16-Bit-Verknüpfung unter Linux
Frage
Ich bin mit NASM Assembler unter Linux wenn ich den Befehl "nasm -f elf -l hello.lst hello.asm" es funktioniert gut aber bei der Verknüpfung mit gcc „gcc -o hallo hello.o“ es erzeugt einen Fehler:
.hello.asm :( text + 0x4): Verlagerung abgeschnitten zu passen: R_386_16 gegen `.data‘ collect2: ld returned 1 exit status
Ich habe gelernt, dass dies ein Problem mit gcc und 16-Bit
irgendwelche Lösungen?
Lösung
Linux hat noch nicht einmal eine 16-Bit-Subsystem - auch wenn Sie gcc bekam es zu verknüpfen, können Sie immer noch nicht ausführen kann! Warum gehst du nicht einfach .bits 32
verwenden?
Andere Tipps
stand ich die gleiche Situation vor ein paar Jahren und auch in diesem Jahr.
Zwei Möglichkeiten, damit umzugehen, sind:
- Schreiben Sie Ihre eigenen 16-Bit-freundlichen Linker (Sie .rel.text Abschnitt zumindest analysieren müssen).
- Verwenden einer Basissymbol (oder Symbole) die absoluten Adressen manuell zu berechnen (die .rel Abschnitte noch geschaffen, sondern können entfernt werden). Allerdings ist diese Methode sehr fehleranfällig.
ich immer 2 am Ende tut, aber ich sollte wohl Zeit machen einen Linker zu schreiben (oder das Patchen GNU ld ...).