Oracle® Solaris 11.2 链接程序和库指南

退出打印视图

更新时间: 2014 年 7 月
 
 

使用 –B direct 选项

–B direct 选项提供了为任何动态目标文件启用直接绑定的最简单机制。此选项可在要生成的目标文件内建立到任何依赖项的直接绑定。

从前面的示例中使用的组件,可以生成一个直接绑定的目标文件 W.so.2

$ cc -o W.so.2 -G -Kpic W.c -R. -Bdirect w.so.1
$ cc -o prog2 -R. main.c W.so.2 X.so.1

直接绑定信息是在 W.so.2 中的符号信息部分 .SUNW_syminfo 中维护的。可以使用 elfdump(1) 查看该部分。

$ elfdump -y W.so.2
     [6]  DB          <self>         a
     [7]  DBL     [1] w.so.1         b

字母 "DB" 表示已经为关联符号记录了直接绑定 (direct binding)。函数 a() 已绑定到包含目标文件 W.so.2。函数 b() 已直接绑定到依赖项 w.so.1。字母 "L" 表示依赖项 w.so.1 也应当延迟装载。

可以使用 LD_DEBUG 环境变量观察为 W.so.2 建立的直接绑定。detail 标记用于向绑定诊断信息添加额外的信息。对于 W.so.2,该标记指明绑定是直接绑定这一特性。detail 标记还提供有关绑定地址的额外信息。为简化起见,在以下示例生成的输出中已省略了该地址信息。

$ LD_DEBUG=symbols,bindings,detail  prog2
....
18452: symbol=a;  lookup in file=./W.so.2  [ ELF ]
18452: binding file=./W.so.2 to file=./W.so.2: symbol 'a'  (direct)
18452: symbol=b;  lookup in file=./w.so.1  [ ELF ]
18452: binding file=./W.so.2 to file=./w.so.1: symbol 'b'  (direct)

lari(1) 实用程序也可以揭示直接绑定信息。

$ lari prog2
[2:2ESD]: a(): ./W.so.2
[2:0]: a(): ./X.so.1
[2:2ED]: b(): ./w.so.1
[2:0]: b(): ./x.so.1

字母 "D" 表示由 W.so.2 定义的函数 a() 已被直接绑定。同样,在 w.so.1 中定义的函数 b() 也已被直接绑定。


注 -  对于函数a()W.so.2W.so.2 的直接绑定产生的效果与使用 –B symbolic 选项生成 W.so.2 时产生的效果类似。不过,–B symbolic 选项能够在链接编辑时完成可以内部解析的引用(例如 a())。该符号解析不会将任何绑定留到运行时进行解析。

–B symbolic 绑定不同,–B direct 绑定留到运行时进行解析。因此,可以使用显式插入覆盖该绑定,或者通过将环境变量 LD_NODIRECT 的值设置为一个非空值来禁用该绑定。

符号绑定通常用来降低在装入复杂目标文件时产生的运行时重定位开销。直接绑定可用来建立完全相同的符号绑定。不过,在创建每个直接绑定时仍然需要进行运行时重定向。直接绑定需要的开销比符号绑定大,但能够提供更强的灵活性。