* reloc.c (_bfd_relocate_contents): Permit bitfield relocations to
authorIan Lance Taylor <ian@airs.com>
Fri, 11 Jun 1999 20:23:58 +0000 (20:23 +0000)
committerIan Lance Taylor <ian@airs.com>
Fri, 11 Jun 1999 20:23:58 +0000 (20:23 +0000)
wrap if the relocation covers the high bit of an address.

bfd/ChangeLog
bfd/reloc.c

index e5edd46f3fe297174b85dc482bbae2e70529a389..0606b9081948cebe4fb9fba1d9094b635a47e3f2 100644 (file)
@@ -1,5 +1,8 @@
 1999-06-11  Ian Lance Taylor  <ian@zembu.com>
 
+       * reloc.c (_bfd_relocate_contents): Permit bitfield relocations to
+       wrap if the relocation covers the high bit of an address.
+
        * dwarf2.c (decode_line_info): Remove unused variable first_time.
 
 1999-06-10  Jakub Jelinek  <jj@ultra.linux.cz>
index 9e8735e5ed6db189c11bcdcc1fa6e2a4b97a54b8..360c1b2799b1badbfbabe05035753d2f5a4291b5 100644 (file)
@@ -1560,6 +1560,15 @@ _bfd_relocate_contents (howto, input_bfd, relocation, location)
 
          /* We just assume (b & ~ fieldmask) == 0.  */
 
+         /* We explicitly permit wrap around if this relocation
+            covers the high bit of an address.  The Linux kernel
+            relies on it, and it is the only way to write assembler
+            code which can run when loaded at a location 0x80000000
+            away from the location at which it is linked.  */
+         if (howto->bitsize + rightshift
+             == bfd_arch_bits_per_address (input_bfd))
+           break;
+
          sum = a + b;
          if (sum < a || (sum & ~ fieldmask) != 0)
            {