编译 Linux 内核,打印 "multiple definition of `yylloc'" 出错

1 问题描述

1.1 环境

  • OS:Arch Linux x86_64
  • GCC:12.2.0
  • ld:2.39.0
  • 编译的内核版本:linux-imx-rel_imx_4.1.15_2.1.0
1
2
3
4
5
6
cat /proc/version
Linux version 6.0.12-arch1-1 (linux@archlinux) (gcc (GCC) 12.2.0, GNU ld (GNU Binutils) 2.39.0) #1 SMP PREEMPT_DYNAMIC Thu, 08 Dec 2022 11:03:38 +0000

uname -m
x86_64

1.2 错误输出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
...
CHK include/generated/bounds.h
UPD include/generated/bounds.h
CC arch/arm/kernel/asm-offsets.s
CHK include/generated/asm-offsets.h
UPD include/generated/asm-offsets.h
CALL scripts/checksyscalls.sh
HOSTLD scripts/dtc/dtc
/usr/bin/ld: scripts/dtc/dtc-parser.tab.o:(.bss+0x50): multiple definition of `yylloc'; scripts/dtc/dtc-lexer.lex.o:(.bss+0x0): first defined here
collect2: 错误:ld 返回 1
make[2]: *** [scripts/Makefile.host:100:scripts/dtc/dtc] 错误 1
make[1]: *** [scripts/Makefile.build:403:scripts/dtc] 错误 2
make[1]: *** 正在等待未完成的任务....
HOSTLD scripts/genksyms/genksyms
HOSTLD scripts/mod/modpost
make: *** [Makefile:555:scripts] 错误 2


2 原因

gcc 10 将默认为 -fno-common,这将导致在链接时出现错误 multiple definition of yylloc’;`


3 解决方法

使用下述两种方式皆能编译通过。

3.1 方法 1

降级 gcc 版本为 gcc 9

3.2 方法 2

定位到内核目录,使用 vim 编辑 ./scripts/dtc/dtc-lexer.lex.c

找到

1
YYLTYPE yylloc;

更改为:

1
extern YYLTYPE yylloc;

4 参考

  1. ‘multiple definition of yylloc’ error #4的解决方案
  2. 补丁