Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Markus Deuling <deuling@de.ibm.com>
To: Ulrich Weigand <uweigand@de.ibm.com>
Cc: Markus Deuling <deuling@de.ibm.com>,
	        Joel Brobecker <brobecker@adacore.com>,
	        GDB Patches <gdb-patches@sourceware.org>,
	        Daniel Jacobowitz <drow@false.org>,
	Kevin Buettner <kevinb@redhat.com>,
	        eliz@gnu.org
Subject: Re: [PING 2] [rfc]: Framework for looking up multiply defined global          symbols  in shared libraries
Date: Thu, 28 Jun 2007 18:20:00 -0000	[thread overview]
Message-ID: <4683D468.4090808@de.ibm.com> (raw)
In-Reply-To: <200706281244.l5SCigKr023030@d12av02.megacenter.de.ibm.com>

[-- Attachment #1: Type: text/plain, Size: 2269 bytes --]

Ulrich Weigand wrote:
> Markus Deuling wrote:
> 
>> diff -urN src/gdb/NEWS dev/gdb/NEWS
>> --- src/gdb/NEWS	2007-06-21 19:00:43.000000000 +0200
>> +++ dev/gdb/NEWS	2007-06-26 21:06:05.000000000 +0200
>> @@ -3,6 +3,9 @@
>>  
>>  *** Changes since GDB 6.6
>>  
>> +* New framework for looking up multiply defined global symbols from shared
>> +  libraries.
>> +
> 
> 
> It's up to Eli to approve NEWS entries, but it has been my understanding that
> NEWS should be about user-visible features, not internal infrastructure changes.
> I'd reword to this something like:
> "When looking up multiply-defined global symbols, GDB will now prefer
> the symbol definition in the current shared library if it was built
> using the -Bsymbolic linker option." 
> 
> 
> I've noticed a couple of minor issues in the test case:
> 
>> diff -urN src/gdb/testsuite/gdb.base/libmd.c dev/gdb/testsuite/gdb.base/libmd.c
> 
> What is libmd supposed to stand for?
> 
>> --- src/gdb/testsuite/gdb.base/libmd.c	1970-01-01 01:00:00.000000000 +0100
>> +++ dev/gdb/testsuite/gdb.base/libmd.c	2007-06-26 21:03:32.000000000 +0200
> 
>> +extern void foo();
> 
> This doesn't appear to be necessary; foo isn't even referred to ...
> 
> +void foo2 ();
> 
> Likewise.
> 
>> 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-26 21:03:32.000000000 +0200
> 
> In fact, this whole header file looks unnecessary to me.
> 
>> 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-26 21:03:32.000000000 +0200
> 
>> +extern void foo();
>> +#include <stdio.h>
>> +#include "libmd.h"
>> +
>> +extern void foo();
> 
> Here we have the declaration three times ;-)  Once is enough ...
> 
> 
> Otherwise, this looks OK to me now.
> 
> 


Ok, I renamed the testsuite files to solib-symbol.exp and solib-symbol-{main,lib}.c The header has been removed.

I also changed the NEWS entry. Eli, is this ok ?



-- 
Markus Deuling
GNU Toolchain for Linux on Cell BE
deuling@de.ibm.com


[-- Attachment #2: diff-gdb-multiple-symbols-mainline --]
[-- Type: text/plain, Size: 21557 bytes --]

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-28 17:09:38.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-06-19 05:22:03.000000000 +0200
+++ dev/gdb/Makefile.in	2007-06-28 17:09:38.000000000 +0200
@@ -798,7 +798,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
@@ -2572,7 +2572,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)
@@ -2719,7 +2719,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/NEWS dev/gdb/NEWS
--- src/gdb/NEWS	2007-06-21 19:00:43.000000000 +0200
+++ dev/gdb/NEWS	2007-06-28 17:10:39.000000000 +0200
@@ -3,6 +3,10 @@
 
 *** Changes since GDB 6.6
 
+* When looking up multiply-defined global symbols, GDB will now prefer the
+  symbol definition in the current shared library if it was built using the
+   -Bsymbolic linker option.
+
 * When the Text User Interface (TUI) is not configured, GDB will now
 recognize the -tui command-line option and print a message that the TUI
 is not supported.
