我正在尝试编译我用NASM和DJGPP中的"ld“命令编写的ASM程序。这是我用来编译它的批处理文件的代码:
@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:发布于 2010-06-22 03:42:51
你有没有试过nasm -f coff?
在nasm -hf输出中:
coff COFF (i386) object files (e.g. DJGPP for DOS)发布于 2012-11-15 01:43:53
从多引导标头信息以及该文件链接到二进制格式输出(如链接器脚本中指定的)的事实来看,这告诉我这是一个操作系统内核(或者至少是一个学术示例),因此应该在独立模式下编译和运行,而不是常规的用户空间进程(需要内核管理)。
ld默认接受elf格式(它在unix平台上很大程度上取代了旧的、过时的aout格式),您可能必须在链接器脚本中指定aout作为输入格式(或者告诉nasm输出elf格式的目标文件)。多重引导在elf中工作得最好,并且不需要所有的"aout_kludge“
这段代码(或任何内核代码)的执行方式是由引导加载程序加载的。由于这是一个兼容多重引导的内核,因此它应该由兼容多重引导的引导加载程序加载,比如grub (请参阅http://www.gnu.org/software/grub/)。
我知道您使用的是windows,所以您的站点上可能没有正确安装info文档系统,但是您可以在http://www.gnu.org/software/grub/manual/multiboot/multiboot.html上阅读GNU文档。而且看起来这段代码是打算在类似unix的平台上编译的,所以至少你使用djgpp是正确的(gcc移植到了windows)。
当我在GNU/Linux上工作时,我很难调试任何需要解决的MS windows或djgpp问题,也许GNU ld (binutils的一部分)信息文档会有所帮助-- http://ftp.gnu.org/old-gnu/Manuals/ld-2.9.1/html_node/ld_toc.html。
https://stackoverflow.com/questions/3086071
复制相似问题