Linker 意外的链接器节输出位置

Linker 意外的链接器节输出位置,linker,ld,linker-scripts,multiboot,Linker,Ld,Linker Scripts,Multiboot,我试图在linux中对内核的汇编文件使用ld命令。要使用grub启动,它需要在1Mb地址之后。因此,我的链接脚本的文本指向地址0x00100000 下面是我正在使用的链接器脚本: SECTIONS { .text 0x00100000 :{ *(.text) } textEnd = .; .data :{ *(.data) *(.rodata) }

我试图在linux中对内核的汇编文件使用ld命令。要使用grub启动,它需要在1Mb地址之后。因此,我的链接脚本的文本指向地址0x00100000

下面是我正在使用的链接器脚本:

    SECTIONS {
       .text 0x00100000 :{
            *(.text)
       }
       textEnd = .;
       .data :{
            *(.data)
            *(.rodata)
       }
       dataEnd = .;
       .bss :{
            *(.common)
            *(.bss)
       }
       bssEnd = .;
    }
我的问题是关于输出文件的。当我查看文件的二进制文件时,文本部分从0x1000开始。当我更改脚本中的文本位置并使用低于0x1000的地址(例如0x500)时,文本将从那里开始。但每当我超过0x1000时,它就会将其四舍五入0x2500,文本将置于0x500


当我指定文本应该是0x100000时,它不应该在输出文件中吗?或者二进制文件中是否有另一部分指定还有更多的移动要做。我这样问是因为启动内核时出现问题,但现在我只是想了解链接器的输出。

您指的是两个不同的地址空间。链接文件中引用的地址(例如0x1000和0x500)只是文件偏移量。链接器脚本中指定的地址(如0x00100000)与计算机内存(即RAM)有关

对于链接器脚本,链接器被告知二进制/可执行文件的.text部分应在RAM中的1MiB点加载,即0x00100000。这与链接器输出的文件布局关系不大,而与执行时如何加载文件关系更大

实际文件中的剖面位置与对齐有关。也就是说,您的链接器似乎正在以4096字节的边界对齐第一个部分。例如,如果每个节的大小小于4096字节,并且每个节位于4096字节边界,则它们在文件中的各自偏移量将为0x1000、0x2000、0x3000等。默认情况下,一旦文件加载到RAM中,该对齐方式也将保持不变,以便前面的示例将生成位于0x00100000、0x00101000的节,0x00102000等

而且,当您将加载位置更改为足够小的数字时,链接器会自动更改对齐方式。但是,如果要手动指定对齐方式,可以使用“对齐”功能

对于更详细地描述上述所有内容的链接器的简短而甜蜜的解释,我建议: