* 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:
parent
0344e87890
commit
0838fb575e
5 changed files with 50 additions and 6 deletions
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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. */
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in a new issue