* elf64-x86-64.c (elf64_x86_64_copy_indirect_symbol): Copy also
authorJakub Jelinek <jakub@redhat.com>
Fri, 23 Apr 2004 08:51:10 +0000 (08:51 +0000)
committerJakub Jelinek <jakub@redhat.com>
Fri, 23 Apr 2004 08:51:10 +0000 (08:51 +0000)
ELF_LINK_POINTER_EQUALITY_NEEDED.
(elf64_x86_64_check_relocs): Set ELF_LINK_POINTER_EQUALITY_NEEDED
if r_type is not R_X86_64_PC32.
(elf64_x86_64_finish_dynamic_symbol): If
ELF_LINK_POINTER_EQUALITY_NEEDED is not set, clear st_value of
SHN_UNDEF symbols.

bfd/ChangeLog
bfd/elf64-x86-64.c

index 60ba0929055f7c2c8bb9d152fb667a7dbd81bf8d..5177dc37b788d62e4cb39dd4b5786face34a3900 100644 (file)
@@ -1,3 +1,13 @@
+2004-04-22  Jakub Jelinek  <jakub@redhat.com>
+
+       * elf64-x86-64.c (elf64_x86_64_copy_indirect_symbol): Copy also
+       ELF_LINK_POINTER_EQUALITY_NEEDED.
+       (elf64_x86_64_check_relocs): Set ELF_LINK_POINTER_EQUALITY_NEEDED
+       if r_type is not R_X86_64_PC32.
+       (elf64_x86_64_finish_dynamic_symbol): If
+       ELF_LINK_POINTER_EQUALITY_NEEDED is not set, clear st_value of
+       SHN_UNDEF symbols.
+
 2004-04-22  Kaz Kojima  <kkojima@rr.iij4u.or.jp>
 
        * elf32-sh.c (sh_elf_plt_sym_val): New function.
index 360d8590d01f7daa45d8d12dcc7def832a7a727a..ee1b14e193fc1d714945c778a4e848df3d84dd0a 100644 (file)
@@ -561,7 +561,8 @@ elf64_x86_64_copy_indirect_symbol (const struct elf_backend_data *bed,
       (ind->elf_link_hash_flags & (ELF_LINK_HASH_REF_DYNAMIC
                                   | ELF_LINK_HASH_REF_REGULAR
                                   | ELF_LINK_HASH_REF_REGULAR_NONWEAK
-                                  | ELF_LINK_HASH_NEEDS_PLT));
+                                  | ELF_LINK_HASH_NEEDS_PLT
+                                  | ELF_LINK_POINTER_EQUALITY_NEEDED));
   else
     _bfd_elf_link_hash_copy_indirect (bed, dir, ind);
 }
@@ -812,6 +813,8 @@ elf64_x86_64_check_relocs (bfd *abfd, struct bfd_link_info *info, asection *sec,
              /* We may need a .plt entry if the function this reloc
                 refers to is in a shared lib.  */
              h->plt.refcount += 1;
+             if (r_type != R_X86_64_PC32)
+               h->elf_link_hash_flags |= ELF_LINK_POINTER_EQUALITY_NEEDED;
            }
 
          /* If we are creating a shared library, and this is a reloc
@@ -2519,11 +2522,16 @@ elf64_x86_64_finish_dynamic_symbol (bfd *output_bfd,
       if ((h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0)
        {
          /* Mark the symbol as undefined, rather than as defined in
-            the .plt section.  Leave the value alone.  This is a clue
+            the .plt section.  Leave the value if there were any
+            relocations where pointer equality matters (this is a clue
             for the dynamic linker, to make function pointer
             comparisons work between an application and shared
-            library.  */
+            library), otherwise set it to zero.  If a function is only
+            called from a binary, there is no need to slow down
+            shared libraries because of that.  */
          sym->st_shndx = SHN_UNDEF;
+         if ((h->elf_link_hash_flags & ELF_LINK_POINTER_EQUALITY_NEEDED) == 0)
+           sym->st_value = 0;
        }
     }