Improve the dynamic linker diagnostics.

Lose the pid, only show the name of the function (not its whole signature),
and include the name of the library we failed to load. (I hadn't noticed
that the library name was missing before because in Java we add that into
the UnsatisfiedLinkError detail message.)

The new output looks like this:

  Cannot load library: soinfo_relocate(linker.cpp:968): cannot locate symbol "__libc_malloc_default_dispatch" referenced by "libc_malloc_debug_leak.so"...

Change-Id: I3bb5c9780d9aaf3a9e4418ea55bc98122a81f80f
This commit is contained in:
Elliott Hughes
2012-08-29 13:10:54 -07:00
parent 0d7177c0d4
commit e9b6fc6f82

View File

@@ -165,8 +165,8 @@ static char __linker_dl_err_buf[768];
#define DL_ERR(fmt, x...) \ #define DL_ERR(fmt, x...) \
do { \ do { \
format_buffer(__linker_dl_err_buf, sizeof(__linker_dl_err_buf), \ format_buffer(__linker_dl_err_buf, sizeof(__linker_dl_err_buf), \
"(%s:%d, pid %d) %s: " fmt, \ "%s(%s:%d): " fmt, \
BASENAME(__FILE__), __LINE__, pid, __func__, ##x); \ __FUNCTION__, BASENAME(__FILE__), __LINE__, ##x); \
ERROR(fmt "\n", ##x); \ ERROR(fmt "\n", ##x); \
} while(0) } while(0)
@@ -972,7 +972,7 @@ static int soinfo_relocate(soinfo *si, Elf32_Rel *rel, unsigned count,
reference.. */ reference.. */
s = &symtab[sym]; s = &symtab[sym];
if (ELF32_ST_BIND(s->st_info) != STB_WEAK) { if (ELF32_ST_BIND(s->st_info) != STB_WEAK) {
DL_ERR("cannot locate \"%s\"...", sym_name); DL_ERR("cannot locate symbol \"%s\" referenced by \"%s\"...", sym_name, si->name);
return -1; return -1;
} }