意外的链接器部分输出位置

时间:2012-06-13 18:24:03

标签: linker ld linker-scripts multiboot

我正在尝试在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时,它不应该在输出文件中吗?或者是否存在二进制文件的另一部分,指出还有更多动作要做。我问,因为启动我的内核时出现问题,但是现在我只是想了解链接器输出。

1 个答案:

答案 0 :(得分:0)

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

对于链接描述文件,链接器被告知二进制/可执行文件的.text部分应该加载到RAM中的1MiB点(即0x00100000)。这与链接器输出文件的布局关系不大,而与执行文件的加载方式有关。

实际文件中的节位置与对齐有关。也就是说,您的链接器似乎正在以4096字节的边界对齐第一部分。例如,如果每个部分的大小小于4096字节并且每个部分位于4096字节边界,则它们在文件中的相应偏移量将为0x1000,0x2000,0x3000等。默认情况下,此对齐也将保留一次文件加载到RAM中,以前的示例将产生位于0x00100000,0x00101000,0x00102000等的部分。

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

简短的&链接器的甜蜜解释(更详细地描述了上述所有内容)我建议:

http://www.math.utah.edu/docs/info/ld_3.html

http://sourceware.org/binutils/docs-2.15/ld/Scripts.html