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