source

GCC에서 생성된 asm은 어떻게 컴파일합니까?

goodcode 2022. 8. 31. 22:42
반응형

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를 사용할 수 있습니다.

http://linux.die.net/man/1/as

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

반응형