2016-02-29 62 views
1

嗨,我從各自的cpp文件創建了目標文件,然後將 作爲一個通用的可執行文件來執行程序。如何從一個可執行文件中獲取目標文件名

g++ -Wall -g -c main.cpp -o main.o 
    g++ -Wall -g -c pts.cpp -o pts.o 
    g++ -Wall -g -c rts.cpp -o rts.o 

    g++ -o main main.o rts.o pts.o 

我不知道這有可能得到的可執行文件(在這種情況下主)的目標文件。如果是又如何?

+0

你想反編譯一個可執行文件嗎? – NathanOliver

+0

no @NathanOliver我的意圖是隻知道負責可執行文件的目標文件。 – Bam

回答

1

這是不可能的。目標文件的名稱是任意的,您可以將它們命名爲a.ob.oc.o,結果不會有所不同。

由於鏈接器丟棄了一個以上目標文件中存在的一些信息(例如內聯函數),因此不可能確定不同目標文件的所有原始內容。

+2

-g將調試數據添加到肯定記錄翻譯單元相關元數據的ELF二進制文件。 –

+0

@SamVarshavchik謝謝,錯過了'-g',更新了我的答案。 –

+0

但我們能找到可執行文件的依賴文件嗎? – Bam

2

由於您使用-g標誌進行編譯,因此可以使用任何DWARF閱讀實用程序來查看有關編譯單元的信息。例如,你可以使用:

`dwarfdump -r main` 

輸出示例:

.debug_aranges 

COMPILE_UNIT<header overall offset = 0x00000000>: 
< 0><0x0000000b> DW_TAG_compile_unit 
        DW_AT_producer    "GNU C++ 4.9.2 -mtune=generic -march=x86-64 -g -std=c++11" 
        DW_AT_language    DW_LANG_C_plus_plus 
        DW_AT_name     "main.cc" 
        DW_AT_comp_dir    "/home/yam/tmp/bla" 
        DW_AT_low_pc    0x004006b6 
        DW_AT_high_pc    <offset-from-lowpc>93 
        DW_AT_stmt_list    0x00000000 


arange starts at 0x004006b6, length of 0x0000005d, cu_die_offset = 0x0000000b 
arange end 
COMPILE_UNIT<header overall offset = 0x00002a66>: 
< 0><0x0000000b> DW_TAG_compile_unit 
        DW_AT_producer    "GNU C++ 4.9.2 -mtune=generic -march=x86-64 -g -std=c++11" 
        DW_AT_language    DW_LANG_C_plus_plus 
        DW_AT_name     "test.cc" 
        DW_AT_comp_dir    "/home/yam/tmp/bla" 
        DW_AT_low_pc    0x00400713 
        DW_AT_high_pc    <offset-from-lowpc>11 
        DW_AT_stmt_list    0x00000365 

你也可以做一些簡單的解析:

dwarfdump -r main | \ 
    grep 'AT_name\|AT_comp_dir' | \ 
    tac | sed -r 's/.*"(.*)"/\1/' | \ 
    ruby -e 'STDIN.readlines.map(&:strip).each_slice(2) { |s| puts File.join(*s) }' 

,輸出

/home/yam/tmp/bla/test.cc 
/home/yam/tmp/bla/main.cc 

由於您的安裝編譯X.cpp改爲X.o,你也可以直接替換擴展名並獲取對象文件名。