24

テスト プラットフォームは 32 ビット Linux です。

基本的に、gcc を使用して Intel スタイルと At&T スタイルの両方のアセンブリ コードを生成できることはわかっていますが、nasm/tasm を直接使用して、gcc が生成した Intel スタイルのアセンブリ コードをコンパイルすることはできないようです。

私は Windows と Linux プラットフォームの両方で asm コードのプロジェクト分析を行っているので、nasm\yasm のようなプラットフォームに依存しないアセンブラーで両方をコンパイルできれば、はるかに簡単な時間を持つことができると考えています...

私の質問は、Linux で c ソース コードから nasm コンパイル可能なアセンブリ コードを生成する方法ですか?

4

3 に答える 3

37

gcc によって生成されたアセンブリ コードを使用するよりも、オブジェクト ファイルを逆アセンブルする方が良い方法だと思います。

  1. まず、ソース コードからオブジェクト ファイルを生成します。

    gcc -fno-asynchronous-unwind-tables -O2 -s -c -o main.o main.c
    

    -fno-asynchronous-unwind-tables: のような不要なセクションを生成しないでください .eh_frame

    -O2asmがひどくならないように最適化します。必要に応じて-Os(速度よりもサイズ) または-O3(自動ベクトル化を含む完全な最適化) を使用します。また、CPU を調整して、 -march=nativeまたは-march=haswellまたは-march=znver1(Zen)でサポートされている拡張機能を使用することもできます。

    -s: 実行可能ファイルを小さくします (ストリップ)

    -c -o main.o: コンパイルしますが、リンクはしません。オブジェクト ファイルを生成します。main.o

  2. objconvを使用してコードを生成しnasmます。

    objconv -fnasm main.o
    

    結果は に格納されmain.asmます。

  3. 結果は Nasm 構文に非常に近くなります。ただし、警告/エラーを排除するために、いくつかの微調整が必​​要になる場合があります。Nasmでコンパイルしてみてください

    nasm -f elf32 main.asm
    

    エラー/警告を手動で修正します。例えば:

    • align=Nand execute/のnoexecute単語を行から削除し.SECTIONます。
    • 宣言: functionからテキストを削除するglobal
    • default rel線を取り除く
    • 必要に応じて空のセクションを削除するなど
  4. main.ogcc を使用して、手順 3 で Nasm によって生成された結果をリンクします。

    gcc main.o
    

    ld を使用してリンクすることもできますが、はるかに困難です。

于 2013-12-23T11:59:54.767 に答える
10

あなたが怠け者なら: https://github.com/diogovk/c2nasm

Babken Vardanyan の提案を自動的に実行するスクリプトがあります。

于 2014-09-08T18:50:18.113 に答える