AIX 7.3下GCC编译程序出现l_rsecnm字段无效重定位错误
AIX 7.3 GCC编译动态库出现"invalid l_rsecnm field"重定位错误
问题详情
在AIX 7.3系统使用GCC 10.3.0编译动态库libotds.1.so并链接到可执行程序pdconfig时,运行程序触发重定位失败错误:
Could not load program bin/pdconfig: Relocation failed for /test/rahul/otos/lib/libotds.1.so because: Relocation entry 0 (at address 0x4BD43) has an invalid l_rsecnm field. ... Examine .loader section relocation entries with the 'dump -Rv' command.
此前在AIX 7.1使用xlC编译相同代码可正常运行,切换GCC后出现该问题。
环境信息
- GCC版本:
gcc (GCC) 10.3.0 - AIX版本:
AIX bp2-aixlpar-om-aix73 3 7 00C4D5F04B00
当前编译/链接命令
编译目标文件
g++ -Wl,-brtl -maix64 -fPIC -DUSE_EXP_BUF -DAIX -I/eng/otbuild/aix73/os/24.2.0.0.0.good/exports/include/ -c -o AuthOTDS.o AuthOTDS.cpp # 其余.o文件编译命令格式一致
链接libotds.1.so
ld -bshared -bnotextro -o libotds.1.so `cat libotds.1.lst` -b64 -G -bnoentry -bnolibpath -bnoipath -bexpall -bE:libotds.1.exp -L/eng/otbuild/aix73/os/24.2.0.0.0.good/exports/lib -lcurl -lC -lc_r
链接libms.2.so(依赖libotds.1.so)
ld -bshared -o libms.2.so `cat libms.2.lst` -b64 -G -bnoentry -bnolibpath -bnoipath -bexpall -bE:libms.2.exp -L/eng/otbuild/aix73/os/24.2.0.0.0.good/exports/lib /eng/otbuild/aix73/os/24.2.0.0.0.good/exports/lib/libotds.1.so -lc_r
解决方案
1. 用g++替代直接调用ld链接动态库
AIX系统原生ld与GCC的兼容性存在问题,建议通过g++执行链接操作,它会自动注入AIX所需的正确链接参数:
# 链接libotds.1.so g++ -maix64 -shared -Wl,-brtl,-bnotextro,-b64,-G,-bnoentry,-bnolibpath,-bnoipath,-bexpall,-bE:libotds.1.exp \ -o libotds.1.so `cat libotds.1.lst` \ -L/eng/otbuild/aix73/os/24.2.0.0.0.good/exports/lib -lcurl -lC -lc_r -lgcc_s # 链接libms.2.so g++ -maix64 -shared -Wl,-brtl,-b64,-G,-bnoentry,-bnolibpath,-bnoipath,-bexpall,-bE:libms.2.exp \ -o libms.2.so `cat libms.2.lst` \ -L/eng/otbuild/aix73/os/24.2.0.0.0.good/exports/lib /eng/otbuild/aix73/os/24.2.0.0.0.good/exports/lib/libotds.1.so -lc_r -lgcc_s
2. 移除编译阶段无效的链接选项
编译.o目标文件时不需要传递-Wl,-brtl,该选项仅在链接阶段生效,修改编译命令:
g++ -maix64 -fPIC -DUSE_EXP_BUF -DAIX -I/eng/otbuild/aix73/os/24.2.0.0.0.good/exports/include/ -c -o AuthOTDS.o AuthOTDS.cpp
3. 移除xlC专属的-bnotextro选项
-bnotextro是xlC的特定选项,GCC链接时可能不需要,尝试移除后重新链接libotds.1.so:
g++ -maix64 -shared -Wl,-brtl,-b64,-G,-bnoentry,-bnolibpath,-bnoipath,-bexpall,-bE:libotds.1.exp \ -o libotds.1.so `cat libotds.1.lst` \ -L/eng/otbuild/aix73/os/24.2.0.0.0.good/exports/lib -lcurl -lC -lc_r -lgcc_s
4. 显式链接GCC运行时库
AIX上GCC编译的程序必须依赖libgcc_s.so,链接命令中添加-lgcc_s确保运行时能正确加载该库。
5. 用dump -Rv定位具体问题
执行错误提示的命令分析重定位条目,确认无效段名称对应的来源文件:
dump -Rv /test/rahul/otos/lib/libotds.1.so
根据输出定位到有问题的.o文件后,针对性调整该文件的编译选项。
6. 添加AIX专属编译选项
尝试添加-mno-fp-in-toc解决GCC在AIX上处理浮点变量的TOC问题,修改编译命令:
g++ -maix64 -fPIC -mno-fp-in-toc -DUSE_EXP_BUF -DAIX -I/eng/otbuild/aix73/os/24.2.0.0.0.good/exports/include/ -c -o AuthOTDS.o AuthOTDS.cpp
内容的提问来源于stack exchange,提问作者Rahul Sabnis
相关产品推荐
相关产品推荐

