現在の実行可能ファイルがLinux(特定のRHEL)で生成されるオブジェクトファイルを見つける方法はありますか?私はエクスポートされたシンボルを見つけるために "nm"、依存する共有オブジェクトを見つけるために "ldd"を使用できることを理解しています。Linuxの実行可能ファイル内のオブジェクトファイル
しかし、実行可能ファイルが構成されているオブジェクト(.o)ファイルの名前を調べるコマンドが見つかりませんでした。出来ますか?
現在の実行可能ファイルがLinux(特定のRHEL)で生成されるオブジェクトファイルを見つける方法はありますか?私はエクスポートされたシンボルを見つけるために "nm"、依存する共有オブジェクトを見つけるために "ldd"を使用できることを理解しています。Linuxの実行可能ファイル内のオブジェクトファイル
しかし、実行可能ファイルが構成されているオブジェクト(.o)ファイルの名前を調べるコマンドが見つかりませんでした。出来ますか?
デバッグ情報yesでコンパイルされている場合。情報を見つけるには、gdb(man gdb)を使用します。
デバッグ情報なしでコンパイルされていない場合。あなたは運がありません。 nullptrに加えて、「共有オブジェクト」は、他の共有ライブラリ(連結)にではなく、元のオブジェクトを指す
(リンクされていない)
あなたはまた限り実行可能ファイルおよびオブジェクトを用いてコンパイルされたように(objdump
を使用することができデバッグ情報):
# gcc -g -c -o /tmp/some_object.o /tmp/some_object.c
# gcc -g -o /tmp/file /tmp/file.c /tmp/some_object.o
# objdump -g /tmp/file | awk 'BEGIN{out=0} /Directory Table/{out=1} /Line Number Statements/{out=0} {if(out){print $0}}'
The Directory Table (offset 0x1b):
1 /tmp
The File Name Table (offset 0x21):
Entry Dir Time Size Name
1 1 0 0 file.c
The Directory Table (offset 0x5a):
1 /tmp
The File Name Table (offset 0x60):
Entry Dir Time Size Name
1 1 0 0 some_object.c
awk
は、あなたが使用していない場合、あなたは)実行ファイルとオブジェクトで完全なデバッグ情報を取得します(ただ、関連する情報を抽出するために使用されます。
オブジェクトファイルの元の名前は、DWARFデバッグ情報には格納されません。
各オブジェクトファイルは、.debug_info
セクションにDW_TAG_compile_unit
というエントリがあります。このエントリには、 "コンパイル単位が派生したプライマリソースファイル "への参照が含まれていますが、オブジェクトファイルの名前は含まれていません。 The DWARF standardには、各コンパイル単位(セクション3.1.1、ページ番号44、pdf 58ページ)ごとに格納できる属性のリストが含まれています。
次のコマンドを使用して、保存された情報を表示することができます。
$ readelf --debug-dump=info --dwarf-depth=1 hw
出力:
Contents of the .debug_info section:
<some compilation units removed>
Compilation Unit @ offset 0x133:
Length: 0x8b (32-bit)
Version: 4
Abbrev Offset: 0x64
Pointer Size: 4
<0><13e>: Abbrev Number: 1 (DW_TAG_compile_unit)
<13f> DW_AT_producer : (indirect string, offset: 0x131): GNU C11 5.3.0 -mtune=generic -march=pentiumpro -g
<143> DW_AT_language : 12 (ANSI C99)
<144> DW_AT_name : (indirect string, offset: 0x163): hw.c
<148> DW_AT_comp_dir : (indirect string, offset: 0x168): /home/mikel/src/hw
<14c> DW_AT_low_pc : 0x80483db
<150> DW_AT_high_pc : 0x2e
<154> DW_AT_stmt_list : 0xea
<1><158>: ...
<some compilation units removed>
オブジェクトファイルは、リンク後の実行可能ファイルに変換します。リンクが共有されている場合は、共有ライブラリ(ldd
)で取得できます。しかし、リンクが静的である場合には、デバッグ情報を経由するしか方法はありません。 RHEL(またはそれに関してはFedora)にdebuginfoパッケージをインストールすることができます。ここでの指示、その後
そして、ここで説明したようにgdb info sources
を使用している:
これはあなたリットルを与えるだろうソースファイルのist。しかし、実際にオブジェクトファイルを取得するには、ビルドツール(rpmbuild
)を詳しく調べる必要があります。
は今、あなたは、パッケージ自身を構築することができ、かつ.o
ファイルがもたらした解剖:そして、実際にはrpmbuildを実行するために、あなたはここに記載された手順を使用して得ることができ、ソースRPMパッケージが必要になります実行可能ファイルに追加します。
私は役立つことを願っています。