Benutzerdefinierte Suche

Base Address verändern

  1. phs

    phs Thread Starter MacUser Mitglied

    Mitglied seit:
    09.06.2006
    Beiträge:
    14
    Zustimmungen:
    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.
     
    phs, 10.06.2006
    #1
  2. der_Kay

    der_Kay MacUser Mitglied

    Mitglied seit:
    02.09.2004
    Beiträge:
    1.685
    Zustimmungen:
    8
    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.
     
    der_Kay, 10.06.2006
    #2
  3. phs

    phs Thread Starter MacUser Mitglied

    Mitglied seit:
    09.06.2006
    Beiträge:
    14
    Zustimmungen:
    0
    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?
     
    phs, 10.06.2006
    #3
  4. phs

    phs Thread Starter MacUser Mitglied

    Mitglied seit:
    09.06.2006
    Beiträge:
    14
    Zustimmungen:
    0
    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!
     
    phs, 10.06.2006
    #4
Die Seite wird geladen...
Ähnliche Themen - Base Address verändern
  1. balufreak
    Antworten:
    0
    Aufrufe:
    387
    balufreak
    09.03.2011
  2. relaht
    Antworten:
    1
    Aufrufe:
    729
    wegus
    05.01.2007