summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormarkj <markj@FreeBSD.org>2014-05-06 18:07:58 +0000
committermarkj <markj@FreeBSD.org>2014-05-06 18:07:58 +0000
commit0ee8ca39cec7bf21b76760f8992ea7c6db294804 (patch)
tree72114c7d2042a9232bde1200b19161d465f46359
parentebf0ea80e499282d74b1d15f6751c4bee0d019c9 (diff)
downloadFreeBSD-src-0ee8ca39cec7bf21b76760f8992ea7c6db294804.zip
FreeBSD-src-0ee8ca39cec7bf21b76760f8992ea7c6db294804.tar.gz
Add a postinit debugger hook to rtld. This will be used by dtrace(1) to halt
the victim process before its entry point is called, at which point probes and DOF data are registered with the kernel. The r_debug_state hook cannot be used for this purpose, as it is called before the program's init routines are invoked and in particular before DOF data is registered (via drti.o). Reviewed by: kib MFC after: 2 weeks
-rw-r--r--libexec/rtld-elf/Symbol.map1
-rw-r--r--libexec/rtld-elf/rtld.c15
2 files changed, 16 insertions, 0 deletions
diff --git a/libexec/rtld-elf/Symbol.map b/libexec/rtld-elf/Symbol.map
index 9ad6251..e82b1d4 100644
--- a/libexec/rtld-elf/Symbol.map
+++ b/libexec/rtld-elf/Symbol.map
@@ -30,4 +30,5 @@ FBSDprivate_1.0 {
_rtld_atfork_post;
_rtld_addr_phdr;
_rtld_get_stack_prot;
+ _rtld_debug_postinit;
};
diff --git a/libexec/rtld-elf/rtld.c b/libexec/rtld-elf/rtld.c
index f96b8e7..72b312f 100644
--- a/libexec/rtld-elf/rtld.c
+++ b/libexec/rtld-elf/rtld.c
@@ -162,6 +162,7 @@ static bool matched_symbol(SymLook *, const Obj_Entry *, Sym_Match_Result *,
const unsigned long);
void r_debug_state(struct r_debug *, struct link_map *) __noinline;
+void _r_debug_postinit(struct link_map *) __noinline;
/*
* Data declarations.
@@ -637,6 +638,7 @@ _rtld(Elf_Addr *sp, func_ptr_type *exit_proc, Obj_Entry **objp)
if (obj_main->crt_no_init)
preinit_main();
objlist_call_init(&initlist, &lockstate);
+ _r_debug_postinit(&obj_main->linkmap);
objlist_clear(&initlist);
dbg("loading filtees");
for (obj = obj_list->next; obj != NULL; obj = obj->next) {
@@ -3553,6 +3555,19 @@ r_debug_state(struct r_debug* rd, struct link_map *m)
}
/*
+ * A function called after init routines have completed. This can be used to
+ * break before a program's entry routine is called, and can be used when
+ * main is not available in the symbol table.
+ */
+void
+_r_debug_postinit(struct link_map *m)
+{
+
+ /* See r_debug_state(). */
+ __asm __volatile("" : : : "memory");
+}
+
+/*
* Get address of the pointer variable in the main program.
* Prefer non-weak symbol over the weak one.
*/
OpenPOWER on IntegriCloud