This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] Initialize _r_debug for static applications.


With Maciej's great work on reducing the difference between
static and dyanmic executables, and with the addition of
a functional main link map in static exectuables we can now
usefully initialize _r_debug for static applications. This
will allow future debuggers the ability to coalesce code
paths which previously had to have special cases for static
v.s. dyanmic.

It also fixes this particular use case where gdb would like
a consistent way to find the application link map for looking
up TLS variables in both static and dynamic applications:
https://www.sourceware.org/ml/libc-help/2014-03/msg00024.html

The discussion touches on the fact that without _r_debug the
debugger has to make various assupmtions while using
libthread_db that contrains the implementation.

This patch initializes the debug infrastructure during
LIBC_START_MAIN, but only for static applications, by
calling `_dl_debug_initialize (0, LM_ID_BASE)'. We pass 0 as
the ldbase because it's a static application, and the runtime
address of the loader doesn't matter. We pass LM_ID_BASE because
we want to load, by default, the base link map, and that's what
really matters.

Tested on x86_64 with no regressions.

Jan reports this works and that gdb can be patched to use
_r_debug to access TLS variables in static applications
while still using the current libthread_db calls normally
used for dynamic applications.

This removes one more difference between static and dynamic
applications.

Note: This does not attempt to cleanup the -Wundef warning
for SHARED, which I am looking to fix in another patch so
we still use `#ifndef SHARED' (Makeconfig needs to be fixed
to use -DSHARED=0 and -DSHARED=1 IMO to make this work correctly).

OK to checkin?

Cheers,
Carlos.

2014-04-10  Carlos O'Donell  <carlos@redhat.com>
 
	* csu/libc-start.c (LIBC_START_MAIN) [!SHARED]: Call
	_dl_debug_initialize.

diff --git a/csu/libc-start.c b/csu/libc-start.c
index 3b7092b..d571a1a 100644
--- a/csu/libc-start.c
+++ b/csu/libc-start.c
@@ -264,6 +264,9 @@ LIBC_START_MAIN (int (*main) (int, char **, char ** MAIN_AUXVEC_DECL),
     GLRO(dl_debug_printf) ("\ntransferring control: %s\n\n", argv[0]);
 #endif
 
+#ifndef SHARED
+  _dl_debug_initialize (0, LM_ID_BASE);
+#endif
 #ifdef HAVE_CLEANUP_JMP_BUF
   /* Memory for the cancellation buffer.  */
   struct pthread_unwind_buf unwind_buf;
---

Cheers,
Carlos.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]