* linux-thread-db.c (thread_db_new_objfile): Only try to load

libthread_db when we load libpthread or the main symbol file.
	(thread_db_inferior_created): New function.
	(_initialize_thread_db): Attach inferior_created observer.
	* linux-nat.c (linux_child_post_attach): Remove call to
	check_for_thread_db.
	(linux_child_post_startup_inferior): Ditto.
	* objfiles.h (OBJF_MAINLINE): Define.
	* symfile.c (symbol_file_add_with_addrs_or_offsets): Pass it to
	allocate_objfile when appropriate.
This commit is contained in:
Doug Evans 2011-10-11 03:31:59 +00:00
parent 0344e87890
commit 0838fb575e
5 changed files with 50 additions and 6 deletions

View File

@ -1,3 +1,16 @@
2011-10-10 Doug Evans <dje@google.com>
* linux-thread-db.c (thread_db_new_objfile): Only try to load
libthread_db when we load libpthread or the main symbol file.
(thread_db_inferior_created): New function.
(_initialize_thread_db): Attach inferior_created observer.
* linux-nat.c (linux_child_post_attach): Remove call to
check_for_thread_db.
(linux_child_post_startup_inferior): Ditto.
* objfiles.h (OBJF_MAINLINE): Define.
* symfile.c (symbol_file_add_with_addrs_or_offsets): Pass it to
allocate_objfile when appropriate.
2011-10-10 Ulrich Weigand <ulrich.weigand@linaro.org>
PR gdb/13218

View File

@ -571,7 +571,6 @@ static void
linux_child_post_attach (int pid)
{
linux_enable_event_reporting (pid_to_ptid (pid));
check_for_thread_db ();
linux_enable_tracesysgood (pid_to_ptid (pid));
}
@ -579,7 +578,6 @@ static void
linux_child_post_startup_inferior (ptid_t ptid)
{
linux_enable_event_reporting (ptid);
check_for_thread_db ();
linux_enable_tracesysgood (ptid);
}

View File

@ -1077,16 +1077,37 @@ check_for_thread_db (void)
return;
}
/* This function is called via the new_objfile observer. */
static void
thread_db_new_objfile (struct objfile *objfile)
{
/* This observer must always be called with inferior_ptid set
correctly. */
if (objfile != NULL)
if (objfile != NULL
/* Only check for thread_db if we loaded libpthread,
or if this is the main symbol file.
We need to check OBJF_MAINLINE to handle the case of debugging
a statically linked executable AND the symbol file is specified AFTER
the exec file is loaded (e.g., gdb -c core ; file foo).
For dynamically linked executables, libpthread can be near the end
of the list of shared libraries to load, and in an app of several
thousand shared libraries, this can otherwise be painful. */
&& ((objfile->flags & OBJF_MAINLINE) != 0
|| libpthread_name_p (objfile->name)))
check_for_thread_db ();
}
/* This function is called via the inferior_created observer.
This handles the case of debugging statically linked executables. */
static void
thread_db_inferior_created (struct target_ops *target, int from_tty)
{
check_for_thread_db ();
}
/* Attach to a new thread. This function is called when we receive a
TD_CREATE event or when we iterate over all threads and find one
that wasn't already in our list. Returns true on success. */
@ -1845,4 +1866,9 @@ When non-zero, libthread-db debugging is enabled."),
/* Add ourselves to objfile event chain. */
observer_attach_new_objfile (thread_db_new_objfile);
/* Add ourselves to inferior_created event chain.
This is needed to handle debugging statically linked programs where
the new_objfile observer won't get called for libpthread. */
observer_attach_inferior_created (thread_db_inferior_created);
}

View File

@ -196,7 +196,8 @@ struct objfile
CORE_ADDR addr_low;
/* Some flag bits for this objfile. */
/* Some flag bits for this objfile.
The values are defined by OBJF_*. */
unsigned short flags;
@ -434,6 +435,11 @@ struct objfile
#define OBJF_PSYMTABS_READ (1 << 4)
/* Set if this is the main symbol file
(as opposed to symbol file for dynamically loaded code). */
#define OBJF_MAINLINE (1 << 5)
/* The object file that contains the runtime common minimal symbols
for SunOS4. Note that this objfile has no associated BFD. */

View File

@ -1081,6 +1081,7 @@ symbol_file_add_with_addrs_or_offsets (bfd *abfd,
struct cleanup *my_cleanups;
const char *name = bfd_get_filename (abfd);
const int from_tty = add_flags & SYMFILE_VERBOSE;
const int mainline = add_flags & SYMFILE_MAINLINE;
const int should_print = ((from_tty || info_verbose)
&& (readnow_symbol_files
|| (add_flags & SYMFILE_NO_READ) == 0));
@ -1097,12 +1098,12 @@ symbol_file_add_with_addrs_or_offsets (bfd *abfd,
interactively wiping out any existing symbols. */
if ((have_full_symbols () || have_partial_symbols ())
&& (add_flags & SYMFILE_MAINLINE)
&& mainline
&& from_tty
&& !query (_("Load new symbol table from \"%s\"? "), name))
error (_("Not confirmed."));
objfile = allocate_objfile (abfd, flags);
objfile = allocate_objfile (abfd, flags | (mainline ? OBJF_MAINLINE : 0));
discard_cleanups (my_cleanups);
if (parent)