既存の実行ファイルがありますが、少量のソースコードがありません。具体的には、実行可能ファイルは静的ライブラリの一部の機能を使用し、そのライブラリのソースコードは失われます。以前のバージョンのライブラリコードはありますが、実行可能ファイルは以前のバージョンにはない3〜4つのメソッドを使用します。欠落している関数のプロトタイプを含む新しいバージョンのコードのヘッダーファイルがありますが、実際の.c
関数定義を含むファイルはありません。
実行可能ファイルが静的にリンクされているので、静的ライブラリからオブジェクトコードを抽出して再構築する方法があるかどうかを知りたいです。を使用nm
して必要なシンボルを見つけることができますが、これらのobjdump
関数を抽出してオブジェクトファイルまたは静的ライブラリに再パッケージする方法があるかどうかわかりません。
たとえば、次のようになります。
$ nm ./theApplication
<a bunch of stuff>
001721dc T _missingFunction1
<more stuff>
00171ed8 T _missingFunction2
<more stuff>
$ objdump --disassemble-all ./theApplication
<a bunch of stuff>
00171ed8 <_missingFunction2>:
171ed8: 1a e5 f8 14 P2 = [P3 + 0x53e0];
<more stuff>
001721dc <_missingFunction1>:
1721dc: c5 04 [--SP] = (P5:5);
<more stuff>
missingFunction1()
他の実行可能ファイルにリンクできるように、これをmissingFunction2()
静的ライブラリまたはオブジェクトファイルにドラッグしたいと思います。可能ですか?それでは、どうすればいいですか?
答え1
スキャンしている実行可能ファイルがDEBUGを有効にして構築されている場合は、コンパイルに使用されたソースファイルとヘッダーファイルについて詳しく説明する広範な情報を見つけることができます。これには、ファイルが起動されたディレクトリの場所、元のコンパイルコマンド(すべてのパラメータを含む)、および多くの情報が含まれます。 、objdump
いくつかのオプションを使用して...
編集情報
objdump -Ws --dwarf=info --dwarf-depth=1 <EXE_FILE>
このコマンドは DWARF 形式で出力を生成します。それが何を意味するのか心配しないでください。DW_TAG_compile_unit
出力からタグを検索すると、ソースファイル、コンパイルコマンド、および調査に役立つ多くの情報を表示するこのような多くのインスタンスを見つけることができます。 。
<526a1>: Abbrev Number: 1 (DW_TAG_compile_unit)
<526a2> DW_AT_name : calculate_tax_rate.c
<526ad> DW_AT_language : 12 (ANSI C99)
<526ae> DW_AT_comp_dir : /opt/src/modules/calc/
<526d2> Unknown AT value: 2205: /opt/gnu/bin/cc -V -m64 -I/opt/hdr/include -L/opt/sqlserver/lib -L/opt/DBG/bin/utils -xc99=all -m64 -c -o MESG_UTIL.o MESG_UTIL.c
<52813> Unknown AT value: 2207: Xa;R=HPUX C 3.11 HPUXOS 2004/06/02;
ディレクトリ情報
objdump -Wl --dwarf=info --dwarf-depth=1 <EXE_FILE>
このコマンドは、ソースファイルとヘッダーファイルに関する目次情報を詳細に説明し、The Directory Table
出力からタグを取得します。
The Directory Table:
/opt/src/modules/calc/
/usr/include
The File Name Table:
Entry Dir Time Size Name
1 1 0 0 calc.c
2 1 0 0 debug.h
3 2 0 0 calc_math.h
4 2 0 0 calc_math.c
ソースコードライン#をアセンブリガイドラインと混合する
このコマンドは.text(コード)セクションを分解し、ソースコード行番号を対応するアセンブリガイドラインに関連付けます。本当に難しいことですが、あなたはできるすべてのソースファイルのすべての行をリバースエンジニアリングして、元のソース動作を技術的に再現します。はい、これは面白いプロジェクトです:-)。それがあなたに役立つことを願っています
objdump -Ddlw --section=.text <EXE_FILE>
/home/projects/src/modules/calc/calc.c:476
1000364f0: e0 5f a7 af ldx [ %fp + 0x7af ], %l0
1000364f4: e0 77 a7 df stx %l0, [ %fp + 0x7df ]
/home/projects/src/modules/calc/calc.c:477
1000364f8: e0 5f a7 b7 ldx [ %fp + 0x7b7 ], %l0
1000364fc: e0 77 a7 d7 stx %l0, [ %fp + 0x7d7 ]
/home/projects/src/modules/findrates.c:4434
100036500: e8 5f a7 df ldx [ %fp + 0x7df ], %l4
100036504: e2 5f a7 c7 ldx [ %fp + 0x7c7 ], %l1
100036508: e0 57 a7 eb ldsh [ %fp + 0x7eb ], %l0
10003650c: a7 2c 30 03 sllx %l0, 3, %l3
100036510: e8 74 40 13 stx %l4, [ %l1 + %l3 ]
/home/projects/src/modules/calc_encrypt.c:480
100036514: e8 5f a7 d7 ldx [ %fp + 0x7d7 ], %l4
100036518: e2 5f a7 c7 ldx [ %fp + 0x7c7 ], %l1