* elfread.c (elf_symtab_read): Add bfd section address to bfd
symbols, now that they are section relative. * solib.c (bfd_lookup_symbol): Ditto.
This commit is contained in:
parent
d7276c0ab4
commit
a608f919de
3 changed files with 116 additions and 37 deletions
|
@ -1,3 +1,14 @@
|
||||||
|
Thu Jun 10 13:26:41 1993 Fred Fish (fnf@cygnus.com)
|
||||||
|
|
||||||
|
* elfread.c (elf_symtab_read): Add bfd section address to bfd
|
||||||
|
symbols, now that they are section relative.
|
||||||
|
* solib.c (bfd_lookup_symbol): Ditto.
|
||||||
|
|
||||||
|
Thu Jun 10 10:56:56 1993 Jim Kingdon (kingdon@cygnus.com)
|
||||||
|
|
||||||
|
* Makefile.in (depend): Add bfd -I's for paread.c and xcoffexec.c
|
||||||
|
depend: Updated accordingly.
|
||||||
|
|
||||||
Wed Jun 9 16:08:44 1993 Jim Kingdon (kingdon@cygnus.com)
|
Wed Jun 9 16:08:44 1993 Jim Kingdon (kingdon@cygnus.com)
|
||||||
|
|
||||||
* Makefile.in (*.tab.c): Use mv for atomic update.
|
* Makefile.in (*.tab.c): Use mv for atomic update.
|
||||||
|
|
|
@ -255,7 +255,8 @@ elf_symtab_read (abfd, addr, objfile)
|
||||||
if ((sym -> flags & (BSF_GLOBAL | BSF_WEAK))
|
if ((sym -> flags & (BSF_GLOBAL | BSF_WEAK))
|
||||||
&& (sym -> section != NULL))
|
&& (sym -> section != NULL))
|
||||||
{
|
{
|
||||||
symaddr = sym -> value;
|
/* Bfd symbols are section relative. */
|
||||||
|
symaddr = sym -> value + sym -> section -> vma;
|
||||||
/* Relocate all non-absolute symbols by base address. */
|
/* Relocate all non-absolute symbols by base address. */
|
||||||
if (sym -> section != &bfd_abs_section)
|
if (sym -> section != &bfd_abs_section)
|
||||||
symaddr += addr;
|
symaddr += addr;
|
||||||
|
@ -343,7 +344,8 @@ elf_symtab_read (abfd, addr, objfile)
|
||||||
if (sectinfo->sections[index])
|
if (sectinfo->sections[index])
|
||||||
complain (§ion_info_dup_complaint, sectinfo->filename);
|
complain (§ion_info_dup_complaint, sectinfo->filename);
|
||||||
|
|
||||||
symaddr = sym -> value;
|
/* Bfd symbols are section relative. */
|
||||||
|
symaddr = sym -> value + sym -> section -> vma;
|
||||||
/* Relocate all non-absolute symbols by base address. */
|
/* Relocate all non-absolute symbols by base address. */
|
||||||
if (sym -> section != &bfd_abs_section)
|
if (sym -> section != &bfd_abs_section)
|
||||||
symaddr += addr;
|
symaddr += addr;
|
||||||
|
|
128
gdb/solib.c
128
gdb/solib.c
|
@ -45,17 +45,26 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||||
|
|
||||||
#define MAX_PATH_SIZE 256 /* FIXME: Should be dynamic */
|
#define MAX_PATH_SIZE 256 /* FIXME: Should be dynamic */
|
||||||
|
|
||||||
/* On SVR4 systems, for the initial implementation, use main() as the
|
/* On SVR4 systems, for the initial implementation, use some runtime startup
|
||||||
"startup mapping complete" breakpoint address. The models for SunOS
|
symbol as the "startup mapping complete" breakpoint address. The models
|
||||||
and SVR4 dynamic linking debugger support are different in that SunOS
|
for SunOS and SVR4 dynamic linking debugger support are different in that
|
||||||
hits one breakpoint when all mapping is complete while using the SVR4
|
SunOS hits one breakpoint when all mapping is complete while using the SVR4
|
||||||
debugger support takes two breakpoint hits for each file mapped, and
|
debugger support takes two breakpoint hits for each file mapped, and
|
||||||
there is no way to know when the "last" one is hit. Both these
|
there is no way to know when the "last" one is hit. Both these
|
||||||
mechanisms should be tied to a "breakpoint service routine" that
|
mechanisms should be tied to a "breakpoint service routine" that
|
||||||
gets automatically executed whenever one of the breakpoints indicating
|
gets automatically executed whenever one of the breakpoints indicating
|
||||||
a change in mapping is hit. This is a future enhancement. (FIXME) */
|
a change in mapping is hit. This is a future enhancement. (FIXME) */
|
||||||
|
|
||||||
#define BKPT_AT_MAIN 1
|
#define BKPT_AT_SYMBOL 1
|
||||||
|
|
||||||
|
static char *bkpt_names[] = {
|
||||||
|
#ifdef SOLIB_BKPT_NAME
|
||||||
|
SOLIB_BKPT_NAME, /* Prefer configured name if it exists. */
|
||||||
|
#endif
|
||||||
|
"_start",
|
||||||
|
"main",
|
||||||
|
NULL
|
||||||
|
};
|
||||||
|
|
||||||
/* local data declarations */
|
/* local data declarations */
|
||||||
|
|
||||||
|
@ -94,6 +103,7 @@ struct so_list {
|
||||||
struct section_table *sections;
|
struct section_table *sections;
|
||||||
struct section_table *sections_end;
|
struct section_table *sections_end;
|
||||||
struct section_table *textsection;
|
struct section_table *textsection;
|
||||||
|
bfd *bfd;
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct so_list *so_list_head; /* List of known shared objects */
|
static struct so_list *so_list_head; /* List of known shared objects */
|
||||||
|
@ -202,7 +212,7 @@ solib_map_sections (so)
|
||||||
{
|
{
|
||||||
perror_with_name (filename);
|
perror_with_name (filename);
|
||||||
}
|
}
|
||||||
make_cleanup (free, scratch_pathname);
|
/* Leave scratch_pathname allocated. bfd->name will point to it. */
|
||||||
|
|
||||||
abfd = bfd_fdopenr (scratch_pathname, NULL, scratch_chan);
|
abfd = bfd_fdopenr (scratch_pathname, NULL, scratch_chan);
|
||||||
if (!abfd)
|
if (!abfd)
|
||||||
|
@ -211,8 +221,9 @@ solib_map_sections (so)
|
||||||
error ("Could not open `%s' as an executable file: %s",
|
error ("Could not open `%s' as an executable file: %s",
|
||||||
scratch_pathname, bfd_errmsg (bfd_error));
|
scratch_pathname, bfd_errmsg (bfd_error));
|
||||||
}
|
}
|
||||||
|
/* Leave bfd open, core_xfer_memory and "info files" need it. */
|
||||||
make_cleanup (bfd_close, abfd); /* Zap bfd, close scratch_chan. */
|
so -> bfd = abfd;
|
||||||
|
abfd -> cacheable = true;
|
||||||
|
|
||||||
if (!bfd_check_format (abfd, bfd_object))
|
if (!bfd_check_format (abfd, bfd_object))
|
||||||
{
|
{
|
||||||
|
@ -222,7 +233,7 @@ solib_map_sections (so)
|
||||||
if (build_section_table (abfd, &so -> sections, &so -> sections_end))
|
if (build_section_table (abfd, &so -> sections, &so -> sections_end))
|
||||||
{
|
{
|
||||||
error ("Can't find the file sections in `%s': %s",
|
error ("Can't find the file sections in `%s': %s",
|
||||||
exec_bfd -> filename, bfd_errmsg (bfd_error));
|
bfd_get_filename (exec_bfd), bfd_errmsg (bfd_error));
|
||||||
}
|
}
|
||||||
|
|
||||||
for (p = so -> sections; p < so -> sections_end; p++)
|
for (p = so -> sections; p < so -> sections_end; p++)
|
||||||
|
@ -363,7 +374,8 @@ bfd_lookup_symbol (abfd, symname)
|
||||||
sym = *symbol_table++;
|
sym = *symbol_table++;
|
||||||
if (STREQ (sym -> name, symname))
|
if (STREQ (sym -> name, symname))
|
||||||
{
|
{
|
||||||
symaddr = sym -> value;
|
/* Bfd symbols are section relative. */
|
||||||
|
symaddr = sym -> value + sym -> section -> vma;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -541,6 +553,23 @@ locate_base ()
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
|
||||||
|
LOCAL FUNCTION
|
||||||
|
|
||||||
|
first_link_map_member -- locate first member in dynamic linker's map
|
||||||
|
|
||||||
|
SYNOPSIS
|
||||||
|
|
||||||
|
static struct link_map *first_link_map_member (void)
|
||||||
|
|
||||||
|
DESCRIPTION
|
||||||
|
|
||||||
|
Read in a copy of the first member in the inferior's dynamic
|
||||||
|
link map from the inferior's dynamic linker structures, and return
|
||||||
|
a pointer to the copy in our address space.
|
||||||
|
*/
|
||||||
|
|
||||||
static struct link_map *
|
static struct link_map *
|
||||||
first_link_map_member ()
|
first_link_map_member ()
|
||||||
{
|
{
|
||||||
|
@ -561,6 +590,9 @@ first_link_map_member ()
|
||||||
#else /* SVR4_SHARED_LIBS */
|
#else /* SVR4_SHARED_LIBS */
|
||||||
|
|
||||||
read_memory (debug_base, (char *) &debug_copy, sizeof (struct r_debug));
|
read_memory (debug_base, (char *) &debug_copy, sizeof (struct r_debug));
|
||||||
|
/* FIXME: Perhaps we should validate the info somehow, perhaps by
|
||||||
|
checking r_version for a known version number, or r_state for
|
||||||
|
RT_CONSISTENT. */
|
||||||
lm = debug_copy.r_map;
|
lm = debug_copy.r_map;
|
||||||
|
|
||||||
#endif /* !SVR4_SHARED_LIBS */
|
#endif /* !SVR4_SHARED_LIBS */
|
||||||
|
@ -607,7 +639,7 @@ find_solib (so_list_ptr)
|
||||||
/* We have not already read in the dynamic linking structures
|
/* We have not already read in the dynamic linking structures
|
||||||
from the inferior, lookup the address of the base structure. */
|
from the inferior, lookup the address of the base structure. */
|
||||||
debug_base = locate_base ();
|
debug_base = locate_base ();
|
||||||
if (debug_base > 0)
|
if (debug_base != 0)
|
||||||
{
|
{
|
||||||
/* Read the base structure in and find the address of the first
|
/* Read the base structure in and find the address of the first
|
||||||
link map list member. */
|
link map list member. */
|
||||||
|
@ -724,6 +756,7 @@ solib_add (arg_string, from_tty, target)
|
||||||
{
|
{
|
||||||
if (so -> so_name[0] && re_exec (so -> so_name))
|
if (so -> so_name[0] && re_exec (so -> so_name))
|
||||||
{
|
{
|
||||||
|
so -> from_tty = from_tty;
|
||||||
if (so -> symbols_loaded)
|
if (so -> symbols_loaded)
|
||||||
{
|
{
|
||||||
if (from_tty)
|
if (from_tty)
|
||||||
|
@ -731,14 +764,12 @@ solib_add (arg_string, from_tty, target)
|
||||||
printf ("Symbols already loaded for %s\n", so -> so_name);
|
printf ("Symbols already loaded for %s\n", so -> so_name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else if (catch_errors
|
||||||
|
(symbol_add_stub, (char *) so,
|
||||||
|
"Error while reading shared library symbols:\n"))
|
||||||
{
|
{
|
||||||
catch_errors (symbol_add_stub, (char *) so,
|
|
||||||
"Error while reading shared library symbols:\n");
|
|
||||||
|
|
||||||
special_symbol_handling (so);
|
special_symbol_handling (so);
|
||||||
so -> symbols_loaded = 1;
|
so -> symbols_loaded = 1;
|
||||||
so -> from_tty = from_tty;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -893,6 +924,7 @@ void
|
||||||
clear_solib()
|
clear_solib()
|
||||||
{
|
{
|
||||||
struct so_list *next;
|
struct so_list *next;
|
||||||
|
char *bfd_filename;
|
||||||
|
|
||||||
while (so_list_head)
|
while (so_list_head)
|
||||||
{
|
{
|
||||||
|
@ -900,7 +932,18 @@ clear_solib()
|
||||||
{
|
{
|
||||||
free ((PTR)so_list_head -> sections);
|
free ((PTR)so_list_head -> sections);
|
||||||
}
|
}
|
||||||
|
if (so_list_head -> bfd)
|
||||||
|
{
|
||||||
|
bfd_filename = bfd_get_filename (so_list_head -> bfd);
|
||||||
|
bfd_close (so_list_head -> bfd);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
/* This happens for the executable on SVR4. */
|
||||||
|
bfd_filename = NULL;
|
||||||
|
|
||||||
next = so_list_head -> next;
|
next = so_list_head -> next;
|
||||||
|
if (bfd_filename)
|
||||||
|
free ((PTR)bfd_filename);
|
||||||
free ((PTR)so_list_head);
|
free ((PTR)so_list_head);
|
||||||
so_list_head = next;
|
so_list_head = next;
|
||||||
}
|
}
|
||||||
|
@ -1018,6 +1061,7 @@ DESCRIPTION
|
||||||
static int
|
static int
|
||||||
enable_break ()
|
enable_break ()
|
||||||
{
|
{
|
||||||
|
int success = 0;
|
||||||
|
|
||||||
#ifndef SVR4_SHARED_LIBS
|
#ifndef SVR4_SHARED_LIBS
|
||||||
|
|
||||||
|
@ -1046,31 +1090,37 @@ enable_break ()
|
||||||
/* Write a value of 1 to this member. */
|
/* Write a value of 1 to this member. */
|
||||||
|
|
||||||
in_debugger = 1;
|
in_debugger = 1;
|
||||||
|
|
||||||
write_memory (flag_addr, (char *) &in_debugger, sizeof (in_debugger));
|
write_memory (flag_addr, (char *) &in_debugger, sizeof (in_debugger));
|
||||||
|
success = 1;
|
||||||
|
|
||||||
#else /* SVR4_SHARED_LIBS */
|
#else /* SVR4_SHARED_LIBS */
|
||||||
|
|
||||||
#ifdef BKPT_AT_MAIN
|
#ifdef BKPT_AT_SYMBOL
|
||||||
|
|
||||||
struct minimal_symbol *msymbol;
|
struct minimal_symbol *msymbol;
|
||||||
|
char **bkpt_namep;
|
||||||
|
CORE_ADDR bkpt_addr;
|
||||||
|
|
||||||
msymbol = lookup_minimal_symbol ("main", symfile_objfile);
|
/* Scan through the list of symbols, trying to look up the symbol and
|
||||||
|
set a breakpoint there. Terminate loop when we/if we succeed. */
|
||||||
|
|
||||||
|
breakpoint_addr = 0;
|
||||||
|
for (bkpt_namep = bkpt_names; *bkpt_namep != NULL; bkpt_namep++)
|
||||||
|
{
|
||||||
|
msymbol = lookup_minimal_symbol (*bkpt_namep, symfile_objfile);
|
||||||
if ((msymbol != NULL) && (SYMBOL_VALUE_ADDRESS (msymbol) != 0))
|
if ((msymbol != NULL) && (SYMBOL_VALUE_ADDRESS (msymbol) != 0))
|
||||||
{
|
{
|
||||||
breakpoint_addr = SYMBOL_VALUE_ADDRESS (msymbol);
|
bkpt_addr = SYMBOL_VALUE_ADDRESS (msymbol);
|
||||||
}
|
if (target_insert_breakpoint (bkpt_addr, shadow_contents) == 0)
|
||||||
else
|
|
||||||
{
|
{
|
||||||
return (0);
|
breakpoint_addr = bkpt_addr;
|
||||||
|
success = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (target_insert_breakpoint (breakpoint_addr, shadow_contents) != 0)
|
#else /* !BKPT_AT_SYMBOL */
|
||||||
{
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
|
|
||||||
#else /* !BKPT_AT_MAIN */
|
|
||||||
|
|
||||||
struct symtab_and_line sal;
|
struct symtab_and_line sal;
|
||||||
|
|
||||||
|
@ -1084,12 +1134,13 @@ enable_break ()
|
||||||
deal with hitting these breakpoints. (FIXME). */
|
deal with hitting these breakpoints. (FIXME). */
|
||||||
|
|
||||||
warning ("'%s': line %d: missing SVR4 support code", __FILE__, __LINE__);
|
warning ("'%s': line %d: missing SVR4 support code", __FILE__, __LINE__);
|
||||||
|
success = 1;
|
||||||
|
|
||||||
#endif /* BKPT_AT_MAIN */
|
#endif /* BKPT_AT_SYMBOL */
|
||||||
|
|
||||||
#endif /* !SVR4_SHARED_LIBS */
|
#endif /* !SVR4_SHARED_LIBS */
|
||||||
|
|
||||||
return (1);
|
return (success);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -1109,6 +1160,21 @@ DESCRIPTION
|
||||||
point, this function gets called via expansion of the macro
|
point, this function gets called via expansion of the macro
|
||||||
SOLIB_CREATE_INFERIOR_HOOK.
|
SOLIB_CREATE_INFERIOR_HOOK.
|
||||||
|
|
||||||
|
For SunOS executables, this first instruction is typically the
|
||||||
|
one at "_start", or a similar text label, regardless of whether
|
||||||
|
the executable is statically or dynamically linked. The runtime
|
||||||
|
startup code takes care of dynamically linking in any shared
|
||||||
|
libraries, once gdb allows the inferior to continue.
|
||||||
|
|
||||||
|
For SVR4 executables, this first instruction is either the first
|
||||||
|
instruction in the dynamic linker (for dynamically linked
|
||||||
|
executables) or the instruction at "start" for statically linked
|
||||||
|
executables. For dynamically linked executables, the system
|
||||||
|
first exec's /lib/libc.so.N, which contains the dynamic linker,
|
||||||
|
and starts it running. The dynamic linker maps in any needed
|
||||||
|
shared libraries, maps in the actual user executable, and then
|
||||||
|
jumps to "start" in the user executable.
|
||||||
|
|
||||||
For both SunOS shared libraries, and SVR4 shared libraries, we
|
For both SunOS shared libraries, and SVR4 shared libraries, we
|
||||||
can arrange to cooperate with the dynamic linker to discover the
|
can arrange to cooperate with the dynamic linker to discover the
|
||||||
names of shared libraries that are dynamically linked, and the
|
names of shared libraries that are dynamically linked, and the
|
||||||
|
|
Loading…
Add table
Reference in a new issue