Как скомпилировать asm, созданный GCC?
Я играю с некоторым кодом asm, и меня что-то беспокоит.
Я скомпилирую это:
#include <stdio.h>
int main(int argc, char** argv){
printf("Hello World\n");
return 0;
}
с gcc file.c -S -o file.S
это генерирует приятный кусочек кода asm:
.cstring
LC0:
.ascii "Hello World\0"
.text
.globl _main
_main:
LFB3:
pushq %rbp
LCFI0:
movq %rsp, %rbp
LCFI1:
subq $16, %rsp
LCFI2:
movl %edi, -4(%rbp)
movq %rsi, -16(%rbp)
leaq LC0(%rip), %rdi
call _puts
movl $0, %eax
leave
ret
LFE3:
.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support
EH_frame1:
.set L$set$0,LECIE1-LSCIE1
.long L$set$0
LSCIE1:
.long 0x0
.byte 0x1
.ascii "zR\0"
.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$1,LEFDE1-LASFDE1
.long L$set$1
LASFDE1:
.long LASFDE1-EH_frame1
.quad LFB3-.
.set L$set$2,LFE3-LFB3
.quad L$set$2
.byte 0x0
.byte 0x4
.set L$set$3,LCFI0-LFB3
.long L$set$3
.byte 0xe
.byte 0x10
.byte 0x86
.byte 0x2
.byte 0x4
.set L$set$4,LCFI1-LCFI0
.long L$set$4
.byte 0xd
.byte 0x6
.align 3
LEFDE1:
.subsections_via_symbols
Моя следующая проблема на самом деле, как мне скомпилировать этот вывод, и могу ли я сделать GCC для этого?
Ответы
Ответ 1
Да, вы можете использовать gcc для компиляции вашего asm-кода. Используйте -c для компиляции следующим образом:
gcc -c file.S -o file.o
Это даст файл объектного кода с именем file.o.
Чтобы вызвать компоновщик, выполните следующую команду:
gcc file.o -o file
Ответ 2
gcc
может использовать файл сборки как входной сигнал и при необходимости активировать ассемблер. Однако есть тонкость:
- Если имя файла заканчивается на "
.s
" (строчные буквы '), то gcc
вызывает ассемблер.
- Если имя файла заканчивается на "
.s
" (верхний регистр "S" ), то gcc
применяет препроцессор C в исходном файле (то есть он распознает директивы, такие как #if
и заменяет макросы), а затем вызывает ассемблер на результат.
Итак, на общем основании вы хотите сделать что-то вроде этого:
gcc -S file.c -o file.s
gcc -c file.s
Ответ 3
Вы можете вставлять код сборки в обычную C-программу. Здесь хороший введение. Используя соответствующий синтаксис, вы также можете указать GCC, с которым хотите взаимодействовать с переменными, объявленными в C. Программа ниже сообщает gcc, что:
- eax должен быть foo
- ebx должен быть bar
- значение в eax должно храниться в foo после выполнения кода сборки
\ п
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;
}
Ответ 4
Да, gcc также может скомпилировать исходный код сборки. В качестве альтернативы вы можете вызвать as
, который является ассемблером. (gcc - это просто "драйверная" программа, которая использует эвристику для вызова компилятора C, компилятора С++, ассемблера, компоновщика и т.д.)
Ответ 5
Вы можете использовать GAS, который является gcc-ассемблером:
http://linux.die.net/man/1/as
Ответ 6
Если у вас есть файл 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/
Ответ 7
nasm -f bin -o 2_hello 2_hello.asm