From d94ea55d64d08093214c2a9a025bbf761c4eeea5 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Fri, 11 Jun 1999 20:23:58 +0000 Subject: [PATCH] * reloc.c (_bfd_relocate_contents): Permit bitfield relocations to wrap if the relocation covers the high bit of an address. --- bfd/ChangeLog | 3 +++ bfd/reloc.c | 9 +++++++++ 2 files changed, 12 insertions(+) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index e5edd46f3..0606b9081 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,5 +1,8 @@ 1999-06-11 Ian Lance Taylor + * 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 diff --git a/bfd/reloc.c b/bfd/reloc.c index 9e8735e5e..360c1b279 100644 --- a/bfd/reloc.c +++ b/bfd/reloc.c @@ -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) { -- 2.11.4.GIT