这看起来像是一个软件工程师的“发现差异”的游戏, 但语法上的细微差别显然会对链接行为产生巨大影响。
ldscript1:
OUTPUT_FORMAT(elf64-x86-64)
ENTRY(main)
ABS_FIRST = 0x10000000;
OFF_SECOND = 0x20000000;
SECTIONS
{
. = ABS_FIRST;
.first :
{
*(.pre)
}
. += OFF_SECOND;
.text :
{
*(.text)
*(.rodata*)
}
.data :
{
*(.data)
}
}
ldscript2:
OUTPUT_FORMAT(elf64-x86-64)
ENTRY(main)
ABS_FIRST = 0x10000000;
OFF_SECOND = 0x20000000;
SECTIONS
{
. = ABS_FIRST;
.first :
{
*(.pre)
}
hack = .;
. = hack + OFF_SECOND;
.text :
{
*(.text)
*(.rodata*)
}
.data :
{
*(.data)
}
}
pre.s:
.section .pre
.long 0x0
main.c中:
int main()
{
}
编译并链接:
gcc -c -xassembler-with-cpp -o pre.o pre.s
gcc -c -o main.o main.c
ld -T ldscriptX pre.o main.o -o example
ld版本:
$ ld -v
GNU ld (GNU Binutils for Ubuntu) 2.22
使用ldscript1:
$ objdump -h example | grep -E ".text|VMA"
Idx Name Size VMA LMA File off Algn
2 .text 00000006 0000000020000000 0000000020000000 00200000 2**2
使用ldscript2:
$ objdump -h example | grep -E ".text|VMA"
Idx Name Size VMA LMA File off Algn
2 .text 00000006 0000000030000004 0000000030000004 00200004 2**2
请注意,VMA对于ldscript2是正确的,但不知何故“。”在ldscript1中的“+ =”操作之前/之前被设置回零。我已阅读GNU ld文档,但无法找到解释。
答案 0 :(得分:0)
对我来说,看起来ldscript1的表现与预期相符......
这看起来像是相对/绝对地址问题。分配给hack的价值是多少?我怀疑它是0.
你能试试hack = ABSOLUTE(.) ;
吗?