Domanda

Come si potrebbe fare per collegare (alcuni) simboli a specifici indirizzi fissi usando GNU ld in modo che il binario possa ancora essere eseguito normalmente in Linux (x86)? Non ci saranno accessi a questi simboli, ma i loro indirizzi sono importanti.

Ad esempio, avrei la seguente struttura:

struct FooBar {
    Register32 field_1;
    Register32 field_2;
    //...
};

struct FooBar foobar;

Vorrei collegare foobar per indirizzare 0x76543210, ma normalmente collego le librerie standard e il resto dell'applicazione. L'applicazione utilizzerà quindi l'indirizzo di foobar, ma non farà riferimento alla memoria (possibilmente inesistente) dietro di essa.

La logica di questa richiesta è che questa stessa fonte può essere usata su due piattaforme: sulla piattaforma nativa, Register32 può semplicemente essere un volatile uint32_t, ma su Linux uint32_t è un oggetto C ++ con le stesse dimensioni come operator= che definisce ad es <=>, che utilizzerà quindi l'indirizzo dell'oggetto e invia una richiesta a un framework di comunicazione con quell'indirizzo (e i dati) per eseguire l'accesso effettivo sull'hardware remoto. Il linker assicurerebbe quindi che i <=> campi della struttura facciano riferimento al & Quot; indirizzi & Quot ;.

È stato utile?

Soluzione

Il suggerimento di litb di usare --defsym symbol=address funziona, ma è un po 'complicato quando hai qualche dozzina di tali istanze da mappare. Tuttavia, --just-symbols=symbolfile fa proprio il trucco. Mi ci è voluto un po 'per scoprire la sintassi di symbolfile, che è

symbolname1 = address;
symbolname2 = address;
...

Gli spazi sembrano essere richiesti, altrimenti ld riporta file format not recognized; treating as linker script.

Altri suggerimenti

Provalo con

--defsym symbol=expression

Come per questo:

gcc -Wl,--defsym,foobar=0x76543210 file.c

E trasforma il foobar nel tuo codice in una dichiarazione esterna:

extern struct FooBar foobar;

Sembra promettente. Tuttavia, è una cattiva idea fare una cosa del genere (a meno che tu non davvero sappia cosa fai). Perché ne hai bisogno?

Ti darò il suggerimento ... GNU LD può farlo (supponendo che le librerie di sistema non abbiano bisogno dell'indirizzo desiderato). Devi solo creare il tuo script linker invece di usare quello generato automaticamente dal compilatore. Leggi la pagina man per ld. Inoltre, costruire uno script di linker per un software complesso non è un compito facile quando si coinvolge anche GLIBC.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top