Base Address verändern

P

phs

Neues Mitglied
Thread Starter
Dabei seit
09.06.2006
Beiträge
14
Reaktionspunkte
0
Hallo,

wie kann man dem Linker in Mac OS X 10.4.6 beibringen, dass er beim Linken eines Programms eine bestimmte Basisadresse verwendet?

Ich habe ein Programm welches mmap(2) verwendet um einen bestimmten Speicherbereich verwenden zu können. Dieser Speicherbereich hängt von der Eingabe ab liegt aber immer im Bereich von ca. 0x2000 bis ca. 0xF000 und ist ansonsten unveränderlich.

Wenn ich nun mmap(2) dazu bringe mir einen Speicherbereich beginnend z.B. an 0x2000 zu mappen, stelle ich fest, das dort eigentlich schon mein eigener Code geladen ist. Wenn ich dann trotzdem in dem Bereich Veränderungen vornehme stürzt mein Code natürlich ab sobald in die Funktion gesprungen wird, die an 0x2000 liegt.

Ich denke die Lösung des Problems könnte sein, den Linker dazu zu bringen meinen eigenen Code nicht im Bereich von ca. 0x2000 - 0xF000 zu linken, sondern eine Basisadresse im oberen Speicherbereich zu verwenden. Auf x86-Systemen (Linux, FreeBSD) werden die Images im Bereich um 0x800000 gelinkt und mein Code funktioniert wunderbar.

Hoffentlich konnte ich das Problem nun verständlich machen. Für jeden Hinweis bin ich dankbar.
 
Willst Du das hier erreichen:
image_base_10000.gif


Zum Verschieben der Basis-Adresse ist das Linker-Flag -seg1addr hexaddr (bzw auch -image_base hexaddr) zuständig. Das Argument hexaddr muss auf PowerPC ein Vielfaches von 1000h sein.

Das Flag bringt man innerhalb von XCode unter "Project"->"Edit Project Settings"->"Build"->"Collection: Linking"->"Other Linker Flags" unter.
 
Zuletzt bearbeitet:
Erstmal ein großes Danke für die schnelle Antwort.

Die Optionen -seg1addr bzw. -image_base hab' ich schon versucht, leider ohne Erfolg. Ich verwende aber nicht XCode, sondern baue das Projekt mittels make(1), also GNU make 3.80. Im Manual zu cc(1) steht, dass man per -Wl Optionen definieren kann, die direkt an den Linker weitergegeben werden.

Deshalb hab' ich im Makefile eine Zeile

Code:
CFLAGS+=-Wl,-image_base=0x200000

eingefügt. Beim übersetzen kommt dann aber diese Warnung:

Code:
powerpc-apple-darwin8-gcc-4.0.1: -image_base=0x200000: linker input file unused because linking not done

und der gewünschte Effekt bleibt leider auch aus.

Andere Varianten wie z.B. -Wl,-seg1addr=0x200000, -Wl,image_base=0x200000 oder einfach image_base=0x200000 helfen leider auch nicht.

Hast Du vielleicht noch 'nen Tip?
 
Nevermind...

Code:
LFLAGS=-Wl,image_base,0x200000

$(CC) $(CFLAGS) -o $(PROG) $(OBJS) $(LFLAGS)

Wichtig ist, dass die Linker-Optionen am Ende stehen, und nicht am Anfang wie die Compiler-Flags.

D'oh.

Nochmals Danke an den Kay!
 
Zurück
Oben Unten