diff -urN src/gdb/solib.c dev/gdb/solib.c
--- src/gdb/solib.c	2007-06-13 19:52:44.000000000 +0200
+++ dev/gdb/solib.c	2007-06-28 17:09:38.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-13 19:52:44.000000000 +0200
+++ dev/gdb/solib-svr4.c	2007-06-28 17:09:38.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-28 17:09:38.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-06-19 05:22:05.000000000 +0200
+++ dev/gdb/symtab.c	2007-06-28 17:09:38.000000000 +0200
@@ -57,6 +57,7 @@
 #include "cp-abi.h"
 #include "observer.h"
 #include "gdb_assert.h"
+#include "solist.h"
 
 /* Prototypes for local functions */
 
@@ -1261,6 +1262,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.  */
 
@@ -1302,6 +1323,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
@@ -1567,7 +1639,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
@@ -1595,10 +1667,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-06-18 05:36:44.000000000 +0200
+++ dev/gdb/symtab.h	2007-06-28 17:09:38.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);
 
@@ -1398,4 +1399,12 @@
 extern void set_main_name (const char *name);
 extern /*const */ char *main_name (void);
 
+/* 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/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-28 17:28:08.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 <deuling@de.ibm.com>.
+#
+
+if {[skip_shlib_tests]} {
+    return 0
+}
+
+# Library file.
+set libname "solib-symbol-lib"
+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-main"
+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
+
+
diff -urN src/gdb/testsuite/gdb.base/solib-symbol-lib.c dev/gdb/testsuite/gdb.base/solib-symbol-lib.c
--- src/gdb/testsuite/gdb.base/solib-symbol-lib.c	1970-01-01 01:00:00.000000000 +0100
+++ dev/gdb/testsuite/gdb.base/solib-symbol-lib.c	2007-06-28 17:16:38.000000000 +0200
@@ -0,0 +1,32 @@
+/* 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 <deuling@de.ibm.com>.
+*/
+#include <stdio.h>
+
+void
+foo ()
+{
+  printf ("foo in lib\n");
+  return;
+}
+
+void
+foo2()
+{
+  printf ("foo2 in lib\n");
+  return;
+}
diff -urN src/gdb/testsuite/gdb.base/solib-symbol-main.c dev/gdb/testsuite/gdb.base/solib-symbol-main.c
--- src/gdb/testsuite/gdb.base/solib-symbol-main.c	1970-01-01 01:00:00.000000000 +0100
+++ dev/gdb/testsuite/gdb.base/solib-symbol-main.c	2007-06-28 17:16:25.000000000 +0200
@@ -0,0 +1,43 @@
+/* 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 <deuling@de.ibm.com>.
+*/
+#include <stdio.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;
+}
+

  parent reply	other threads:[~2007-06-28 15:33 UTC|newest]

Thread overview: 24+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-05-10 12:33 [PING] " Markus Deuling
2007-05-10 13:00 ` Daniel Jacobowitz
2007-05-10 14:52   ` Markus Deuling
2007-05-14 17:53     ` Daniel Jacobowitz
2007-05-14 18:25 ` Daniel Jacobowitz
2007-05-15  5:49   ` Markus Deuling
2007-05-18  4:13     ` Markus Deuling
2007-05-31 21:40       ` Ulrich Weigand
2007-06-05  3:46         ` Markus Deuling
2007-06-20  6:58           ` [PING 2] " Markus Deuling
2007-06-26 18:31             ` Joel Brobecker
2007-06-26 18:35             ` Joel Brobecker
2007-06-26 20:34               ` Markus Deuling
2007-06-28 15:32                 ` Ulrich Weigand
2007-06-28 15:33                   ` Joel Brobecker
2007-06-28 18:20                   ` Markus Deuling [this message]
2007-06-29 17:03                     ` Eli Zaretskii
2007-07-02 18:24                     ` Ulrich Weigand
2007-07-03  4:04                       ` Markus Deuling
2007-07-03 12:17                         ` Ulrich Weigand
2007-07-03 12:28                           ` Daniel Jacobowitz
2007-07-04  3:50                           ` Markus Deuling
2007-06-29 17:15                   ` Eli Zaretskii
2007-06-25 21:48           ` [PING] " Kevin Buettner

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4683D468.4090808@de.ibm.com \
    --to=deuling@de.ibm.com \
    --cc=brobecker@adacore.com \
    --cc=drow@false.org \
    --cc=eliz@gnu.org \
    --cc=gdb-patches@sourceware.org \
    --cc=kevinb@redhat.com \
    --cc=uweigand@de.ibm.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox