undefined symbol in modpost "zero"
Ben Dooks
ben.dooks at codethink.co.uk
Fri Dec 23 08:59:51 PST 2022
On 23/12/2022 16:38, Ben Dooks wrote:
> I'm getting the following error from modpost:
>
> ERROR: modpost: "zero" [arch/riscv/kvm/kvm.ko] undefined!
> ERROR: modpost: "zero" [drivers/gpu/drm/drm.ko] undefined!
> ERROR: modpost: "zero" [drivers/nvme/host/nvme.ko] undefined!
> ERROR: modpost: "zero" [drivers/i2c/algos/i2c-algo-bit.ko] undefined!
>
> This seems to be coming from arch/riscv/include/asm/jump_label.h
> with the arch_static_branch_jump() assembling some code:
>
>> 40 {
>> 41 asm_volatile_goto(
>> 42 " .option
>> push \n\t"
>> 43 " .option
>> norelax \n\t"
>> 44 " .option
>> norvc \n\t"
>> 45 "1: jal zero,
>> %l[label] \n\t"
>> 46 " .option
>> pop \n\t"
>> 47 " .pushsection __jump_table,
>> \"aw\" \n\t"
>> 48 " .align " RISCV_LGPTR
>> " \n\t"
>> 49 " .long 1b - ., %l[label] -
>> . \n\t"
>> 50 " " RISCV_PTR " %0 -
>> . \n\t"
>> 51 "
>> .popsection \n\t"
>> 52 : : "i"(&((char *)key)[branch]) : : label);
>> 53
>> 54 return false;
>> 55 label:
>> 56 return true;
>> 57 }
>>
>
> Changing the jal zero to jal x0 doesn't fix it, it just comes up with
> "x0" being undefined.
>
> gcc version 12.2.0 (Debian 12.2.0-9)
> GNU assembler version 2.39.50 (riscv64-linux-gnu) using BFD version (GNU
> Binutils for Debian) 2.39.50.20221208
>
> I suspect this is a gas bug where it means to assemble a J instruction
> to the label without outputting the unused symbol "zero" into the symbol
> table. Is the right thing to fix gas, or can the kernel be changed?
>
> FYI:
>
> tmp.s:
> 1 .text
> 2
> 3 1:
> 4 jal zero, 1b
>
>
> produces:
>
> 0000000000000000 <.L1^B1>:
> 0: 0000006f j 0 <.L1^B1>
> 0: R_RISCV_JAL .L1^B1
>
> and
>
> $ riscv64-linux-gnu-nm -a tmp.o
> 0000000000000000 b .bss
> 0000000000000000 d .data
> 0000000000000000 n .riscv.attributes
> 0000000000000000 t .text
> U zero
>
> Current fix is to:
>
>
> diff --git a/arch/riscv/include/asm/jump_label.h
> b/arch/riscv/include/asm/jump_label.h
> index 6d58bbb5da46..a4abbacd0b62 100644
> --- a/arch/riscv/include/asm/jump_label.h
> +++ b/arch/riscv/include/asm/jump_label.h
> @@ -42,7 +42,7 @@ static __always_inline bool
> arch_static_branch_jump(struct static_key * const ke
> " .option push \n\t"
> " .option norelax \n\t"
> " .option norvc \n\t"
> - "1: jal zero, %l[label] \n\t"
> + "1: j %l[label] \n\t"
> " .option pop \n\t"
> " .pushsection __jump_table, \"aw\" \n\t"
> " .align " RISCV_LGPTR " \n\t"
>
>
> This fixes modpost, not sure if this should be applied or not.
>
I just checked riscv64-linux-gnu-nm vmlinux.o and it has
U zero
So I guess the linker just ignores this undefined symbol as it is never
actually used for a relocation.
--
Ben Dooks http://www.codethink.co.uk/
Senior Engineer Codethink - Providing Genius
https://www.codethink.co.uk/privacy.html
More information about the linux-riscv
mailing list