PIE binaries are no longer mapped below 4 GiB on ppc64le
Florian Weimer
fweimer at redhat.com
Thu Nov 1 04:54:52 AEDT 2018
* Michal Suchánek:
> On Wed, 31 Oct 2018 18:20:56 +0100
> Florian Weimer <fweimer at redhat.com> wrote:
>
>> We tried to use Go to build PIE binaries, and while the Go toolchain
>> is definitely not ready (it produces text relocations and problematic
>> relocations in general), it exposed what could be an accidental
>> userspace ABI change.
>>
>> With our 4.10-derived kernel, PIE binaries are mapped below 4 GiB, so
>> relocations like R_PPC64_ADDR16_HA work:
>>
> ...
>
>> There are fewer mappings because the loader detects a relocation
>> overflow and aborts (“error while loading shared libraries:
>> R_PPC64_ADDR16_HA reloc at 0x0000000120f0983c for symbol `' out of
>> range”), so I had to recover the mappings externally. Disabling ASLR
>> does not help.
>>
> ...
>>
>> And it needs to be built with:
>>
>> go build -ldflags=-extldflags=-pie extld.go
>>
>> I'm not entirely sure what to make of this, but I'm worried that this
>> could be a regression that matters to userspace.
>
> I encountered the same when trying to build go on ppc64le. I am not
> familiar with the internals so I just let it be.
>
> It does not seem to matter to any other userspace.
It would matter to C code which returns the address of a global variable
in the main program through and (implicit) int return value.
The old behavior hid some pointer truncation issues.
> Maybe it would be good idea to generate 64bit relocations on 64bit
> targets?
Yes, the Go toolchain definitely needs fixing for PIE. I don't dispute
that.
Thanks,
Florian
More information about the Linuxppc-dev
mailing list