16-bit che collega sotto Linux
Domanda
sto usando NASM Assembler sotto linux quando uso il comando "nasm -f elf -l hello.lst hello.asm" funziona benissimo ma quando il collegamento con gcc "gcc -o ciao hello.o" esso genera un errore:
.:( hello.asm testo + 0x4): trasferimento troncati per adattarsi: R_386_16 contro `.data' collect2: ld returned 1 exit status
Ho imparato che questo è un problema con gcc e 16-bit
eventuali soluzioni?
Soluzione
Linux non ha nemmeno un sottosistema a 16 bit - anche se hai gcc collegarlo, ancora non poteva eseguirlo! Perché non basta usare .bits 32
?
Altri suggerimenti
I affrontato la stessa situazione di qualche anno fa e di nuovo quest'anno.
Due modi per affrontare con esso sono:
- Scrivi la tua 16 bit linker amichevole (è necessario analizzare sezione .rel.text almeno).
- Usa un simbolo di base (o simboli) per calcolare gli indirizzi assoluti manualmente (sezioni .rel sono ancora creati, ma può essere rimosso). Tuttavia, questo metodo è molto soggetto ad errori.
Ho sempre finisce per fare 2, ma probabilmente dovrebbe trovare il tempo per scrivere un linker (o patch GNU ld ...).