Commit bbb5b988 authored by Natanael Copa's avatar Natanael Copa

Revert "Revert "main/gdb: upgrade to 7.2""

This reverts commit d666f38c.
parent d666f38c
2007-11-02 Jan Kratochvil <jan.kratochvil@redhat.com>
Port to GDB-6.7.1.
2007-11-02 Jan Kratochvil <jan.kratochvil@redhat.com>
Port to post-GDB-6.7.1 multi-PC breakpoints.
2007-11-09 Jan Kratochvil <jan.kratochvil@redhat.com>
* solib-svr4.c (svr4_current_sos): Fix segfault on NULL EXEC_BFD.
2008-02-24 Jan Kratochvil <jan.kratochvil@redhat.com>
Port to GDB-6.8pre.
2008-02-27 Jan Kratochvil <jan.kratochvil@redhat.com>
Port to gdb-6.7.50.20080227.
Index: gdb/dwarf2read.c
===================================================================
--- a/gdb/dwarf2read.c 2008-02-27 08:57:20.000000000 +0100
+++ b/gdb/dwarf2read.c 2008-02-27 08:57:31.000000000 +0100
@@ -1217,7 +1217,7 @@ dwarf2_build_psymtabs (struct objfile *o
else
dwarf2_per_objfile->loc_buffer = NULL;
- if (mainline
+ if ((mainline == 1)
|| (objfile->global_psymbols.size == 0
&& objfile->static_psymbols.size == 0))
{
Index: gdb/auxv.c
===================================================================
--- a/gdb/auxv.c 2008-01-16 17:27:37.000000000 +0100
+++ b/gdb/auxv.c 2008-02-27 08:57:31.000000000 +0100
@@ -80,7 +80,7 @@ procfs_xfer_auxv (struct target_ops *ops
Return 1 if an entry was read into *TYPEP and *VALP. */
int
target_auxv_parse (struct target_ops *ops, gdb_byte **readptr,
- gdb_byte *endptr, CORE_ADDR *typep, CORE_ADDR *valp)
+ gdb_byte *endptr, ULONGEST *typep, CORE_ADDR *valp)
{
const int sizeof_auxv_field = TYPE_LENGTH (builtin_type_void_data_ptr);
gdb_byte *ptr = *readptr;
@@ -105,9 +105,10 @@ target_auxv_parse (struct target_ops *op
an error getting the information. On success, return 1 after
storing the entry's value field in *VALP. */
int
-target_auxv_search (struct target_ops *ops, CORE_ADDR match, CORE_ADDR *valp)
+target_auxv_search (struct target_ops *ops, ULONGEST match, CORE_ADDR *valp)
{
- CORE_ADDR type, val;
+ CORE_ADDR val;
+ ULONGEST at_type;
gdb_byte *data;
LONGEST n = target_read_alloc (ops, TARGET_OBJECT_AUXV, NULL, &data);
gdb_byte *ptr = data;
@@ -117,10 +118,10 @@ target_auxv_search (struct target_ops *o
return n;
while (1)
- switch (target_auxv_parse (ops, &ptr, data + n, &type, &val))
+ switch (target_auxv_parse (ops, &ptr, data + n, &at_type, &val))
{
case 1: /* Here's an entry, check it. */
- if (type == match)
+ if (at_type == match)
{
xfree (data);
*valp = val;
@@ -143,7 +144,8 @@ target_auxv_search (struct target_ops *o
int
fprint_target_auxv (struct ui_file *file, struct target_ops *ops)
{
- CORE_ADDR type, val;
+ CORE_ADDR val;
+ ULONGEST at_type;
gdb_byte *data;
LONGEST len = target_read_alloc (ops, TARGET_OBJECT_AUXV, NULL,
&data);
@@ -153,14 +155,14 @@ fprint_target_auxv (struct ui_file *file
if (len <= 0)
return len;
- while (target_auxv_parse (ops, &ptr, data + len, &type, &val) > 0)
+ while (target_auxv_parse (ops, &ptr, data + len, &at_type, &val) > 0)
{
extern int addressprint;
const char *name = "???";
const char *description = "";
enum { dec, hex, str } flavor = hex;
- switch (type)
+ switch (at_type)
{
#define TAG(tag, text, kind) \
case tag: name = #tag; description = text; flavor = kind; break
@@ -213,7 +215,7 @@ fprint_target_auxv (struct ui_file *file
}
fprintf_filtered (file, "%-4s %-20s %-30s ",
- paddr_d (type), name, description);
+ paddr_d (at_type), name, description);
switch (flavor)
{
case dec:
Index: gdb/auxv.h
===================================================================
--- a/gdb/auxv.h 2008-01-01 23:53:09.000000000 +0100
+++ b/gdb/auxv.h 2008-02-27 08:57:31.000000000 +0100
@@ -35,14 +35,14 @@ struct target_ops; /* Forward declarati
Return 1 if an entry was read into *TYPEP and *VALP. */
extern int target_auxv_parse (struct target_ops *ops,
gdb_byte **readptr, gdb_byte *endptr,
- CORE_ADDR *typep, CORE_ADDR *valp);
+ ULONGEST *typep, CORE_ADDR *valp);
/* Extract the auxiliary vector entry with a_type matching MATCH.
Return zero if no such entry was found, or -1 if there was
an error getting the information. On success, return 1 after
storing the entry's value field in *VALP. */
extern int target_auxv_search (struct target_ops *ops,
- CORE_ADDR match, CORE_ADDR *valp);
+ ULONGEST match, CORE_ADDR *valp);
/* Print the contents of the target's AUXV on the specified file. */
extern int fprint_target_auxv (struct ui_file *file, struct target_ops *ops);
Index: gdb/breakpoint.h
===================================================================
--- a/gdb/breakpoint.h 2008-02-01 17:24:46.000000000 +0100
+++ b/gdb/breakpoint.h 2008-02-27 08:57:31.000000000 +0100
@@ -144,6 +144,7 @@ enum enable_state
automatically enabled and reset when the call
"lands" (either completes, or stops at another
eventpoint). */
+ bp_startup_disabled,
bp_permanent /* There is a breakpoint instruction hard-wired into
the target's code. Don't try to write another
breakpoint instruction on top of it, or restore
@@ -823,6 +824,10 @@ extern void remove_thread_event_breakpoi
extern void disable_breakpoints_in_shlibs (void);
+extern void disable_breakpoints_at_startup (int silent);
+
+extern void re_enable_breakpoints_at_startup (void);
+
/* This function returns TRUE if ep is a catchpoint. */
extern int ep_is_catchpoint (struct breakpoint *);
Index: gdb/symfile-mem.c
===================================================================
--- a/gdb/symfile-mem.c 2008-01-01 23:53:13.000000000 +0100
+++ b/gdb/symfile-mem.c 2008-02-27 08:57:31.000000000 +0100
@@ -108,7 +108,7 @@ symbol_file_add_from_memory (struct bfd
}
objf = symbol_file_add_from_bfd (nbfd, from_tty,
- sai, 0, OBJF_SHARED);
+ sai, 2, OBJF_SHARED);
/* This might change our ideas about frames already looked at. */
reinit_frame_cache ();
Index: gdb/infrun.c
===================================================================
--- a/gdb/infrun.c 2008-02-27 08:57:20.000000000 +0100
+++ b/gdb/infrun.c 2008-02-27 08:57:31.000000000 +0100
@@ -2277,6 +2277,11 @@ process_event_stop_test:
#endif
target_terminal_inferior ();
+ /* For PIE executables, we dont really know where the
+ breakpoints are going to be until we start up the
+ inferior. */
+ re_enable_breakpoints_at_startup ();
+
/* If requested, stop when the dynamic linker notifies
gdb of events. This allows the user to get control
and place breakpoints in initializer routines for
Index: gdb/objfiles.c
===================================================================
--- a/gdb/objfiles.c 2008-01-01 23:53:12.000000000 +0100
+++ b/gdb/objfiles.c 2008-02-27 08:57:31.000000000 +0100
@@ -49,6 +49,9 @@
#include "source.h"
#include "addrmap.h"
+#include "auxv.h"
+#include "elf/common.h"
+
/* Prototypes for local functions */
static void objfile_alloc_data (struct objfile *objfile);
@@ -260,7 +263,19 @@ init_entry_point_info (struct objfile *o
CORE_ADDR
entry_point_address (void)
{
- return symfile_objfile ? symfile_objfile->ei.entry_point : 0;
+ int ret;
+ CORE_ADDR entry_addr;
+
+ /* Find the address of the entry point of the program from the
+ auxv vector. */
+ ret = target_auxv_search (&current_target, AT_ENTRY, &entry_addr);
+ if (ret == 1)
+ return entry_addr;
+ /*if (ret == 0 || ret == -1)*/
+ else
+ {
+ return symfile_objfile ? symfile_objfile->ei.entry_point : 0;
+ }
}
/* Create the terminating entry of OBJFILE's minimal symbol table.
Index: gdb/solib-svr4.c
===================================================================
--- a/gdb/solib-svr4.c 2008-02-27 08:57:19.000000000 +0100
+++ b/gdb/solib-svr4.c 2008-02-27 08:59:06.000000000 +0100
@@ -31,6 +31,8 @@
#include "gdbcore.h"
#include "target.h"
#include "inferior.h"
+#include "auxv.h"
+#include "command.h"
#include "gdb_assert.h"
@@ -246,7 +248,9 @@ static char *debug_loader_name;
/* Local function prototypes */
+#if 0
static int match_main (char *);
+#endif
static CORE_ADDR bfd_lookup_symbol (bfd *, char *);
@@ -349,10 +353,12 @@ scan_dyntag (int dyntag, bfd *abfd, CORE
int arch_size, step, sect_size;
long dyn_tag;
CORE_ADDR dyn_ptr, dyn_addr;
+ CORE_ADDR entry_addr;
gdb_byte *bufend, *bufstart, *buf;
Elf32_External_Dyn *x_dynp_32;
Elf64_External_Dyn *x_dynp_64;
struct bfd_section *sect;
+ int ret;
if (abfd == NULL)
return 0;
@@ -360,19 +366,74 @@ scan_dyntag (int dyntag, bfd *abfd, CORE
if (arch_size == -1)
return 0;
+ /* The auxv vector based relocatable files reading is limited to the main
+ executable. */
+ gdb_assert (abfd == exec_bfd || ptr == NULL);
+
+ if (ptr != NULL)
+ {
+ /* Find the address of the entry point of the program from the
+ auxv vector. */
+ ret = target_auxv_search (&current_target, AT_ENTRY, &entry_addr);
+
+ if (ret == 0 || ret == -1)
+ {
+ /* No auxv info, maybe an older kernel. Fake our way through. */
+ entry_addr = bfd_get_start_address (exec_bfd);
+
+ if (debug_solib)
+ fprintf_unfiltered (gdb_stdlog,
+ "elf_locate_base: program entry address not found. Using bfd's 0x%s for %s\n",
+ paddr_nz (entry_addr), exec_bfd->filename);
+ }
+ else
+ {
+ if (debug_solib)
+ fprintf_unfiltered (gdb_stdlog,
+ "elf_locate_base: found program entry address 0x%s for %s\n",
+ paddr_nz (entry_addr), exec_bfd->filename);
+ }
+ }
+
/* Find the start address of the .dynamic section. */
sect = bfd_get_section_by_name (abfd, ".dynamic");
if (sect == NULL)
- return 0;
+ {
+ if (debug_solib)
+ fprintf_unfiltered (gdb_stdlog,
+ "elf_locate_base: .dynamic section not found in %s -- return now\n",
+ exec_bfd->filename);
+ return 0;
+ }
+ else
+ {
+ if (debug_solib)
+ fprintf_unfiltered (gdb_stdlog,
+ "elf_locate_base: .dynamic section found in %s\n",
+ exec_bfd->filename);
+ }
+
dyn_addr = bfd_section_vma (abfd, sect);
+ if (debug_solib)
+ fprintf_unfiltered (gdb_stdlog,
+ "elf_locate_base: .dynamic addr 0x%s\n",
+ paddr_nz (dyn_addr));
/* Read in .dynamic from the BFD. We will get the actual value
from memory later. */
sect_size = bfd_section_size (abfd, sect);
buf = bufstart = alloca (sect_size);
+ if (debug_solib)
+ fprintf_unfiltered (gdb_stdlog,
+ "elf_locate_base: read in .dynamic section\n");
if (!bfd_get_section_contents (abfd, sect,
buf, 0, sect_size))
- return 0;
+ {
+ if (debug_solib)
+ fprintf_unfiltered (gdb_stdlog,
+ "elf_locate_base: couldn't read .dynamic section -- return now\n");
+ return 0;
+ }
/* Iterate over BUF and scan for DYNTAG. If found, set PTR and return. */
step = (arch_size == 32) ? sizeof (Elf32_External_Dyn)
@@ -405,9 +466,43 @@ scan_dyntag (int dyntag, bfd *abfd, CORE
CORE_ADDR ptr_addr;
ptr_addr = dyn_addr + (buf - bufstart) + arch_size / 8;
+ if (ptr != NULL)
+ {
+ if (debug_solib)
+ fprintf_unfiltered (gdb_stdlog,
+ "elf_locate_base: unrelocated ptr addr 0x%s\n",
+ paddr_nz (ptr_addr));
+ ptr_addr += entry_addr - bfd_get_start_address (exec_bfd);
+ if (debug_solib)
+ fprintf_unfiltered (gdb_stdlog,
+ "elf_locate_base: relocated ptr addr 0x%s"
+ " (auxv entry 0x%s, bfd start address 0x%s)"
+ " for %s\n",
+ paddr_nz (ptr_addr), paddr_nz (entry_addr),
+ paddr_nz (bfd_get_start_address (exec_bfd)),
+ exec_bfd->filename);
+ }
if (target_read_memory (ptr_addr, ptr_buf, arch_size / 8) == 0)
- dyn_ptr = extract_typed_address (ptr_buf,
- builtin_type_void_data_ptr);
+ {
+ dyn_ptr = extract_typed_address (ptr_buf,
+ builtin_type_void_data_ptr);
+ if (ptr != NULL)
+ {
+ if (debug_solib)
+ fprintf_unfiltered (gdb_stdlog,
+ "elf_locate_base: Tag entry has value 0x%s -- return now\n",
+ paddr_nz (dyn_ptr));
+ }
+ }
+ else
+ {
+ if (ptr != NULL)
+ {
+ if (debug_solib)
+ fprintf_unfiltered (gdb_stdlog,
+ "elf_locate_base: Couldn't read tag entry value -- return now\n");
+ }
+ }
*ptr = dyn_ptr;
}
return 1;
@@ -544,6 +639,10 @@ solib_svr4_r_map (void)
{
struct link_map_offsets *lmo = svr4_fetch_link_map_offsets ();
+ if (debug_solib)
+ fprintf_unfiltered (gdb_stdlog,
+ "solib_svr4_r_map: read at 0x%s\n",
+ paddr_nz (debug_base + lmo->r_map_offset));
return read_memory_typed_address (debug_base + lmo->r_map_offset,
builtin_type_void_data_ptr);
}
@@ -713,6 +812,11 @@ svr4_current_sos (void)
struct so_list *head = 0;
struct so_list **link_ptr = &head;
CORE_ADDR ldsomap = 0;
+ const char *filename = exec_bfd ? exec_bfd->filename : "<none>";
+
+ if (debug_solib)
+ fprintf_unfiltered (gdb_stdlog,
+ "svr4_current_sos: exec_bfd %s\n", filename);
/* Always locate the debug struct, in case it has moved. */
debug_base = 0;
@@ -721,10 +825,19 @@ svr4_current_sos (void)
/* If we can't find the dynamic linker's base structure, this
must not be a dynamically linked executable. Hmm. */
if (! debug_base)
- return svr4_default_sos ();
+ {
+ if (debug_solib)
+ fprintf_unfiltered (gdb_stdlog,
+ "svr4_current_sos: no DT_DEBUG found in %s -- return now\n",
+ filename);
+ return svr4_default_sos ();
+ }
/* Walk the inferior's link map list, and build our list of
`struct so_list' nodes. */
+ if (debug_solib)
+ fprintf_unfiltered (gdb_stdlog,
+ "svr4_current_sos: walk link map in %s\n", filename);
lm = solib_svr4_r_map ();
while (lm)
@@ -740,23 +853,103 @@ svr4_current_sos (void)
new->lm_info->lm = xzalloc (lmo->link_map_size);
make_cleanup (xfree, new->lm_info->lm);
+ if (debug_solib)
+ fprintf_unfiltered (gdb_stdlog,
+ "svr4_current_sos: read lm at 0x%s\n", paddr_nz(lm));
read_memory (lm, new->lm_info->lm, lmo->link_map_size);
lm = LM_NEXT (new);
+ if (debug_solib)
+ fprintf_unfiltered (gdb_stdlog,
+ "svr4_current_sos: is first link entry? %d\n",
+ IGNORE_FIRST_LINK_MAP_ENTRY (new));
+
/* For SVR4 versions, the first entry in the link map is for the
inferior executable, so we must ignore it. For some versions of
SVR4, it has no name. For others (Solaris 2.3 for example), it
does have a name, so we can no longer use a missing name to
decide when to ignore it. */
- if (IGNORE_FIRST_LINK_MAP_ENTRY (new) && ldsomap == 0)
- free_so (new);
+ if (exec_bfd != NULL && IGNORE_FIRST_LINK_MAP_ENTRY (new) && ldsomap == 0)
+ {
+ /* It is the first link map entry, i.e. it is the main executable. */
+
+ if (bfd_get_start_address (exec_bfd) == entry_point_address ())
+ {
+ /* Non-pie case, main executable has not been relocated. */
+ free_so (new);
+ }
+ else
+ {
+ /* Pie case, main executable has been relocated. */
+ struct so_list *gdb_solib;
+
+ if (debug_solib)
+ fprintf_unfiltered (gdb_stdlog,
+ "svr4_current_sos: Processing first link map entry\n");
+ strncpy (new->so_name, exec_bfd->filename,
+ SO_NAME_MAX_PATH_SIZE - 1);
+ new->so_name[SO_NAME_MAX_PATH_SIZE - 1] = '\0';
+ strcpy (new->so_original_name, new->so_name);
+ /*new->main = 1;*/
+ new->main_relocated = 0;
+
+ if (debug_solib)
+ {
+ fprintf_unfiltered (gdb_stdlog,
+ "svr4_current_sos: Processing nameless DSO\n");
+ fprintf_unfiltered (gdb_stdlog,
+ "svr4_current_sos: adding name %s\n",
+ new->so_name);
+ }
+
+ for (gdb_solib = master_so_list ();
+ gdb_solib;
+ gdb_solib = gdb_solib->next)
+ {
+ if (debug_solib)
+ fprintf_unfiltered (gdb_stdlog,
+ "svr4_current_sos: compare gdb %s and new %s\n",
+ gdb_solib->so_name, new->so_name);
+ if (strcmp (gdb_solib->so_name, new->so_name) == 0)
+ if (gdb_solib->main_relocated)
+ {
+ if (debug_solib)
+ fprintf_unfiltered (gdb_stdlog,
+ "svr4_current_sos: found main relocated\n");
+ break;
+ }
+ }
+
+ if ((gdb_solib && !gdb_solib->main_relocated) || (!gdb_solib))
+ {
+ add_to_target_sections (0 /*from_tty*/, &current_target, new);
+ new->main = 1;
+ }
+
+ /* We need this in the list of shared libs we return because
+ solib_add_stub will loop through it and add the symbol file. */
+ new->next = 0;
+ *link_ptr = new;
+ link_ptr = &new->next;
+ }
+ } /* End of IGNORE_FIRST_LINK_MAP_ENTRY */
else
{
+ /* This is not the first link map entry, i.e. is not the main
+ executable. Note however that it could be the DSO supplied on
+ certain systems (i.e. Linux 2.6) containing information about
+ the vsyscall page. We must ignore such entry. This entry is
+ nameless (just like the one for the main executable, sigh). */
+
int errcode;
char *buffer;
/* Extract this shared object's name. */
+ if (debug_solib)
+ fprintf_unfiltered (gdb_stdlog,
+ "svr4_current_sos: read LM_NAME\n");
+
target_read_string (LM_NAME (new), &buffer,
SO_NAME_MAX_PATH_SIZE - 1, &errcode);
if (errcode != 0)
@@ -764,23 +957,35 @@ svr4_current_sos (void)
safe_strerror (errcode));
else
{
- strncpy (new->so_name, buffer, SO_NAME_MAX_PATH_SIZE - 1);
- new->so_name[SO_NAME_MAX_PATH_SIZE - 1] = '\0';
- strcpy (new->so_original_name, new->so_name);
- }
- xfree (buffer);
-
- /* If this entry has no name, or its name matches the name
- for the main executable, don't include it in the list. */
- if (! new->so_name[0]
- || match_main (new->so_name))
- free_so (new);
- else
- {
- new->next = 0;
- *link_ptr = new;
- link_ptr = &new->next;
+ if (debug_solib)
+ fprintf_unfiltered (gdb_stdlog,
+ "svr4_current_sos: LM_NAME is <%s>\n",
+ buffer);
+ /* The name could be empty, in which case it is the
+ system supplied DSO. */
+ if (strcmp (buffer, "") == 0)
+ free_so (new);
+ else
+ {
+ strncpy (new->so_name, buffer, SO_NAME_MAX_PATH_SIZE - 1);
+ new->so_name[SO_NAME_MAX_PATH_SIZE - 1] = '\0';
+ strcpy (new->so_original_name, new->so_name);
+ if (debug_solib)
+ {
+ fprintf_unfiltered (gdb_stdlog,
+ "svr4_current_sos: Processing DSO: %s\n",
+ new->so_name);
+ fprintf_unfiltered (gdb_stdlog,
+ "svr4_current_sos: first link entry %d\n",
+ IGNORE_FIRST_LINK_MAP_ENTRY (new));
+ }
+
+ new->next = 0;
+ *link_ptr = new;
+ link_ptr = &new->next;
+ }
}
+ xfree (buffer);
}
/* On Solaris, the dynamic linker is not in the normal list of
@@ -796,6 +1001,9 @@ svr4_current_sos (void)
if (head == NULL)
return svr4_default_sos ();
+ if (debug_solib)
+ fprintf_unfiltered (gdb_stdlog, "svr4_current_sos: ENDS %s\n", filename);
+
return head;
}
@@ -875,7 +1083,7 @@ svr4_fetch_objfile_link_map (struct objf
/* On some systems, the only way to recognize the link map entry for
the main executable file is by looking at its name. Return
non-zero iff SONAME matches one of the known main executable names. */
-
+#if 0
static int
match_main (char *soname)
{
@@ -889,6 +1097,7 @@ match_main (char *soname)
return (0);
}
+#endif
/* Return 1 if PC lies in the dynamic symbol resolution code of the
SVR4 run time loader. */
@@ -1040,6 +1249,11 @@ enable_break (void)
/* Find the .interp section; if not found, warn the user and drop
into the old breakpoint at symbol code. */
interp_sect = bfd_get_section_by_name (exec_bfd, ".interp");
+
+ if (debug_solib)
+ fprintf_unfiltered (gdb_stdlog,
+ "enable_break: search for .interp in %s\n",
+ exec_bfd->filename);
if (interp_sect)
{
unsigned int interp_sect_size;
@@ -1074,6 +1288,9 @@ enable_break (void)
if (tmp_fd >= 0)
tmp_bfd = bfd_fopen (tmp_pathname, gnutarget, FOPEN_RB, tmp_fd);
+ if (debug_solib)
+ fprintf_unfiltered (gdb_stdlog,
+ "enable_break: opening %s\n", tmp_pathname);
if (tmp_bfd == NULL)
goto bkpt_at_symbol;
@@ -1180,6 +1397,9 @@ enable_break (void)
if (sym_addr != 0)
{
create_solib_event_breakpoint (load_addr + sym_addr);
+ if (debug_solib)
+ fprintf_unfiltered (gdb_stdlog,
+ "enable_break: solib bp set\n");
return 1;
}
@@ -1440,6 +1660,8 @@ svr4_solib_create_inferior_hook (void)
while (stop_signal != TARGET_SIGNAL_TRAP);
stop_soon = NO_STOP_QUIETLY;
#endif /* defined(_SCO_DS) */
+
+ disable_breakpoints_at_startup (1);
}
static void
@@ -1620,6 +1842,75 @@ svr4_lp64_fetch_link_map_offsets (void)
return lmp;
}
+void
+info_linkmap_command (char *cmd, int from_tty)
+{
+ CORE_ADDR lm;
+
+ /* Make sure we've looked up the inferior's dynamic linker's base
+ structure. */
+ if (! debug_base)
+ {
+ debug_base = locate_base ();
+
+ /* If we can't find the dynamic linker's base structure, this
+ must not be a dynamically linked executable. Hmm. */
+ if (! debug_base)
+ {
+ if (debug_solib)
+ fprintf_unfiltered (gdb_stdlog,
+ "svr4_print_linkmap: no DT_DEBUG found in %s -- return now\n",
+ exec_bfd->filename);
+ return;
+ }
+ }
+
+ /* Walk the inferior's link map list, and print the info. */