gpt4 book ai didi

c++ - 编译的Elf二进制文件太大

转载 作者:行者123 更新时间:2023-12-03 07:08:43 24 4
gpt4 key购买 nike

long *video_memory = (long *)0xB8000;

int main() {
// long *video_memory = (long *)0xB8000;
*video_memory = 0x5050505050505050;
return 0;
}
为什么上面的C代码在链接时会创建一个 2Mb 二进制文件?
如果我注释全局变量而取消注释本地变量,则它起作用(该文件只有几个字节)。
这是我链接/ [交叉]编译它的方式:
x86_64-elf-gcc -m64 -ffreestanding -nostdlib -mno-red-zone -c kernel.c -o bin/kernel.o
objcopy --remove-section .eh_frame bin/kernel.o
x86_64-elf-ld --oformat binary -Ttext 0x8000 bin/kernel_entry.o bin/kernel.o -o bin/kernel.bin
# kernel.bin is now 2Mb

最佳答案

问题是链接器由于x86_64 ABI中的错误而具有2MB的可笑max-page-size,最终导致在各个位置产生2MB对齐要求。通常,它将文本和数据段放置在文件的同一部分中,目的是将其映射两次,但是只有像ELF这样的合理二进制格式才能表示它;如果使用原始二进制文件,则实现对齐的唯一方法是将近2MB的间隙。
正确的解决方法是在链接命令行上使用max-page-size(实际的硬件页面大小/内存保护的粒度)覆盖可笑的默认-z max-page-size=4096。如果您使用编译器驱动程序而不是直接调用ld,则为-Wl,-z,max-page-size=4096。每当您使用会导致出现相同问题的强化选项时,现代的托管工具链都会为您完成此任务,但显然裸机仍然没有。
您可能还考虑使用可以为内核加载ELF而不是原始二进制文件的引导加载程序。 ELF加载程序易于编写,并让您做一些有用的事情,例如通过两次映射(在裸机级别,只需加载/复制)同一页两次来避免浪费的空间,在图像标题控制的位置设置入口点,而不是在 bootstrap 等中进行了硬编码。如果愿意,您甚至可以通过这种方式使内核独立于位置。

关于c++ - 编译的Elf二进制文件太大,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64808047/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com