2016-02-29 4 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.o, b.o и c.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, вы также можете просто заменить расширения и получить имена файлов объектов.

Смежные вопросы