2009-04-30 52 views
8

有沒有辦法找到Linux中生成當前可執行文件的目標文件(RHEL是特定的)。我明白,可以使用「nm」來查找導出的符號,「ldd」來查找依賴的共享對象。Linux中可執行文件中的目標文件

但我無法找到命令來找出可執行文件所組成的對象(.o)文件的名稱。可能嗎?

回答

6

如果已經使用調試信息編譯了yes。使用gdb(man gdb)來查找信息。

如果它沒有編譯沒有調試信息。你運氣不好。

1

除了nullptr,「共享對象」是指其他共享庫(鏈接),而不是原來的對象(不鏈接)

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

這將給你A L源文件。但要實際獲取目標文件,您需要深入瞭解構建工具(rpmbuild)。而實際運行的rpmbuild你需要源RPM軟件包,您可以獲取使用此處列出的說明:

現在可以構建軟件包自己,並剖析其.o文件導致進入可執行文件。

我希望有幫助。

相關問題