Как мне скомпилировать ASM в сгенерированный с помощью GCC?
Я играю с некоторым кодом asm, и что-то беспокоит меня.
Я скомпилировать этот:
#include <stdio.h>
int main(int argc, char** argv){
printf("Hello Worldn");
return 0;
}
С gcc file.c -S -o file.S
это создает хороший маленький кусочек кода asm:
.cstring
LC0:
.ascii "Hello World"
.text
.globl _main
_main:
LFB3:
pushq %rbp
LCFI0:
movq %rsp, %rbp
LCFI1:
subq , %rsp
LCFI2:
movl %edi, -4(%rbp)
movq %rsi, -16(%rbp)
leaq LC0(%rip), %rdi
call _puts
movl , %eax
leave
ret
LFE3:
.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support
EH_frame1:
.set L$set,LECIE1-LSCIE1
.long L$set
LSCIE1:
.long 0x0
.byte 0x1
.ascii "zR"
.byte 0x1
.byte 0x78
.byte 0x10
.byte 0x1
.byte 0x10
.byte 0xc
.byte 0x7
.byte 0x8
.byte 0x90
.byte 0x1
.align 3
LECIE1:
.globl _main.eh
_main.eh:
LSFDE1:
.set L$set,LEFDE1-LASFDE1
.long L$set
LASFDE1:
.long LASFDE1-EH_frame1
.quad LFB3-.
.set L$set,LFE3-LFB3
.quad L$set
.byte 0x0
.byte 0x4
.set L$set,LCFI0-LFB3
.long L$set
.byte 0xe
.byte 0x10
.byte 0x86
.byte 0x2
.byte 0x4
.set L$set,LCFI1-LCFI0
.long L$set
.byte 0xd
.byte 0x6
.align 3
LEFDE1:
.subsections_via_symbols
моя следующая проблема на самом деле, как мне скомпилировать этот вывод, и я могу сделать GCC сделать это для меня?
7 ответов:
Да, вы можете использовать gcc для компиляции кода asm. Используйте -c для компиляции, как это:
gcc -c file.S -o file.o
это даст объектный код файла с именем file.о. Для вызова компоновщика выполните следующую команду после приведенной выше:
gcc file.o -o file
gcc
можно использовать файл сборки в качестве входных данных и вызывать ассемблер по мере необходимости. Однако есть одна тонкость:
- если имя файла заканчивается "
.s
" (строчные буквы 's'), затемgcc
вызывает ассемблер.- если имя файла заканчивается "
.S
" (прописная "S"), затемgcc
применяет препроцессор C к исходному файлу (т. е. он распознает директивы, такие как#if
и заменяет макросы), и затем вызывает ассемблер на результат.Итак, в общем, вы хотите делать такие вещи:
gcc -S file.c -o file.s gcc -c file.s
вы можете встроить ассемблерный код в обычную программу на языке Си. Вот это хорошо введение. Используя соответствующий синтаксис, вы также можете сообщить GCC, что хотите взаимодействовать с переменными, объявленными в C. программа ниже указывает gcc, что:
- eax будет foo
- ebx должен быть бар
- значение в eax должно храниться в foo после выполнения кода сборки
\n
int main(void) { int foo = 10, bar = 15; __asm__ __volatile__("addl %%ebx,%%eax" :"=a"(foo) :"a"(foo), "b"(bar) ); printf("foo+bar=%d\n", foo); return 0; }
да, gcc также может компилировать исходный код сборки. Кроме того, вы можете вызвать
as
, который является ассемблер. (gcc-это просто программа "драйвер", которая использует эвристику для вызова компилятора C, компилятора C++, ассемблера, компоновщика и т. д..)
Если у вас есть main.файл s. вы можете создать объектный файл с помощью
GCC
иas
# gcc -c main.s # as main.s -o main.o
проверьте эту ссылку, это поможет вам узнать некоторые binutils GCC http://www.thegeekstuff.com/2017/01/gnu-binutils-commands/