繁体   English   中英

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

[英]How do I link an object file generated from C code, a static library and a NASM generated object file?

我正在开发一个程序(用于实模式),该程序由引导加载程序加载到内存中的某个地址并跳转到该地址并开始执行该程序。 问题是我将项目分成两个文件: 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 源文件中。 但是,这会破坏重定位(因此您将无法使用全局变量)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM