undefined symbol in modpost "zero"
Conor Dooley
conor at kernel.org
Tue Dec 27 11:05:51 PST 2022
On Fri, Dec 23, 2022 at 04:59:51PM +0000, Ben Dooks wrote:
> 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.
For anyone not paying attention to the RISC-V IRC, it is an upstream
binutils issue that does not affect released versions (yet) although it
does affect what is in debian-testing.
The upstream report for the issue is here:
https://sourceware.org/bugzilla/show_bug.cgi?id=29940
and for debian here:
https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1026979
Thanks,
Conor.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 228 bytes
Desc: not available
URL: <http://lists.infradead.org/pipermail/linux-riscv/attachments/20221227/b1825ee1/attachment.sig>
More information about the linux-riscv
mailing list