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

退出打印视图

更新时间: 2014 年 7 月
 
 

使用 DIRECT mapfile 关键字

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
....

注 - 通过使用 –B direct 选项或 –z direct 选项生成 prog4,可以生成到 W.so.2X.so.1 的相同直接绑定。本示例的目的只是为了说明如何使用 mapfile 关键字。