将位置计数器设置为链接描述文件中的新值

时间:2018-04-05 02:26:16

标签: gcc linux-kernel linker ld linker-scripts

我对位置计数器感到困惑,特别是在设置时 输出部分中的新值。

我编写了一个简单的程序和一个链接器脚本来提出更多问题 明确。代码如下:

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_20x30。作为LD documentation 说,如果在部分描述中使用.,则它指的是 从该部分的开头起的字节偏移量,而不是绝对地址。 在custom_section中,.设置为0x20,这是相对偏移量, 所以我认为label_2也应该是0x20label_3的值是 合理,因为它是一个绝对的地址。

有人可以解释为什么label_2是0x30吗?谢谢!

0 个答案:

没有答案