* elflink.h (elf_link_output_extsym): Call finish_dynamic_symbol
authorIan Lance Taylor <ian@airs.com>
Wed, 11 Jun 1997 16:59:00 +0000 (16:59 +0000)
committerIan Lance Taylor <ian@airs.com>
Wed, 11 Jun 1997 16:59:00 +0000 (16:59 +0000)
for a symbol which is being forced to be local.
* elf32-i386.c (elf_i386_relocate_section): Write out the
  relocation value for a GOT reloc for a symbol which is turning
  into a local symbol.
(elf_i386_finish_dynamic_symbol): If a symbol is turning into a
local symbol, write out a RELATIVE reloc rather than a GLOB_DAT
reloc.
* elf32-m68k.c, elf32-sparc.c: Corresponding changes.

bfd/ChangeLog
bfd/elf32-i386.c
bfd/elf32-m68k.c
bfd/elf32-sparc.c
bfd/elflink.h

index 474a1dbe8643141c1f9ce2fc9fb81785f90c7c1a..4d827dd88ae64c34c2762be103311257ca76e079 100644 (file)
@@ -1,5 +1,15 @@
 Wed Jun 11 00:00:07 1997  Ian Lance Taylor  <ian@cygnus.com>
 
+       * elflink.h (elf_link_output_extsym): Call finish_dynamic_symbol
+       for a symbol which is being forced to be local.
+       * elf32-i386.c (elf_i386_relocate_section): Write out the
+       relocation value for a GOT reloc for a symbol which is turning
+       into a local symbol.
+       (elf_i386_finish_dynamic_symbol): If a symbol is turning into a
+       local symbol, write out a RELATIVE reloc rather than a GLOB_DAT
+       reloc.
+       * elf32-m68k.c, elf32-sparc.c: Corresponding changes.
+
        * elf32-i386.c (elf_i386_relocate_section): Get the relocation
        value if the symbol is turning into a local symbol.
        * elf32-m68k.c (elf_m68k_relocate_section): Likewise.
