2017-04-12 15 views
0

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?

+0

wo machst du den Umzug, hast du ein Betriebssystem mit einem Elf-Parser auf dem Cortex-m3? –

+0

Ich verwende Contiki OS 2.7, also muss ich nur einige prozessorabhängige Funktionen schreiben, wie 'elfloader_arch_relocate()' – boortmans

+0

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

Antwort

0

Wenn ich dieses Recht habe zu lesen, und ich bin nicht sicher, ich bin, geht es diese wie:

  • S ist addr.
  • B(S) ist sectionaddr.
  • A ist rela->r_addend.
  • Tkann abgeleitet werden aus Informationen in rela->r_info; Wenn nicht, weiß ich nicht, wo Sie suchen müssen.

Dies ist eine wirklich kompliziert aussehende Verlagerung. Betrachten Sie mit den einfachen beginnen (wie R_ARM_ABS16). In einem dynamischen Lader sollten Sie nicht implementieren müssen alle Umlagerungen typess in der Spezifikation, mit der Sie verknüpften, nur eine kleine Teilmenge.Wenn es so aussieht, als würden Sie viele Umlagerungsarten benötigen, liegt dies wahrscheinlich daran, dass Sie versuchen, nicht verknüpfte Objektdateien dem dynamischen Loader zuzuführen. Sie sollten sie mit dem vorhandenen ARM-Linker in gemeinsame Objekte umwandeln. (Mit der GNU-Toolchain ist eine erste Annäherung, wie Sie das tun, gcc -shared foo.o -o foo.so.)

Cribbing aus einem vorhandenen dynamischen Lader für die Architektur ist oft ein guter Plan; im Code für solche Dinge steckt oft viel undokumentierte Weisheit. Zum Beispiel ist hier GNU libc's ld.so's ARM relocator. (LGPL)

+0

Wenn ich die aktuelle Implementierung teste, erhalte ich eine Fehlermeldung über einen nicht unterstützten Umzugstyp (# 70). Ist es möglich, diesen Fehler durch einfachere Umsetzungen zu beheben? – boortmans

+0

Nicht auf lange Sicht, aber während Sie diese Implementierung noch durchführen, können Sie auf gemeinsam genutzten Objekten mit zunehmender Komplexität testen. – zwol

+0

(Es ist möglich, dass Sie versuchen, eine nicht verknüpfte Objektdatei einem Loader zuzuordnen, was eigentlich nicht funktionieren sollte. Bitte lesen Sie die Kommentare zu der Frage.) – zwol