0

したがって、作業中のアセンブリコードの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)
4

1 に答える 1

1

おそらく、このコマンドの余分なスペースが原因です:

nasm -f elf64 -g -F stabs main.asm -l spacelander   .lst

の末尾に$(TARGET)余分なスペースがあるため、この行の末尾に余分なスペースがあるためです。

TARGET := spacelander

これらの余分なスペースを削除してみてください。

于 2012-09-28T05:41:49.750 に答える