On Sat, 26 Dec 2020, Andrew Pinski via Gcc wrote:

> Two things, this should really be on the binutils mailing list rather
> than the GCC mailing list.  Second you can't generate a flat binary
> which has a GOT as it requires relocations and there is no way to
> represent relocations in flat binary.  So you need to use non PIE or
> still use elf format.
> PIE requires the use of the GOT.

You can annotate 'func' in prog.c with __attribute__((visibility("hidden"))),
then GCC should not use a GOT relocation for the reference. Note that you do
need to set visibility via the attribute or the pragma, not the command-line
flag -fvisibility=hidden, because the flag does not affect declarations.

(this is for x86-64; as 32-bit x86 lack eip-relative addressing, GCC uses
GOT relocation for taking the address anyway; it will work if the linker
places an "imaginary" empty GOT somewhere, just to have a stable anchor
against which to resolve GOTOFF relocations)

Please consider filing a bug against binutils on sourceware.org, this looks
like a QoI issue in the linker: it should emit a diagnostic rather than
non-sensical code.

Alexander

Reply via email to