7

これは、 GCC を使用して読み取り可能なアセンブリを生成することに近いですか? 、しかし、ここでの私のコンテキストはavr-gcc(それに対応してavr-objdump) Atmel 用です (ただし、GCC ボード全体に適用されると思います)。

問題は、複数の .c および .cpp ファイルのプロジェクトがあることです。最終的に、「マスター」.cpp ファイルと同じ名前の実行可能ファイルにコンパイルされます。このプロセスでは、次の 2 つの方法でアセンブリ リストを取得できます。

  • スイッチを使用して、gccアセンブリ リストのソースを出力するように指示できます( Linux Assembly and Disassembly an Introduction を参照)。-Sこの場合、次のような内容のファイルを取得します。
    ...
    ループ:
      r14を押す
      r15を押す
      r16を押す
      r17を押す
      r28を押す
      r29を押す
    /* プロローグ: 関数/
    /フレーム サイズ = 0 */
      ldi r24、lo8(13)
      ldi r22、lo8(1)
      デジタル書き込みを呼び出す
      rjmp .L2
    .L3:
      ldi r24,lo8(MyObj)
      ldi r25,hi8(MyObj)
      _ZN16MYOBJ7connectEv を呼び出す
    .L2:
      ldi r24,lo8(MyObj)
      ldi r25,hi8(MyObj)
      call _ZN16MYOBJ11isConnectedEv
    ...
    

(まだ試していませんが、このコードはコンパイル可能/ビルド可能だと思います.... )

  • スイッチを使用して、最終的な実行可能ファイルを検査し、objdumpアセンブリ リスト ソースを出力するように指示でき-Sます。この場合、次のような内容のファイルを取得します。
    ...
    0000066a <初期化>:
    ボイド初期化()
    {
            // これは setup() の前に呼び出す必要があります。そうしないと、一部の関数が呼び出されません
            // そこで働く
            sei();
         66a: 78 94 世
         66c: r24 の 83 b7、0x33 ; 51
         66e: 84 60 ori r24、0x04 ; 4
         670: 0x33、r24 から 83 bf ; 51
    ...
    000006be <ループ>:
         6be: ef 92 プッシュ r14
         6c0: ff 92 プッシュ r15
         6c2: 0f 93 プッシュ r16
         6c4: 1f 93 プッシュ r17
         6c6: cf 93 プッシュ r28
         6c8: df 93 プッシュ r29
         6ca: 8d e0 ldi r24, 0x0D ; 13
         6cc: 61 e0 ldi r22、0x01 ; 1
         6ce: 0e 94 23 02 コール 0x446 ; 0x446
         6d2: 04 c0 rjmp .+8 ; 0x6dc
         6d4: 8d ef ldi r24, 0xFD ; 253
         6d6: 94 e0 ldi r25、0x04 ; 4
         6d8: 0e 94 25 06 コール 0xc4a ; 0xc4a <_ZN16MYOBJ7connectEv>
         6dc: 8d ef ldi r24, 0xFD ; 253
         6de: 94 e0 ldi r25, 0x04 ; 4
         6e0: 0e 94 21 06 コール 0xc42 ; 0xc42 <_ZN16MYOBJ11isConnectedEv>
    ...
    

(私はこのコードをビルドしようとしましたが、失敗しました - 「行番号」をラベルとして読み取ります)

明らかに、両方のリスト (loop少なくとも関数については) は同じアセンブリ コードを表しています。を除外する:

  • コンパイルする必要があるものgcc-- コンパイルobjdumpないもの
  • 1objdumpつには、「マスター」以外のファイルで定義できるすべての参照関数のリストが含まれています(例:digitalWrite) -1gccつにはありませ
  • 1objdumpつには、アセンブリが「散在」している元の C/C++ ソース行が含まれています (ただし、たまにしかなく、一見 C ファイルの場合のみですか?) -- gcc1 つには含まれていません。

それで、「コンパイル可能」であるアセンブリリストを取得する方法はありますが、すべてのリンクされた関数があり、ソース C/C++ コードが (おそらく、適切な場合) コメントとして散在しています (干渉しないように)アセンブリ ファイルのコンパイルで)? (の出力用のパーサーを書くことを除いてobjdump、つまり :) )

4

3 に答える 3

1

-fverbose-asmそこにあるgccコマンドラインにオプションを追加します。(これはgccマニュアルにありますが、「Code GenOptions」に記載されています)

于 2011-08-04T18:35:45.977 に答える
1

あなたが話している「依存関係」は、多くの場合、ライブラリまたは個別のオブジェクト ファイルに由来するため、ソースはありません。最終的な実行可能ファイルにバイナリ コードとしてリンクされているだけです。このようなコードはアセンブラを介して渡されないため、別の方法 (objdump など) を使用して抽出する必要があります。

そのような演習だけではあまり意味がないと思うので、本当に達成したいことを教えてください。

于 2011-08-05T10:41:17.793 に答える
1

私が得ることができた最高のものは、-Wa,-ahl=outfile.sの代わりに使用することです-S。ただし、これはコンパイル可能なコードではなく、診断目的のリスト ファイルです。コンパイルされたオブジェクト ファイルは通常どおり出力されます。

于 2011-08-31T20:20:50.747 に答える