ppc476 linker workaround shared lib fixes again
authorAlan Modra <amodra@gmail.com>
Tue, 16 Jun 2015 07:17:51 +0000 (16:47 +0930)
committerAlan Modra <amodra@gmail.com>
Tue, 16 Jun 2015 08:12:29 +0000 (17:42 +0930)
Huh, I can't even write a binary search properly.

bfd/
* elf32-ppc.c (ppc_elf_relocate_section): Correct binary search of
dynamic relocs.
ld/testsuite/
* ld-powerpc/ppc476-shared.s: Repeat dynamic reloc generating insns.
* ld-powerpc/ppc476-shared.d: Update.
* ld-powerpc/ppc476-shared2.d: Update.

bfd/ChangeLog
bfd/elf32-ppc.c
ld/testsuite/ChangeLog
ld/testsuite/ld-powerpc/ppc476-shared.d
ld/testsuite/ld-powerpc/ppc476-shared.s
ld/testsuite/ld-powerpc/ppc476-shared2.d

index 886da5b..91bdc45 100644 (file)
@@ -1,3 +1,8 @@
+2015-06-16  Alan Modra  <amodra@gmail.com>
+
+       * elf32-ppc.c (ppc_elf_relocate_section): Correct binary search of
+       dynamic relocs.
+
 2015-06-10  Jon Turney  <jon.turney@dronecode.org.uk>
 
        * elf-bfd.h : Remove struct elf_build_id.
