Ubuntu24.04编译linux-xlnx-xlnx_rebase_v5.4的问题

环境

环境Ubuntu 18.04 (官方推荐)Ubuntu 24.04(我的wsl)
GCC7.x13.3
binutils2.302.42
glibc2.272.39
Linux-xlnx2020.22020.2

现象

minglie@ming:/home/wpf/workspace/kernel-driver/linux-xlnx-xlnx_rebase_v5.4_2020.2$ make 
HOSTLD scripts/dtc/dtc 
/usr/bin/ld: scripts/dtc/dtc-parser.tab.o:
(.bss+0x20): multiple definition of yylloc'; 
scripts/dtc/dtc-lexer.lex.o:
(.bss+0x0): first defined here collect2: 
error: ld returned 1 exit status make[1]: 
*** [scripts/Makefile.host:116: scripts/dtc/dtc] 
Error 1 make: *** [Makefile:1263: scripts_dtc] Error 2

旧版 Linux 内核(5.4 Xilinx 2020.2)和新版 Ubuntu/WSL 的 flex/bison 不兼容
yylloc 全局变量被定义了两次
dtc-parser.tab.o 定义了一次 yylloc
dtc-lexer.lex.o 又定义了一次 yylloc

GCC 10 有个编译选项-fcommon 和 -fno-common

对比项-fcommon(GCC 10 以前默认)-fno-common(GCC 10 以后默认)
默认版本GCC < 10GCC ≥ 10
对未初始化全局变量 int x; 的处理生成 Common Symbol生成真正的全局变量定义
多个源文件都有 int x;链接器自动合并链接时报错
nm 查看符号C(Common)B(BSS)或 D(Data)
是否容易隐藏 Bug
是否符合现代 C 工程规范较宽松更严格、更推荐
Linux 新版本支持情况已逐渐淘汰官方推荐

gcc编译选项

minglie@ming$ gcc -Q --help=common | grep common
  -fcommon                              [disabled]
  -fpredictive-commoning                [disabled]
  -funconstrained-commons               [disabled]

修改scripts/dtc/dtc-lexer.l重新编译

# scripts/dtc/dtc-lexer.l 的 26行
# YYLTYPE yylloc; 改为 extern YYLTYPE yylloc;
$ vim scripts/dtc/dtc-lexer.l
# 重新编译
make mrproper
make xilinx_zynq_defconfig
make -j$(nproc)


# 或者
# 删除 dtc 的生成文件
rm -f scripts/dtc/dtc
rm -f scripts/dtc/*.o
rm -f scripts/dtc/*.tab.*
rm -f scripts/dtc/*.lex.c
# 重新编译
make -j$(nproc)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值