参考资料:
1.博客1:https://www.cnblogs.com/zuofaqi/p/10440754.html
2.博客2:https://blog.csdn.net/wangsiman/article/details/80031397
3.博客3:https://blog.csdn.net/chenzixun0/article/details/56278632
最近在做OTA相关工作,需要将不同架构(arm和x86)下的程序统一放到一个架构(arm)下进行统一管理。
涉及到的问题,不同程序有不同链接的动态库(xx.so),如何对一个ELF文件(linux下的可执行文件)进行正确的动态库链接?
记录:
1.看看操作系统的架构:
命令:uname -a
x86:
arm:
2.查看ELF文件本身和动态库链接情况:
file xx(文件名)
观察发现这个是在arm平台下编译出的(或者用的是arm平台下的编译器)
ldd xx(文件名)
观察发现又许多动态库没有链接,not found
3.找到开发这个程序的同事,问他要需要链接的库...
嗯,假装找到了!在xx路径下,比如/lib64下
关于怎么链接动态库网上有很多教程,这里只推荐用环境变量的方式,比较灵活,在程序运行的时候可以写脚本指定
export 查看当前的环境变量使用情况
观察发现没有LD_LIBRARY_PATH这个变量,这个变量即指定链接动态库的搜索路径
执行命令:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:../../lib64
如果链接多个目录,用:分割,比如export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:../../lib64:其他路径:...
然后export再执行会看到LD_LIBRARY_PATH已经出现了
执行命令:ldd xx(文件名)
刚刚未找到的动态库找到了,当然,你要使用正确的动态库和路径才行,这时候运行改elf文件应该问题不大了。
注意这种方法重启后需要重新指定环境变量LD_LIBRARY_PATH
PS:
1、unset LD_LIBRARY_PATH 这个命令可以重置环境变量,当然也可以不重置直接覆盖;
2、export 环境变量后,可以执行ldconfig -p打印出当前缓存文件所保存的所有共享库(动态库)的名字,看看刚刚添加的动态库有没有;
ldconfig 用法:https://blog.csdn.net/chenzixun0/article/details/56278632