@@ -10,7 +20,7 @@ Wed Jun 11 00:00:07 1997  Ian Lance Taylor  <ian@cygnus.com>
        * elflink.h (elf_link_add_object_symbols): Also read verneed
        information by calling `_bfd_elf_slurp_version_tables'.
        (elf_link_add_object_symbols): For undefined symbols look for
-       version informaiton in the verneed records.
+       version information in the verneed records.
        (elf_link_add_object_symbols): Use soname of shared object
        for verneed record if it is available.
 
index a871a7fb5c503d2f056b85403fe6919bdd169733..91f0c5015e262861755286dc8e6696bb9446fb1f 100644 (file)
@@ -1179,7 +1179,7 @@ elf_i386_relocate_section (output_bfd, info, input_bfd, input_section,
                  || (r_type == R_386_GOT32
                      && elf_hash_table (info)->dynamic_sections_created
                      && (! info->shared
-                         || ! info->symbolic
+                         || (! info->symbolic && h->dynindx != -1)
                          || (h->elf_link_hash_flags
                              & ELF_LINK_HASH_DEF_REGULAR) == 0))
                  || (info->shared
@@ -1241,15 +1241,16 @@ elf_i386_relocate_section (output_bfd, info, input_bfd, input_section,
 
              if (! elf_hash_table (info)->dynamic_sections_created
                  || (info->shared
-                     && info->symbolic
+                     && (info->symbolic || h->dynindx == -1)
                      && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR)))
                {
                  /* This is actually a static link, or it is a
                     -Bsymbolic link and the symbol is defined
-                    locally.  We must initialize this entry in the
-                    global offset table.  Since the offset must
-                    always be a multiple of 4, we use the least
-                    significant bit to record whether we have
+                    locally, or the symbol was forced to be local
+                    because of a version file.  We must initialize
+                    this entry in the global offset table.  Since the
+                    offset must always be a multiple of 4, we use the
+                    least significant bit to record whether we have
                     initialized it already.
 
                     When doing a dynamic link, we create a .rel.got
@@ -1623,8 +1624,6 @@ elf_i386_finish_dynamic_symbol (output_bfd, info, h, sym)
       /* This symbol has an entry in the global offset table.  Set it
         up.  */
 
-      BFD_ASSERT (h->dynindx != -1);
-
       sgot = bfd_get_section_by_name (dynobj, ".got");
       srel = bfd_get_section_by_name (dynobj, ".rel.got");
       BFD_ASSERT (sgot != NULL && srel != NULL);
@@ -1634,11 +1633,12 @@ elf_i386_finish_dynamic_symbol (output_bfd, info, h, sym)
                      + (h->got_offset &~ 1));
 
       /* If this is a -Bsymbolic link, and the symbol is defined
-        locally, we just want to emit a RELATIVE reloc.  The entry in
-        the global offset table will already have been initialized in
-        the relocate_section function.  */
+        locally, we just want to emit a RELATIVE reloc.  Likewise if
+        the symbol was forced to be local because of a version file.
+        The entry in the global offset table will already have been
+        initialized in the relocate_section function.  */
       if (info->shared
-         && info->symbolic
+         && (info->symbolic || h->dynindx == -1)
          && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR))
        rel.r_info = ELF32_R_INFO (0, R_386_RELATIVE);
       else
index fe24d4b66ab0f7a2b33f7da3a41a776d3a55b8c5..1d763a97aeebb94836445f0e068f42b2620b4a96 100644 (file)
@@ -1125,7 +1125,7 @@ elf_m68k_relocate_section (output_bfd, info, input_bfd, input_section,
                                      "_GLOBAL_OFFSET_TABLE_") != 0))
                      && elf_hash_table (info)->dynamic_sections_created
                      && (! info->shared
-                         || ! info->symbolic
+                         || (! info->symbolic && h->dynindx != -1)
                          || (h->elf_link_hash_flags
                              & ELF_LINK_HASH_DEF_REGULAR) == 0))
                  || (info->shared
@@ -1197,16 +1197,17 @@ elf_m68k_relocate_section (output_bfd, info, input_bfd, input_section,
 
                if (!elf_hash_table (info)->dynamic_sections_created
                    || (info->shared
-                       && info->symbolic
+                       && (info->symbolic || h->dynindx == -1)
                        && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR)))
                  {
                    /* This is actually a static link, or it is a
                       -Bsymbolic link and the symbol is defined
-                      locally.  We must initialize this entry in the
-                      global offset table.  Since the offset must
-                      always be a multiple of 4, we use the least
-                      significant bit to record whether we have
-                      initialized it already.
+                      locally, or the symbol was forced to be local
+                      because of a version file..  We must initialize
+                      this entry in the global offset table.  Since
+                      the offset must always be a multiple of 4, we
+                      use the least significant bit to record whether
+                      we have initialized it already.
 
                       When doing a dynamic link, we create a .rela.got
                       relocation entry to initialize the value.  This
@@ -1607,8 +1608,6 @@ elf_m68k_finish_dynamic_symbol (output_bfd, info, h, sym)
       /* This symbol has an entry in the global offset table.  Set it
         up.  */
 
-      BFD_ASSERT (h->dynindx != -1);
-
       sgot = bfd_get_section_by_name (dynobj, ".got");
       srela = bfd_get_section_by_name (dynobj, ".rela.got");
       BFD_ASSERT (sgot != NULL && srela != NULL);
@@ -1618,11 +1617,12 @@ elf_m68k_finish_dynamic_symbol (output_bfd, info, h, sym)
                       + (h->got_offset &~ 1));
 
       /* If this is a -Bsymbolic link, and the symbol is defined
-        locally, we just want to emit a RELATIVE reloc.  The entry in
-        the global offset table will already have been initialized in
-        the relocate_section function.  */
+        locally, we just want to emit a RELATIVE reloc.  Likewise if
+        the symbol was forced to be local because of a version file.
+        The entry in the global offset table will already have been
+        initialized in the relocate_section function.  */
       if (info->shared
-         && info->symbolic
+         && (info->symbolic || h->dynindx == -1)
          && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR))
        {
          rela.r_info = ELF32_R_INFO (0, R_68K_RELATIVE);
index 30615153faa829db07997c3243a68f964106f8b9..4f29eeb87aa72c6af3ea22db09989bdee8a4a1b7 100644 (file)
@@ -1050,7 +1050,7 @@ elf32_sparc_relocate_section (output_bfd, info, input_bfd, input_section,
                       || r_type == R_SPARC_GOT22)
                      && elf_hash_table (info)->dynamic_sections_created
                      && (! info->shared
-                         || ! info->symbolic
+                         || (! info->symbolic && h->dynindx != -1)
                          || (h->elf_link_hash_flags
                              & ELF_LINK_HASH_DEF_REGULAR) == 0))
                  || (info->shared
@@ -1123,15 +1123,16 @@ elf32_sparc_relocate_section (output_bfd, info, input_bfd, input_section,
 
              if (! elf_hash_table (info)->dynamic_sections_created
                  || (info->shared
-                     && info->symbolic
+                     && (info->symbolic || h->dynindx == -1)
                      && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR)))
                {
                  /* This is actually a static link, or it is a
                      -Bsymbolic link and the symbol is defined
-                     locally.  We must initialize this entry in the
-                     global offset table.  Since the offset must
-                     always be a multiple of 4, we use the least
-                     significant bit to record whether we have
+                     locally, or the symbol was forced to be local
+                     because of a version file.  We must initialize
+                     this entry in the global offset table.  Since the
+                     offset must always be a multiple of 4, we use the
+                     least significant bit to record whether we have
                      initialized it already.
 
                     When doing a dynamic link, we create a .rela.got
@@ -1498,8 +1499,6 @@ elf32_sparc_finish_dynamic_symbol (output_bfd, info, h, sym)
       /* This symbol has an entry in the global offset table.  Set it
          up.  */
 
-      BFD_ASSERT (h->dynindx != -1);
-
       sgot = bfd_get_section_by_name (dynobj, ".got");
       srela = bfd_get_section_by_name (dynobj, ".rela.got");
       BFD_ASSERT (sgot != NULL && srela != NULL);
@@ -1509,11 +1508,12 @@ elf32_sparc_finish_dynamic_symbol (output_bfd, info, h, sym)
                       + (h->got_offset &~ 1));
 
       /* If this is a -Bsymbolic link, and the symbol is defined
-        locally, we just want to emit a RELATIVE reloc.  The entry in
-        the global offset table will already have been initialized in
-        the relocate_section function.  */
+        locally, we just want to emit a RELATIVE reloc.  Likewise if
+        the symbol was forced to be local because of a version file.
+        The entry in the global offset table will already have been
+        initialized in the relocate_section function.  */
       if (info->shared
-         && info->symbolic
+         && (info->symbolic || h->dynindx == -1)
          && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR))
        rela.r_info = ELF32_R_INFO (0, R_SPARC_RELATIVE);
       else
index b295e10915cf9c1017932b19cdedc1bed4bbb6dd..0ac27da8aa12c1a820453264405192c38c58376b 100644 (file)
@@ -4123,6 +4123,24 @@ elf_link_output_extsym (h, data)
              ((struct elf_link_hash_entry *) h->root.u.i.link, data));
     }
 
+  /* Give the processor backend a chance to tweak the symbol value,
+     and also to finish up anything that needs to be done for this
+     symbol.  */
+  if ((h->dynindx != -1
+       || (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) != 0)
+      && elf_hash_table (finfo->info)->dynamic_sections_created)
+    {
+      struct elf_backend_data *bed;
+
+      bed = get_elf_backend_data (finfo->output_bfd);
+      if (! ((*bed->elf_backend_finish_dynamic_symbol)
+            (finfo->output_bfd, finfo->info, h, &sym)))
+       {
+         eoinfo->failed = true;
+         return false;
+       }
+    }
+
   /* If this symbol should be put in the .dynsym section, then put it
      there now.  We have already know the symbol index.  We also fill
      in the entry in the .hash section.  */
@@ -4139,17 +4157,6 @@ elf_link_output_extsym (h, data)
 
       sym.st_name = h->dynstr_index;
 
-      /* Give the processor backend a chance to tweak the symbol
-        value, and also to finish up anything that needs to be done
-        for this symbol.  */
-      bed = get_elf_backend_data (finfo->output_bfd);
-      if (! ((*bed->elf_backend_finish_dynamic_symbol)
-            (finfo->output_bfd, finfo->info, h, &sym)))
-       {
-         eoinfo->failed = true;
-         return false;
-       }
-
       elf_swap_symbol_out (finfo->output_bfd, &sym,
                           (PTR) (((Elf_External_Sym *)
                                   finfo->dynsym_sec->contents)