Ich versuche herauszufinden, wie Umzug funktioniert, aber ich kann nicht scheinen, meinen Kopf drum herum. This document beschreibt die verschiedenen Typen, die beim Verschieben einer ELF-Datei auftreten können.ELF Umzug auf ARM Cortex-M3
Nehmen wir zum Beispiel R_ARM_ALU_SB_G0_NC
(# 70).
- Typ: statisch
- Klasse: ARM, beschreibt die Art von Ort, die verlagert werden soll (was ich nicht verstehe)
- Betrieb: ((S + A) | T) - B (S))
Ich vermute, dass der mathematische Ausdruck ist die Operation, die ich suche. Allerdings verstehe ich nicht ganz, wie das in meine Funktion passt. Das Verfahren, bei dem die Verlagerung stattfindet, sieht wie folgt aus:
int elfloader_arch_relocate(int input_fd, struct elfloader_output *output,
unsigned int sectionoffset, char *sectionaddr, struct elf32_rela *rela, char *addr)
input_fd
ist ein Dateideskriptor für die ELF-Datei, *output
verwendet wird, wenn das Ausgangssegment zu schreiben, ist sectionoffset
die Datei, zu dem Versatz die Verlagerung zu finden ist *sectionaddr
ist die Startadresse des Abschnitts (absolute Laufzeit) und *addr
ist die verschobene Adresse. Die 32-Bit sieht Verlagerung Struktur wie diese
struct elf32_rela {
elf32_addr r_offset;
elf32_word r_info;
elf32_sword r_addend;
};
Auf Seite 26 der oben document erwähnt die Nomenklatur erläutert:
- S (wenn sie auf eigene verwendet) ist die Adresse des Symbols .
- A ist der Zusatz für die Verlagerung.
- T ist 1, wenn das Zielsymbol S den Typ STT_FUNC hat und das Symbol eine Thumb-Anweisung adressiert; Ansonsten ist es 0.
- B (S) ist die Adressierung Ursprung des Ausgabesegments des Symbols definiere
So ist meine Frage, welche der Parameter in der Funktion Umzug zu den in der Formel verwendeten entsprechen?
wo machst du den Umzug, hast du ein Betriebssystem mit einem Elf-Parser auf dem Cortex-m3? –
Ich verwende Contiki OS 2.7, also muss ich nur einige prozessorabhängige Funktionen schreiben, wie 'elfloader_arch_relocate()' – boortmans
Es ist mir nicht klar, ob Sie einen _linker_ oder _loader_ implementieren. Ein Linker wird als letzte Stufe der Kompilierung ausgeführt, um "Objektdateien" in "ausführbare Dateien" und "gemeinsam genutzte Bibliotheken" umzuwandeln. Ein Loader läuft als erste Stufe der Ausführung, um ausführbare Dateien und gemeinsame Bibliotheken zu "reparieren", wenn sie in den Speicher gebracht werden. Ein Linker muss viel mehr Relocation-Typen handhaben als ein Loader. Bitte sag, was du meinst. – zwol