index a947e8e..f1fbc66 100644 (file)
@@ -9642,32 +9642,33 @@ ppc_elf_relocate_section (bfd *output_bfd,
              sreloc = elf_section_data (input_section)->sreloc;
              if (sreloc != NULL)
                {
-                 bfd_byte *slo, *shi, *srelend;
+                 Elf32_External_Rela *slo, *shi, *srelend;
                  bfd_vma soffset;
 
-                 slo = sreloc->contents;
-                 shi = srelend
-                   = slo + sreloc->reloc_count * sizeof (Elf32_External_Rela);
+                 slo = (Elf32_External_Rela *) sreloc->contents;
+                 shi = srelend = slo + sreloc->reloc_count;
                  soffset = (offset + input_section->output_section->vma
                             + input_section->output_offset);
                  while (slo < shi)
                    {
-                     bfd_byte *srel = slo + (shi - slo) / 2;
-                     bfd_elf32_swap_reloca_in (output_bfd, srel, &outrel);
+                     Elf32_External_Rela *srel = slo + (shi - slo) / 2;
+                     bfd_elf32_swap_reloca_in (output_bfd, (bfd_byte *) srel,
+                                               &outrel);
                      if (outrel.r_offset < soffset)
                        slo = srel + 1;
                      else if (outrel.r_offset > soffset + 3)
                        shi = srel;
                      else
                        {
-                         bfd_byte *nextr = srel + sizeof (Elf32_External_Rela);
-                         if (nextr != srelend)
+                         if (srel + 1 != srelend)
                            {
-                             memmove (srel, nextr, srelend - nextr);
-                             srel = srelend - sizeof (Elf32_External_Rela);
+                             memmove (srel, srel + 1,
+                                      (srelend - (srel + 1)) * sizeof (*srel));
+                             srel = srelend - 1;
                            }
                          outrel.r_offset += patch_off - offset;
-                         bfd_elf32_swap_reloca_out (output_bfd, &outrel, srel);
+                         bfd_elf32_swap_reloca_out (output_bfd, &outrel,
+                                                    (bfd_byte *) srel);
                          break;
                        }
                    }
index de4adbb..39cbab6 100644 (file)
@@ -1,3 +1,9 @@
+2015-06-16  Alan Modra  <amodra@gmail.com>
+
+       * ld-powerpc/ppc476-shared.s: Repeat dynamic reloc generating insns.
+       * ld-powerpc/ppc476-shared.d: Update.
+       * ld-powerpc/ppc476-shared2.d: Update.
+
 2015-06-12  Tristan Gingold  <gingold@adacore.com>
 
        * ld-scripts/print-memory-usage-1.t,
index 8fda847..fe438f4 100644 (file)
@@ -8,23 +8,41 @@
 
 Disassembly of section \.text:
 
-0+fffc <\.text>:
-    fffc:      (48 01 00 04|04 00 01 48)       b       20000 .*
+0000fffc <\.text>:
+    fffc:      (48 03 00 04|04 00 03 48)       b       40000 .*
    10000:      (38 63 00 00|00 00 63 38)       addi    r3,r3,0
-                       1000[02]: R_PPC_ADDR16_LO       .bss
+                       1000[02]: R_PPC_ADDR16_LO       \.bss
        \.\.\.
-   1fff0:      (42 9f 00 05|05 00 9f 42)       bcl     .*
-   1fff4:      (7d 28 02 a6|a6 02 28 7d)       mflr    r9
-   1fff8:      (3d 29 00 00|00 00 29 3d)       addis   r9,r9,0
-                       1fff[8a]: R_PPC_REL16_HA        .bss\+0x[46]
-   1fffc:      (48 00 00 14|14 00 00 48)       b       20010 .*
-   20000:      (3c 60 00 00|00 00 60 3c)       lis     r3,0
-                       2000[02]: R_PPC_ADDR16_HA       .bss
-   20004:      (4b fe ff fc|fc ff fe 4b)       b       10000 .*
-   20008:      (48 00 00 02|02 00 00 48)       ba      0 .*
-   2000c:      (48 00 00 02|02 00 00 48)       ba      0 .*
-   20010:      (39 29 01 00|00 01 29 39)       addi    r9,r9,256
-                       2001[02]: R_PPC_REL16_LO        .bss\+0x1[ce]
-   20014:      (4b ff ff ec|ec ff ff 4b)       b       20000 .*
-   20018:      (48 00 00 02|02 00 00 48)       ba      0 .*
-   2001c:      (48 00 00 02|02 00 00 48)       ba      0 .*
+   1fffc:      (48 02 00 14|14 00 02 48)       b       40010 .*
+   20000:      (38 63 00 00|00 00 63 38)       addi    r3,r3,0
+                       2000[02]: R_PPC_ADDR16_LO       \.bss
+       \.\.\.
+   2fffc:      (48 01 00 24|24 00 01 48)       b       40020 .*
+   30000:      (38 63 00 00|00 00 63 38)       addi    r3,r3,0
+                       3000[02]: R_PPC_ADDR16_LO       \.bss
+       \.\.\.
+   3fff0:      (42 9f 00 05|05 00 9f 42)       bcl     .*
+   3fff4:      (7d 28 02 a6|a6 02 28 7d)       mflr    r9
+   3fff8:      (3d 29 00 00|00 00 29 3d)       addis   r9,r9,0
+                       3fff[8a]: R_PPC_REL16_HA        \.bss\+0x[46]
+   3fffc:      (48 00 00 34|34 00 00 48)       b       40030 .*
+   40000:      (3c 60 00 00|00 00 60 3c)       lis     r3,0
+                       4000[02]: R_PPC_ADDR16_HA       \.bss
+   40004:      (4b fc ff fc|fc ff fc 4b)       b       10000 .*
+   40008:      (48 00 00 02|02 00 00 48)       ba      0 .*
+   4000c:      (48 00 00 02|02 00 00 48)       ba      0 .*
+   40010:      (3c 60 00 00|00 00 60 3c)       lis     r3,0
+                       4001[02]: R_PPC_ADDR16_HA       \.bss
+   40014:      (4b fd ff ec|ec ff fd 4b)       b       20000 .*
+   40018:      (48 00 00 02|02 00 00 48)       ba      0 .*
+   4001c:      (48 00 00 02|02 00 00 48)       ba      0 .*
+   40020:      (3c 60 00 00|00 00 60 3c)       lis     r3,0
+                       4002[02]: R_PPC_ADDR16_HA       \.bss
+   40024:      (4b fe ff dc|dc ff fe 4b)       b       30000 .*
+   40028:      (48 00 00 02|02 00 00 48)       ba      0 .*
+   4002c:      (48 00 00 02|02 00 00 48)       ba      0 .*
+   40030:      (39 29 01 50|50 01 29 39)       addi    r9,r9,336
+                       4003[02]: R_PPC_REL16_LO        \.bss\+0x3[ce]
+   40034:      (4b ff ff cc|cc ff ff 4b)       b       40000 .*
+   40038:      (48 00 00 02|02 00 00 48)       ba      0 .*
+   4003c:      (48 00 00 02|02 00 00 48)       ba      0 .*
index 6774bad..e23b78a 100644 (file)
@@ -1,8 +1,14 @@
  .text
  lis 3,x@ha
  addi 3,3,x@l
+ .org 0x10000
+ lis 3,x@ha
+ addi 3,3,x@l
+ .org 0x20000
+ lis 3,x@ha
+ addi 3,3,x@l
 
- .org 0xfff4
+ .org 0x2fff4
  bcl 20,31,.+4
 0:
  mflr 9
index ebb8bf1..813ea2e 100644 (file)
@@ -8,5 +8,9 @@
 
 DYNAMIC RELOCATION RECORDS
 OFFSET   TYPE              VALUE 
-0001000[02] R_PPC_ADDR16_LO   \.text\+0x000200f4
-0002000[02] R_PPC_ADDR16_HA   \.text\+0x000200f4
+0001000[02] R_PPC_ADDR16_LO   \.text\+0x00040144
+0002000[02] R_PPC_ADDR16_LO   \.text\+0x00040144
+0003000[02] R_PPC_ADDR16_LO   \.text\+0x00040144
+0004000[02] R_PPC_ADDR16_HA   \.text\+0x00040144
+0004001[02] R_PPC_ADDR16_HA   \.text\+0x00040144
+0004002[02] R_PPC_ADDR16_HA   \.text\+0x00040144