On Monday 30 November 2009, Zachary T Welch wrote:
> Adds a fully-documented API for dynamically loading libraries and
> looking up symbols or addresses in them.
Seems to me I've seen one or two or three or four of these
before ... must there be another?? I know that portability
of such things to non-UNIXey environments has been painful.
I'm used to seeing systems either stick to the "libdl" stuff,
or use some multiplatform beast which tracks all of the
platform-specific annoyances.
Also, I'm a bit uneasy at the notion of adding this, so I hope
this doesn't merge unless it gets a lot better understood.
What's the intended change which will have us loading
modules? What modules would be loaded?
Plus:
> +struct module_symbol *module_symbol_by_addr(void *addr)
> +{
> + struct module_symbol *sym = calloc(1, sizeof(*sym));
> + if (NULL == sym)
> + return NULL;
> +
> + Dl_info info;
> + int retval = dladdr(addr, &info);
As noted, not very portable ...
> + if (0 == retval)
> + {
> + free(sym);
> + return NULL;
> + }
> +
> + sym->so_name = info.dli_fname;
> + sym->so_addr = info.dli_fbase;
> + sym->sym_name = info.dli_sname;
> + if (NULL != sym->sym_name) {
> + sym->sym_addr = info.dli_saddr;
> + sym->sym_offset = addr - sym->sym_addr;
> + } else {
> + sym->sym_addr = addr;
> + sym->sym_offset = 0;
This looks wrong/dangerous. Surely better to just fail?
> + }
> +
> + if (NULL == sym->so_name)
> + sym->so_name = "<unknown>";
> + if (NULL == sym->sym_name)
> + sym->sym_name = "<unknown>";
... and this even more so; those names aren't valid.
> + return sym;
> +}
> +
> +struct module_symbol *module_symbol_by_name(struct module_instance *module,
> + const char *name)
> +{
> + void *addr = dlsym(module->dlhandle, name);
But dlsym can fail...
> + return module_symbol_by_addr(addr);
> +}
_______________________________________________
Openocd-development mailing list
[email protected]
https://lists.berlios.de/mailman/listinfo/openocd-development