OSDN Git Service

* elf32-m68k.c (elf_m68k_check_relocs): Don't set DF_TEXTREL for
authorAndreas Schwab <schwab@linux-m68k.org>
Tue, 7 Jan 2003 13:12:35 +0000 (13:12 +0000)
committerAndreas Schwab <schwab@linux-m68k.org>
Tue, 7 Jan 2003 13:12:35 +0000 (13:12 +0000)
PC relative relocations.
(elf_m68k_discard_copies): Set it here instead.

bfd/ChangeLog
bfd/elf32-m68k.c

index 7a35fd2..96367a8 100644 (file)
@@ -1,3 +1,9 @@
+2003-01-07  Andreas Schwab  <schwab@suse.de>
+
+       * elf32-m68k.c (elf_m68k_check_relocs): Don't set DF_TEXTREL for
+       PC relative relocations.
+       (elf_m68k_discard_copies): Set it here instead.
+
 2002-01-02  Ben Elliston  <bje@redhat.com>
            Jeff Johnston  <jjohnstn@redhat.com>
 
index 0875d88..2f49dad 100644 (file)
@@ -1,5 +1,5 @@
 /* Motorola 68k series support for 32-bit ELF
-   Copyright 1993, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002
+   Copyright 1993, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
    Free Software Foundation, Inc.
 
 This file is part of BFD, the Binary File Descriptor library.
@@ -689,10 +689,16 @@ elf_m68k_check_relocs (abfd, info, sec, relocs)
                          || !bfd_set_section_alignment (dynobj, sreloc, 2))
                        return FALSE;
                    }
-                 if (sec->flags & SEC_READONLY)
-                   info->flags |= DF_TEXTREL;
                }
 
+             if (sec->flags & SEC_READONLY
+                 /* Don't set DF_TEXTREL yet for PC relative
+                    relocations, they might be discarded later.  */
+                 && !(ELF32_R_TYPE (rel->r_info) == R_68K_PC8
+                      || ELF32_R_TYPE (rel->r_info) == R_68K_PC16
+                      || ELF32_R_TYPE (rel->r_info) == R_68K_PC32))
+                   info->flags |= DF_TEXTREL;
+
              sreloc->_raw_size += sizeof (Elf32_External_Rela);
 
              /* We count the number of PC relative relocations we have
@@ -1285,11 +1291,15 @@ elf_m68k_size_dynamic_sections (output_bfd, info)
 /* This function is called via elf_m68k_link_hash_traverse if we are
    creating a shared object.  In the -Bsymbolic case it discards the
    space allocated to copy PC relative relocs against symbols which
-   are defined in regular objects.  For the normal shared case, if
+   are defined in regular objects.  For the normal shared case, it
    discards space for pc-relative relocs that have become local due to
    symbol visibility changes.  We allocated space for them in the
    check_relocs routine, but we won't fill them in in the
-   relocate_section routine.  */
+   relocate_section routine.
+
+   We also check whether any of the remaining relocations apply
+   against a readonly section, and set the DF_TEXTREL flag in this
+   case.  */
 
 static bfd_boolean
 elf_m68k_discard_copies (h, inf)
@@ -1305,7 +1315,19 @@ elf_m68k_discard_copies (h, inf)
   if ((h->root.elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0
       || (!info->symbolic
          && (h->root.elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) == 0))
-    return TRUE;
+    {
+      if ((info->flags & DF_TEXTREL) == 0)
+       {
+         /* Look for relocations against read-only sections.  */
+         for (s = h->pcrel_relocs_copied; s != NULL; s = s->next)
+           if ((s->section->flags & SEC_READONLY) != 0)
+             {
+               info->flags |= DF_TEXTREL;
+               break;
+             }
+       }
+      return TRUE;
+    }
 
   for (s = h->pcrel_relocs_copied; s != NULL; s = s->next)
     s->section->_raw_size -= s->count * sizeof (Elf32_External_Rela);