This is the mail archive of the binutils@sources.redhat.com mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [patch] Default versions for imported symbols


On Monday 15 November 2004 04:00, Alan Modra wrote:
> Your mailer or something has mangled your patch, turning tabs into
> spaces.  This makes it hard to review.  Please repost.

Here it is as an attachment.

Paul

2004-11-04  Paul Brook  <paul@codesourcery.com>

bfd/
 * elf-bfd.h (_bfd_elf_slurp_version_tables): Update prototype.
 * elf.c (_bfd_elf_print_private_bfd_data): Pass extra argument.
 (_bfd_elf_slurp_version_tables): Add extra argument.  Create extra
 default version definition for unversioned symbols.
 * elfcode.h (elf_slurp_symbol_table): Pass extra argument.
 * elflink.c (elf_link_add_object_symbols): Pass extra argument to
 _bfd_elf_slurp_version_tables.  Set default version for unversioned
 imported symbols.
include/
 * bfdlink.h (bfd_link_info): Add default_imported_symver.
ld/
 * ld.texinfo: Document --default-imported-symver.
 * ldmain.c (main): Set link_info.default_imported_symver.
 * lexsup.c (option_values): Add OPTION_DEFAULT_IMPORTED_SYMVER.
 (ld_options): Add --default-imported-symver.
 (parse_args): Handle OPTION_DEFAULT_IMPORTED_SYMVER.
Index: bfd/elf-bfd.h
===================================================================
RCS file: /cvs/src/src/bfd/elf-bfd.h,v
retrieving revision 1.162
diff -c -p -r1.162 elf-bfd.h
*** bfd/elf-bfd.h	14 Oct 2004 23:38:08 -0000	1.162
--- bfd/elf-bfd.h	4 Nov 2004 18:49:33 -0000
*************** extern bfd_boolean _bfd_elf_link_hash_ta
*** 1419,1425 ****
     struct bfd_hash_entry *(*)
       (struct bfd_hash_entry *, struct bfd_hash_table *, const char *));
  extern bfd_boolean _bfd_elf_slurp_version_tables
!   (bfd *);
  extern bfd_boolean _bfd_elf_merge_sections
    (bfd *, struct bfd_link_info *);
  extern bfd_boolean bfd_elf_is_group_section
--- 1419,1425 ----
     struct bfd_hash_entry *(*)
       (struct bfd_hash_entry *, struct bfd_hash_table *, const char *));
  extern bfd_boolean _bfd_elf_slurp_version_tables
!   (bfd *, bfd_boolean);
  extern bfd_boolean _bfd_elf_merge_sections
    (bfd *, struct bfd_link_info *);
  extern bfd_boolean bfd_elf_is_group_section
