global pointer gets overwritten with dlopen(3) on RISC-V
Palmer Dabbelt
palmer@dabbelt.com
Fri May 12 20:33:25 GMT 2023
On Fri, 12 May 2023 13:11:43 PDT (-0700), fweimer@redhat.com wrote:
> * Fangrui Song:
>
>>>1. Make -mno-relax the default for ld(1) (on Linux?). We have no
>>>benchmarks whatsoever, but global variables aren't very popular in
>>>application code these days and the gp register allows access to a
>>>single memory page (4kB) only. No big deal really.
>>
>> I do agree that --no-relax-gp is a sensible default choice for GNU ld.
>> https://maskray.me/blog/2021-03-14-the-dark-side-of-riscv-linker-relaxation#global-pointer-relaxation
>>
>> Perhaps you can start a separate topic on binutils? :)
>>
>> According to a doc from SiFive about -static -mcpu=sifive-u74 builds,
>> https://docs.google.com/spreadsheets/d/14V7cPbyc80AcGHzsMaw9hYb232dzRbGCmTApnxj-SpU/edit#gid=0
>> global pointer relaxation saves at best 0.5% size (I guess that refers
>> to .text. If we count all allocable sections, the percentage is likely
>> even smaller.)
>
> For a mature toolchain, 0.5% in code size reduction would be *a lot*,
> so I wouldn't dismiss that.
That's broadly speaking why it sticks around. We've got a bunch of
headaches related to relaxation, GP or otherwise, but they improve
performance and nobody's figured out how to replace that yet.
> Do we have a reproducer? Is the issue actually about gp relaxation for
> the main executable?
In general we don't reference GP from shared libraries as we don't have
a GP save/restore scheme. There may be a bug floating around here
somewhere, in which case we should fix it, but the original post sounds
like it wasn't a supported use case.
> Thanks,
> Florian
More information about the Binutils
mailing list