2013-02-10 2 views
1

gcc로 실행 파일을 만들려고합니다. 두 개의 파일 virtualstack.c (아래 C 코드로 구성)와 stack32는 AT & T 문법 (C 코드 아래 참조)으로 작성된 Intel x86 어셈블리 코드로 구성됩니다. 내 명령 줄 명령은 gcc -c virtualstack.c -s stack.s이지만 두 줄의 오류가 발생합니다 (스택 3의 3 행) - missing symbol name in directiveno such instruction _stack_create. 어셈블리의 접두어가 밑줄 (_) 인 C에서 함수를 올바르게 선언했다고 생각했습니다. 나는 어떤 의견이라도 매우 감사 할 것이다.gcc 컴파일 및 어셈블

C 코드 :

#include <stdio.h> 
#include <stdlib.h> 

extern void stack_create(void); 

int main(void) 
{ 
stack_create(); 

return 0; 
} 

어셈블리 코드 : 나는 어떻게 이러한 경우를 조사하는 방법을 설명하려고합니다

.global _stack_create 
    .type, @function 

_stack_create 
pushl %ebp 
movl $5, %esp 
movl %esp, ebp 
movl $21, %edx 
pushl %edx 
+1

두 번째'_stack_create' 다음에 콜론이 필요합니다. '.type '이있는 줄이 맞는지는 모르지만 필요하지는 않습니다. Btw, 5를 esp로 옮기면 문제가 생깁니다. –

+0

@alexey frunze. 고마워 :) 이제 나는 결장에 대해 어리 석다. 나는 그걸 보았어 야했다. .type이 없으면 컴파일됩니다. 나는 아직도 그것이 실행 가능한지 볼 필요가있다. 또한 esp 경고에 감사드립니다. – stian

+0

잘. .type, @function을 제거했습니다. 나는 gcc가 개별 objectfile을 생성한다는 것을 발견했다. 대신 gcc -o와 virtualstack.c -s stack.s를 쓰려고했습니다. 나는 그것이 대결 파일 (실행 파일)을 만들어야한다고 믿었다. 그럼 내가 main()에서 stack_create에 대한 정의되지 않은 참조를 얻을 - 어떤 아이디어가있어? – stian

답변

2

.

1) 컴파일러를 작동시키는 것이 항상 좋은 생각입니다. 그래서 코드를 시작할 수 있습니다 (그것을 assemble.c 호출 할 수 있습니다) :

#include <stdio.h> 
    #include <stdlib.h> 

    /* stub stuff */ 
    void __attribute__ ((noinline)) 
    stack_create(void) { } 

    int 
    main(void) 
    { 
     stack_create(); 
     return 0; 
    } 

지금 gcc -S -g0 assemble.c와 어셈블러를 컴파일합니다. stack_create 기능 (결과는 그렇게 자신이 내 지시를 따르십시오 다를 수 있습니다)에 조립했다 :

.text 
    .globl stack_create 
    .type stack_create, @function 
stack_create: 
    pushq %rbp 
    movq %rsp, %rbp 

    ;; Go and put your favorite stuff here! 
    pushl %ebp 
    movl $5, %esp 
    movl %esp, ebp 
    movl $21, %edx 
    pushl %edx 
    ... etc ... 

    popq %rbp 
    ret 
    .size stack_create, .-stack_create 
:

.text 
    .globl stack_create 
    .type stack_create, @function 
stack_create: 
    pushq %rbp 
    movq %rsp, %rbp 
    popq %rbp 
    ret 
    .size stack_create, .-stack_create 

2) 지금 당신이 필요로하는 모든이 템플릿을하고 물건을 채우는 것입니다

물론 파일을 .s 개로 분리하십시오. 예를 들어 stack.s.

3) 이제 컴파일을 모두 허용합니다. assemble.c에서 스텁 내용을 제거하고 다음을 모두 컴파일합니다.

gcc assemble.c stack.s 

오류가 발생하지 않았습니다. 나는 너에게 아무 오류도 없을 것이라고 믿는다.

주된 교훈 : 섹션, 함수 레이블 등과 같은 세부 사항으로 어셈블러에서 작성하려고하지 마십시오. 컴파일러는이를 수행하는 방법을 더 잘 알고 있습니다. 대신 그의 지식을 사용하십시오.