Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 6 May 2014 18:07:59 +0000 (UTC)
From:      Mark Johnston <markj@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r265456 - head/libexec/rtld-elf
Message-ID:  <201405061807.s46I7xxt048377@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: markj
Date: Tue May  6 18:07:58 2014
New Revision: 265456
URL: http://svnweb.freebsd.org/changeset/base/265456

Log:
  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

Modified:
  head/libexec/rtld-elf/Symbol.map
  head/libexec/rtld-elf/rtld.c

Modified: head/libexec/rtld-elf/Symbol.map
==============================================================================
--- head/libexec/rtld-elf/Symbol.map	Tue May  6 16:51:07 2014	(r265455)
+++ head/libexec/rtld-elf/Symbol.map	Tue May  6 18:07:58 2014	(r265456)
@@ -30,4 +30,5 @@ FBSDprivate_1.0 {
     _rtld_atfork_post;
     _rtld_addr_phdr;
     _rtld_get_stack_prot;
+    _rtld_debug_postinit;
 };

Modified: head/libexec/rtld-elf/rtld.c
==============================================================================
--- head/libexec/rtld-elf/rtld.c	Tue May  6 16:51:07 2014	(r265455)
+++ head/libexec/rtld-elf/rtld.c	Tue May  6 18:07:58 2014	(r265456)
@@ -162,6 +162,7 @@ static bool matched_symbol(SymLook *, co
     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_
     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
 }
 
 /*
+ * 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.
  */



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201405061807.s46I7xxt048377>