Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Markus Deuling <deuling@de.ibm.com>
To: GDB Patches <gdb-patches@sourceware.org>,
	        Ulrich Weigand <uweigand@de.ibm.com>
Cc: Daniel Jacobowitz <drow@false.org>, Kevin Buettner <kevinb@redhat.com>
Subject: [PING 2] [rfc]: Framework for looking up multiply defined global        symbols  in shared libraries
Date: Wed, 20 Jun 2007 06:58:00 -0000	[thread overview]
Message-ID: <4678CFAD.2030509@de.ibm.com> (raw)
In-Reply-To: <4664DC23.70903@de.ibm.com>


> 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 <deuling@de.ibm.com>.
> +*/
> +extern void foo();
> +#include <stdio.h>
> +#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 <deuling@de.ibm.com>.
> +*/
> +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 <deuling@de.ibm.com>.
> +*/
> +extern void foo();
> +#include <stdio.h>
> +#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 <deuling@de.ibm.com>.
> +#
> +
> +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


  reply	other threads:[~2007-06-20  6:58 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           ` Markus Deuling [this message]
2007-06-26 18:31             ` [PING 2] " 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
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=4678CFAD.2030509@de.ibm.com \
    --to=deuling@de.ibm.com \
    --cc=drow@false.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