Die Verknüpfung von Symbolen zu festen Adressen auf Linux
Wie würde man gehen, um die Verknüpfung (einige) Zeichen bestimmten festen Adressen bei der Verwendung von GNU ld, so dass die binären konnte noch ausgeführt werden, wie normal in Linux (x86)? Es werden nicht alle Zugriffe auf diese Symbole, sondern Ihre Adressen sind wichtig.
Zum Beispiel, ich hätte die folgende Struktur:
struct FooBar {
Register32 field_1;
Register32 field_2;
//...
};
struct FooBar foobar;
Ich würde gerne link foobar
zu Adresse 0x76543210, aber die Verknüpfung der standard-Bibliotheken und der rest der Anwendung normal. Wird die Anwendung dann nutzen Sie die Adresse von foobar, aber wird sich nicht auf die (möglicherweise nicht vorhandene) Speicher dahinter.
Die Begründung für diese Anforderung ist, dass diese dieselbe Quelle verwendet werden kann, das auf zwei Plattformen: Auf die native Plattform, Register32
kann einfach eine volatile uint32_t
, aber auf Linux Register32
ist ein C++ - Objekt mit derselben Größe wie eine uint32_t
definiert z.B. operator=
, das dann die Adresse des Objekts und sendet eine Anforderung an ein Kommunikations-framework mit, dass die Adresse (und die Daten), um die eigentliche Zugriff auf remote-hardware. Der linker würde damit die Sicherstellung der Register32
Felder der struct finden Sie die richtigen "Adressen".
- WARUM würden Sie möglicherweise möchten dies tun?
- Auf einer memory-geschützt OS es gibt KEINEN Grund, dies zu tun.
- Diese Art der Sache wird oft benötigt bei eingebetteten Systemen, wo die hardware sitzt zu bekannt, bestimmte Adressen. 0x76543210 ist nicht wahrscheinlich, eine solche Adresse jedoch. 😉 ld ist auch nicht die Freundlichste linker für solche Dinge. Es ist eine syntax für die Definition von Symbolen aus dem linker-Skript, das hilft.
- Die OP ' s Absichten scheinen darüber hinaus zu gehen, einfach den Zugriff auf hardware, die sich an einer bestimmten Adresse. Mit GCC, so etwas wie "struct FooBar foobar = (struct FooBar)0x76543210" sollte eine einfache Methode zum erleichtern den Zugriff auf die hardware.
- Mögliche Duplikate von Fixed-address-variable in C
- Siehe auch relocatable code-und Objekt-Dateien und shared libraries (siehe Ian lance Taylor ' s Antwort).
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dem Vorschlag von litb zu verwenden
--defsym symbol=address
funktioniert, aber ist ein bisschen umständlich, wenn man ein paar Dutzend solcher Instanzen anzeigen. Allerdings--just-symbols=symbolfile
tut den trick. Es dauerte eine Weile, um herauszufinden, die syntax dessymbolfile
, dieDie Räume scheinen erforderlich zu sein, da sonst
ld
Berichtefile format not recognized; treating as linker script
.Versuchen Sie es mit
Als mit diesem:
Machen und foobar in Ihrem code eine extern-Deklaration:
Dieser sieht vielversprechend aus. Jedoch, es ist eine schlechte Idee, so etwas zu tun (es sei denn, Sie wirklich wissen, was Sie tun). Warum brauchen Sie das?
Gebe ich dir den heißen Tipp... GNU LD können dies tun (vorausgesetzt, das system libs brauchen nicht die Adresse, die Sie möchten). Sie brauchen nur Ihre eigenen zu bauen linker-Skript statt über den compiler automatisch generierte ein. Lesen Sie die man-Seite für ld. Auch, den Aufbau einer linker-Skript für eine komplexe software handelt, ist keine einfache Aufgabe, wenn Sie beinhalten die GLIBC zu.