When libexec/rtld-elf/rtld.c is compiled with clang, the r_debug_state()

function (a hook necessary for gdb support), is inlined, but since the
function contains no code, no calls to it are generated.  When gdb is
debugging a dynamically linked program, this causes backtraces to be
corrupted.

Fix it by marking the function __noinline, and inserting an empty asm
statement, that pretends to clobber memory.  This forces the compiler to
emit calls to r_debug_state() throughout rtld.c.

Approved by:	re (kib)
This commit is contained in:
Dimitry Andric 2011-09-03 11:41:00 +00:00
parent 2419d7f93b
commit cce0f33cda
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=225366

View File

@ -144,7 +144,7 @@ static void ld_utrace_log(int, void *, void *, size_t, int, const char *);
static void rtld_fill_dl_phdr_info(const Obj_Entry *obj,
struct dl_phdr_info *phdr_info);
void r_debug_state(struct r_debug *, struct link_map *);
void r_debug_state(struct r_debug *, struct link_map *) __noinline;
/*
* Data declarations.
@ -2782,6 +2782,14 @@ linkmap_delete(Obj_Entry *obj)
void
r_debug_state(struct r_debug* rd, struct link_map *m)
{
/*
* The following is a hack to force the compiler to emit calls to
* this function, even when optimizing. If the function is empty,
* the compiler is not obliged to emit any code for calls to it,
* even when marked __noinline. However, gdb depends on those
* calls being made.
*/
__asm __volatile("" : : : "memory");
}
/*