[PATCH] gold: Add -z noreloc-overflow option

Fangrui Song i@maskray.me
Sat Nov 7 22:06:03 GMT 2020


On 2020-11-03, H.J. Lu wrote:
>On Mon, Nov 2, 2020 at 11:02 PM Fangrui Song <i@maskray.me> wrote:
>>
>> On 2020-11-03, Hang Deng (handeng) via Binutils wrote:
>> >HJ, Cary,
>> >
>> >Thanks, we tried your patch for X86_64, it works well.
>> >
>> >And the patch below also works with arm64,  but I am not familiar with  the test case and review/commit process, can you please help to commit this patch as well?
>> >
>> >Thanks,
>> >Hunter
>> >
>> >diff --git a/gold/aarch64.cc b/gold/aarch64.cc
>> >index b207dcdc..29da1e35 100644
>> >--- a/gold/aarch64.cc
>> >+++ b/gold/aarch64.cc
>> >@@ -5972,7 +5972,6 @@ Target_aarch64<size, big_endian>::Scan::local(
>> >     case elfcpp::R_AARCH64_NONE:
>> >       break;
>> >
>> >-    case elfcpp::R_AARCH64_ABS32:
>> >     case elfcpp::R_AARCH64_ABS16:
>> >       if (parameters->options().output_is_position_independent())
>> >        {
>> >@@ -5981,6 +5980,13 @@ Target_aarch64<size, big_endian>::Scan::local(
>> >        }
>> >       break;
>> >
>> >+    case elfcpp::R_AARCH64_ABS32:
>> >+      if ( parameters->options().output_is_position_independent() &&
>> >+          !parameters->options().noreloc_overflow()) {
>> >+              gold_error(_("%s: unsupported reloc %u in pos independent link."),
>> >+                       object->name().c_str(), r_type);
>> >+           break;
>> >+       }
>>
>> Cary raised the point that -z noreloc-overflow should be related to the
>> link-time value, rather than the possibility of runtime overflow.
>>
>
>From ld manual:
>
>    'noreloc-overflow'
>          Disable relocation overflow check.  This can be used to
>          disable relocation overflow check if there will be no dynamic
>          relocation overflow at run-time.  Supported for x86_64.
>
>H.J.

I am now wondering whether -z noreloc-overflow is a misnomer or a
misfeature.

I can see that the resolution of
https://sourceware.org/bugzilla/show_bug.cgi?id=19807 introduced -z
noreloc-overflow and the only usage is in the Linux kernel.

https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=a2c4fc4d4e2c40b07534094810d915c7354d84a7
which I reviewed
properly fixed fix the x86 code and it will be included in Linux 5.10.
This paragraph of the commit message explained why the option can be
dangerous pretty well:

   ... This is because these instructions cannot really be
   relocated: the displacement field is only 32-bits wide, and thus
   cannot be relocated for a 64-bit load address. The -z noreloc-overflow
   option simply overrides the linker error, and results in
   R_X86_64_RELATIVE relocations that apply a 64-bit relocation to a
   32-bit field anyway.  This happens to work because nothing will
   process these run-time relocations.

The test pr19807-2e.d well demonstrated that an R_X86_64_RELATIVE
relocates a 32-bit field, which looks very dangerous.

Note, the meaning of -z noreloc-overflow in PR19807 seems very different
from this Gold patch.


More information about the Binutils mailing list