1

gccで実行可能ファイルを作成しようとしています。2つのファイルvirtualstack.c(以下のCコードで構成されています)と、AT&T構文で記述されたIntel x86アセンブリコード(Cコードの下に表示)で構成されているstack.sがあります。私のコマンドラインコマンドはですがgcc -c virtualstack.c -s stack.s、2つのエラーが発生します(stack.sの3行目)-missing symbol name in directiveno such instruction _stack_create。アンダースコア()が前に付いたアセンブリでCから関数を正しく宣言したと思いました_。コメントをいただければ幸いです。

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
4

1 に答える 1

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
  popq  %rbp
  ret
  .size stack_create, .-stack_create

2)必要なのは、このテンプレートを取得して、自分のもので埋めることだけです。

  .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

そしてもちろん、それを別の.sファイル、たとえばstack.sにします。

3)一緒にコンパイルしましょう。assemble.cからスタブのものを削除し、すべてを次のようにコンパイルします。

gcc assemble.c stack.s

エラーは発生しませんでした。エラーも発生しないと思います。

主な教訓:セクションや関数ラベルなどの詳細をアセンブラに書き込もうとしないでください。コンパイラはその方法をよく知っています。代わりに彼の知識を使用してください。

于 2013-02-10T12:55:55.420 に答える