使用BYTE
或LONG
等命令,可以从链接描述文件中include explicit bytes of data in an output section。链接页面还描述了这些命令可用于输出符号的值。
我原本预计如果你执行部分链接(即使用ld
的{{3}}选项),将为以这种方式输出的符号发出重定位记录。但是,链接器似乎只输出符号的当前已知值 1 。
这是一个MWE来澄清我的意思。
test.c
:
int foo = 1, bar = 2;
test.ld
:
SECTIONS {
.data : {
*(.data)
LONG(foo)
LONG(bar)
}
}
然后运行以下命令:
$ gcc -c test.c
$ ld -T test.ld -r -o test.elf test.o
$ readelf -r test.elf
There are no relocations in this file.
$ readelf -x .data test.elf
Hex dump of section '.data':
0x00000000 01000000 02000000 00000000 04000000 ................
如您所见,没有创建重定位,输出的值是foo
和bar
的当前已知值。
这可能是个错误吗?如果没有,有没有办法强制链接器输出添加到输出节的符号的重定位记录?
1 我不确定这是正确的用语。我的意思是您在输入对象文件上运行readelf -s
时看到的值。