* elf32-i386.c (allocate_dynrelocs): Use SYMBOL_CALLS_LOCAL.
authorAlan Modra <amodra@gmail.com>
Thu, 15 May 2003 06:35:43 +0000 (06:35 +0000)
committerAlan Modra <amodra@gmail.com>
Thu, 15 May 2003 06:35:43 +0000 (06:35 +0000)
(elf_i386_relocate_section): Likewise.
* elf32-ppc.c (allocate_dynrelocs): Likewise.
(ppc_elf_relocate_section): Likewise.
* elf64-ppc.c (allocate_dynrelocs): Likewise.
(ppc64_elf_relocate_section): Likewise.

bfd/ChangeLog
bfd/elf32-i386.c
bfd/elf32-ppc.c
bfd/elf64-ppc.c

index c6ec77c12cef96ef70a92bcd40b420f80cf1d526..e22b592fc6eea5bda1c1bd12ebdaa6071b02a665 100644 (file)
@@ -1,3 +1,13 @@
+2003-05-15  Alan Modra  <amodra@bigpond.net.au>
+           H.J. Lu <hongjiu.lu@intel.com>
+
+       * elf32-i386.c (allocate_dynrelocs): Use SYMBOL_CALLS_LOCAL.
+       (elf_i386_relocate_section): Likewise.
+       * elf32-ppc.c (allocate_dynrelocs): Likewise.
+       (ppc_elf_relocate_section): Likewise.
+       * elf64-ppc.c (allocate_dynrelocs): Likewise.
+       (ppc64_elf_relocate_section): Likewise.
+
 2003-05-15  Thiemo Seufer <seufer@csv.ica.uni-stuttgart.de>
 
        * elf32-mips.c (gprel32_with_gp): Remove useless N64 ABI case.
index 8fbe8a1c603eeec2b54ac7a1c8509cf5889a872f..b1a441aaa7ab11ee3324527a8235a1dd1437113a 100644 (file)
@@ -1679,7 +1679,13 @@ allocate_dynrelocs (h, inf)
 
   if (info->shared)
     {
-      if (SYMBOL_REFERENCES_LOCAL (info, h))
+      /* The only reloc that uses pc_count is R_386_PC32, which will
+        appear on a call or on something like ".long foo - .".  We
+        want calls to protected symbols to resolve directly to the
+        function rather than going via the plt.  If people want
+        function pointer comparisons to work as expected then they
+        should avoid writing assembly like ".long foo - .".  */
+      if (SYMBOL_CALLS_LOCAL (info, h))
        {
          struct elf_i386_dyn_relocs **pp;
 
@@ -2434,7 +2440,7 @@ elf_i386_relocate_section (output_bfd, info, input_bfd, input_section,
                   || h->root.type != bfd_link_hash_undefweak)
               && (r_type != R_386_PC32
                   || (h != NULL
-                      && !SYMBOL_REFERENCES_LOCAL (info, h))))
+                      && !SYMBOL_CALLS_LOCAL (info, h))))
              || (ELIMINATE_COPY_RELOCS
                  && !info->shared
                  && h != NULL
index ca9fbd9e21eb01c69eb375787f857efe413ef71e..212e5b34f4a83eebaf2dea230d696cfa129861fd 100644 (file)
@@ -2799,7 +2799,13 @@ allocate_dynrelocs (h, inf)
 
   if (info->shared)
     {
-      if (SYMBOL_REFERENCES_LOCAL (info, h))
+      /* Relocs that use pc_count are those that appear on a call
+        insn, or certain REL relocs (see MUST_BE_DYN_RELOC) that can
+        generated via assembly.  We want calls to protected symbols
+        to resolve directly to the function rather than going via the
+        plt.  If people want function pointer comparisons to work as
+        expected then they should avoid writing weird assembly.  */
+      if (SYMBOL_CALLS_LOCAL (info, h))
        {
          struct ppc_elf_dyn_relocs **pp;
 
@@ -4991,7 +4997,7 @@ ppc_elf_relocate_section (output_bfd, info, input_bfd, input_section,
                   || h->root.type != bfd_link_hash_undefweak)
               && (MUST_BE_DYN_RELOC (r_type)
                   || (h != NULL
-                      && !SYMBOL_REFERENCES_LOCAL (info, h))))
+                      && !SYMBOL_CALLS_LOCAL (info, h))))
              || (ELIMINATE_COPY_RELOCS
                  && !info->shared
                  && (input_section->flags & SEC_ALLOC) != 0
index 331c0ba2327170f015bb63d435983e40ce789e60..2887d9bfef04c50aceafcec645cda32709e7d774 100644 (file)
@@ -5621,7 +5621,13 @@ allocate_dynrelocs (h, inf)
 
   if (info->shared)
     {
-      if (SYMBOL_REFERENCES_LOCAL (info, h))
+      /* Relocs that use pc_count are those that appear on a call
+        insn, or certain REL relocs (see MUST_BE_DYN_RELOC) that can
+        generated via assembly.  We want calls to protected symbols
+        to resolve directly to the function rather than going via the
+        plt.  If people want function pointer comparisons to work as
+        expected then they should avoid writing weird assembly.  */
+      if (SYMBOL_CALLS_LOCAL (info, h))
        {
          struct ppc_dyn_relocs **pp;
 
@@ -7874,7 +7880,7 @@ ppc64_elf_relocate_section (output_bfd, info, input_bfd, input_section,
                   || h->root.type != bfd_link_hash_undefweak)
               && (MUST_BE_DYN_RELOC (r_type)
                   || (h != NULL
-                      && !SYMBOL_REFERENCES_LOCAL (info, h))))
+                      && !SYMBOL_CALLS_LOCAL (info, h))))
              || (ELIMINATE_COPY_RELOCS
                  && !info->shared
                  && h != NULL