因为我还将 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/)并将精力集中在操作系统代码上(应该作为免费软件发布,以获得一些反馈)。