大家好我从他们各自的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
我不确定是否可以从可执行文件中获取目标文件(在本例中为main)。如果是这样的话?
答案 0 :(得分: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
,因此您也可以只替换扩展名并获取目标文件名。
答案 1 :(得分:1)
这是不可能的。目标文件的名称是任意的,您可以将它们命名为a.o
,b.o
和c.o
,结果不会有所不同。
由于链接器会丢弃多个目标文件中存在的某些信息(例如内联函数),因此无法确定不同目标文件的所有原始内容。