mirror of
https://github.com/opnsense/src.git
synced 2026-05-28 04:12:45 -04:00
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:
parent
2419d7f93b
commit
cce0f33cda
1 changed files with 9 additions and 1 deletions
|
|
@ -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");
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
|||
Loading…
Reference in a new issue