Autor Thema: ld und hohe Startadresse  (Gelesen 8983 mal)

OsDevNewbie

  • Beiträge: 282
    • Profil anzeigen
    • YourOS Kernel
Gespeichert
« am: 19. September 2015, 19:38 »
Hallo,
ich habe mein Speicher so konzipiert, dass die unteren 512GiB und die oberen 512GiB Kernelspace sind. Der obere Speicherbereich wird allerdings nur zur Verwaltung der Pagingtabellen verwendet. Der Userspace sitzt dazwischen. Programme werden an die Adresse 0x8000000000 geladen und dann ausgeführt. Jetzt habe ich das Problem, dass mir ld immer folgende Fehlermeldung ausgibt:
main.c:(.text+0x30): relocation truncated to fit: R_X86_64_32 against `.rodata'
Es wurde zwar schon hier vermutet, dass 0x8000000000 nicht in 32-bit passt und deshalb diese Meldung ausgegeben wird, aber das macht für mich keinen Sinn, denn diese Meldung wird ja nur für Symbole, also (globale) Variablen oder Funktionen, ausgegeben. Diese werden ja relativ addressiert. Aber eigentlich sollte diese relative Addresse in 32-bit reinpassen, denn das Programm ist sicher kleiner als 4 GiB.

Meine aktuelle Konfiguration für mein Cross-gcc seht ihr hier.

Ich hoffe ihr wisst eine Antwort auf mein Problem.
Viele Grüsse
OsDevNewbie

Ein Computer ohne Betriebsystem ist nicht mehr wert als ein Haufen Schrott.
Ein Computer ist eine Maschine, die einem Lebewesen das kostbarste klaut, was sie selber nicht hat:
DIE ZEIT DES LEBENS

MNemo

  • Beiträge: 547
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 26. September 2015, 11:24 »
Diese werden ja relativ addressiert.

Werden sie das? Mit '-fpic' (Position Independent Code) wird es natürlich Relativ adressiert, aber sonst.?

Dissasembliere das object file doch vor dem linken mal (objdump -d) und zeig mal was da so um .text+30 so steht.

[EDIT]
Richtige dokumentation habe ich jetzt auf die schnelle nicht gefunden, aber hieraus geht für mich hervor, dass es sich bei R_X86_64_32 um direkte Adressierung handelt, im Gegensatz zu 'R_X86_64_PC32' relativer Adressierung. (PC=Programm Counter=Instruction Pointer=rIP)
« Letzte Änderung: 26. September 2015, 11:35 von MNemo »
„Wichtig ist nicht, besser zu sein als alle anderen. Wichtig ist, besser zu sein als du gestern warst!“

OsDevNewbie

  • Beiträge: 282
    • Profil anzeigen
    • YourOS Kernel
Gespeichert
« Antwort #2 am: 29. September 2015, 11:09 »
Ah. Ok jetzt verstehe ich das. Mit -mcmodel=large funktioniert es auch. Welches der beiden ist denn zu bevorzugen?
Viele Grüsse
OsDevNewbie

Ein Computer ohne Betriebsystem ist nicht mehr wert als ein Haufen Schrott.
Ein Computer ist eine Maschine, die einem Lebewesen das kostbarste klaut, was sie selber nicht hat:
DIE ZEIT DES LEBENS

 

Einloggen