GCC에서 생성된 asm은 어떻게 컴파일합니까?
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에 의뢰할 수 있는가 하는 것입니다.
네, gcc를 사용하여 asm 코드를 컴파일할 수 있습니다.다음과 같은 컴파일에는 -c를 사용합니다.
gcc -c file.S -o file.o
그러면 file.o라는 오브젝트 코드 파일이 생성됩니다.위의 명령어 뒤에 링커를 호출하려면 다음 명령을 수행합니다.
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
조립 코드는 일반 C 프로그램에 삽입할 수 있습니다.여기 좋은 소개가 있습니다.적절한 구문을 사용하여 C에서 선언된 변수와 대화할 것을 GCC에 지시할 수도 있습니다.다음 프로그램은 gcc에 다음과 같이 지시합니다.
- eax는 foo여야 한다.
- ebx는 bar여야 한다.
- 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++ 컴파일러, 어셈블러, 링커 등을 호출하는 "드라이버" 프로그램입니다).
GCC의 백엔드 어셈블러인 GAS를 사용할 수 있습니다.
main.s 파일이 있는 경우.오브젝트 파일을 생성할 수 있습니다.GCC그리고 또as
# gcc -c main.s
# as main.s -o main.o
이 링크를 체크해 주세요.GCC의 바이너리 http://www.thegeekstuff.com/2017/01/gnu-binutils-commands/ 를 학습하는 데 도움이 됩니다.
nasm -f bin -o 2_hello 2_hello.asm
언급URL : https://stackoverflow.com/questions/7190050/how-do-i-compile-the-asm-generated-by-gcc
'source' 카테고리의 다른 글
| 이 =! 교환원은 무엇입니까? (0) | 2022.08.31 |
|---|---|
| Gradle 인수에 대한 메서드 컴파일()을 찾을 수 없습니다. (0) | 2022.08.31 |
| vue cli - 수집되지 않은 구문 오류:예기치 않은 토큰 < (0) | 2022.08.31 |
| 목록/어레이 목록 정렬 방법 (0) | 2022.08.31 |
| JPA에서 발행한SQL 쿼리를 표시하는 방법 (0) | 2022.08.31 |