使用Buildroot构建Debian时出现libDeviceIo.so文件格式无法识别错误
编译PX30平台Debian系统链接报错解决方案
问题背景
为采用RockChip PX30方案的aarch64架构Engicam PX30-Core EDIMM SOM设备编译Debian系统,编译环境为厂商提供的预装全量开发工具与配置的虚拟机。通过make menuconfig添加软件包后执行make编译,出现链接失败错误。
完整报错日志
PATH="/home/user/px30/buildroot/output/host/bin:/home/user/px30/buildroot/output/host/sbin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin" /usr/bin/make -j9 CXXFLAGS+="-DRKDEVICEIO -I/home/user/px30/buildroot/../external/deviceio_release/DeviceIO/include" LFLAGS+=" -lDeviceIo -lasound" -C /home/user/px30/buildroot/output/build/qsetting-1.0 make[1]: Entering directory '/home/user/px30/buildroot/output/build/qsetting-1.0' /home/user/px30/buildroot/output/host/bin/aarch64-buildroot-linux-gnu-g++ -lDeviceIo -lasound -o qsetting main.o mainwindow.o qtaudio.o qtbt.o qtfactory.o qtinputdialog.o qtkeyboard.o qtupdate.o qtwifi.o qrc_res.o moc_mainwindow.o moc_qtaudio.o moc_qtbt.o moc_qtfactory.o moc_qtinputdialog.o moc_qtkeyboard.o moc_qtupdate.o moc_qtwifi.o -lQt5Widgets -lQt5Multimedia -lQt5Gui -lQt5Network -lQt5Core -latomic -lrt -ldl /home/user/px30/buildroot/output/host/aarch64-buildroot-linux-gnu/sysroot/usr/lib/libGLESv2.so -lpthread -lrt -lpthread -ldl /home/user/px30/buildroot/output/host/lib/gcc/aarch64-buildroot-linux-gnu/6.5.0/../../../../aarch64-buildroot-linux-gnu/bin/ld:/home/user/px30/buildroot/output/host/aarch64-buildroot-linux-gnu/sysroot/usr/lib/../lib64/libDeviceIo.so: file format not recognized; treating as linker script /home/user/px30/buildroot/output/host/lib/gcc/aarch64-buildroot-linux-gnu/6.5.0/../../../../aarch64-buildroot-linux-gnu/bin/ld:/home/user/px30/buildroot/output/host/aarch64-buildroot-linux-gnu/sysroot/usr/lib/../lib64/libDeviceIo.so:0: syntax error collect2: error: ld returned 1 exit status Makefile:214: recipe for target 'qsetting' failed make[1]: *** [qsetting] Error 1 make[1]: Leaving directory '/home/user/px30/buildroot/output/build/qsetting-1.0' package/pkg-generic.mk:254: recipe for target '/home/user/px30/buildroot/output/build/qsetting-1.0/.stamp_built' failed make: *** [/home/user/px30/buildroot/output/build/qsetting-1.0/.stamp_built] Error 2
根因定位
检查链接报错指向的libDeviceIo.so文件,发现该文件并非符合aarch64架构的动态链接库,而是仅包含fake字符串的ASCII文本文件:
user@ubuntu:~/px30/buildroot/output/host/aarch64-buildroot-linux-gnu/sysroot/usr/lib$ cat libDeviceIo.so fake user@ubuntu:~/px30/buildroot/output/host/aarch64-buildroot-linux-gnu/sysroot/usr/lib$ file libDeviceIo.so libDeviceIo.so: ASCII text
该问题是厂商提供的DeviceIO SDK编译脚本异常,导致生成了占位用的假库文件,无法被链接器识别。
解决方案
可用快速修复
若不需要使用qsetting组件,直接通过make menuconfig从目标软件包列表中移除qsetting包,重新执行编译即可解决报错。
可选修复方向(需保留qsetting时)
- 检查
external/deviceio_release目录下的SDK编译配置,修复生成假库的脚本逻辑,重新编译生成正确的aarch64架构libDeviceIo.so - 从厂商提供的预编译固件、配套SDK包中提取可用的aarch64版
libDeviceIo.so,替换当前路径下的假文件后重新编译 - 调整qsetting包的编译配置,将链接路径指向正确的
libDeviceIo.so输出目录
内容的提问来源于stack exchange,提问作者The Mark
相关产品推荐
相关产品推荐

