Der folgende Assembly-Code gibt einen Fehler beim Ausführen von as
unter OSX 10.9.4, funktioniert aber erfolgreich unter Linux (Debian 7.6). Insbesondere scheint die movq-Anweisung das Label-Argument nicht zu mögen. HierWarum funktioniert diese movq-Anweisung auf Linux und nicht auf osx?
$ cat test.S
.globl _main
_main:
movq $_main, %rax
ret
ist der Fehler:
$ 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
Ändern $_main
in Zeile 3 zu einer wörtlichen wie $10
funktioniert gut.
Der Code musste sehr geringfügig geändert werden, damit er unter Linux ausgeführt werden konnte - indem einfach die Unterstriche von den Beschriftungen entfernt wurden.
$ cat test.S
.globl main
main:
movq $main, %rax
ret
es ziemlich einfach ist, unabhängig zu überprüfen, ob der Code auf Linux funktioniert:
$ as -o test.o test.S
$ gcc -o test.out test.o
$ ./test.out
Bitte ignorieren, dass der Code wirklich viel tun, nicht von etwas, habe ich getrimmt es absichtlich nach unten als so viel wie möglich, um den Fehler zu demonstrieren.
Ich habe ziemlich viel in die Verwendung von LEA (Load Effective Address) geschaut, aber bevor ich diese Änderung mache, möchte ich den Unterschied verstehen - warum funktioniert es unter Linux und nicht unter OSX?
+1 gut schriftliche Anfrage mit einem sehr guten minimal, vollständigen, überprüfbaren Codeb. – msw