Deal with relocations which are 3 bytes in size
authorJohn Darrington <john@darrington.wattle.id.au>
Thu, 9 Aug 2018 16:46:51 +0000 (18:46 +0200)
committerAlan Modra <amodra@gmail.com>
Sat, 11 Aug 2018 01:41:39 +0000 (11:11 +0930)
* reloc.c (_bfd_relocate_contents): Handle 3 byte relocs.
(_bfd_clear_contents): Likewise.
(bfd_perform_relocation): Likewise.
(bfd_install_relocation): Likewise.

bfd/ChangeLog
bfd/reloc.c

index a62a8546029c853080e7bffb36e6bb5513fe02fb..46ec6b8f7a808195dac4e2c2a52de59a61d5e6f3 100644 (file)
@@ -1,3 +1,10 @@
+2018-08-11  John Darrington  <john@darrington.wattle.id.au>
+
+       * reloc.c (_bfd_relocate_contents): Handle 3 byte relocs.
+       (_bfd_clear_contents): Likewise.
+       (bfd_perform_relocation): Likewise.
+       (bfd_install_relocation): Likewise.
+
 2018-08-10  H.J. Lu  <hongjiu.lu@intel.com>
 
        PR ld/23499
index b63473e12aee566b99b3d58d97ef5898a7848352..775a4403ef9345a444389a40773c119003558581 100644 (file)
@@ -920,11 +920,9 @@ space consuming.  For each target:
     {
     case 5:
       {
-       long x = bfd_get_32 (abfd, (bfd_byte *) data + octets);
-       x >>= 8;
+       long x = bfd_get_24 (abfd, (bfd_byte *) data + octets);
        DOIT (x);
-       bfd_put_16 (abfd, (bfd_vma) (x >> 8), (bfd_byte *) data + octets);
-       bfd_put_8 (abfd, (x & 0xFF), (unsigned char *) data + 2 + octets);
+       bfd_put_24 (abfd, (bfd_vma) x, (unsigned char *) data + octets);
       }
       break;
 
@@ -1340,6 +1338,13 @@ space consuming.  For each target:
        bfd_put_32 (abfd, (bfd_vma) x, data);
       }
       break;
+    case 5:
+      {
+       long x = bfd_get_24 (abfd, data);
+       DOIT (x);
+       bfd_put_24 (abfd, (bfd_vma) x, data);
+      }
+      break;
     case -2:
       {
        long x = bfd_get_32 (abfd, data);
@@ -1467,6 +1472,9 @@ _bfd_relocate_contents (reloc_howto_type *howto,
     case 2:
       x = bfd_get_16 (input_bfd, location);
       break;
+    case 3:
+      x = bfd_get_24 (input_bfd, location);
+      break;
     case 4:
       x = bfd_get_32 (input_bfd, location);
       break;
@@ -1593,6 +1601,9 @@ _bfd_relocate_contents (reloc_howto_type *howto,
     case 2:
       bfd_put_16 (input_bfd, x, location);
       break;
+    case 3:
+      bfd_put_24 (input_bfd, x, location);
+      break;
     case 4:
       bfd_put_32 (input_bfd, x, location);
       break;
@@ -1636,6 +1647,9 @@ _bfd_clear_contents (reloc_howto_type *howto,
     case 2:
       x = bfd_get_16 (input_bfd, location);
       break;
+    case 3:
+      x = bfd_get_24 (input_bfd, location);
+      break;
     case 4:
       x = bfd_get_32 (input_bfd, location);
       break;
@@ -1670,6 +1684,9 @@ _bfd_clear_contents (reloc_howto_type *howto,
     case 2:
       bfd_put_16 (input_bfd, x, location);
       break;
+    case 3:
+      bfd_put_24 (input_bfd, x, location);
+      break;
     case 4:
       bfd_put_32 (input_bfd, x, location);
       break;