如何链接从C代码生成的对象文件、静态库和NASM生成的对象文件?
我正在编写一个程序(对于实模式),该程序由引导加载程序加载到内存中的一个地址,然后跳转到该地址并开始执行该程序。问题是我将项目分为两个文件:a.asm(16位asm,NASM语法)和b.c(我使用gccfordos(djgpp)编译)。另外,b.c使用了allegro库中的一些函数(我把它作为一个静态库,.a) 我的问题是,如何编译和链接这3个文件?我的第一个想法是:如何链接从C代码生成的对象文件、静态库和NASM生成的对象文件?,c,assembly,linker,dos,real-mode,C,Assembly,Linker,Dos,Real Mode,我正在编写一个程序(对于实模式),该程序由引导加载程序加载到内存中的一个地址,然后跳转到该地址并开始执行该程序。问题是我将项目分为两个文件:a.asm(16位asm,NASM语法)和b.c(我使用gccfordos(djgpp)编译)。另外,b.c使用了allegro库中的一些函数(我把它作为一个静态库,.a) 我的问题是,如何编译和链接这3个文件?我的第一个想法是: 使用gcc编译和组装b.c(使用-c标志),结果得到一个b.o文件 使用NASM(-fbin或..?)组装a.asm并获得a.o
谢谢。由DJGPP生成的.o文件包含32位(i386)代码,不能直接从16位代码调用 在DOS下,32位代码通常使用a运行,a切换到32位保护模式,设置内存映射和DOS API转换(即调用int 21h DOS API时切换回16位实模式的小型蹦床函数)。然后加载并调用32位代码 用于在16位和32位模式之间切换的DOS扩展器的轻量级替代方案:
- 使用gcc-m16(
)。有关gcc-m16的更多详细信息,请参阅和其他答案.code16gcc
- 项目的引导加载程序,包含16位汇编(NASM)、32位汇编(NASM)和32位C(GCC)代码,并在它们之间切换
要将16位和32位代码链接在一起,可以运行
objcopy-O binary func.O func.bin
(32位),然后将%incbin“func.bin”
添加到16位NASM源文件中。但是,这会中断重新定位(因此您将无法使用全局变量)。您不需要-f bin
。您需要使用任何对象文件格式。可能是-f coff
。请参见nasm-hf
@Jester I used-fcoff,我得到了“coff格式不支持非32位重定位”。djgpp生成的32位代码不能以您期望的方式链接到16位代码。它生成的代码通常需要DOS,Allegro库也需要DOS。我的建议是使用FreeDOS作为“引导加载程序”,并将启动程序的命令放在AUTOEXEC.BAT文件中。