Skip site navigation (1)Skip section navigation (2)
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>