本次实验平台:
【Debian9】
gcc version 6.3.0 20170516 (Debian 6.3.0-18+deb9u1)
GNU ld (GNU Binutils for Debian) 2.28
最近在使用C语言造轮子,夯实基础。将常用算法封装成函数放入库中,供可执行程序调用。这里首先试验了静态链接,无问题。试验使用动态链接时,出现无法找到文件的错误。
以参考项目为例,代码可通过编译及链接,但在执行时,提示如下:
./TestString: error while loading shared libraries: libPlanC.so: cannot open shared object file: No such file or directory
说明程序无法找到正确的动态库。
此时使用系统提供的ldd脚本,查看共享库的依赖关系,如下图所示,提示无法找到libPlanC.so
再用readelf查看可执行程序的动态段,如下:
此处注册了libPlanC.so动态库,但是并没有指定查找目录,那么在运行此可执行文件时,系统只会在默认的路径查找libPlanC.so库,显然是找不到的。那么问题至此已经明确,解决方法只需要在链接阶段,设置链接器搜索指定目录,就可以正常运行。
在makefile中,加入如下指令:
-Wl,-rpath=../../src
编译以后,再次使用readelf查看可执行程序的动态段,如下:
可见Library runpath中指定了搜索目录。
再次使用脚本ldd查看依赖关系,如下:
至此,问题解决。
参考资料
1.https://gcc.gnu.org/onlinedocs/gcc-6.5.0/gcc/
2.man ld