我对位置计数器感到困惑,特别是在设置时 输出部分中的新值。
我编写了一个简单的程序和一个链接器脚本来提出更多问题 明确。代码如下:
test.s
section .text
.globl _start
_start:
movq $1, %rax
movq $0, %rbx
int $0x80
test.lds
SECTIONS
{
. = 0x10;
label_1 = .;
custom_section : {
. = 0x20;
label_2 = . ;
label_3 = ABSOLUTE(.) ;
*(.text) ;
}
}
链接后,使用nm
命令打印符号地址:
0000000000000010 T label_1
0000000000000030 T label_2
0000000000000030 A label_3
0000000000000030 T _start
我无法理解为什么lable_2
是0x30
。作为LD documentation
说,如果在部分描述中使用.
,则它指的是
从该部分的开头起的字节偏移量,而不是绝对地址。
在custom_section
中,.
设置为0x20
,这是相对偏移量,
所以我认为label_2
也应该是0x20
。 label_3
的值是
合理,因为它是一个绝对的地址。
有人可以解释为什么label_2
是0x30吗?谢谢!