有沒有辦法找到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
:
這將給你A L源文件。但要實際獲取目標文件,您需要深入瞭解構建工具(rpmbuild
)。而實際運行的rpmbuild你需要源RPM軟件包,您可以獲取使用此處列出的說明:
現在可以構建軟件包自己,並剖析其.o
文件導致進入可執行文件。
我希望有幫助。