Petalinux无ldd/file时检查共享库依赖及Zynq应用报错排查
针对你在Zynq Zedboard的Petalinux上运行交叉编译的xiSample程序遇到的问题,我整理了几个实用的排查方法,尤其是在没有ldd和file工具的情况下:
一、无ldd/file时查找可执行文件的依赖共享库
因为Petalinux默认可能没预装这些工具,你可以用以下几种方式获取依赖信息:
用交叉编译工具链的readelf(开发机端操作):
如果你能把xiSample拷贝回开发机,直接用你的arm-linux-gnueabi工具链里的readelf命令,列出所有需要的动态库:arm-linux-gnueabi-readelf -d xiSample | grep NEEDED输出会显示类似
0x00000001 (NEEDED) Shared library: [libxi.so.6]这样的条目,就是程序依赖的库。目标板上用readelf/objdump(如果存在):
先在Petalinux终端里输入readelf -V或objdump -V看看系统有没有自带这两个工具。如果有,直接运行:readelf -d xiSample | grep NEEDED # 或者用objdump objdump -x xiSample | grep NEEDED如果没有,可以从开发机的交叉工具链目录里把对应的readelf/objdump二进制文件拷贝到目标板的
/usr/bin目录(记得加可执行权限:chmod +x /usr/bin/readelf)。从运行报错直接定位:
运行xiSample时的错误提示通常会直接指出缺失的库,比如:error while loading shared libraries: libxi.so.6: cannot open shared object file: No such file or directory
看到这种提示,直接去目标板的/lib、/usr/lib目录下查找是否存在该库,或者确认库的路径是否被系统识别。
二、链接问题的排查建议
如果怀疑是链接层面的问题,可以从这几个方向入手:
确认交叉编译时的库路径是否正确:
检查你编译xiSample时的命令,确保-L参数指向的是Zynq平台对应的共享库目录(比如Petalinux根文件系统里的usr/lib,或者你移植的第三方库目录),同时-l参数正确指定了库名(比如-lxi对应libxi.so)。验证库与程序的架构匹配:
在开发机上用交叉工具链的file命令检查可执行文件和依赖库的架构,避免用错x86的库:arm-linux-gnueabi-file xiSample arm-linux-gnueabi-file /path/to/libxi.so.6输出应该显示类似
ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV)的ARM架构信息。检查运行时库路径环境变量:
Petalinux里的LD_LIBRARY_PATH决定了系统去哪里找动态库,先查看当前设置:echo $LD_LIBRARY_PATH如果你的库不在这个路径里,临时设置后再运行程序试试:
export LD_LIBRARY_PATH=/path/to/your/library/dir:$LD_LIBRARY_PATH ./xiSample如果有效,可以把这个环境变量添加到
/etc/profile里永久生效。确认库版本匹配:
有些库会带版本号(比如libxi.so.6),要确保目标板上存在对应的版本,而不是只有不带版本的软链接或者版本不兼容的库。如果版本不符,可以从交叉编译工具链的sysroot目录里拷贝对应版本的库到目标板。尝试静态编译排除动态链接问题:
编译时添加-static参数,生成不依赖动态库的可执行文件:arm-linux-gnueabi-gcc -static xiSample.c -o xiSample_static -L/path/to/libs -lxi把静态版本拷贝到目标板运行,如果能正常执行,说明问题确实出在动态链接环节。
检查Petalinux根文件系统配置:
确认你需要的库已经包含在Petalinux的根文件系统中。如果是用Petalinux构建系统,可以在配置时通过petalinux-config -c rootfs选中对应的库包;如果是手动移植的库,要确保已经拷贝到目标板的/lib或/usr/lib目录,并且权限正确。
内容的提问来源于stack exchange,提问作者gPats

