Montage-Fehler beim kompilieren mit GCC
Ich bin immer "no such instruction" Fehler beim kompilieren ein .s Datei mit diesem Befehl:
$ gcc -s -o scall scall.s
scall.s: Assembler messages:
scall.s:2: Error: no such instruction: `section '
scall.s:4: Error: no such instruction: `global _start'
scall.s:7: Error: unsupported instruction `mov'
scall.s:8: Error: unsupported instruction `mov'
scall.s:11: Error: operand size mismatch for `int'
scall.s:13: Error: no such instruction: `section .data'
scall.s:15: Error: no such instruction: `msglength .word 12'
Hier ist der code der Datei:
section .text
global _start
_start:
mov 4,%eax
mov 1,%ebx
mov $message,%ecx
mov $msglength,%edx
int $0x80
section .data
message: .ascii "Hello world!"
msglength .word 12
Wie kann ich loswerden der Fehler?
- Warum nennst du
gcc
zu kompilieren, dass?gcc
ist ein C-compiler, verwenden Sieas
oder ähnlichem Werkzeug. - Das ist es, was wir mit der Schule jetzt.
unsupported instruction 'mov'
keinen Sinn macht.mov
aus einer absoluten Adresse ist eine gültige Anweisung, die sollte montieren, es ist nur nicht die, die Sie wollen. Aktuelle gcc / binutils nur beschwert sich über den tatsächlichen Fehler (section
und global, und die fehlenden:
nachmsglength
)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich denke, dass der folgende code kompiliert wird ("gcc" kompilieren kann .s und .S-Dateien, und verknüpfen Sie Sie mit der C-Bibliothek standardmäßig aber "als" das gleiche tun und nicht link-code mit C-Bibliothek)
als :
gcc:
_start': (.text+0x0): multiple definition of
_start' /usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): Verlagerung 0 ungültige symbol index 11mov $msglength, %edx
zumov msglength, %edx
.main
mit gcc. Sie könnengcc -static -nostdlib start.s
zu montieren und link eine statische ausführbare Datei ohne Verknüpfung CRT-startup-Dateien (definiert einen Konflikt_start
).msglength
wäre.equ msglength, . - message
um die assembler berechnen Sie die Länge für Sie, und verwenden Sie es als eine unmittelbare Konstante anstatt es zu laden.Korrigieren Sie ihn wie folgt ein und kompilieren Sie es mit -c param
gcc -c test.s -o test
-c
ist.o
. Du bist nur Montage ohne Verlinkung hier. Und Sie wusste nicht, beheben Sie die Fehler in der asm, und Sie verändert die OP ' s_start
zumain
: verwenden Siegcc -m32 -nostdlib -static test.s -o test
zu montieren+link ein 32-bit-statische ausführbare Datei.