2009-04-30 31 views
8

現在の実行可能ファイルがLinux(特定のRHEL)で生成されるオブジェクトファイルを見つける方法はありますか?私はエクスポートされたシンボルを見つけるために "nm"、依存する共有オブジェクトを見つけるために "ldd"を使用できることを理解しています。Linuxの実行可能ファイル内のオブジェクトファイル

しかし、実行可能ファイルが構成されているオブジェクト(.o)ファイルの名前を調べるコマンドが見つかりませんでした。出来ますか?

答えて

6

デバッグ情報yesでコンパイルされている場合。情報を見つけるには、gdb(man gdb)を使用します。

デバッグ情報なしでコンパイルされていない場合。あなたは運がありません。 nullptrに加えて、「共有オブジェクト」は、他の共有ライブラリ(連結)にではなく、元のオブジェクトを指す

1

(リンクされていない)

1

あなたはまた限り実行可能ファイルおよびオブジェクトを用いてコンパイルされたように(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は、あなたが使用していない場合、あなたは)実行ファイルとオブジェクトで完全なデバッグ情報を取得します(ただ、関連する情報を抽出するために使用されます。

4

オブジェクトファイルの元の名前は、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> 
1

オブジェクトファイルは、リンク後の実行可能ファイルに変換します。リンクが共有されている場合は、共有ライブラリ(ldd)で取得できます。しかし、リンクが静的である場合には、デバッグ情報を経由するしか方法はありません。 RHEL(またはそれに関してはFedora)にdebuginfoパッケージをインストールすることができます。ここでの指示、その後

そして、ここで説明したようにgdb info sourcesを使用している:

これはあなたリットルを与えるだろうソースファイルのist。しかし、実際にオブジェクトファイルを取得するには、ビルドツール(rpmbuild)を詳しく調べる必要があります。

は今、あなたは、パッケージ自身を構築することができ、かつ.oファイルがもたらした解剖:そして、実際にはrpmbuildを実行するために、あなたはここに記載された手順を使用して得ることができ、ソースRPMパッケージが必要になります実行可能ファイルに追加します。

私は役立つことを願っています。

関連する問題