无法加载到库问题
问题及分析过程
在开发一个程序过程中,需要加载第三方库iTapTradeAPI, 在CMakeList.txt中已经设置了CMAKE_INSTALL_RPATH,但是发布到生产之后由于目录问题无法加载到libiTapTradeAPI库了
下面时分析的过程图
从图中可以看出iTapTradeAPI使用的相对路径,与其他依赖库不同, 然后查看依赖库iTapTradeAPI的信息
可以看到使用的RPATH时 .:/RIGIN路径
刚开始想到的时是否把相对路径去掉, 使用如下命令:
patchelf --remove-rpath <path-to-elf>
eg: patchelf --remove-rpath libiTapTradeAPI.so
去掉之后还是不行,对比项目中的其他动态库,发现这个动态库少了一个选项SONAME, 然后使用命令
patchelf --set-soname libiTapTradeAPI.so ./libiTapTradeAPI.so
进行设置,这样之后就可以了
另外假如在生产上想先快速修复:还可以使用
patchelf --replace-needed LIBRARY NEW_LIBRARY
来做应急修复,替换依赖库的路径
readelf 命令
readelf是一个用于查看可执行文件和共享库的信息的命令行工具。它可以显示二进制文件的各种部分,包括头部信息、节(section)信息、符号表、动态链接信息等
readelf -h
readelf: Warning: Nothing to do.
Usage: readelf <option(s)> elf-file(s)
Display information about the contents of ELF format files
Options are:
-a --all Equivalent to: -h -l -S -s -r