Base Address verändern

Diskutiere mit über: Base Address verändern im Mac OS X Entwickler, Programmierer Forum

  1. phs

    phs Thread Starter MacUser Mitglied

    Beiträge:
    14
    Zustimmungen:
    0
    Registriert seit:
    09.06.2006
    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.
     
  2. der_Kay

    der_Kay MacUser Mitglied

    Beiträge:
    1.693
    Zustimmungen:
    7
    Registriert seit:
    02.09.2004
    Willst Du das hier erreichen:
    [​IMG]

    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: 10.06.2006
  3. phs

    phs Thread Starter MacUser Mitglied

    Beiträge:
    14
    Zustimmungen:
    0
    Registriert seit:
    09.06.2006
    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?
     
  4. phs

    phs Thread Starter MacUser Mitglied

    Beiträge:
    14
    Zustimmungen:
    0
    Registriert seit:
    09.06.2006
    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!
     
Die Seite wird geladen...
Ähnliche Themen - Base Address verändern Forum Datum
View Höhe zur Laufzeit verändern Mac OS X Entwickler, Programmierer 09.03.2011
Wer kann diesen Code verändern? Mac OS X Entwickler, Programmierer 04.01.2007

Diese Seite empfehlen

Benutzerdefinierte Suche