文章目录
共享库运行时加载
动态链接有两步:
- 链接阶段(Link time):由链接编辑器将动态库的信息编辑到ELF文件系统的对应段
- 运行阶段(Run time):由动态链接器(ld.so)在可执行程序装载时根据链接信息重定位找到共享库的函数
运行时搜索库的路径优先级:
- 该可执行程序的RPATH
- LD_LIBRARY_PATH
- 正被加载对象的RUNPATH
默认编译链接共享库时会将链接共享库的路径写入elf文件系统的dynamic section的RUNPATH字段
# -d表示查看elf文件的dynamic section
readelf -d elf文件
可以看到RUNPATH字段包含了共享库的路径信息。
LD_DEBUG=libs exe文件
Cmake中指定RPATH
cmake中与rpath相关的几个变量:
- CMAKE_BUILD_RPATH、CMAKE_INSTALL_RPATH: 用于指定构建和安装时的rpath。
- CMAKE_SKIP_RPATH、CMAKE_SKIP_BUILD_RPATH、CMAKE_SKIP_INSTALL_RPATH:用于让cmake是否跳过添加rpath。
- CMAKE_BUILD_RPATH_USE_ORIGIN:设置rpath为相对可执行文件路径。
- CMAKE_BUILD_WITH_INSTALL_RPATH:构建时是否使用安装的RPATH
- CMAKE_INSTALL_RPATH_USE_LINK_PATH:安装时候是否加上rpath,默认不开启。
- CMAKE_INSTALL_REMOVE_ENVIRONMENT_RPATH:
INSTALL选项只对通过target安装的方式有用install(TARGETS ...)
。
在Cmake中可以通过设置CMAKE_SKIP_BUILD_RPATH
布尔变量来控制构建时是否跳过为目标文件自动生成RPATH信息。通常,CMake在目标文件等时使用BUILD_RPATH
目标属性,当安装时,CMake会重新链接目标文件等,使用INSTALL_RPATH
。如果你设置了CMAKE_SKIP_INSTALL_RPATH
这个变量为真,那么安装时目标文件将不包含RPATH信息。
LD_RUN_PATH
:指定链接阶段搜索库的路径
LD_LIBRARY_PATH
:指定运行阶段搜索库的路径
linux下有5中程序保护机制
- CANARY 栈保护
gcc -fno-stack-protector -o test test.c //禁用栈保护 gcc