[PATCH] RISC-V: errata: Use medany for relocatable builds

Palmer Dabbelt palmer at rivosinc.com
Sun Mar 30 12:41:00 PDT 2025


On Fri, 28 Mar 2025 01:18:01 PDT (-0700), Alexandre Ghiti wrote:
> On 26/03/2025 23:45, Palmer Dabbelt wrote:
>> We're trying to mix non-PIC/PIE objects into the otherwise-PIE
>> relocatable kernels, to avoid GOT/PLT references during early boot
>> alternative resolution (which happens before the GOT/PLT are set up).
>>
>> riscv64-unknown-linux-gnu-ld: arch/riscv/errata/sifive/errata.o: relocation R_RISCV_HI20 against `tlb_flush_all_threshold' can not be used when making a shared object; recompile with -fPIC
>> riscv64-unknown-linux-gnu-ld: arch/riscv/errata/thead/errata.o: relocation R_RISCV_HI20 against `riscv_cbom_block_size' can not be used when making a shared object; recompile with -fPIC
>
>
> thead erratas are already compiled with medany if
> CONFIG_RISCV_ALTERNATIVE_EARLY is set
> (https://elixir.bootlin.com/linux/v6.14-rc6/source/arch/riscv/errata/thead/Makefile#L2)
> so why isn't it enough?

Those are linker errors, we can't pull the medlow code into PIC objects.  
So any objects in relocatable kernels need to either be PIC/PIE or be 
medany (which can't reference any absolute symbols).

>> Fixes: 8dc2a7e8027f ("riscv: Fix relocatable kernels with early alternatives using -fno-pie")
>> Signed-off-by: Palmer Dabbelt <palmer at rivosinc.com>
>> ---
>> I'm not 100% sure it's possible to expose this without Samuel's NOMMU
>> relocatable builds, see
>> <https://lore.kernel.org/all/mhng-517c0318-c8fb-4c4a-aa0e-0d08f8d34d78@palmer-ri-x1c9/>
>> ---
>>   arch/riscv/errata/Makefile | 6 +++++-
>>   1 file changed, 5 insertions(+), 1 deletion(-)
>>
>> diff --git a/arch/riscv/errata/Makefile b/arch/riscv/errata/Makefile
>> index f0da9d7b39c3..bc6c77ba837d 100644
>> --- a/arch/riscv/errata/Makefile
>> +++ b/arch/riscv/errata/Makefile
>> @@ -1,5 +1,9 @@
>>   ifdef CONFIG_RELOCATABLE
>> -KBUILD_CFLAGS += -fno-pie
>> +# We can't use PIC/PIE when handling early-boot errata parsing, as the kernel
>> +# doesn't have a GOT setup at that point.  So instead just use medany: it's
>> +# usually position-independent, so it should be good enough for the errata
>> +# handling.
>> +KBUILD_CFLAGS += -fno-pie -mcmodel=medany
>>   endif
>>
>>   ifdef CONFIG_RISCV_ALTERNATIVE_EARLY
>
> _______________________________________________
> linux-riscv mailing list
> linux-riscv at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-riscv



More information about the linux-riscv mailing list