From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 1036 invoked by alias); 20 Jun 2007 06:58:22 -0000 Received: (qmail 1026 invoked by uid 22791); 20 Jun 2007 06:58:19 -0000 X-Spam-Check-By: sourceware.org Received: from mtagate5.de.ibm.com (HELO mtagate5.de.ibm.com) (195.212.29.154) by sourceware.org (qpsmtpd/0.31) with ESMTP; Wed, 20 Jun 2007 06:58:13 +0000 Received: from d12nrmr1607.megacenter.de.ibm.com (d12nrmr1607.megacenter.de.ibm.com [9.149.167.49]) by mtagate5.de.ibm.com (8.13.8/8.13.8) with ESMTP id l5K6wA8l271428 for ; Wed, 20 Jun 2007 06:58:10 GMT Received: from d12av02.megacenter.de.ibm.com (d12av02.megacenter.de.ibm.com [9.149.165.228]) by d12nrmr1607.megacenter.de.ibm.com (8.13.8/8.13.8/NCO v8.3) with ESMTP id l5K6wADI3993796 for ; Wed, 20 Jun 2007 08:58:10 +0200 Received: from d12av02.megacenter.de.ibm.com (loopback [127.0.0.1]) by d12av02.megacenter.de.ibm.com (8.12.11.20060308/8.13.3) with ESMTP id l5K6w9Fj003612 for ; Wed, 20 Jun 2007 08:58:10 +0200 Received: from [9.152.248.39] (dyn-9-152-248-39.boeblingen.de.ibm.com [9.152.248.39]) by d12av02.megacenter.de.ibm.com (8.12.11.20060308/8.12.11) with ESMTP id l5K6w78F003578 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Wed, 20 Jun 2007 08:58:09 +0200 Message-ID: <4678CFAD.2030509@de.ibm.com> Date: Wed, 20 Jun 2007 06:58:00 -0000 From: Markus Deuling User-Agent: Thunderbird 1.5.0.10 (X11/20070301) MIME-Version: 1.0 To: GDB Patches , Ulrich Weigand CC: Daniel Jacobowitz , Kevin Buettner Subject: [PING 2] [rfc]: Framework for looking up multiply defined global symbols in shared libraries References: <200705312124.l4VLO1qU019395@d12av02.megacenter.de.ibm.com> <4664DC23.70903@de.ibm.com> In-Reply-To: <4664DC23.70903@de.ibm.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2007-06/txt/msg00386.txt.bz2 > Ulrich Weigand wrote: >> Markus Deuling wrote: >> >> It looks like this duplicates a whole bunch of code from elf_locate_base. >> Maybe we should extract a helper routine that retrieves a given DT_ tag >> from the .dynamic section? >> >> >>> +/* Look up OBJFILE to BLOCK. */ >>> + >>> +struct objfile * >>> +lookup_objfile_from_block (const struct block *block) >> >> I guess this could be static now. >> >>> +/* Lookup objfile to a block. */ >>> +extern struct objfile * >>> +lookup_objfile_from_block (const struct block *block); >> >> If we make it static, this should go away. Otherwise, the function name >> should again not start in the first column for the prototype. >> >> >> Bye, >> Ulrich >> > > thank you very much for your input. I reworked the patch. There is now a > helper routine to extract DT_ tags from > .dynamic section called scan_dyntag. Testsuite on x86 showed no regression. > > Is this ok to commit? Hello, it would be great to have that one in for 6.7 :-) Is this ok ? > > ChangeLog: > > * cp-namespace.c (lookup_symbol_file): Add block to > lookup_symbol_global call. > * Makefile.in (solist_h): Add dependency on symtab header. > (solib.o): Add dependency on objfiles header. > (symtab.o): Add dependency on solist header. > * solib.c (solib_global_lookup): New function. > * solib-svr4.c (scan_dyntag): Likewise. > (elf_locate_base): Call helper routine scan_dyntag. > (elf_lookup_lib_symbol): New function. > (_initialize_svr4_solib): Add elf_lookup_lib_symbol to svr4_so_ops. > * solist.h (symtab.h): New include. > (lookup_lib_global_symbol): New prototype. > (solib_global_lookup): Likewise. > * symtab.c: New include solist.h. > (lookup_objfile_from_block): New function. > (lookup_global_symbol_from_objfile): New function. > (basic_lookup_symbol_nonlocal): Add block to lookup_symbol_global call. > (lookup_symbol_global): Call library-specific lookup procedure. > * symtab.h (lookup_global_symbol_from_objfile): New prototype. > * gdb.base/libmd.c: New file (testcase multiple symbol lookup). > * gdb.base/libmd.h: Likewise. > * gdb.base/solib_symbol.c: Likewise. > * gdb.base/solib_symbol.exp: Likewise. > > > ------------------------------------------------------------------------ > > diff -urN src/gdb/cp-namespace.c dev/gdb/cp-namespace.c > --- src/gdb/cp-namespace.c 2007-01-09 18:58:50.000000000 +0100 > +++ dev/gdb/cp-namespace.c 2007-06-05 05:30:07.000000000 +0200 > @@ -491,7 +491,7 @@ > } > else > { > - sym = lookup_symbol_global (name, linkage_name, domain, symtab); > + sym = lookup_symbol_global (name, linkage_name, block, domain, symtab); > } > > if (sym != NULL) > diff -urN src/gdb/Makefile.in dev/gdb/Makefile.in > --- src/gdb/Makefile.in 2007-05-29 08:01:14.000000000 +0200 > +++ dev/gdb/Makefile.in 2007-06-05 05:30:07.000000000 +0200 > @@ -797,7 +797,7 @@ > solib_pa64_h = solib-pa64.h > solib_som_h = solib-som.h > solib_svr4_h = solib-svr4.h > -solist_h = solist.h > +solist_h = solist.h $(symtab_h) > source_h = source.h > sparc64_tdep_h = sparc64-tdep.h $(sparc_tdep_h) > sparc_nat_h = sparc-nat.h > @@ -2568,7 +2568,7 @@ > $(objfiles_h) $(exceptions_h) $(gdbcore_h) $(command_h) $(target_h) \ > $(frame_h) $(gdb_regex_h) $(inferior_h) $(environ_h) $(language_h) \ > $(gdbcmd_h) $(completer_h) $(filenames_h) $(exec_h) $(solist_h) \ > - $(observer_h) $(readline_h) > + $(observer_h) $(readline_h) $(objfiles_h) > solib-frv.o: solib-frv.c $(defs_h) $(gdb_string_h) $(inferior_h) \ > $(gdbcore_h) $(solist_h) $(frv_tdep_h) $(objfiles_h) $(symtab_h) \ > $(language_h) $(command_h) $(gdbcmd_h) $(elf_frv_h) $(solib_h) > @@ -2715,7 +2715,8 @@ > $(language_h) $(demangle_h) $(inferior_h) $(linespec_h) $(source_h) \ > $(filenames_h) $(objc_lang_h) $(ada_lang_h) $(hashtab_h) \ > $(gdb_obstack_h) $(block_h) $(dictionary_h) $(gdb_string_h) \ > - $(gdb_stat_h) $(cp_abi_h) $(observer_h) $(gdb_assert_h) > + $(gdb_stat_h) $(cp_abi_h) $(observer_h) $(gdb_assert_h) \ > + $(solist_h) > target.o: target.c $(defs_h) $(gdb_string_h) $(target_h) $(gdbcmd_h) \ > $(symtab_h) $(inferior_h) $(bfd_h) $(symfile_h) $(objfiles_h) \ > $(gdb_wait_h) $(dcache_h) $(regcache_h) $(gdb_assert_h) $(gdbcore_h) \ > diff -urN src/gdb/solib.c dev/gdb/solib.c > --- src/gdb/solib.c 2007-05-16 16:07:56.000000000 +0200 > +++ dev/gdb/solib.c 2007-06-05 05:30:07.000000000 +0200 > @@ -955,6 +955,24 @@ > } > > > +/* Handler for library-specific lookup of global symbol NAME in OBJFILE. Call > + the library-specific handler if it is installed for the current target. */ > + > +struct symbol * > +solib_global_lookup (const struct objfile *objfile, > + const char *name, > + const char *linkage_name, > + const domain_enum domain, > + struct symtab **symtab) > +{ > + if (current_target_so_ops->lookup_lib_global_symbol != NULL) > + return current_target_so_ops->lookup_lib_global_symbol (objfile, > + name, linkage_name, domain, symtab); > + > + return NULL; > +} > + > + > extern initialize_file_ftype _initialize_solib; /* -Wmissing-prototypes */ > > void > diff -urN src/gdb/solib-svr4.c dev/gdb/solib-svr4.c > --- src/gdb/solib-svr4.c 2007-06-04 05:41:43.000000000 +0200 > +++ dev/gdb/solib-svr4.c 2007-06-05 05:35:58.000000000 +0200 > @@ -354,6 +354,76 @@ > return symaddr; > } > > +/* Scan for DYNTAG in .dynamic section of ABFD. If DYNTAG is found 1 is > + returned and the corresponding PTR is set. */ > + > +static int > +scan_dyntag (int dyntag, bfd *abfd, CORE_ADDR *ptr) > +{ > + int arch_size, step, sect_size; > + long dyn_tag; > + CORE_ADDR dyn_ptr, dyn_addr; > + gdb_byte *bufend, *buf; > + Elf32_External_Dyn *x_dynp_32; > + Elf64_External_Dyn *x_dynp_64; > + struct bfd_section *sect; > + > + if (abfd == NULL) > + return 0; > + arch_size = bfd_get_arch_size (abfd); > + if (arch_size == -1) > + return 0; > + > + /* Find the start address of the .dynamic section. */ > + sect = bfd_get_section_by_name (abfd, ".dynamic"); > + if (sect == NULL) > + return 0; > + dyn_addr = bfd_section_vma (abfd, sect); > + > + /* Read in .dynamic section, silently ignore errors. */ > + sect_size = bfd_section_size (abfd, sect); > + buf = alloca (sect_size); > + if (target_read_memory (dyn_addr, buf, sect_size)) > + { > + /* If target_read_memory fails, try reading the BFD file. */ > + if (!bfd_get_section_contents (abfd, sect, > + buf, 0, sect_size)) > + return 0; > + } > + > + /* Iterate over BUF and scan for DYNTAG. If found, set PTR and return. */ > + step = (arch_size == 32) ? sizeof (Elf32_External_Dyn) > + : sizeof (Elf64_External_Dyn); > + for (bufend = buf + sect_size; > + buf < bufend; > + buf += step) > + { > + if (arch_size == 32) > + { > + x_dynp_32 = (Elf32_External_Dyn *) buf; > + dyn_tag = bfd_h_get_32 (abfd, (bfd_byte *) x_dynp_32->d_tag); > + dyn_ptr = bfd_h_get_32 (abfd, (bfd_byte *) x_dynp_32->d_un.d_ptr); > + } > + else > + { > + x_dynp_64 = (Elf64_External_Dyn *) buf; > + dyn_tag = bfd_h_get_64 (abfd, (bfd_byte *) x_dynp_64->d_tag); > + dyn_ptr = bfd_h_get_64 (abfd, (bfd_byte *) x_dynp_64->d_un.d_ptr); > + } > + if (dyn_tag == DT_NULL) > + return 0; > + if (dyn_tag == dyntag) > + { > + if (ptr) > + *ptr = dyn_ptr; > + return 1; > + } > + } > + > + return 0; > +} > + > + > /* > > LOCAL FUNCTION > @@ -381,114 +451,31 @@ > static CORE_ADDR > elf_locate_base (void) > { > - struct bfd_section *dyninfo_sect; > - int dyninfo_sect_size; > - CORE_ADDR dyninfo_addr; > - gdb_byte *buf; > - gdb_byte *bufend; > - int arch_size; > + struct minimal_symbol *msymbol; > + CORE_ADDR dyn_ptr; > > - /* Find the start address of the .dynamic section. */ > - dyninfo_sect = bfd_get_section_by_name (exec_bfd, ".dynamic"); > - if (dyninfo_sect == NULL) > + /* Find DT_DEBUG. */ > + if (scan_dyntag (DT_DEBUG, exec_bfd, &dyn_ptr)) > + return dyn_ptr; > + > + /* Find DT_MIPS_RLD_MAP. */ > + if (scan_dyntag (DT_MIPS_RLD_MAP, exec_bfd, &dyn_ptr)) > { > - /* This may be a static executable. Look for the symbol > - conventionally named _r_debug, as a last resort. */ > - struct minimal_symbol *msymbol; > - > - msymbol = lookup_minimal_symbol ("_r_debug", NULL, symfile_objfile); > - if (msymbol != NULL) > - return SYMBOL_VALUE_ADDRESS (msymbol); > - else > + gdb_byte *pbuf; > + int pbuf_size = TYPE_LENGTH (builtin_type_void_data_ptr); > + pbuf = alloca (pbuf_size); > + /* DT_MIPS_RLD_MAP contains a pointer to the address > + of the dynamic link structure. */ > + if (target_read_memory (dyn_ptr, pbuf, pbuf_size)) > return 0; > + return extract_typed_address (pbuf, builtin_type_void_data_ptr); > } > > - dyninfo_addr = bfd_section_vma (exec_bfd, dyninfo_sect); > - > - /* Read in .dynamic section, silently ignore errors. */ > - dyninfo_sect_size = bfd_section_size (exec_bfd, dyninfo_sect); > - buf = alloca (dyninfo_sect_size); > - if (target_read_memory (dyninfo_addr, buf, dyninfo_sect_size)) > - return 0; > - > - /* Find the DT_DEBUG entry in the the .dynamic section. > - For mips elf we look for DT_MIPS_RLD_MAP, mips elf apparently has > - no DT_DEBUG entries. */ > - > - arch_size = bfd_get_arch_size (exec_bfd); > - if (arch_size == -1) /* failure */ > - return 0; > - > - if (arch_size == 32) > - { /* 32-bit elf */ > - for (bufend = buf + dyninfo_sect_size; > - buf < bufend; > - buf += sizeof (Elf32_External_Dyn)) > - { > - Elf32_External_Dyn *x_dynp = (Elf32_External_Dyn *) buf; > - long dyn_tag; > - CORE_ADDR dyn_ptr; > - > - dyn_tag = bfd_h_get_32 (exec_bfd, (bfd_byte *) x_dynp->d_tag); > - if (dyn_tag == DT_NULL) > - break; > - else if (dyn_tag == DT_DEBUG) > - { > - dyn_ptr = bfd_h_get_32 (exec_bfd, > - (bfd_byte *) x_dynp->d_un.d_ptr); > - return dyn_ptr; > - } > - else if (dyn_tag == DT_MIPS_RLD_MAP) > - { > - gdb_byte *pbuf; > - int pbuf_size = TYPE_LENGTH (builtin_type_void_data_ptr); > - > - pbuf = alloca (pbuf_size); > - /* DT_MIPS_RLD_MAP contains a pointer to the address > - of the dynamic link structure. */ > - dyn_ptr = bfd_h_get_32 (exec_bfd, > - (bfd_byte *) x_dynp->d_un.d_ptr); > - if (target_read_memory (dyn_ptr, pbuf, pbuf_size)) > - return 0; > - return extract_typed_address (pbuf, builtin_type_void_data_ptr); > - } > - } > - } > - else /* 64-bit elf */ > - { > - for (bufend = buf + dyninfo_sect_size; > - buf < bufend; > - buf += sizeof (Elf64_External_Dyn)) > - { > - Elf64_External_Dyn *x_dynp = (Elf64_External_Dyn *) buf; > - long dyn_tag; > - CORE_ADDR dyn_ptr; > - > - dyn_tag = bfd_h_get_64 (exec_bfd, (bfd_byte *) x_dynp->d_tag); > - if (dyn_tag == DT_NULL) > - break; > - else if (dyn_tag == DT_DEBUG) > - { > - dyn_ptr = bfd_h_get_64 (exec_bfd, > - (bfd_byte *) x_dynp->d_un.d_ptr); > - return dyn_ptr; > - } > - else if (dyn_tag == DT_MIPS_RLD_MAP) > - { > - gdb_byte *pbuf; > - int pbuf_size = TYPE_LENGTH (builtin_type_void_data_ptr); > - > - pbuf = alloca (pbuf_size); > - /* DT_MIPS_RLD_MAP contains a pointer to the address > - of the dynamic link structure. */ > - dyn_ptr = bfd_h_get_64 (exec_bfd, > - (bfd_byte *) x_dynp->d_un.d_ptr); > - if (target_read_memory (dyn_ptr, pbuf, pbuf_size)) > - return 0; > - return extract_typed_address (pbuf, builtin_type_void_data_ptr); > - } > - } > - } > + /* This may be a static executable. Look for the symbol > + conventionally named _r_debug, as a last resort. */ > + msymbol = lookup_minimal_symbol ("_r_debug", NULL, symfile_objfile); > + if (msymbol != NULL) > + return SYMBOL_VALUE_ADDRESS (msymbol); > > /* DT_DEBUG entry not found. */ > return 0; > @@ -1554,6 +1541,24 @@ > > struct target_so_ops svr4_so_ops; > > +/* Lookup global symbol for ELF DSOs linked with -Bsymbolic. Those DSOs have a > + different rule for symbol lookup. The lookup begins here in the DSO, not in > + the main executable. */ > + > +static struct symbol * > +elf_lookup_lib_symbol (const struct objfile *objfile, > + const char *name, > + const char *linkage_name, > + const domain_enum domain, struct symtab **symtab) > +{ > + if (objfile->obfd == NULL > + || scan_dyntag (DT_SYMBOLIC, objfile->obfd, NULL) != 1) > + return NULL; > + > + return lookup_global_symbol_from_objfile > + (objfile, name, linkage_name, domain, symtab); > +} > + > extern initialize_file_ftype _initialize_svr4_solib; /* -Wmissing-prototypes */ > > void > @@ -1569,6 +1574,7 @@ > svr4_so_ops.current_sos = svr4_current_sos; > svr4_so_ops.open_symbol_file_object = open_symbol_file_object; > svr4_so_ops.in_dynsym_resolve_code = svr4_in_dynsym_resolve_code; > + svr4_so_ops.lookup_lib_global_symbol = elf_lookup_lib_symbol; > > /* FIXME: Don't do this here. *_gdbarch_init() should set so_ops. */ > current_target_so_ops = &svr4_so_ops; > diff -urN src/gdb/solist.h dev/gdb/solist.h > --- src/gdb/solist.h 2007-01-09 18:58:58.000000000 +0100 > +++ dev/gdb/solist.h 2007-06-05 05:30:07.000000000 +0200 > @@ -23,6 +23,8 @@ > #define SOLIST_H > > #define SO_NAME_MAX_PATH_SIZE 512 /* FIXME: Should be dynamic */ > +/* For domain_enum domain. */ > +#include "symtab.h" > > /* Forward declaration for target specific link map information. This > struct is opaque to all but the target specific file. */ > @@ -103,7 +105,14 @@ > Convenience function for remote debuggers finding host libs. */ > int (*find_and_open_solib) (char *soname, > unsigned o_flags, char **temp_pathname); > - > + > + /* Hook for looking up global symbols in a library-specific way. */ > + struct symbol * (*lookup_lib_global_symbol) (const struct objfile *objfile, > + const char *name, > + const char *linkage_name, > + const domain_enum domain, > + struct symtab **symtab); > + > }; > > /* Free the memory associated with a (so_list *). */ > @@ -125,4 +134,11 @@ > #define TARGET_SO_IN_DYNSYM_RESOLVE_CODE \ > (current_target_so_ops->in_dynsym_resolve_code) > > +/* Handler for library-specific global symbol lookup in solib.c. */ > +struct symbol *solib_global_lookup (const struct objfile *objfile, > + const char *name, > + const char *linkage_name, > + const domain_enum domain, > + struct symtab **symtab); > + > #endif > diff -urN src/gdb/symtab.c dev/gdb/symtab.c > --- src/gdb/symtab.c 2007-04-17 17:07:21.000000000 +0200 > +++ dev/gdb/symtab.c 2007-06-05 05:30:07.000000000 +0200 > @@ -57,6 +57,7 @@ > #include "cp-abi.h" > #include "observer.h" > #include "gdb_assert.h" > +#include "solist.h" > > /* Prototypes for local functions */ > > @@ -1265,6 +1266,26 @@ > return NULL; > } > > +/* Look up OBJFILE to BLOCK. */ > + > +static struct objfile * > +lookup_objfile_from_block (const struct block *block) > +{ > + struct objfile *obj; > + struct symtab *s; > + > + if (block == NULL) > + return NULL; > + > + block = block_global_block (block); > + /* Go through SYMTABS. */ > + ALL_SYMTABS (obj, s) > + if (block == BLOCKVECTOR_BLOCK (BLOCKVECTOR (s), GLOBAL_BLOCK)) > + return obj; > + > + return NULL; > +} > + > /* Look up a symbol in a block; if found, locate its symtab, fixup the > symbol, and set block_found appropriately. */ > > @@ -1306,6 +1327,57 @@ > return NULL; > } > > +/* Check all global symbols in OBJFILE in symtabs and > + psymtabs. */ > + > +struct symbol * > +lookup_global_symbol_from_objfile (const struct objfile *objfile, > + const char *name, > + const char *linkage_name, > + const domain_enum domain, > + struct symtab **symtab) > +{ > + struct symbol *sym; > + struct blockvector *bv; > + const struct block *block; > + struct symtab *s; > + struct partial_symtab *ps; > + > + /* Go through symtabs. */ > + ALL_OBJFILE_SYMTABS (objfile, s) > + { > + bv = BLOCKVECTOR (s); > + block = BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK); > + sym = lookup_block_symbol (block, name, linkage_name, domain); > + if (sym) > + { > + block_found = block; > + if (symtab != NULL) > + *symtab = s; > + return fixup_symbol_section (sym, (struct objfile *)objfile); > + } > + } > + > + /* Now go through psymtabs. */ > + ALL_OBJFILE_PSYMTABS (objfile, ps) > + { > + if (!ps->readin > + && lookup_partial_symbol (ps, name, linkage_name, > + 1, domain)) > + { > + s = PSYMTAB_TO_SYMTAB (ps); > + bv = BLOCKVECTOR (s); > + block = BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK); > + sym = lookup_block_symbol (block, name, linkage_name, domain); > + if (symtab != NULL) > + *symtab = s; > + return fixup_symbol_section (sym, (struct objfile *)objfile); > + } > + } > + > + return NULL; > +} > + > /* Check to see if the symbol is defined in one of the symtabs. > BLOCK_INDEX should be either GLOBAL_BLOCK or STATIC_BLOCK, > depending on whether or not we want to search global symbols or > @@ -1571,7 +1643,7 @@ > if (sym != NULL) > return sym; > > - return lookup_symbol_global (name, linkage_name, domain, symtab); > + return lookup_symbol_global (name, linkage_name, block, domain, symtab); > } > > /* Lookup a symbol in the static block associated to BLOCK, if there > @@ -1599,10 +1671,19 @@ > struct symbol * > lookup_symbol_global (const char *name, > const char *linkage_name, > + const struct block *block, > const domain_enum domain, > struct symtab **symtab) > { > - struct symbol *sym; > + struct symbol *sym = NULL; > + struct objfile *objfile = NULL; > + > + /* Call library-specific lookup procedure. */ > + objfile = lookup_objfile_from_block (block); > + if (objfile != NULL) > + sym = solib_global_lookup (objfile, name, linkage_name, domain, symtab); > + if (sym != NULL) > + return sym; > > sym = lookup_symbol_aux_symtabs (GLOBAL_BLOCK, name, linkage_name, > domain, symtab); > diff -urN src/gdb/symtab.h dev/gdb/symtab.h > --- src/gdb/symtab.h 2007-03-28 02:12:15.000000000 +0200 > +++ dev/gdb/symtab.h 2007-06-05 05:30:07.000000000 +0200 > @@ -1050,6 +1050,7 @@ > > extern struct symbol *lookup_symbol_global (const char *name, > const char *linkage_name, > + const struct block *block, > const domain_enum domain, > struct symtab **symtab); > > @@ -1403,4 +1404,12 @@ > Defined in symtab.c, used in hppa-tdep.c. */ > extern int deprecated_hp_som_som_object_present; > > +/* Check global symbols in objfile. */ > +struct symbol *lookup_global_symbol_from_objfile (const struct objfile *objfile, > + const char *name, > + const char *linkage_name, > + const domain_enum domain, > + struct symtab **symtab); > + > + > #endif /* !defined(SYMTAB_H) */ > diff -urN src/gdb/testsuite/gdb.base/libmd.c dev/gdb/testsuite/gdb.base/libmd.c > --- src/gdb/testsuite/gdb.base/libmd.c 1970-01-01 01:00:00.000000000 +0100 > +++ dev/gdb/testsuite/gdb.base/libmd.c 2007-06-05 05:30:07.000000000 +0200 > @@ -0,0 +1,36 @@ > +/* Copyright 2007 Free Software Foundation, Inc. > + This program is free software; you can redistribute it and/or modify > + it under the terms of the GNU General Public License as published by > + the Free Software Foundation; either version 2 of the License, or > + (at your option) any later version. > + > + This program is distributed in the hope that it will be useful, > + but WITHOUT ANY WARRANTY; without even the implied warranty of > + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > + GNU General Public License for more details. > + > + You should have received a copy of the GNU General Public License > + along with this program; if not, write to the Free Software > + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. > + > + Contributed by Markus Deuling . > +*/ > +extern void foo(); > +#include > +#include "libmd.h" > + > +void foo2 (); > + > +void > +foo () > +{ > + printf ("foo in lib\n"); > + return; > +} > + > +void > +foo2() > +{ > + printf ("foo2 in lib\n"); > + return; > +} > diff -urN src/gdb/testsuite/gdb.base/libmd.h dev/gdb/testsuite/gdb.base/libmd.h > --- src/gdb/testsuite/gdb.base/libmd.h 1970-01-01 01:00:00.000000000 +0100 > +++ dev/gdb/testsuite/gdb.base/libmd.h 2007-06-05 05:30:07.000000000 +0200 > @@ -0,0 +1,18 @@ > +/* Copyright 2007 Free Software Foundation, Inc. > + This program is free software; you can redistribute it and/or modify > + it under the terms of the GNU General Public License as published by > + the Free Software Foundation; either version 2 of the License, or > + (at your option) any later version. > + > + This program is distributed in the hope that it will be useful, > + but WITHOUT ANY WARRANTY; without even the implied warranty of > + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > + GNU General Public License for more details. > + > + You should have received a copy of the GNU General Public License > + along with this program; if not, write to the Free Software > + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. > + > + Contributed by Markus Deuling . > +*/ > +extern void foo(); > diff -urN src/gdb/testsuite/gdb.base/solib_symbol.c dev/gdb/testsuite/gdb.base/solib_symbol.c > --- src/gdb/testsuite/gdb.base/solib_symbol.c 1970-01-01 01:00:00.000000000 +0100 > +++ dev/gdb/testsuite/gdb.base/solib_symbol.c 2007-06-05 05:30:07.000000000 +0200 > @@ -0,0 +1,45 @@ > +/* Copyright 2007 Free Software Foundation, Inc. > + This program is free software; you can redistribute it and/or modify > + it under the terms of the GNU General Public License as published by > + the Free Software Foundation; either version 2 of the License, or > + (at your option) any later version. > + > + This program is distributed in the hope that it will be useful, > + but WITHOUT ANY WARRANTY; without even the implied warranty of > + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > + GNU General Public License for more details. > + > + You should have received a copy of the GNU General Public License > + along with this program; if not, write to the Free Software > + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. > + > + Contributed by Markus Deuling . > +*/ > +extern void foo(); > +#include > +#include "libmd.h" > + > +extern void foo(); > +void foo3(); > +void foo2(); > + > +int main () > +{ > + printf ("in main\n"); > + foo (); > + foo3 (); > + return 0; > +} > + > +void foo3() > +{ > + printf ("foo3 in main\n"); > + return; > +} > + > +void foo2() > +{ > + printf ("foo2 in main\n"); > + return; > +} > + > diff -urN src/gdb/testsuite/gdb.base/solib_symbol.exp dev/gdb/testsuite/gdb.base/solib_symbol.exp > --- src/gdb/testsuite/gdb.base/solib_symbol.exp 1970-01-01 01:00:00.000000000 +0100 > +++ dev/gdb/testsuite/gdb.base/solib_symbol.exp 2007-06-05 05:30:07.000000000 +0200 > @@ -0,0 +1,80 @@ > +# Copyright 2007 Free Software Foundation, Inc. > +# This program is free software; you can redistribute it and/or modify > +# it under the terms of the GNU General Public License as published by > +# the Free Software Foundation; either version 2 of the License, or > +# (at your option) any later version. > +# > +# This program is distributed in the hope that it will be useful, > +# but WITHOUT ANY WARRANTY; without even the implied warranty of > +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > +# GNU General Public License for more details. > +# > +# You should have received a copy of the GNU General Public License > +# along with this program; if not, write to the Free Software > +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. > +# > +# Contributed by Markus Deuling . > +# > + > +if {[skip_shlib_tests]} { > + return 0 > +} > + > +# Library file. > +set libname "libmd" > +set srcfile_lib ${srcdir}/${subdir}/${libname}.c > +set binfile_lib ${objdir}/${subdir}/${libname}.so > +set lib_flags [list debug ldflags=-Wl,-Bsymbolic] > +# Binary file. > +set testfile "solib_symbol" > +set srcfile ${srcdir}/${subdir}/${testfile}.c > +set binfile ${objdir}/${subdir}/${testfile} > +set bin_flags [list debug shlib=${binfile_lib}] > + > +if [get_compiler_info ${binfile}] { > + return -1 > +} > + > +if { [gdb_compile_shlib ${srcfile_lib} ${binfile_lib} $lib_flags] != "" > + || [gdb_compile ${srcfile} ${binfile} executable $bin_flags] != "" } { > + untested "Could not compile $binfile_lib or $binfile." > + return -1 > +} > + > +gdb_exit > +gdb_start > +gdb_reinitialize_dir $srcdir/$subdir > +gdb_load ${binfile} > +gdb_load_shlibs $binfile_lib > + > +if ![runto_main] then { > + fail "Can't run to main" > + return 0 > +} > + > +# Set a breakpoint in the binary. > +gdb_test "br foo2" \ > + "Breakpoint.*file.*${srcfile}.*" \ > + "foo2 in main" > + > +delete_breakpoints > + > +# Break in the library. > +gdb_test "br foo" \ > + "" \ > + "foo in libmd" > + > +gdb_test "continue" \ > + "Continuing.*" \ > + "continue" > + > +# This symbol is now looked up in the ELF library. > +gdb_test "br foo2" \ > + "Breakpoint.*file.*${srcfile_lib}.*" \ > + "foo2 in mdlib" > + > +gdb_exit > + > +return 0 > + > + -- Markus Deuling GNU Toolchain for Linux on Cell BE deuling@de.ibm.com