Gcc编译时指定动态库搜索路径

7 篇文章 0 订阅

1.调用gcc是可以指定连接选项(也就是说gcc调用ld时候的选): -Wl 。每个子选项都需要用逗号隔开具体用法是

            $ gcc      -gccoption1         -Wl,-ldoption1,-ldoption1         -gccoption3

2.ld 连接器可以在连接阶段制定最终二进制代码的动态库搜索路径,具体做法是在可执行文件的.dynamic段指定一个 DT_RPATH的项(它是一个以冒号分隔的库文件搜索目录列表)。

3.当加载器加载该可执行文件时首先查看程序文件的.dynamic 段是否包含DT_RPATH项,其次才根据环境变量LD_LIBRARY_PATH 去搜索动态库。

4.给连接器制定索索路径的选项是 rpath=PATHNAME .假设当前目录下有两个子目录,lib 和 src  .  lib目录下有一个动态库 libmylib.so,在src目录下有 Test.c程序,src/Test.c会调用 ./lib/libmylib.so.  联合起来就是

           $ gcc  -o Test -Llib  -lmylib -Wl,-rpath=./lib src/Test.c

5.如果需要在连接阶段需要特定的目录下面搜索动态库,则用gcc的 -Wl,-rpath-link=PATH .此选项会将PATH目录传给连接器ld.

 

6.关于共享库的_init和_fini的加载,gcc编译需要一个开关参数,需要加一个「-nostartfiles」选项。这个选项使得C编译器不链接系统的启动函数库里面的启动函数。这个选项使得C编译器不链接系统的启动函数库里面的启动函数

 

7.gcc 选项 -fvisibility 用于指定是否将符号从库中导出。

1)当 「-fvisibility=hidden」 时表示默认不把符号导出,这种情况(这个与windos动态库的默认相同)下要通过在函数声明中加入__attribute__((visibility("default"))) 来导出符号。 

2)当 「-fvisibility=default」 时表示默认把符号导出,这种情况下要通过在函数声明中加入__attribute__((visibility("hidden"))) 来限制符号导出.

3)动态库的导出符号在 .dynsym段里.可以用 readelf -sD 命令查看导出符号.

 

因此,在发布动态库是需要注意的是:

        (1)  用 raadelf -sD libxxx.lib 来查看有没有导出不必要的符号.

        (2)  用 strip 命令去除 .symtab 段中的信息.

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值