2017-06-19 2 views
6

Ich habe eine Anwendung, die auf blankem Metall-Target läuft und hat die folgende Strukturdynamisch Last Code auf Embedded-Ziel

  • main.c
  • service.c/.h

Es kompiliert zu ELF ausführbar (system.elf) mit Standard gcc -c, ld Sequenz. Ich benutze Linker, um eine Kartendatei zu erzeugen, die Adressen aller Symbole zeigt.

Jetzt, ohne mein System neu zu flashen, muss ich eine zusätzliche Funktionalität mit einem benutzerdefinierten Laufzeitlader hinzufügen. Denken Sie daran, das ist ein Bare-Metal ohne Betriebssystem.

Ich möchte

  • Kompilierung extra.c, die in service.h definiert APIs verwendet (und irgendwie verknüpfen gegen bestehende service.o/system.elf)
  • kopieren Sie die ausführbare Datei auf meine SDRAM zur Laufzeit und springen, um es
  • geladenen Code sollte in der Lage sein, die exportierten Symbole von service.c zu laufen und greift als
  • erwartet

I tho ught ich wäre in der Lage Map-Datei wiederverwenden die extra.o gegen system.elf zu verbinden, aber das hat nicht funktioniert:

ld -o extraExe extra.o system.map 

Hat gcc oder ld hat einige Modi so spät Verknüpfung Verfahren zu machen? Wenn nicht, wie kann ich dynamisches Codeladen erreichen, das ich oben beschrieben habe?

+1

gcc ist nicht leer. – Olaf

+0

fixed den Titel, pls entfernen -1, Oder geben Sie einfach produktive Antwort :) –

+1

Noch ist es ein Frontend zu einem Linker, so können Sie mit gcc ... –

Antwort

4

Sie können den '-R Dateinamen' oder '--just-Symbole = Dateinamen' Befehlsoptionen in ld. Es liest die Symbolnamen und ihre Adressen aus dem Dateinamen, verschiebt sie jedoch nicht oder fügt sie in die Ausgabe ein. Dadurch kann sich Ihre Ausgabedatei symbolisch auf absolute Speicherorte beziehen, die in Ihrem system.elf-Programm definiert sind. (siehe ftp://ftp.gnu.org/old-gnu/Manuals/ld-2.9.1/html_node/ld_3.html).

Also hier Dateiname wird 'system.elf' sein. Sie können extra.c mit GCC normalerweise einschließlich services.h kompilieren, aber ohne Verknüpfung und erzeugen ‚extra.o‘ dann ld nennen wie folgt:

ld -R"system.elf" -o"extra.out" extra.o 

Die ‚extra.out‘ sind Ihre Symbole verknüpft haben. Sie können objdump verwenden, um den Inhalt von "extra.out" und "extra.o" zu vergleichen. Beachten Sie, dass Sie immer die Startadresse Ihres Programms an die ld übergeben können (z. B. -defsym _TEXT_START_ADDR = 0xAAAA0123) sowie die Startadresse anderer Speicherbereiche wie bss, data. (d. h. -Tbss, -Tdaten)
Seien Sie vorsichtig, um eine gültige Adresse zu verwenden, die nicht mit Ihrem 'system.elf' kollidiert, da ld keinen Fehler dafür erzeugen wird. Sie können neue Bereiche für den geladenen Code + Daten + BSS in Ihrem ursprünglichen Linkerskript definieren und das System neu kompilieren. Dann zeigen Sie die Startadressen auf Ihre definierten Bereiche, während Sie 'extra.o' verlinken.