diff options
author | Jim Blandy <jimb@codesourcery.com> | 2003-08-26 23:35:19 +0000 |
---|---|---|
committer | Jim Blandy <jimb@codesourcery.com> | 2003-08-26 23:35:19 +0000 |
commit | 87f84c9d11a20c3863a13027050d1f9ca1120c06 (patch) | |
tree | 653cb92a3b563f513f1e4c8e0058b9c24be73a6c /gdb/solib-svr4.c | |
parent | 102d615a7c09e7c91c8e44c0850806e6d854138d (diff) | |
download | gdb-87f84c9d11a20c3863a13027050d1f9ca1120c06.zip gdb-87f84c9d11a20c3863a13027050d1f9ca1120c06.tar.gz gdb-87f84c9d11a20c3863a13027050d1f9ca1120c06.tar.bz2 |
* solib-svr4.c (bfd_lookup_symbol): New SECT_FLAGS argument.
(enable_break): Pass SEC_CODE as the SECT_FLAGS argument to
bfd_lookup_symbol, since we only want symbols in code sections.
(look_for_base): Pass zero as the SECT_FLAGS argument to
bfd_lookup_symbol, since we're not concerned about which section
the symbol is in.
Diffstat (limited to 'gdb/solib-svr4.c')
-rw-r--r-- | gdb/solib-svr4.c | 29 |
1 files changed, 22 insertions, 7 deletions
diff --git a/gdb/solib-svr4.c b/gdb/solib-svr4.c index 5ff6ba6..7fda5e4 100644 --- a/gdb/solib-svr4.c +++ b/gdb/solib-svr4.c @@ -177,7 +177,7 @@ static CORE_ADDR breakpoint_addr; /* Address where end bkpt is set */ static int match_main (char *); -static CORE_ADDR bfd_lookup_symbol (bfd *, char *); +static CORE_ADDR bfd_lookup_symbol (bfd *, char *, flagword); /* @@ -187,7 +187,7 @@ static CORE_ADDR bfd_lookup_symbol (bfd *, char *); SYNOPSIS - CORE_ADDR bfd_lookup_symbol (bfd *abfd, char *symname) + CORE_ADDR bfd_lookup_symbol (bfd *abfd, char *symname, flagword sect_flags) DESCRIPTION @@ -196,12 +196,15 @@ static CORE_ADDR bfd_lookup_symbol (bfd *, char *); shared library support to find the address of the debugger interface structures in the shared library. + If SECT_FLAGS is non-zero, only match symbols in sections whose + flags include all those in SECT_FLAGS. + Note that 0 is specifically allowed as an error return (no such symbol). */ static CORE_ADDR -bfd_lookup_symbol (bfd *abfd, char *symname) +bfd_lookup_symbol (bfd *abfd, char *symname, flagword sect_flags) { long storage_needed; asymbol *sym; @@ -222,7 +225,8 @@ bfd_lookup_symbol (bfd *abfd, char *symname) for (i = 0; i < number_of_symbols; i++) { sym = *symbol_table++; - if (STREQ (sym->name, symname)) + if (STREQ (sym->name, symname) + && (sym->section->flags & sect_flags) == sect_flags) { /* Bfd symbols are section relative. */ symaddr = sym->value + sym->section->vma; @@ -249,7 +253,9 @@ bfd_lookup_symbol (bfd *abfd, char *symname) for (i = 0; i < number_of_symbols; i++) { sym = *symbol_table++; - if (STREQ (sym->name, symname)) + + if (STREQ (sym->name, symname) + && (sym->section->flags & sect_flags) == sect_flags) { /* Bfd symbols are section relative. */ symaddr = sym->value + sym->section->vma; @@ -355,7 +361,7 @@ look_for_base (int fd, CORE_ADDR baseaddr) for (symbolp = debug_base_symbols; *symbolp != NULL; symbolp++) { - address = bfd_lookup_symbol (interp_bfd, *symbolp); + address = bfd_lookup_symbol (interp_bfd, *symbolp, 0); if (address != 0) { break; @@ -1060,7 +1066,16 @@ enable_break (void) /* Now try to set a breakpoint in the dynamic linker. */ for (bkpt_namep = solib_break_names; *bkpt_namep != NULL; bkpt_namep++) { - sym_addr = bfd_lookup_symbol (tmp_bfd, *bkpt_namep); + /* On ABI's that use function descriptors, there are usually + two linker symbols associated with each C function: one + pointing at the actual entry point of the machine code, + and one pointing at the function's descriptor. The + latter symbol has the same name as the C function. + + What we're looking for here is the machine code entry + point, so we are only interested in symbols in code + sections. */ + sym_addr = bfd_lookup_symbol (tmp_bfd, *bkpt_namep, SEC_CODE); if (sym_addr != 0) break; } |