DIRECT mapfile 关键字提供了一种为各个符号建立直接绑定的方法。该机制用于特定的链接编辑情况。
在之前示例使用的组件中,main() 函数引用了外部函数 W() 和 X()。这些函数的绑定遵循缺省的搜索模型。
$ LD_DEBUG=symbols,bindings prog3 .... 18754: symbol=W; lookup in file=prog3 [ ELF ] 18754: symbol=W; lookup in file=./W.so.2 [ ELF ] 18754: binding file=prog3 to file=./W.so.2: symbol 'W' .... 18754: symbol=X; lookup in file=prog3 [ ELF ] 18754: symbol=X; lookup in file=./W.so.2 [ ELF ] 18754: symbol=X; lookup in file=./X.so.2 [ ELF ] 18754: binding file=prog3 to file=./X.so.2: symbol 'X'
可以使用 DIRECT mapfile 关键字来重新生成 prog3,以便建立到函数 W() 和 X() 的直接绑定。
$ cat mapfile $mapfile_version 2 SYMBOL_SCOPE { global: W { FLAGS = EXTERN DIRECT }; X { FLAGS = EXTERN DIRECT }; }; $ cc -o prog4 -R. main.c W.so.2 X.so.2 -Mmapfile
可以使用 LD_DEBUG 环境变量来观察运行时绑定。
$ LD_DEBUG=symbols,bindings,detail prog4 .... 23432: symbol=W; lookup in file=./W.so.2 [ ELF ] 23432: binding file=prog4 to file=./W.so.2: symbol 'W' (direct) 23432: symbol=X; lookup in file=./X.so.2 [ ELF ] 23432: binding file=prog4 to file=./x.so.2: symbol 'X' (direct)
lari(1) 实用程序也可以揭示直接绑定信息。然而,在本例中没有多次定义 W() 和 X() 函数。因此,缺省情况下,lari 不会发现这些函数受关注。必须使用 –a 选项才能显示所有符号信息。
$ lari -a prog4 .... [1:1ED]: W(): ./W.so.2 .... [2:1ED]: X(): ./X.so.2 ....