Forum: Mikrocontroller und Digitale Elektronik arm7tdmi statisches linken und offset


von Felix H. (masterq)


Lesenswert?

Hallo zusammen,
ich habe ein nerfiges Problem mit arm-elf-gcc.
Ich möchte gerne C funktionen schreiben und compilieren und dann später 
in eine eine schon vorhandene software einspielen.
Dann möchte ich sie von anderer Stelle aufrufen.

Teilweise habe ich erfolg, jedoch reicht mein verständnis von compiler 
und linker nicht um alles zu realisieren.
Kleine Funktionen ohne weitere funktions aufrufe und memcpy und 
sonnstiges kann ich bereits benutzen. Zum compileren und einbinden habe 
ich mir folgenden script geschrieben.
1
#!/bin/bash
2
if (( $# != 3))
3
then
4
        echo "usage: c file without .c, target file, offset in hex eg. 0x80000"
5
        exit
6
fi
7
8
arm-linux-gnueabi-gcc -static -S -mthumb -mthumb-interwork -mcpu=arm7tdmi -Os $1.c && \
9
arm-linux-gnueabi-as -o $1.o $1.s && \
10
arm-linux-gnueabi-objcopy -O binary $1.o $1.bin && \
11
echo "writing to address: $3 = $(($3))" && \
12
dd if=$1.bin of="$2" conv=notrunc obs=1 seek=$(($3))

Es ist klar das ich keine Funktion aufrufen kann... Angenommen ich habe 
2 Funktionen F1 und F2 die eine wird an der Adresse 0x0 gespeichert und 
die andere vielleicht an 0xCB. Will F1 F2 aufrufen greift sie auf die 
Adresse 0xCB zu. Was aber signifikant daneben ist wenn die ganze 
Geschichte mit 0x1000000 offset in der Binary steht.

1. Ich würde also gerne den compiler Anweisen das er diesen offset 
berücksichtig.

2. Ausserdem sobald etwas passiert wie memcpy oder eine division, was 
schnell zu ist wenn man strukturen nutzt, macht er auch nicht weiter wie 
geplant. Memcpy muss also umbedingt mit in die binary... nur leider 
bekomme ich das einfach nicht hin.

Vielen Dank an alle die mir helfen. Das hier ist echt schon ziemlich 
nerfig geworden. Vorallem weil ich einfach nicht weiß wo ich nach 
schauen muss.

Grüße

Felix

von (prx) A. K. (prx)


Lesenswert?

Die .o Files sind nicht direkt ausführbar. Es ist die Aufgabe des 
Linkers (ld, also hier wohl arm-linux-gnueabi-ld) mehrere .o und ggf. 
Libs als .a zusammenzubinden. Erst dann erhält man ausführbaren Code.

Allerdings musst du die ganzen Schritte nicht unbedingt alle zu Fuss 
ausführen, auch wenn dich niemand daran hindert. Sowohl den Assembler 
als auch den Linker ruft "gcc" üblicherweise selbst auf. Es besteht also 
keine Notwendigkeit, mit Gewalt (-S) Assemblercode statt Objektfiles 
(.o) zu produzieren, wenn du eigentlich Objektfiles willst.

So produziert also
 gcc -c t1.c
ein Objektfile t1.o, und mehrere davon können mit
 gcc -o test t1.o t2.o t3.o
zusammengelinkt werden. Das gilt für den ARM-Compiler genauso wie für 
den x86-Compiler vom Linux selbst.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.