2004-06-09 Andrew Cagney <cagney@gnu.org>
* solib-svr4.c [HANDLE_SVR4_EXEC_EMULATORS]: Delete #ifdef code.
This commit is contained in:
parent
2d62ecc7b6
commit
4b38d6f1a4
@ -1,5 +1,7 @@
|
||||
2004-06-09 Andrew Cagney <cagney@gnu.org>
|
||||
|
||||
* solib-svr4.c [HANDLE_SVR4_EXEC_EMULATORS]: Delete #ifdef code.
|
||||
|
||||
* config/ia64/tm-linux.h (TARGET_ELF64): Delete macro, Update
|
||||
copyright.
|
||||
* config/ia64/tm-aix.h (TARGET_ELF64): Ditto.
|
||||
|
132
gdb/solib-svr4.c
132
gdb/solib-svr4.c
@ -272,133 +272,6 @@ bfd_lookup_symbol (bfd *abfd, char *symname, flagword sect_flags)
|
||||
return symaddr;
|
||||
}
|
||||
|
||||
#ifdef HANDLE_SVR4_EXEC_EMULATORS
|
||||
|
||||
/*
|
||||
Solaris BCP (the part of Solaris which allows it to run SunOS4
|
||||
a.out files) throws in another wrinkle. Solaris does not fill
|
||||
in the usual a.out link map structures when running BCP programs,
|
||||
the only way to get at them is via groping around in the dynamic
|
||||
linker.
|
||||
The dynamic linker and it's structures are located in the shared
|
||||
C library, which gets run as the executable's "interpreter" by
|
||||
the kernel.
|
||||
|
||||
Note that we can assume nothing about the process state at the time
|
||||
we need to find these structures. We may be stopped on the first
|
||||
instruction of the interpreter (C shared library), the first
|
||||
instruction of the executable itself, or somewhere else entirely
|
||||
(if we attached to the process for example).
|
||||
*/
|
||||
|
||||
static char *debug_base_symbols[] =
|
||||
{
|
||||
"r_debug", /* Solaris 2.3 */
|
||||
"_r_debug", /* Solaris 2.1, 2.2 */
|
||||
NULL
|
||||
};
|
||||
|
||||
static int look_for_base (int, CORE_ADDR);
|
||||
|
||||
/*
|
||||
|
||||
LOCAL FUNCTION
|
||||
|
||||
look_for_base -- examine file for each mapped address segment
|
||||
|
||||
SYNOPSYS
|
||||
|
||||
static int look_for_base (int fd, CORE_ADDR baseaddr)
|
||||
|
||||
DESCRIPTION
|
||||
|
||||
This function is passed to proc_iterate_over_mappings, which
|
||||
causes it to get called once for each mapped address space, with
|
||||
an open file descriptor for the file mapped to that space, and the
|
||||
base address of that mapped space.
|
||||
|
||||
Our job is to find the debug base symbol in the file that this
|
||||
fd is open on, if it exists, and if so, initialize the dynamic
|
||||
linker structure base address debug_base.
|
||||
|
||||
Note that this is a computationally expensive proposition, since
|
||||
we basically have to open a bfd on every call, so we specifically
|
||||
avoid opening the exec file.
|
||||
*/
|
||||
|
||||
static int
|
||||
look_for_base (int fd, CORE_ADDR baseaddr)
|
||||
{
|
||||
bfd *interp_bfd;
|
||||
CORE_ADDR address = 0;
|
||||
char **symbolp;
|
||||
|
||||
/* If the fd is -1, then there is no file that corresponds to this
|
||||
mapped memory segment, so skip it. Also, if the fd corresponds
|
||||
to the exec file, skip it as well. */
|
||||
|
||||
if (fd == -1
|
||||
|| (exec_bfd != NULL
|
||||
&& fdmatch (fileno ((FILE *) (exec_bfd->iostream)), fd)))
|
||||
{
|
||||
return (0);
|
||||
}
|
||||
|
||||
/* Try to open whatever random file this fd corresponds to. Note that
|
||||
we have no way currently to find the filename. Don't gripe about
|
||||
any problems we might have, just fail. */
|
||||
|
||||
if ((interp_bfd = bfd_fdopenr ("unnamed", gnutarget, fd)) == NULL)
|
||||
{
|
||||
return (0);
|
||||
}
|
||||
if (!bfd_check_format (interp_bfd, bfd_object))
|
||||
{
|
||||
/* FIXME-leak: on failure, might not free all memory associated with
|
||||
interp_bfd. */
|
||||
bfd_close (interp_bfd);
|
||||
return (0);
|
||||
}
|
||||
|
||||
/* Now try to find our debug base symbol in this file, which we at
|
||||
least know to be a valid ELF executable or shared library. */
|
||||
|
||||
for (symbolp = debug_base_symbols; *symbolp != NULL; symbolp++)
|
||||
{
|
||||
address = bfd_lookup_symbol (interp_bfd, *symbolp, 0);
|
||||
if (address != 0)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (address == 0)
|
||||
{
|
||||
/* FIXME-leak: on failure, might not free all memory associated with
|
||||
interp_bfd. */
|
||||
bfd_close (interp_bfd);
|
||||
return (0);
|
||||
}
|
||||
|
||||
/* Eureka! We found the symbol. But now we may need to relocate it
|
||||
by the base address. If the symbol's value is less than the base
|
||||
address of the shared library, then it hasn't yet been relocated
|
||||
by the dynamic linker, and we have to do it ourself. FIXME: Note
|
||||
that we make the assumption that the first segment that corresponds
|
||||
to the shared library has the base address to which the library
|
||||
was relocated. */
|
||||
|
||||
if (address < baseaddr)
|
||||
{
|
||||
address += baseaddr;
|
||||
}
|
||||
debug_base = address;
|
||||
/* FIXME-leak: on failure, might not free all memory associated with
|
||||
interp_bfd. */
|
||||
bfd_close (interp_bfd);
|
||||
return (1);
|
||||
}
|
||||
#endif /* HANDLE_SVR4_EXEC_EMULATORS */
|
||||
|
||||
/*
|
||||
|
||||
LOCAL FUNCTION
|
||||
@ -579,11 +452,6 @@ locate_base (void)
|
||||
if (exec_bfd != NULL
|
||||
&& bfd_get_flavour (exec_bfd) == bfd_target_elf_flavour)
|
||||
debug_base = elf_locate_base ();
|
||||
#ifdef HANDLE_SVR4_EXEC_EMULATORS
|
||||
/* Try it the hard way for emulated executables. */
|
||||
else if (!ptid_equal (inferior_ptid, null_ptid) && target_has_execution)
|
||||
proc_iterate_over_mappings (look_for_base);
|
||||
#endif
|
||||
}
|
||||
return (debug_base);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user