Spojující symboly pevných adres na Linux

hlasů
9

Jak by se dalo jít o propojení (některé) symboly do určitých pevných adres pomocí GNU ld, aby binární mohl ještě být provedeny jako normální v systému Linux (x86)? K dispozici nebudou žádné přístupy do těchto symbolů, ale jejich adresy jsou důležité.

Například, já bych mít následující strukturu:

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

struct FooBar foobar;

Chtěl bych propojit foobarřešit 0x76543210, ale propojit standardní knihovny a zbytek aplikace normálně. Aplikace se pak využívají adresy foobar, ale nebude odkazovat na (možná neexistující) paměť za ním.

Důvodem pro tento požadavek je, že stejný zdroj může být použit na dvou platformách: Na nativní platformu, Register32může být jednoduše volatile uint32_t, ale v Linuxu Register32je C ++ objekt se stejnou velikost jako disk uint32_t, který definuje např operator=, které pak budou používat adresu objektu a odešle požadavek na komunikační rámce s touto adresou (a údajů) provádět skutečnou přístup na vzdáleném hardwaru. Linker by tak zajistit Register32polí struct odkazují na správné „adresy“.

Položena 30/01/2009 v 12:47
zdroj uživatelem
V jiných jazycích...                            


3 odpovědí

hlasů
14

Návrh, podle litb používat --defsym symbol=addressfunguje, ale je trochu těžkopádné, když máte několik desítek takových instance mapovat. Nicméně, --just-symbols=symbolfiledělá jen trik. Chvíli mi trvalo, než zjistil syntaxi symbolfile, která je

symbolname1 = address;
symbolname2 = address;
...

Zdá se, že prostory, které mají být zapotřebí, protože jinak ldhlásí file format not recognized; treating as linker script.

Odpovězeno 30/01/2009 v 15:19
zdroj uživatelem

hlasů
7

Zkuste to s

--defsym symbol=expression

Stejně jako u takto:

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

A aby foobar v kódu externí prohlášení:

extern struct FooBar foobar;

To vypadá slibně. Nicméně, je to špatný nápad, udělat takovou věc (pokud opravdu víte, co děláte). Proč to potřebuješ?

Odpovězeno 30/01/2009 v 13:10
zdroj uživatelem

hlasů
1

Dám vám horký tip ... GNU LD lze provést (za předpokladu, že systém libs nepotřebují adresu, kterou chcete). Je pouze potřeba vytvořit vlastní linker skriptu namísto použití vytvořeno automaticky jeden kompilátoru. Přečtěte si manuálové stránky pro ld. Také budování linker skript pro komplexní kus softwaru není snadný úkol, když se zapojit glibc taky.

Odpovězeno 30/01/2009 v 13:07
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more