链接程序和库指南

定义暂定符号

还可以使用 mapfile 定义 COMMON 或暂定符号。与其他类型的符号定义不同,暂定符号在文件中不占用存储空间,而定义在运行时必须分配的存储空间。因此,定义此类型的符号有助于要生成的输出文件的存储分配。

暂定符号与其他类型的符号的一个不同特征在于,暂定符号的 value 属性指示其对齐要求。因此,可以使用 mapfile 定义重新对齐从链接编辑的输入文件中获取的暂定定义。

以下示例给出了两个暂定符号的定义。符号 foo 定义新的存储区域,而符号 bar 实际上用于更改文件 main.c 中相同暂定定义的对齐方式。


$ cat main.c

extern  int     foo;

int             bar[0x10];



main()

{

        (void) printf("&foo = %x\n", &foo);

        (void) printf("&bar = %x\n", &bar);

}

$ cat mapfile

{

        global:

                foo = COMMON V0x4 S0x200;

                bar = COMMON V0x100 S0x40;

};

$ cc -o prog -M mapfile main.c

ld: warning: symbol `bar' has differing alignments:

        (file mapfile value=0x100; file main.o value=0x4);

        largest value applied

$ prog

&foo = 20940

&bar = 20900

$ nm -x prog | egrep "foo$|bar$"

[37]    |0x00020900|0x00000040|OBJT |GLOB |0x0  |16     |bar

[42]    |0x00020940|0x00000200|OBJT |GLOB |0x0  |16     |foo

注 –

使用链接编辑器的 -t 选项可以不诊断此符号解析。