如何链接从 C 代码生成的目标文件、静态库和 NASM 生成的目标文件?

达科特

我正在开发一个程序(用于实模式),该程序由引导加载程序加载到内存中的某个地址并跳转到该地址并开始执行该程序。问题是我将项目分成两个文件:a.asm(16 位 asm,NASM 语法)和bc(我用 gcc 编译 dos (djgpp))。此外,bc使用了 allegro 库中的一些函数(我将它作为静态库,.a)。

我的问题是,我如何编译和链接这 3 个文件?我的第一个想法是:

  1. 用gcc(带有-c标志)编译和组装bc,结果我得到一个bo文件
  2. a.asm与 NASM(-fbin 或 .. ?)组装起来并获得ao
  3. 链接boaoallegro.a以获得纯二进制文件(没有 .exe 头文件,没有调试信息等)

我尝试了上述方法,但在第 3 步,链接器抛出错误,提示无法识别ao(NASM 生成的目标文件)的格式,这可能是因为我没有调用正确的标志和选项组装文件时,或..

我想要一些关于如何解决这个问题的指导。

谢谢。

DJGPP 生成的 .o 文件包含 32 位(i386)代码,不能直接从 16 位代码中调用。

在 DOS 下,32 位代码通常使用DOS 扩展器运行,它切换到 32 位保护模式,设置内存映射和 DOS API 转换(即在调用时切换回 16 位实模式的小型蹦床函数int 21h DOS API)。然后加载并调用 32 位代码。

用于在 16 位和 32 位模式之间切换的 DOS 扩展器的轻量级替代品:

  • 使用gcc -m16 ( .code16gcc) 的虚幻模式有关gcc -m16 的更多详细信息,请参阅此答案和其他答案

  • Syslinux项目的引导加载程序,包含 16 位汇编 (NASM)、32 位汇编 (NASM) 和 32 位 C (GCC) 代码,并在它们之间切换。

要将 16 位和 32 位代码链接在一起,您可以运行objcopy -O binary func.o func.bin(32-bit),然后添加%incbin "func.bin"到您的 16 位 NASM 源文件中。但是,这会破坏重定位(因此您将无法使用全局变量)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

bazel Rules_go:将go二进制文件链接到工作空间中另一个目标生成的静态c ++库(.a文件)

使用make生成c源的目标文件时如何生成依赖文件

ld不链接as生成的目标文件

为链接器生成目标文件(.o)

我如何以与 clang -c main.c 相同的方式从汇编源生成目标文件

如何查找C ++文件的目标代码

如何链接 ocamlopt 生成的目标文件以创建可执行文件?

Linux上的C ++,确认库中的代码未静态链接到生成的可执行文件中

nasm-在macOS Mojave上无法将目标文件与ld链接

如何从目标文件生成普通二进制文件?

如何使用Cmake与NASM生成二进制文件

C++ 库不链接目标文件 (G++)

将C与NASM链接

Polygot包含nasm / yasm和C的文件

如何在Linux上从C源代码生成nasm可编译汇编代码?

代码生成器生成自己的 CMake 文件和目标

如何使用链接器将目标文件转换为可执行文件(C目标文件)

链接时,不同静态库中的相同目标文件

如何在64位Windows计算机上链接32位Nasm程序集目标代码

编译C时如何链接文件夹中的所有目标文件?

Antlr4 C#目标和生成文件的输出路径

链接两个目标文件以生成一个二进制文件

如何告诉autogen.sh在单独的文件夹中生成文件(m4和目标文件)?

如何在正确提供 argc、argv、envp 的情况下从 NASM 中调用用 C 编写的链接可执行文件中的主函数

如何在不使用过多内存的情况下链接许多C ++目标文件?

NASM + GoLink:“目标文件中未定义以下符号”

链接到可执行文件时,如何强制将目标文件包含在静态库中?

C++ 模板的目标代码是否在可执行文件和动态库中重复?

C nasm代码的实现