Index: bfd/elf.c
===================================================================
RCS file: /cvs/src/src/bfd/elf.c,v
retrieving revision 1.252
diff -c -p -r1.252 elf.c
*** bfd/elf.c	4 Nov 2004 00:44:23 -0000	1.252
--- bfd/elf.c	4 Nov 2004 18:49:35 -0000
*************** _bfd_elf_print_private_bfd_data (bfd *ab
*** 1192,1198 ****
    if ((elf_dynverdef (abfd) != 0 && elf_tdata (abfd)->verdef == NULL)
        || (elf_dynverref (abfd) != 0 && elf_tdata (abfd)->verref == NULL))
      {
!       if (! _bfd_elf_slurp_version_tables (abfd))
  	return FALSE;
      }
  
--- 1192,1198 ----
    if ((elf_dynverdef (abfd) != 0 && elf_tdata (abfd)->verdef == NULL)
        || (elf_dynverref (abfd) != 0 && elf_tdata (abfd)->verref == NULL))
      {
!       if (! _bfd_elf_slurp_version_tables (abfd, FALSE))
  	return FALSE;
      }
  
*************** _bfd_elf_canonicalize_dynamic_reloc (bfd
*** 6027,6036 ****
  /* Read in the version information.  */
  
  bfd_boolean
! _bfd_elf_slurp_version_tables (bfd *abfd)
  {
    bfd_byte *contents = NULL;
    bfd_size_type amt;
  
    if (elf_dynverdef (abfd) != 0)
      {
--- 6027,6120 ----
  /* Read in the version information.  */
  
  bfd_boolean
! _bfd_elf_slurp_version_tables (bfd *abfd, bfd_boolean default_imported_symver)
  {
    bfd_byte *contents = NULL;
    bfd_size_type amt;
+   unsigned int freeidx = 0;
+ 
+   if (elf_dynverref (abfd) != 0)
+     {
+       Elf_Internal_Shdr *hdr;
+       Elf_External_Verneed *everneed;
+       Elf_Internal_Verneed *iverneed;
+       unsigned int i;
+ 
+       hdr = &elf_tdata (abfd)->dynverref_hdr;
+ 
+       amt = (bfd_size_type) hdr->sh_info * sizeof (Elf_Internal_Verneed);
+       elf_tdata (abfd)->verref = bfd_zalloc (abfd, amt);
+       if (elf_tdata (abfd)->verref == NULL)
+ 	goto error_return;
+ 
+       elf_tdata (abfd)->cverrefs = hdr->sh_info;
+ 
+       contents = bfd_malloc (hdr->sh_size);
+       if (contents == NULL)
+ 	goto error_return;
+       if (bfd_seek (abfd, hdr->sh_offset, SEEK_SET) != 0
+ 	  || bfd_bread (contents, hdr->sh_size, abfd) != hdr->sh_size)
+ 	goto error_return;
+ 
+       everneed = (Elf_External_Verneed *) contents;
+       iverneed = elf_tdata (abfd)->verref;
+       for (i = 0; i < hdr->sh_info; i++, iverneed++)
+ 	{
+ 	  Elf_External_Vernaux *evernaux;
+ 	  Elf_Internal_Vernaux *ivernaux;
+ 	  unsigned int j;
+ 
+ 	  _bfd_elf_swap_verneed_in (abfd, everneed, iverneed);
+ 
+ 	  iverneed->vn_bfd = abfd;
+ 
+ 	  iverneed->vn_filename =
+ 	    bfd_elf_string_from_elf_section (abfd, hdr->sh_link,
+ 					     iverneed->vn_file);
+ 	  if (iverneed->vn_filename == NULL)
+ 	    goto error_return;
+ 
+ 	  amt = iverneed->vn_cnt;
+ 	  amt *= sizeof (Elf_Internal_Vernaux);
+ 	  iverneed->vn_auxptr = bfd_alloc (abfd, amt);
+ 
+ 	  evernaux = ((Elf_External_Vernaux *)
+ 		      ((bfd_byte *) everneed + iverneed->vn_aux));
+ 	  ivernaux = iverneed->vn_auxptr;
+ 	  for (j = 0; j < iverneed->vn_cnt; j++, ivernaux++)
+ 	    {
+ 	      _bfd_elf_swap_vernaux_in (abfd, evernaux, ivernaux);
+ 
+ 	      ivernaux->vna_nodename =
+ 		bfd_elf_string_from_elf_section (abfd, hdr->sh_link,
+ 						 ivernaux->vna_name);
+ 	      if (ivernaux->vna_nodename == NULL)
+ 		goto error_return;
+ 
+ 	      if (j + 1 < iverneed->vn_cnt)
+ 		ivernaux->vna_nextptr = ivernaux + 1;
+ 	      else
+ 		ivernaux->vna_nextptr = NULL;
+ 
+ 	      evernaux = ((Elf_External_Vernaux *)
+ 			  ((bfd_byte *) evernaux + ivernaux->vna_next));
+ 
+ 	      if (ivernaux->vna_other > freeidx)
+ 		freeidx = ivernaux->vna_other;
+ 	    }
+ 
+ 	  if (i + 1 < hdr->sh_info)
+ 	    iverneed->vn_nextref = iverneed + 1;
+ 	  else
+ 	    iverneed->vn_nextref = NULL;
+ 
+ 	  everneed = ((Elf_External_Verneed *)
+ 		      ((bfd_byte *) everneed + iverneed->vn_next));
+ 	}
+ 
+       free (contents);
+       contents = NULL;
+     }
  
    if (elf_dynverdef (abfd) != 0)
      {
*************** _bfd_elf_slurp_version_tables (bfd *abfd
*** 6067,6072 ****
--- 6151,6163 ----
  		     ((bfd_byte *) everdef + iverdefmem.vd_next));
  	}
  
+       if (default_imported_symver)
+ 	{
+ 	  if (freeidx > maxidx)
+ 	    maxidx = ++freeidx;
+ 	  else
+ 	    freeidx = ++maxidx;
+ 	}
        amt = (bfd_size_type) maxidx * sizeof (Elf_Internal_Verdef);
        elf_tdata (abfd)->verdef = bfd_zalloc (abfd, amt);
        if (elf_tdata (abfd)->verdef == NULL)
*************** _bfd_elf_slurp_version_tables (bfd *abfd
*** 6130,6214 ****
        free (contents);
        contents = NULL;
      }
! 
!   if (elf_dynverref (abfd) != 0)
      {
!       Elf_Internal_Shdr *hdr;
!       Elf_External_Verneed *everneed;
!       Elf_Internal_Verneed *iverneed;
!       unsigned int i;
! 
!       hdr = &elf_tdata (abfd)->dynverref_hdr;
! 
!       amt = (bfd_size_type) hdr->sh_info * sizeof (Elf_Internal_Verneed);
!       elf_tdata (abfd)->verref = bfd_zalloc (abfd, amt);
!       if (elf_tdata (abfd)->verref == NULL)
! 	goto error_return;
! 
!       elf_tdata (abfd)->cverrefs = hdr->sh_info;
  
!       contents = bfd_malloc (hdr->sh_size);
!       if (contents == NULL)
! 	goto error_return;
!       if (bfd_seek (abfd, hdr->sh_offset, SEEK_SET) != 0
! 	  || bfd_bread (contents, hdr->sh_size, abfd) != hdr->sh_size)
  	goto error_return;
  
!       everneed = (Elf_External_Verneed *) contents;
!       iverneed = elf_tdata (abfd)->verref;
!       for (i = 0; i < hdr->sh_info; i++, iverneed++)
! 	{
! 	  Elf_External_Vernaux *evernaux;
! 	  Elf_Internal_Vernaux *ivernaux;
! 	  unsigned int j;
! 
! 	  _bfd_elf_swap_verneed_in (abfd, everneed, iverneed);
! 
! 	  iverneed->vn_bfd = abfd;
! 
! 	  iverneed->vn_filename =
! 	    bfd_elf_string_from_elf_section (abfd, hdr->sh_link,
! 					     iverneed->vn_file);
! 	  if (iverneed->vn_filename == NULL)
! 	    goto error_return;
! 
! 	  amt = iverneed->vn_cnt;
! 	  amt *= sizeof (Elf_Internal_Vernaux);
! 	  iverneed->vn_auxptr = bfd_alloc (abfd, amt);
! 
! 	  evernaux = ((Elf_External_Vernaux *)
! 		      ((bfd_byte *) everneed + iverneed->vn_aux));
! 	  ivernaux = iverneed->vn_auxptr;
! 	  for (j = 0; j < iverneed->vn_cnt; j++, ivernaux++)
! 	    {
! 	      _bfd_elf_swap_vernaux_in (abfd, evernaux, ivernaux);
! 
! 	      ivernaux->vna_nodename =
! 		bfd_elf_string_from_elf_section (abfd, hdr->sh_link,
! 						 ivernaux->vna_name);
! 	      if (ivernaux->vna_nodename == NULL)
! 		goto error_return;
  
! 	      if (j + 1 < iverneed->vn_cnt)
! 		ivernaux->vna_nextptr = ivernaux + 1;
! 	      else
! 		ivernaux->vna_nextptr = NULL;
  
! 	      evernaux = ((Elf_External_Vernaux *)
! 			  ((bfd_byte *) evernaux + ivernaux->vna_next));
! 	    }
  
! 	  if (i + 1 < hdr->sh_info)
! 	    iverneed->vn_nextref = iverneed + 1;
! 	  else
! 	    iverneed->vn_nextref = NULL;
  
! 	  everneed = ((Elf_External_Verneed *)
! 		      ((bfd_byte *) everneed + iverneed->vn_next));
! 	}
  
!       free (contents);
!       contents = NULL;
      }
  
    return TRUE;
--- 6221,6266 ----
        free (contents);
        contents = NULL;
      }
!   else if (default_imported_symver)
      {
!       if (freeidx < 3)
! 	freeidx = 3;
!       else
! 	freeidx++;
  
!       amt = (bfd_size_type) freeidx * sizeof (Elf_Internal_Verdef);
!       elf_tdata (abfd)->verdef = bfd_zalloc (abfd, amt);
!       if (elf_tdata (abfd)->verdef == NULL)
  	goto error_return;
  
!       elf_tdata (abfd)->cverdefs = freeidx;
!     }
  
!   /* Create a default version based on the soname.  */
!   if (default_imported_symver)
!     {
!       Elf_Internal_Verdef *iverdef;
!       Elf_Internal_Verdaux *iverdaux;
  
!       iverdef = &elf_tdata (abfd)->verdef[freeidx - 1];;
  
!       iverdef->vd_version = VER_DEF_CURRENT;
!       iverdef->vd_flags = 0;
!       iverdef->vd_ndx = freeidx;
!       iverdef->vd_cnt = 1;
  
!       iverdef->vd_bfd = abfd;
  
!       iverdef->vd_nodename = bfd_elf_get_dt_soname (abfd);
!       if (iverdef->vd_nodename == NULL)
! 	goto error_return;
!       iverdef->vd_nextdef = NULL;
!       amt = (bfd_size_type) sizeof (Elf_Internal_Verdaux);
!       iverdef->vd_auxptr = bfd_alloc (abfd, amt);
! 
!       iverdaux = iverdef->vd_auxptr;
!       iverdaux->vda_nodename = iverdef->vd_nodename;
!       iverdaux->vda_nextptr = NULL;
      }
  
    return TRUE;
Index: bfd/elfcode.h
===================================================================
RCS file: /cvs/src/src/bfd/elfcode.h,v
retrieving revision 1.57
diff -c -p -r1.57 elfcode.h
*** bfd/elfcode.h	27 Jul 2004 14:20:47 -0000	1.57
--- bfd/elfcode.h	4 Nov 2004 18:49:36 -0000
*************** elf_slurp_symbol_table (bfd *abfd, asymb
*** 1026,1032 ****
  	  || (elf_tdata (abfd)->dynverref_section != 0
  	      && elf_tdata (abfd)->verref == NULL))
  	{
! 	  if (! _bfd_elf_slurp_version_tables (abfd))
  	    return -1;
  	}
      }
--- 1026,1032 ----
  	  || (elf_tdata (abfd)->dynverref_section != 0
  	      && elf_tdata (abfd)->verref == NULL))
  	{
! 	  if (!_bfd_elf_slurp_version_tables (abfd, FALSE))
  	    return -1;
  	}
      }
Index: bfd/elflink.c
===================================================================
RCS file: /cvs/src/src/bfd/elflink.c,v
retrieving revision 1.116
diff -c -p -r1.116 elflink.c
*** bfd/elflink.c	2 Nov 2004 05:44:34 -0000	1.116
--- bfd/elflink.c	4 Nov 2004 18:49:39 -0000
*************** elf_link_add_object_symbols (bfd *abfd, 
*** 3347,3353 ****
    if (dynamic)
      {
        /* Read in any version definitions.  */
!       if (! _bfd_elf_slurp_version_tables (abfd))
  	goto error_free_sym;
  
        /* Read in the symbol versions, but don't bother to convert them
--- 3347,3354 ----
    if (dynamic)
      {
        /* Read in any version definitions.  */
!       if (!_bfd_elf_slurp_version_tables (abfd,
! 					  info->default_imported_symver))
  	goto error_free_sym;
  
        /* Read in the symbol versions, but don't bother to convert them
*************** elf_link_add_object_symbols (bfd *abfd, 
*** 3499,3600 ****
  	  unsigned int vernum = 0;
  	  bfd_boolean skip;
  
! 	  if (ever != NULL)
  	    {
! 	      _bfd_elf_swap_versym_in (abfd, ever, &iver);
! 	      vernum = iver.vs_vers & VERSYM_VERSION;
  
! 	      /* If this is a hidden symbol, or if it is not version
! 		 1, we append the version name to the symbol name.
! 		 However, we do not modify a non-hidden absolute
! 		 symbol, because it might be the version symbol
! 		 itself.  FIXME: What if it isn't?  */
! 	      if ((iver.vs_vers & VERSYM_HIDDEN) != 0
! 		  || (vernum > 1 && ! bfd_is_abs_section (sec)))
  		{
! 		  const char *verstr;
! 		  size_t namelen, verlen, newlen;
! 		  char *newname, *p;
  
! 		  if (isym->st_shndx != SHN_UNDEF)
  		    {
! 		      if (vernum > elf_tdata (abfd)->cverdefs)
! 			verstr = NULL;
! 		      else if (vernum > 1)
! 			verstr =
! 			  elf_tdata (abfd)->verdef[vernum - 1].vd_nodename;
! 		      else
! 			verstr = "";
! 
! 		      if (verstr == NULL)
! 			{
! 			  (*_bfd_error_handler)
! 			    (_("%B: %s: invalid version %u (max %d)"),
! 			     abfd, name, vernum,
! 			     elf_tdata (abfd)->cverdefs);
! 			  bfd_set_error (bfd_error_bad_value);
! 			  goto error_free_vers;
! 			}
  		    }
! 		  else
  		    {
! 		      /* We cannot simply test for the number of
! 			 entries in the VERNEED section since the
! 			 numbers for the needed versions do not start
! 			 at 0.  */
! 		      Elf_Internal_Verneed *t;
! 
! 		      verstr = NULL;
! 		      for (t = elf_tdata (abfd)->verref;
! 			   t != NULL;
! 			   t = t->vn_nextref)
! 			{
! 			  Elf_Internal_Vernaux *a;
  
! 			  for (a = t->vn_auxptr; a != NULL; a = a->vna_nextptr)
  			    {
! 			      if (a->vna_other == vernum)
! 				{
! 				  verstr = a->vna_nodename;
! 				  break;
! 				}
  			    }
- 			  if (a != NULL)
- 			    break;
- 			}
- 		      if (verstr == NULL)
- 			{
- 			  (*_bfd_error_handler)
- 			    (_("%B: %s: invalid needed version %d"),
- 			     abfd, name, vernum);
- 			  bfd_set_error (bfd_error_bad_value);
- 			  goto error_free_vers;
  			}
  		    }
  
! 		  namelen = strlen (name);
! 		  verlen = strlen (verstr);
! 		  newlen = namelen + verlen + 2;
! 		  if ((iver.vs_vers & VERSYM_HIDDEN) == 0
! 		      && isym->st_shndx != SHN_UNDEF)
! 		    ++newlen;
  
! 		  newname = bfd_alloc (abfd, newlen);
! 		  if (newname == NULL)
! 		    goto error_free_vers;
! 		  memcpy (newname, name, namelen);
! 		  p = newname + namelen;
! 		  *p++ = ELF_VER_CHR;
! 		  /* If this is a defined non-hidden version symbol,
! 		     we add another @ to the name.  This indicates the
! 		     default version of the symbol.  */
! 		  if ((iver.vs_vers & VERSYM_HIDDEN) == 0
! 		      && isym->st_shndx != SHN_UNDEF)
! 		    *p++ = ELF_VER_CHR;
! 		  memcpy (p, verstr, verlen + 1);
  
! 		  name = newname;
! 		}
  	    }
  
  	  if (!_bfd_elf_merge_symbol (abfd, info, name, isym, &sec, &value,
--- 3500,3608 ----
  	  unsigned int vernum = 0;
  	  bfd_boolean skip;
  
! 	  if (ever == NULL)
  	    {
! 	      if (info->default_imported_symver)
! 		/* Use the default symbol version created earlier.  */
! 		iver.vs_vers = elf_tdata (abfd)->cverdefs;
! 	      else
! 		iver.vs_vers = 0;
! 	    }
! 	  else
! 	    _bfd_elf_swap_versym_in (abfd, ever, &iver);
  
! 	  vernum = iver.vs_vers & VERSYM_VERSION;
! 
! 	  /* If this is a hidden symbol, or if it is not version
! 	     1, we append the version name to the symbol name.
! 	     However, we do not modify a non-hidden absolute
! 	     symbol, because it might be the version symbol
! 	     itself.  FIXME: What if it isn't?  */
! 	  if ((iver.vs_vers & VERSYM_HIDDEN) != 0
! 	      || (vernum > 1 && ! bfd_is_abs_section (sec)))
! 	    {
! 	      const char *verstr;
! 	      size_t namelen, verlen, newlen;
! 	      char *newname, *p;
! 
! 	      if (isym->st_shndx != SHN_UNDEF)
  		{
! 		  if (vernum > elf_tdata (abfd)->cverdefs)
! 		    verstr = NULL;
! 		  else if (vernum > 1)
! 		    verstr =
! 		      elf_tdata (abfd)->verdef[vernum - 1].vd_nodename;
! 		  else
! 		    verstr = "";
  
! 		  if (verstr == NULL)
  		    {
! 		      (*_bfd_error_handler)
! 			(_("%B: %s: invalid version %u (max %d)"),
! 			 abfd, name, vernum,
! 			 elf_tdata (abfd)->cverdefs);
! 		      bfd_set_error (bfd_error_bad_value);
! 		      goto error_free_vers;
  		    }
! 		}
! 	      else
! 		{
! 		  /* We cannot simply test for the number of
! 		     entries in the VERNEED section since the
! 		     numbers for the needed versions do not start
! 		     at 0.  */
! 		  Elf_Internal_Verneed *t;
! 
! 		  verstr = NULL;
! 		  for (t = elf_tdata (abfd)->verref;
! 		       t != NULL;
! 		       t = t->vn_nextref)
  		    {
! 		      Elf_Internal_Vernaux *a;
  
! 		      for (a = t->vn_auxptr; a != NULL; a = a->vna_nextptr)
! 			{
! 			  if (a->vna_other == vernum)
  			    {
! 			      verstr = a->vna_nodename;
! 			      break;
  			    }
  			}
+ 		      if (a != NULL)
+ 			break;
  		    }
+ 		  if (verstr == NULL)
+ 		    {
+ 		      (*_bfd_error_handler)
+ 			(_("%B: %s: invalid needed version %d"),
+ 			 abfd, name, vernum);
+ 		      bfd_set_error (bfd_error_bad_value);
+ 		      goto error_free_vers;
+ 		    }
+ 		}
  
! 	      namelen = strlen (name);
! 	      verlen = strlen (verstr);
! 	      newlen = namelen + verlen + 2;
! 	      if ((iver.vs_vers & VERSYM_HIDDEN) == 0
! 		  && isym->st_shndx != SHN_UNDEF)
! 		++newlen;
  
! 	      newname = bfd_alloc (abfd, newlen);
! 	      if (newname == NULL)
! 		goto error_free_vers;
! 	      memcpy (newname, name, namelen);
! 	      p = newname + namelen;
! 	      *p++ = ELF_VER_CHR;
! 	      /* If this is a defined non-hidden version symbol,
! 		 we add another @ to the name.  This indicates the
! 		 default version of the symbol.  */
! 	      if ((iver.vs_vers & VERSYM_HIDDEN) == 0
! 		  && isym->st_shndx != SHN_UNDEF)
! 		*p++ = ELF_VER_CHR;
! 	      memcpy (p, verstr, verlen + 1);
  
! 	      name = newname;
  	    }
  
  	  if (!_bfd_elf_merge_symbol (abfd, info, name, isym, &sec, &value,
Index: include/bfdlink.h
===================================================================
RCS file: /cvs/src/src/include/bfdlink.h,v
retrieving revision 1.49
diff -c -p -r1.49 bfdlink.h
*** include/bfdlink.h	26 Oct 2004 13:46:02 -0000	1.49
--- include/bfdlink.h	4 Nov 2004 18:49:41 -0000
*************** struct bfd_link_info
*** 262,270 ****
    /* TRUE if ok to have version with no definition.  */
    unsigned int allow_undefined_version: 1;
  
!   /* TRUE id a fedault symbol version should be created and used.  */
    unsigned int create_default_symver: 1;
  
    /* TRUE if symbols should be retained in memory, FALSE if they
       should be freed and reread.  */
    unsigned int keep_memory: 1;
--- 262,275 ----
    /* TRUE if ok to have version with no definition.  */
    unsigned int allow_undefined_version: 1;
  
!   /* TRUE if a default symbol version should be created and used for
!      exported symbols.  */
    unsigned int create_default_symver: 1;
  
+   /* TRUE if a default symbol version should be created and used for
+      imported symbols.  */
+   unsigned int default_imported_symver: 1;
+ 
    /* TRUE if symbols should be retained in memory, FALSE if they
       should be freed and reread.  */
    unsigned int keep_memory: 1;
Index: ld/ld.texinfo
===================================================================
RCS file: /cvs/src/src/ld/ld.texinfo,v
retrieving revision 1.129
diff -c -p -r1.129 ld.texinfo
*** ld/ld.texinfo	26 Oct 2004 18:41:51 -0000	1.129
--- ld/ld.texinfo	4 Nov 2004 18:49:48 -0000
*************** will be issued instead.
*** 1237,1243 ****
  @kindex --default-symver
  @item --default-symver
  Create and use a default symbol version (the soname) for unversioned
! symbols.
  
  @kindex --no-warn-mismatch
  @item --no-warn-mismatch
--- 1237,1248 ----
  @kindex --default-symver
  @item --default-symver
  Create and use a default symbol version (the soname) for unversioned
! exported symbols.
! 
! @kindex --default-imported-symver
! @item --default-imported-symver
! Create and use a default symbol version (the soname) for unversioned
! imported symbols.
  
  @kindex --no-warn-mismatch
  @item --no-warn-mismatch
Index: ld/ldmain.c
===================================================================
RCS file: /cvs/src/src/ld/ldmain.c,v
retrieving revision 1.88
diff -c -p -r1.88 ldmain.c
*** ld/ldmain.c	26 Oct 2004 13:46:04 -0000	1.88
--- ld/ldmain.c	4 Nov 2004 18:49:48 -0000
*************** main (int argc, char **argv)
*** 307,312 ****
--- 307,313 ----
    link_info.allow_multiple_definition = FALSE;
    link_info.allow_undefined_version = TRUE;
    link_info.create_default_symver = FALSE;
+   link_info.default_imported_symver = FALSE;
    link_info.keep_memory = TRUE;
    link_info.notice_all = FALSE;
    link_info.nocopyreloc = FALSE;
Index: ld/lexsup.c
===================================================================
RCS file: /cvs/src/src/ld/lexsup.c,v
retrieving revision 1.80
diff -c -p -r1.80 lexsup.c
*** ld/lexsup.c	26 Oct 2004 18:41:51 -0000	1.80
--- ld/lexsup.c	4 Nov 2004 18:49:48 -0000
*************** enum option_values
*** 136,141 ****
--- 136,142 ----
    OPTION_ALLOW_MULTIPLE_DEFINITION,
    OPTION_NO_UNDEFINED_VERSION,
    OPTION_DEFAULT_SYMVER,
+   OPTION_DEFAULT_IMPORTED_SYMVER,
    OPTION_DISCARD_NONE,
    OPTION_SPARE_DYNAMIC_TAGS,
    OPTION_NO_DEFINE_COMMON,
*************** static const struct ld_option ld_options
*** 397,402 ****
--- 398,407 ----
      '\0', NULL, N_("Disallow undefined version"), TWO_DASHES },
    { {"default-symver", no_argument, NULL, OPTION_DEFAULT_SYMVER},
      '\0', NULL, N_("Create default symbol version"), TWO_DASHES },
+   { {"default-imported-symver", no_argument, NULL,
+       OPTION_DEFAULT_IMPORTED_SYMVER},
+     '\0', NULL, N_("Create default symbol version for imported symbols"),
+     TWO_DASHES },
    { {"no-warn-mismatch", no_argument, NULL, OPTION_NO_WARN_MISMATCH},
      '\0', NULL, N_("Don't warn about mismatched input files"), TWO_DASHES},
    { {"no-whole-archive", no_argument, NULL, OPTION_NO_WHOLE_ARCHIVE},
*************** parse_args (unsigned argc, char **argv)
*** 909,914 ****
--- 914,922 ----
  	case OPTION_DEFAULT_SYMVER:
  	  link_info.create_default_symver = TRUE;
  	  break;
+ 	case OPTION_DEFAULT_IMPORTED_SYMVER:
+ 	  link_info.default_imported_symver = TRUE;
+ 	  break;
  	case OPTION_NO_WARN_MISMATCH:
  	  command_line.warn_mismatch = FALSE;
  	  break;

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]