Date: Sat, 9 May 2009 14:58:50 GMT From: Poul-Henning Kamp <phk@critter.freebsd.dk> To: FreeBSD-gnats-submit@FreeBSD.org Subject: bin/134391: dladdr(3) does effectively not work on main program. Message-ID: <200905091458.n49EwnTF029189@critter.freebsd.dk> Resent-Message-ID: <200905091520.n49FK1Gj028264@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
>Number: 134391 >Category: bin >Synopsis: dladdr(3) does effectively not work on main program. >Confidential: no >Severity: non-critical >Priority: low >Responsible: freebsd-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: sw-bug >Submitter-Id: current-users >Arrival-Date: Sat May 09 15:20:01 UTC 2009 >Closed-Date: >Last-Modified: >Originator: Poul-Henning Kamp >Release: FreeBSD 8.0-CURRENT i386 >Organization: >Environment: System: FreeBSD critter.freebsd.dk 8.0-CURRENT FreeBSD 8.0-CURRENT #1 r191911: Fri May 8 09:42:35 UTC 2009 root@critter.freebsd.dk:/usr/obj/freebsd/head/sys/CRITTER i386 >Description: The dladdr(3) function does not return anything remotely useful for the main program, because it only examines the dynamic symbol table. The most common use for this function, is to construct a backtrace. ports/devel/libexecinfo is an example of this use. >How-To-Repeat: #include <stdio.h> #include <dlfcn.h> extern void foo(const void *a); static void bar(void *a); int main(int argc, char **argv) { (void)argc; (void)argv; foo((const char *)bar + 4); return (0); } void foo(const void *a) { Dl_info info; int i; i = dladdr(a, &info); printf("i = %d (%p)\n", i, a); printf("fn = %s\n", info.dli_fname); printf("fb = %p\n", info.dli_fbase); printf("sn = %s\n", info.dli_sname); printf("sb = %p\n", info.dli_saddr); } static void bar(void *b) { printf("%p\n", b); } >Fix: Linking the program with `-Wl,--export-dynamic fills the dynamic symbol table with all non-static symbols, which is a bit better, but still useless because all static functions are invisible. A simple correct solution escapes me, since we might not even be able to open the original binary again to read the DWARF symbol table. One, quasi-hackish way to solve this, is to notice that the program references dladdr(3) in the first place, and have rtld(1) load the DWARF-symbol table(s) also. >Release-Note: >Audit-Trail: >Unformatted:
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200905091458.n49EwnTF029189>