将 NASM 和 64 位 C 代码编译并链接到引导加载程序中 [重复]

2024-01-03

我制作了一个非常简单的一级引导加载程序,它执行两个主要操作:从 16 位实模式切换到 64 位长模式,并从硬盘读取接下来的几个用于启动基本内核的扇区。

对于基本内核,我尝试用 C 而不是汇编编写代码,对此我有一些疑问:

  1. 我应该如何编译和链接nasm文件和C文件?
  2. 编译文件时,应该编译为16位还是64位?因为我要从 16 位切换到 64 位。
  3. 如何将更多文件从 C 或汇编添加到项目中?

我重写了问题以使我的目标更加明确,因此如果需要源代码请告诉我添加它。

Code: https://github.com/LatKid/BasicBootloaderNASMC https://github.com/LatKid/BasicBootloaderNASMC


因为我还将 nasm 文件与 C 文件链接,所以它从 nasm 对象文件中吐出一个错误,即在创建共享对象时不能使用针对 .text' 的重定位 R_X86_64_16 ;使用 -fPIC 重新编译

您的问题之一可能就在其中nasm汇编程序文件(您在问题的初始版本中没有显示该文件)。它应该只包含与位置无关的代码 https://en.wikipedia.org/wiki/Position-independent_code(PIC)因此无法产生目标文件 https://en.wikipedia.org/wiki/Object_file with 搬迁 https://en.wikipedia.org/wiki/Relocation_(computing) R_X86_64_16(在您编辑的问题中,mov sp, main显然不是PIC,你应该使用指令指针相对数据访问x86-64 https://en.wikipedia.org/wiki/X86-64,并且你不能定义main都在你的nasm文件和 C 文件中,并且链接时不能混合 16 位模式和 64 位模式)。

Study ELF https://en.wikipedia.org/wiki/Executable_and_Linkable_Format,那么x86-64 ABI https://github.com/hjl-tools/x86-psABI/wiki/X86-psABI了解 PIC 文件中允许何种类型的重定位(以及汇编程序文件应遵循哪些约束来生成 PIC 目标文件)。

Use 对象转储(1) http://man7.org/linux/man-pages/man1/objdump.1.html & 雷德尔夫(1) http://man7.org/linux/man-pages/man1/readelf.1.html检查对象文件(以及共享对象和可执行文件)。

一旦你的nasm代码生成一个 PIC 目标文件,链接到gcc and use https://gcc.gnu.org/onlinedocs/gcc/Invoking-GCC.html gcc -v了解幕后发生的事情(您将看到额外的库和目标文件,包括crt0 https://en.wikipedia.org/wiki/Crt0 ones, -lgcc and -lc,被使用)。

也许您需要更好地了解编译和链接。读莱文的书链接器和加载器 https://www.iecc.com/linkers/, 德雷珀的论文如何编写共享库 https://www.iecc.com/linkers/,以及-关于编译-龙书 https://en.wikipedia.org/wiki/Compilers:_Principles,_Techniques,_and_Tools.

您可能想链接到gcc但用你自己的链接描述文件 https://sourceware.org/binutils/docs/ld/Scripts.html。也可以看看this https://stackoverflow.com/a/51910861/841108回答一个非常相关的问题(可能与您的动机相似);那里的参考资料与您高度相关。

附言。你的问题缺乏动机和背景(它没有MCVE https://stackoverflow.com/help/mcve但需要一个)并且可能是一些XY问题 http://xyproblem.info/。我猜你用的是Linux。我强烈建议发布您实际的完整代码 - 甚至是错误的 - (也许在github http://github.com/ or gitlab http://gitlab.com/或其他地方)作为自由软件 https://www.gnu.org/philosophy/free-sw.en.html以获得潜在的帮助。I 强烈推荐使用现有的引导加载程序(大概GRUB https://www.gnu.org/software/grub/)并将精力集中在操作系统代码上(应该作为免费软件发布,以获得一些反馈)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 NASM 和 64 位 C 代码编译并链接到引导加载程序中 [重复] 的相关文章

随机推荐