From e9b6fc6f82276188404a2839e31a2f4c19f6c336 Mon Sep 17 00:00:00 2001 From: Elliott Hughes Date: Wed, 29 Aug 2012 13:10:54 -0700 Subject: [PATCH] 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 --- linker/linker.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/linker/linker.cpp b/linker/linker.cpp index 9d882a86b..46d133583 100644 --- a/linker/linker.cpp +++ b/linker/linker.cpp @@ -162,12 +162,12 @@ DISALLOW_ALLOCATION(void*, calloc, (size_t u1 UNUSED, size_t u2 UNUSED)); static char tmp_err_buf[768]; static char __linker_dl_err_buf[768]; #define BASENAME(s) (strrchr(s, '/') != NULL ? strrchr(s, '/') + 1 : s) -#define DL_ERR(fmt, x...) \ - do { \ - format_buffer(__linker_dl_err_buf, sizeof(__linker_dl_err_buf), \ - "(%s:%d, pid %d) %s: " fmt, \ - BASENAME(__FILE__), __LINE__, pid, __func__, ##x); \ - ERROR(fmt "\n", ##x); \ +#define DL_ERR(fmt, x...) \ + do { \ + format_buffer(__linker_dl_err_buf, sizeof(__linker_dl_err_buf), \ + "%s(%s:%d): " fmt, \ + __FUNCTION__, BASENAME(__FILE__), __LINE__, ##x); \ + ERROR(fmt "\n", ##x); \ } while(0) const char *linker_get_error(void) @@ -972,7 +972,7 @@ static int soinfo_relocate(soinfo *si, Elf32_Rel *rel, unsigned count, reference.. */ s = &symtab[sym]; 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; }