# Assembler Makefile



## Westbär (9. Juni 2007)

Hallo,
Ich habe einige Dateien in Assembler Sprache geschrieben. Nun will ich sie compilieren, allerdings will ich nicht jedes über das Terminal.
Nun, könnt ihr mir bitte helfen ein Makefile für diese Assembler Files zuschreiben?


Gruß


----------



## deepthroat (9. Juni 2007)

Hi.

Zuerst müsstest du uns erklären wie diese Dateien zusammenhängen - welche Zieldateien es gibt und aus welchen Quelldateien die zusammengesetzt werden.

Gruß


----------



## Westbär (9. Juni 2007)

Ich weiß nicht genau was du meinst....
Ich habe nur ein paar Assembler files die nicht mehr machen als Texte ausgeben. Die möchte ich jetz über ein Makefile kompilieren. Rein zum testen und zum lernen.
Benutzen tu' ich .asm Files und "nasm".

(Es hängt keins mit einem anderen zusammen)


Gruß


----------



## deepthroat (10. Juni 2007)

Westbär hat gesagt.:


> Ich weiß nicht genau was du meinst....


Ich meine: du hast einige Assembler-Dateinen - super. Wie hängen die Assemblerdateien denn nun zusammen? Werden die alle in ein Programm kompiliert, oder werden die alle in einzelne Programme kompiliert, oder werden Datei 1, 2 und 3 in ein Programm 3, 4 in ein zweites kompiliert, ... kurz: wie hängen die Dateien zusammen? Welche Datei hängt von welcher ab - also wann muß eine Datei neu kompiliert werden weil sich die andere Datei geändert hat?


```
.PHONY = all

SOURCES = $(wildcard *.asm)
TARGETS = $(SOURCES:.asm=)

% :: %.asm
	nasm -f elf -o $@ $<


all: $(TARGETS)
```
Das Makefile kompiliert alle .asm Dateien im aktuellen Verzeichnis in eigene ELF Dateien.

Gruß


----------



## Westbär (10. Juni 2007)

Keine Datei hängt von keiner anderen Datei ab. Die sind alle unterschiedlich und sollen aber dann im Binär zusammengefügt zu einem executable werden.

Die Dateien liegen auch in Unterverzeichnissen, mir wäre es also recht, wenn man manuell angibt, welche dateien genommen werden. 


Gruß


----------



## deepthroat (10. Juni 2007)

Man, lass dir doch nicht alles aus der Nase ziehen. Ein Makefile Beispiel hab ich dir schon geliefert. Du darfst auch ruhig etwas Eigeninitiative zeigen rtfm: 'info make').

Es gibt immer irgendwelche Abhängigkeiten, sonst bräuchte man auch kein Makefile schreiben. Zumindest hängt die Zieldatei von den Quelldateien ab und muß neu erstellt werden wenn eine der Quelldateien geändert wurde.

Welche Dateien werden denn nun wie erstellt? Ich nehme mal an du erstellst aus den Assemblerdateien erstmal ELF Objektdateien? Oder wie? Wie rufst du NASM auf? Und dann linkst du die Objektdateien dann zu einem Programm zusammen? Oder nicht? Welche Schritte machst du denn, bis zum fertigen Programm?


```
.PHONY = all

SOURCES = subdir1/d1.asm subdir2/d2.asm subdir3/d3.asm
OBJECTS = $(SOURCES:.asm=.o)
TARGETS = prog

%.o : %.asm
	nasm -f elf -o $@ $<


all: $(TARGETS)

prog: $(OBJECTS)
	ld -o $@ $^
```
Gruß


----------



## Westbär (10. Juni 2007)

Ich kompiliere die Assembler Files so:

```
nasm –f bin –o datei.bin datei.asm
```

Ich hab nun das Makefile ein bisschen umgeändert auf die hoffung das es funktioniert.


```
.PHONY = all

SOURCES = dat1/datei.asm dat3/dhost.asm
OBJECTS = $(SOURCES:.asm=.bin)
TARGETS = prog

%.bin : %.asm
	nasm -f bin -o $@ $<


all: $(TARGETS)

prog: $(OBJECTS)
	ld -o $@ $^
```

Leider bekomme ich immer den Error:


> nicolas@localhost ~/Desktop/assembler/ $ make
> ld -o prog dat1/datei.bin dat3/dhost.bin
> dat1/datei.bin: file not recognized: File format not recognized
> make: *** [prog] Fehler 1



Gruß


----------



## deepthroat (10. Juni 2007)

Hi.

Du mußt natürlich dann auch das Kommando zum Linken anpassen. Ich weiss nicht wie du sonst mit den bin Dateien umgehst und wie du dementsprechend das Programm erstellst?! Das mußt du schon selber wissen wie du nachher die .bin Dateien weiter verwenden kannst.

Gruß


----------



## Westbär (10. Juni 2007)

Vielen Dank für alles, nun funktioniert es.


```
.PHONY = all

SOURCES = dat1/datei.asm dat3/dhost.asm
OBJECTS = $(SOURCES:.asm=.bin)
TARGETS = prog

all: $(OBJECTS)
%.bin : %.asm
	@nasm -f bin -o $@ $<
```

EDIT:// Eine Frage hab ich noch:
Beim Linux-Kernel wird ja alles in ein bzImage kompiliert.
Wie kann ich das hier machen, also das die Dateien "datei.bin" und "dhost.bin" in eine ausführbare datei kommen (Diese Datei wäre beim Kernel das bzImage)?

Gruß


----------

