[akpm-mm:mm-nonmm-unstable 18/58] ERROR: modpost: vmlinux: local symbol 'kthread_stop_put' was exported

Masahiro Yamada masahiroy at kernel.org
Mon Oct 30 22:37:35 PDT 2023


(+CC: RISCV, toolchian folks)

Original Thread:
https://lore.kernel.org/oe-kbuild-all/202310282049.HXCHtgEz-lkp@intel.com/


On Sun, Oct 29, 2023 at 1:36 AM Andrew Morton <akpm at linux-foundation.org> wrote:
>
> On Sat, 28 Oct 2023 20:29:18 +0800 kernel test robot <lkp at intel.com> wrote:
>
> > tree:   https://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm.git mm-nonmm-unstable
> > head:   d431880137b55533f664056070226a88dba99637
> > commit: 6309727ef27162deabd5c095c11af24970fba5a2 [18/58] kthread: add kthread_stop_put
> > config: riscv-randconfig-c033-20221102 (https://download.01.org/0day-ci/archive/20231028/202310282049.HXCHtgEz-lkp@intel.com/config)
> > compiler: riscv32-linux-gcc (GCC) 13.2.0
> > reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20231028/202310282049.HXCHtgEz-lkp@intel.com/reproduce)
> >
> > If you fix the issue in a separate patch/commit (i.e. not just a new version of
> > the same patch/commit), kindly add following tags
> > | Reported-by: kernel test robot <lkp at intel.com>
> > | Closes: https://lore.kernel.org/oe-kbuild-all/202310282049.HXCHtgEz-lkp@intel.com/
> >
> > All errors (new ones prefixed by >>, old ones prefixed by <<):
> >
> > ERROR: modpost: vmlinux: local symbol 'system_power_efficient_wq' was exported
>
> [ it now proceeds to list 16000 more such "errors" ]
>
> I see no error here - these symbols are exported because modules use
> them.  Unless I misinterpret the intent of this modpost check.
>
> Masahiro, could you please take a look?


I was able to reproduce the issue even in the mainline kernel.

But, the warnings are not only the export symbols,
but also a ton of false-positive section mismatch warnings.

To me, the RELA sections look broken when the vmlinux size
grows to a certain extent.

I suspected a toolchain bug, but I am not 100% sure.

In my investigation, this happens under some conditions.

 - It happens on RISCV 32-bit
 - It happens with GCC. LLVM is no problem.
 - It happens when the vmlinux size grows


I attached a simple reproducer script at the end of this reply.


Please checkout the v6.6 tag.
Run the reproducer, with the yes2modconfig line commented out.


When vmlinux.o is small, the relocation info looks sane.
For example,

$ riscv64-linux-gnu-size vmlinux.o
   text    data     bss     dec     hex filename
10762048 905937 342657 12010642 b74492 vmlinux.o
$ riscv64-linux-gnu-readelf -r vmlinux.o  | grep -m1 -A10 rela.export_symbol
Relocation section '.rela.export_symbol' at offset 0x1d9491d4 contains
9789 entries:
 Offset     Info    Type            Sym.Value  Sym. Name + Addend
00000004  c3130301 R_RISCV_32        00000024   system_state + 0
00000010  c33b6901 R_RISCV_32        00000018   static_key_initialized + 0
00000018  c3024d01 R_RISCV_32        00000014   reset_devices + 0
00000020  c33b9e01 R_RISCV_32        00000008   loops_per_jiffy + 0
0000002c  c2f57201 R_RISCV_32        00000110   init_uts_ns + 0
00000038  c3233601 R_RISCV_32        00000354   wait_for_initramfs + 0
00000040  c2ffff01 R_RISCV_32        00000340   init_task + 0
00000048  c313fc01 R_RISCV_32        00000b58   riscv_cached_mvendorid + 0
00000050  c2f78a01 R_RISCV_32        00000b7e   riscv_cached_marchid + 0







Run the reproducer, with the yes2modconfig line in.

vmlinux.o gets bigger, and the relocation info is messed up.
ELF_R_SYM() starts to point local symbols ".LASF*"


$ riscv64-linux-gnu-size vmlinux.o
   text    data     bss     dec     hex filename
16831652 1141862 390321 18363835 11835bb vmlinux.o

$ riscv64-linux-gnu-readelf -r vmlinux.o  | grep -A10 rela.export_symbol
Relocation section '.rela.export_symbol' at offset 0x3201524c contains
11648 entries:
 Offset     Info    Type            Sym.Value  Sym. Name + Addend
00000004  3f41b601 R_RISCV_32        01302449   .LASF1851 + 0
00000010  3f3f4301 R_RISCV_32        012ffca4   .LASF1225 + 0
00000018  3f40d201 R_RISCV_32        01300bc1   .LASF1623 + 0
00000020  3f646a01 R_RISCV_32        01319a43   .LASF5361 + 0
0000002c  3f2f6201 R_RISCV_32        012f5c1f   .LASF3521 + 0
00000038  3f168701 R_RISCV_32        012dd796   .LASF4363 + 0
00000040  3f5d8c01 R_RISCV_32        01319a26   .LASF3685 + 0
00000048  3f092501 R_RISCV_32        012e5792   .LASF939 + 0
00000050  3f22b501 R_RISCV_32        012f89a4   .LASF277 + 0





This is the reproducer shell script.

------------------->8-----------------------------
#!/bin/sh

set -e

# I used riscv64-linux-gnu-gcc available on Ubuntu.
# Instead, you can also use riscv32-linux-gcc, riscv64-linux-gcc, etc.
# provided by the 0day.

export CROSS_COMPILE=riscv64-linux-gnu-

make ARCH=riscv defconfig

#
# Configure for 32-bit
#
make ARCH=riscv 32-bit.config

#
# Turn =m into =y in order to grow vmlinux
#
make ARCH=riscv mod2yesconfig

#
# Enable DEBUG_INFO
#
./scripts/config -d CONFIG_DEBUG_INFO_NONE
./scripts/config -e CONFIG_DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT

# sync the .config
make ARCH=riscv olddefconfig

make ARCH=riscv -j$(nproc) vmlinux_o
------------------------>8------------------------------------



-- 
Best Regards
Masahiro Yamada



More information about the linux-riscv mailing list