我正在尝试编译我用NASM编写的ASM程序和来自DJGPP的“ld”命令。这是我用来编译它的批处理文件的代码:
@echo off
set path=C:\NASM;%PATH%
nasm -f aout -o start.o start.asm
ld -T link.ld -o kernel.bin start.o
但是当我运行文件时,我得到了:
start.o: file not recognised: File format not recognized
什么,在我的构建文件中,我做错了导致此错误消息?
这是我的link.ld文件:
OUTPUT_FORMAT("binary")
ENTRY(start)
phys = 0x00100000;
SECTIONS
{
.text phys : AT(phys) {
code = .;
*(.text)
*(.rodata)
. = ALIGN(4096);
}
.data : AT(phys + (data - code))
{
data = .;
*(.data)
. = ALIGN(4096);
}
.bss : AT(phys + (bss - code))
{
bss = .;
*(.bss)
. = ALIGN(4096);
}
end = .;
}
没有其他工作,所以这里是我的ASM文件的代码(我正在为我一直在研究的操作系统创建内核):
[BITS 32]
global start
start:
mov esp, _sys_stack
jmp stublet
ALIGN 4
mboot:
MULTIBOOT_PAGE_ALIGN equ 1<<0
MULTIBOOT_MEMORY_INFO equ 1<<1
MULTIBOOT_AOUT_KLUDGE equ 1<<16
MULTIBOOT_HEADER_MAGIC equ 0x1BADB002
MULTIBOOT_HEADER_FLAGS equ MULTIBOOT_PAGE_ALIGN | MULTIBOOT_MEMORY_INFO | MULTIBOOT_AOUT_KLUDGE
MULTIBOOT_CHECKSUM equ -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS)
EXTERN code, bss, end
dd MULTIBOOT_HEADER_MAGIC
dd MULTIBOOT_HEADER_FLAGS
dd MULTIBOOT_CHECKSUM
dd mboot
dd code
dd bss
dd end
dd start
stublet:
jmp $
SECTION .bss
resb 8192
_sys_stack:
答案 0 :(得分:2)
您在代码文件中缺少文本部分:
[BITS 32]
SECTION .text
global start
...
对于对象格式,请尝试-f coff
,因为这似乎是DJCPP的正确格式(感谢@ninjalj):
valid output formats for -f are (`*' denotes default): * bin flat-form binary files (e.g. DOS .COM, .SYS) ith Intel hex srec Motorola S-records aout Linux a.out object files aoutb NetBSD/FreeBSD a.out object files coff COFF (i386) object files (e.g. DJGPP for DOS) elf32 ELF32 (i386) object files (e.g. Linux) elf ELF (short name for ELF32) elf64 ELF64 (x86_64) object files (e.g. Linux) as86 Linux as86 (bin86 version 0.3) object files obj MS-DOS 16-bit/32-bit OMF object files win32 Microsoft Win32 (i386) object files win64 Microsoft Win64 (x86-64) object files rdf Relocatable Dynamic Object File Format v2.0 ieee IEEE-695 (LADsoft variant) object file format macho32 NeXTstep/OpenStep/Rhapsody/Darwin/MacOS X (i386) object files macho MACHO (short name for MACHO32) macho64 NeXTstep/OpenStep/Rhapsody/Darwin/MacOS X (x86_64) object files dbg Trace of all info passed to output stage
我没有DJCPP的解决方案,但我能够在我的64位Linux(添加.text
部分)上编译和链接,如下所示:
~$ nasm -f elf64 start.asm
~$ ld -T link.ld -o kernel.bin start.o
答案 1 :(得分:1)
你有没有尝试过nasm -f coff?
来自nasm -hf输出:
coff COFF (i386) object files (e.g. DJGPP for DOS)
答案 2 :(得分:0)
根据多引导头信息判断,以及此文件链接到二进制格式输出(如链接器脚本中指定)这一事实告诉我这是一个操作系统内核(或至少是一个学术示例因此,它意味着要在独立模式下编译和运行,而不是常规的用户空间进程(需要内核来管理)。
默认情况下,ld接受elf格式(它非常取代unix平台上旧的,过时的aout格式),你可能必须在链接描述文件中指定aout作为输入格式(或者告诉nasm输出elf格式对象)文件)。 multiboot最适合精灵,不需要所有“aout_kludge”
此代码(或任何内核代码)的执行方式是由引导加载程序加载。由于这是一个多引导兼容的内核,它意味着由多引导兼容的引导加载程序(如grub)加载(参见http://www.gnu.org/software/grub/)。
我意识到你在Windows上,所以你可能没有在你的站点上正确安装信息文档系统,但你可以阅读http://www.gnu.org/software/grub/manual/multiboot/multiboot.html阅读GNU文档。此外,看起来这个代码是在unix平台上编译的,所以至少你是正确的使用djgpp(gcc移植到windows)。
当我在GNU / Linux上工作时,我很难调试任何需要解决的MS窗口或djgpp问题,也许GNU ld(binutils的一部分)信息文档会有所帮助 - {{3} }