链接程序和库指南

扩充符号定义

应避免在共享库中创建绝对数据符号。从动态可执行文件对共享库中数据项的外部引用通常需要创建复制重定位。 请参见复制重定位。要提供此重定位,应该在目标文件中定义数据项,以便将符号定义与数据存储关联。

可以过滤数据符号。 请参见作为过滤器的共享库。要提供此过滤,可以使用 mapfile 定义扩充目标文件定义。以下示例创建包含函数和数据定义的过滤器。虽然可以在 mapfile 中显式创建函数定义,但数据定义将扩充输入可重定位目标文件提供的定义。


$ cat bar.c

int bar = 0;

$ cat mapfile

{

        global:

                foo = FUNCTION FILTER filtee.so.1;

                bar = FILTER filtee.so.1;

        local:

                *;

};

$ cc -o filter.so.1 -G -Kpic -h filter.so.1 -M mapfile -R. bar.c

$ nm -x filter.so.1 | egrep "foo|bar"

[39]    |0x000102b0|0x00000004|OBJT |GLOB |0    |12     |bar

[45]    |0x00000000|0x00000000|FUNC |GLOB |0    |ABS    |foo

$ elfdump -y filter.so.1 | egrep "foo|bar"

       [1]  F        [0] filtee.so.1        bar

       [7]  F        [0] filtee.so.1        foo

运行时,从外部目标文件对任一符号的引用将解析为 filtee 中的定义。