summaryrefslogtreecommitdiffstats
path: root/libexec
diff options
context:
space:
mode:
authordim <dim@FreeBSD.org>2011-09-03 11:41:00 +0000
committerdim <dim@FreeBSD.org>2011-09-03 11:41:00 +0000
commit8e7c067b29e212e945f97d0fd375bdac77d5f73c (patch)
tree9650086a654d88a064f39a4ebec93a63964b0db3 /libexec
parenta6059bf016f4f1c6ce4e37142d4e06ed08e69759 (diff)
downloadFreeBSD-src-8e7c067b29e212e945f97d0fd375bdac77d5f73c.zip
FreeBSD-src-8e7c067b29e212e945f97d0fd375bdac77d5f73c.tar.gz
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)
Diffstat (limited to 'libexec')
-rw-r--r--libexec/rtld-elf/rtld.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/libexec/rtld-elf/rtld.c b/libexec/rtld-elf/rtld.c
index 0f5aaba..874f4bc 100644
--- a/libexec/rtld-elf/rtld.c
+++ b/libexec/rtld-elf/rtld.c
@@ -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");
}
/*
OpenPOWER on IntegriCloud