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