还可以使用 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 选项可以不诊断此符号解析。