patches/binutils/2.15/600-arm-textrel.patch
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Sun Feb 17 22:08:06 2008 +0000 (2008-02-17)
changeset 431 8bde4c6ea47a
permissions -rw-r--r--
Robert P. J. DAY says:

apparently, the patchset for gcc 4.2.1 applies properly to the
source for gcc 4.2.2 and gcc 4.2.3. so, if you want, you can simply
add support for those last two just by augmenting menuconfig and
adding a couple symlinks for those two directories. seems like a
cheap way to add a couple new versions.
yann@1
     1
http://sources.redhat.com/ml/binutils/2004-06/msg00010.html
yann@1
     2
--- binutils-2.15.90.0.3-old/bfd/elf32-arm.h	2004-04-12 14:56:33.000000000 -0500
yann@1
     3
+++ binutils-2.15.90.0.3/bfd/elf32-arm.h	2004-09-03 06:56:40.000000000 -0500
yann@1
     4
@@ -87,6 +87,8 @@
yann@1
     5
 #endif
yann@1
     6
 static bfd_boolean allocate_dynrelocs 
yann@1
     7
   PARAMS ((struct elf_link_hash_entry *h, PTR inf));
yann@1
     8
+static bfd_boolean elf32_arm_readonly_dynrelocs
yann@1
     9
+  PARAMS ((struct elf_link_hash_entry *, PTR));
yann@1
    10
 static bfd_boolean create_got_section 
yann@1
    11
   PARAMS ((bfd * dynobj, struct bfd_link_info * info));
yann@1
    12
 static bfd_boolean elf32_arm_create_dynamic_sections 
yann@1
    13
@@ -3531,6 +3533,37 @@
yann@1
    14
   return TRUE;
yann@1
    15
 }
yann@1
    16
 
yann@1
    17
+/* Find any dynamic relocs that apply to read-only sections.  */
yann@1
    18
+
yann@1
    19
+static bfd_boolean
yann@1
    20
+elf32_arm_readonly_dynrelocs (h, inf)
yann@1
    21
+     struct elf_link_hash_entry *h;
yann@1
    22
+     PTR inf;
yann@1
    23
+{
yann@1
    24
+  struct elf32_arm_link_hash_entry *eh;
yann@1
    25
+  struct elf32_arm_relocs_copied *p;
yann@1
    26
+
yann@1
    27
+  if (h->root.type == bfd_link_hash_warning)
yann@1
    28
+    h = (struct elf_link_hash_entry *) h->root.u.i.link;
yann@1
    29
+
yann@1
    30
+  eh = (struct elf32_arm_link_hash_entry *) h;
yann@1
    31
+  for (p = eh->relocs_copied; p != NULL; p = p->next)
yann@1
    32
+    {
yann@1
    33
+      asection *s = p->section;
yann@1
    34
+
yann@1
    35
+      if (s != NULL && (s->flags & SEC_READONLY) != 0)
yann@1
    36
+       {
yann@1
    37
+         struct bfd_link_info *info = (struct bfd_link_info *) inf;
yann@1
    38
+
yann@1
    39
+         info->flags |= DF_TEXTREL;
yann@1
    40
+
yann@1
    41
+         /* Not an error, just cut short the traversal.  */
yann@1
    42
+         return FALSE;
yann@1
    43
+       }
yann@1
    44
+    }
yann@1
    45
+  return TRUE;
yann@1
    46
+}
yann@1
    47
+
yann@1
    48
 /* Set the sizes of the dynamic sections.  */
yann@1
    49
 
yann@1
    50
 static bfd_boolean
yann@1
    51
@@ -3740,6 +3773,12 @@
yann@1
    52
 	    return FALSE;
yann@1
    53
 	}
yann@1
    54
 
yann@1
    55
+      /* If any dynamic relocs apply to a read-only section,
yann@1
    56
+         then we need a DT_TEXTREL entry.  */
yann@1
    57
+      if ((info->flags & DF_TEXTREL) == 0)
yann@1
    58
+        elf_link_hash_traverse (&htab->root, elf32_arm_readonly_dynrelocs,
yann@1
    59
+                                (PTR) info);
yann@1
    60
+
yann@1
    61
       if ((info->flags & DF_TEXTREL) != 0)
yann@1
    62
 	{
yann@1
    63
 	  if (!add_dynamic_entry (DT_TEXTREL, 0))