したがって、作業中のアセンブリコードのmakefileがあり、コードをビルドしようとすると、次の出力が得られます。
Makefile:32: warning: overriding commands for target `obj'
Makefile:29: warning: ignoring old commands for target `obj'
nasm -f elf64 -g -F stabs main.asm -l spacelander .lst
nasm: error: more than one input file specified
type `nasm -h' for help
make: *** [obj] Error 1
それでも、これをグーグルで検索すると、NASM自体ではなくLDからのリンカーの問題が原因のようです(LDではなくNASMのみがエラーで出力されます)。テストとして単純なテキスト出力を出力するソースファイルは1つだけです。この例では、 OPは自分のコードを実行できました。私は構築すらしません。
AFAIK、私のソースファイルは完全に問題ありません。変更する前にコードがビルドされ、問題なく正常に実行されたからです。.o
ただし、ファイルをobj/
ディレクトリにコピーし、ターゲットをディレクトリにコピーするために変更しましたbin/
。
この問題の原因は何でしょうか?私はそれがコードとは何の関係もなく、Makefile自体によるものだとほぼ確信しています。
完全を期すために、Makefileとアセンブリソースの両方を貼り付けます。
ソース
bits 32
section [.bss]
section [.data]
; Store three lines in the same string.
; This is just for test purposes.
Title: db "------SPACE LANDER-----", 10, \
"------SPACE LANDER-----", 10, \
"------SPACE LANDER-----", 10
Len: equ $-Title
section [.text]
global _start
_start:
mov eax, 4 ; Syswrite
mov ebx, 1 ; To stdout
mov ecx, Title ; ecx stores title to print
mov edx, Len ; store offset of len in edx
int 0x80 ; call kernel, do print
exit:
mov eax, 1 ; exit
mov ebx, 0 ; return 0
int 0x80 ; call kernel, exit safely (hopefully)
Makefile
ASM := nasm
ARGS := -f
FMT := elf64
OPT := -g -F stabs
SRC := main.asm
#SRC_EXT := asm
#^unused due to suspected error causing.
OBJDIR := obj
TARGETDIR := bin
OBJ := $(addprefix $(OBJDIR)/,$(patsubst %.asm, %.o, $(wildcard *.asm)))
TARGET := spacelander
.PHONY: all clean
all: $(OBJDIR) $(TARGET)
$(OBJDIR):
mkdir $(OBJDIR)
$(OBJDIR)/%.o: $(SRC)
$(ASM) $(ARGS) $(FMT) $(OPT) $(SRC) -l $(TARGET).lst
$(TARGET): $(OBJ)
ld -o $(TARGET) $(OBJ)
clean:
@rm -f $(TARGET) $(wildcard *.o)
@rm -rf $(OBJDIR)