–z direct 选项提供的机制用来建立与链接编辑命令行中该选项后的所有依赖项的直接绑定。与 –B direct 选项不同,这不会在将要生成的目标文件内建立直接绑定。
此选项适用于生成作为插入基础的目标文件。例如,共享目标文件有时会设计包含许多缺省或回退接口。应用程序可以本着在运行时将应用程序定义绑定到这些接口的目的,自由地定义这些接口的定义。要允许应用程序插入到共享目标文件的接口,请使用 –z direct 选项而不是 –B direct 选项来生成共享目标文件。
如果您希望有选择地直接绑定到一个或多个依赖项,–z direct 选项也比较有用。–z nodirect 选项用于在通过链接编辑提供的依赖项之间切换直接绑定的使用。
从之前示例中使用的组件,可以生成一个直接绑定的目标文件 X.so.2。
$ cc -o X.so.2 -G -Kpic X.c -R. -zdirect x.so.1 $ cc -o prog3 -R. main.c W.so.2 X.so.2
可以通过 elfdump(1) 查看直接绑定信息。
$ elfdump -y X.so.2 [6] D <self> a [7] DB [1] x.so.1 b
函数 b() 已直接绑定到依赖项 x.so.1。函数 a() 被定义为与目标文件 X.so.2 之间有一个可能的直接绑定 "D",但没有建立直接绑定。
可以使用 LD_DEBUG 环境变量来观察运行时绑定。
$ LD_DEBUG=symbols,bindings,detail prog3 .... 06177: symbol=a; lookup in file=prog3 [ ELF ] 06177: symbol=a; lookup in file=./W.so.2 [ ELF ] 06177: binding file=./X.so.2 to file=./W.so.2: symbol 'a' 06177: symbol=b; lookup in file=./x.so.1 [ ELF ] 06177: binding file=./X.so.2 to file=./x.so.1: symbol 'b' (direct)
lari(1) 实用程序也可以揭示直接绑定信息。
$ lari prog3 [2:2ESD]: a(): ./W.so.2 [2:0]: a(): ./X.so.2 [2:1ED]: b(): ./w.so.1 [2:1ED]: b(): ./x.so.1
由 W.so.2 定义的函数 a() 继续服务于 X.so.2 执行的缺省符号引用。但是,在 x.so.1 中定义的函数 b() 已从 X.so.2 执行的引用直接绑定。