GCC编译

共享库运行时加载

动态链接有两步:

  1. 链接阶段(Link time):由链接编辑器将动态库的信息编辑到ELF文件系统的对应段
  2. 运行阶段(Run time):由动态链接器(ld.so)在可执行程序装载时根据链接信息重定位找到共享库的函数

运行时搜索库的路径优先级:

  • 该可执行程序的RPATH
  • LD_LIBRARY_PATH
  • 正被加载对象的RUNPATH

默认编译链接共享库时会将链接共享库的路径写入elf文件系统的dynamic section的RUNPATH字段

# -d表示查看elf文件的dynamic section
readelf -d elf文件

可以看到RUNPATH字段包含了共享库的路径信息。

对库加载过程debug详解

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:指定运行阶段搜索库的路径

详细解释

gcc编译选项总览

linux下有5中程序保护机制

  • CANARY 栈保护
    gcc -fno-stack-protector -o test test.c  //禁用
  • 22
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Shilong Wang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值