Välkommen till linuxportalen.se!

Linuxportalen.se är Sveriges största och aktivaste webbplats för användare av öppen- och fri programvara.

Du besöker Linuxportalen.se som gäst vilket begränsar din möjlighet att använda webbplatsens alla funktioner. Genom att registera dig som medlem får du inte bara möjlighet att söka bland webbplatsens innehåll, skapa nya och delta i befintliga diskussioner, skapa din egen blogg, kommunicera med andra medlemmar genom privata meddelanden och delta i omröstningar. Du får också tillgång till Veckans Kadavro - en seriestrip unikt skapad för Linuxportalen.se!

Registeringen sker snabbt och är helt kostnadsfri - tveka inte, bli medlem idag!

Skapa körbara program med Make

Tjena,

Jag håller på att lära mig att programmera Assembler. I boken jag läser så ander de sig av Make-verktyget när det skall kompilera och länka.

Detta är ett exemepl urdraget från boken som de säger att man skall göra:

. The dependency itself canbe pretty simply stated:
eatsyscall: eatsyscall.o

När jag skriver så i konsollen, så får jag felmeddelande: eatsyscall:: kommandot hittades inte

Hur skall jag använda mgi utav make för att skapa dessa körbara program? Hur gör jag även den indentering i konsollen som krävs? :

eatsyscall: eatsyscall.o
    ld -o eatsyscall.o eatsyscall

 

Alternativ för kommentarvisning

Välj ditt önskade sätt att visa kommentarerna och klicka på "Spara" för att verkställa dina ändringar.

alberts bild

Skriv in källkoden i en .s eller .S fil. Tex hello.s.

Sen kan du skapa en .o fil från .s filen från kommandoraden:

as -o hello.o hello.s

och sedan skapa en körbar binär med ld:

ld -o hello hello.o

En Makefile som gör detta skulle kunna se ut ungefär så här:

hello: hello.o
	ld -o hello hello.o

hello.o: hello.s
	as -o hello.o hello.s

Notera att det måste vara en tab före kommandona ld och as.

Första regeln talar om för make hur den ska skapa programmet hello från hello.o. Den andra regeln talar om hur hello.o kan skapas från hello.s.

Ovanstående Makefile kan förbättras, tex kan man skrive $< för att referera till filnamnet till höger om : och $@ för att referera till filnamnet till vänster. Så istället för ld -o hello hello.o skulle man kunna skriva ld -o $@ $<. Men bägge funkar.

Obs, textredigeraren kanske har bytt ut tab i exemplet ovan mot 8 space. Ta bort alla space och byt ut mot tab i så fall, annars kommer det inte funka.

När du skrivit in hello.s och Makefile (med en texteditor, tex nano eller vad du nu använder) kan du köra Makefilen med kommandot make:

make
as -o hello.o hello.s
ld -o hello hello.o

Obs att kommandona som make kör måste fungera. Du kan testa manuellt på kommandoraden först. make kommer avslutas vid första fel den får.

alberts bild

Ja visst ja, det är inte säkert du vill köra programmet as heller. En del exempelkod är skriven för nasm och en del för GNU as (kallas även gas). Nasm använder något som kallas intel syntax medan gas klarar både intel och AT&T-syntax. Intel och AT&T är två olika dialekter av samma sak kan man säga.

Om exemplen använder nasm, byt bara ut as mot nasm i Makefile. Och byt naturligtvis ut hello mot det ditt exempel heter.

FoHs bild

Du ska inte skriva det i konsollen, utan det är ett utdrag ur en Makefile. Indentering är alltså vanlig indentering i en textfil. Gå tillbaka några snäpp i boken så blir det nog klart vad det handlar om. Ta inga genvägar Wink

Edit: Du kan ju iofs hoppa över makefile och skriva kommandot från ld-raden manuellt. Blir snabbt jobbigt för större projekt dock.

alberts bild

Du har förresten skrivit fel i det här stycket:

eatsyscall: eatsyscall.o
	ld -o eatsyscall.o eatsyscall

Byt plats så borde det funka bättre:

eatsyscall: eatsyscall.o
	ld -o eatsyscall eatsyscall.o

Och glöm inte att det måste stå en tab före kommandot ld. Det funkar inte med mellanslag.

bryans bild

Jag är lite förvirrad.

Jag har nu gjort en .s fil som heter test.s med följande innehåll:

newsandbox: newsandbox.o
    ld -o newsandbox newsandbox.o
newsandbox: newsandbox.asm
    nasm -f elf -g -F stabs newsandbox.asm -l newsandbox.lst

 

När jag kör kommandot:

as -o newsandbox.o test.s

Så får jag följande:

test.s:1: Error: no such instruction: `newsandbox.o'
test.s:2: Error: no such instruction: `ld -o newsandbox newsandbox.o'
test.s:3: Error: no such instruction: `newsandbox.asm'
test.s:4: Error: no such instruction: `nasm -f elf -g -F stabs newsandbox.asm -l newsandbox.lst'

Jag skrev av detta från boken, och det står inte vad newsandbox.lst är för något?

 

Och när jag skriver make, så får jag följande fel:

make: *** Inga mål angavs och ingen makefil hittades.  Stannar.
 

Vad gör jag för fel? 
 

 

FoHs bild

Du har inte förstått vad det är för kommandon du skriver in. Det är instruktioner avsedda för en Makefile. En Makefile heter just Makefile. Eftersom du döpte filen till test.s så hittar inte make-kommandot filen. Vill du använda ett annat namn på filen måste du ange vilken fil som ska användas med en växel till kommandot make.

Vet inte vad en .s-fil är, men du försöker skapa en objektsfil från den med kommandot as, och då gissar jag att s-filen ska innehålla själva assemblerkoden (den ska definitivt inte innehålla kommandon för en Makefile vilket du gjort).

Ställer mig även lite tveksam till att du skrivit av den rätt, med tanke på att du har två Makefile targets vid samma namn, och som ger olika kommandon. Men jag är ingen expert på Makefiles så det är möjligt att jag har fel.

alberts bild

Ja, precis som foh skriver ska dessa kommandon in i en fil som heter Makefile. Assemblerkoden ska in i newsandbox.asm (du kan kalla den newsandbox.s också om du vill, men det spelar mindre roll).

Ändra raden:

newsandbox: newsandbox.asm

till:

newsandbox.o: newsandbox.asm

så borde det funka bättre, förutsatt att du skrivit rätt i newsandbox.asm.

fsns bild

Du behöver inte använda "make" om du inte vill, det har du bara för att underlätta för dig att hålla ordning på vad som skall kompileras. Om du hackar för skojs skulle och för att lära dig så räcker det ofta att kompilera och länka direkt från kommandoraden, eller så skriver du in dina kompileringskommandon i ett skalscript som du sedan kör. "make" kan du alltid lära dig sen, när du blivit varm i kläderna.