0

我正在尝试ld在内核的程序集文件上使用 linux 中的命令。要使用 grub 启动,它需要位于 1Mb 地址之后。所以我的链接脚本有文本到地址 0x00100000。

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

    SECTIONS {
       .text 0x00100000 :{
            *(.text)
       }
       textEnd = .;
       .data :{
            *(.data)
            *(.rodata)
       }
       dataEnd = .;
       .bss :{
            *(.common)
            *(.bss)
       }
       bssEnd = .;
    }

我的问题是关于输出文件。当我查看文件的二进制文件时,文本部分从 0x1000 开始。当我更改脚本中的文本位置并使用低于 0x1000 的地址(例如 0x500)时,文本将从那里开始。但是每当我超过 0x1000 时,它就会将其四舍五入(0x2500 会将文本放在 0x500 处)。

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

4

1 回答 1

0

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

在链接器脚本的情况下,链接器被告知二进制/可执行文件的 .text 部分应加载到 RAM 中的 1MiB 点(即 0x00100000)。这与链接器输出的文件布局无关,而与执行时如何加载文件有关。

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

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

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

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

或者

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

于 2012-12-19T15:36:39.773 回答