Lowlevel

Lowlevel => Softwareentwicklung => Thema gestartet von: OsDevNewbie am 19. September 2015, 19:38

Titel: ld und hohe Startadresse
Beitrag von: OsDevNewbie 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 (http://forum.lowlevel.eu/index.php?topic=3415.msg39292#msg39292) 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 (https://github.com/Gurgel100/gcc).

Ich hoffe ihr wisst eine Antwort auf mein Problem.
Titel: Re: ld und hohe Startadresse
Beitrag von: MNemo 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 (http://www.scs.stanford.edu/histar/src/lind/asm-lind/elf.h) 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)
Titel: Re: ld und hohe Startadresse
Beitrag von: OsDevNewbie 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?