Il seguente codice assembly genera un errore durante l'esecuzione di as
su OSX 10.9.4, ma funziona correttamente su Linux (Debian 7.6). In particolare, l'istruzione movq non sembra gradire l'argomento dell'etichetta.Perché questa istruzione movq funziona su linux e non su osx?
$ cat test.S
.globl _main
_main:
movq $_main, %rax
ret
Ecco l'errore:
$ as -o test.o test.S
test.S:3:32-bit absolute addressing is not supported for x86-64
test.S:3:cannot do signed 4 byte relocation
Modifica $_main
in linea di 3 ad un letterale come $10
funziona bene.
Il codice doveva essere modificato in un modo molto minore per farlo funzionare su Linux - semplicemente rimuovendo i caratteri di sottolineatura dalle etichette.
$ cat test.S
.globl main
main:
movq $main, %rax
ret
E 'abbastanza facile da verificare in modo indipendente che il codice funziona su Linux:
$ as -o test.o test.S
$ gcc -o test.out test.o
$ ./test.out
Si prega di ignorare che il codice in realtà non fare molto di nulla, ho volutamente rifilato giù come il più possibile per dimostrare l'errore.
Ho guardato un bel po 'a usare LEA (caricare l'indirizzo effettivo), ma prima di apportare questa modifica mi piacerebbe capire la differenza - perché funziona su Linux e non su OSX?
+1 domanda ben scritto con un ottimo minimal, completo, esempio di codice verificabile – msw