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).

InformationsquelleAutor Tomi Junnila | 2009-01-30
Schreibe einen Kommentar