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