如何从可执行文件中获取目标文件名

时间:2016-02-29 13:23:18

标签: c++

大家好我从他们各自的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)。如果是这样的话?

2 个答案:

答案 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.ob.oc.o,结果不会有所不同。

由于链接器会丢弃多个目标文件中存在的某些信息(例如内联函数),因此无法确定不同目标文件的所有原始内容。