2012-01-04 2 views
3

IN LINUX: Не уверен, что это возможно. У меня есть 100 исходных файлов и 100 соответствующих исполняемых файлов. Теперь, учитывая исполняемый файл, можно определить соответствующий исходный файл.Как найти имя исходного файла из исполняемого файла?

+0

Является ли данный факт, что каждый из этих 100 исполняемых файлов исходит из одного файла исходного кода? –

+0

Нет, все из 100 исходных файлов. – Whoami

+2

Ну, тогда вам нужно переформулировать свой вопрос большое время. –

ответ

5

Я думаю, вы можете попробовать.

readelf -s a.out | grep FILE 

Я думаю, вы можете добавить grep и sed магии выше команды и получить имя исходного файла.

+0

Это всего лишь эвристика, хотя (и «строки», как by @mouviciel, являются следующим лучшим после чтения); можно легко разбить или изменить исполняемый файл. –

3

Нет, поскольку ваше предположение о том, что один двоичный файл происходит только из одного исходного файла, является очень ложным.

Большинство реальных приложений состоят из сотен, если не тысяч, отдельных исходных файлов, которые все скомпилированы отдельно, с результатами, которые объединены вместе, чтобы сформировать двоичный файл.

Если у вас есть Непро- stripped двоичных файлов, или (еще лучше) двоичные файлы скомпилированы с debugging information настоящее, то может (или будет, в случае отладки информации) быть информация остается в файл, чтобы позволить вам выяснить имена исходных файлов, но в целом у вас не будет таких двоичных файлов, если вы сами их не создадите.

1

Ваш вопрос имеет смысл только в том случае, если мы предположим, что данный факт состоит в том, что каждый из этих 100 исполняемых файлов поступает из одного исходного файла и что у вас есть все эти исходные файлы и они способны их компилировать.

Что вы можете сделать, это объявить в каждом исходном файле строку, которая выглядит как "HERE!HERE!>>>" + __FILE__, а затем написать служебную программу, которая ищет внутри «исполняемого файла» ЗДЕСЬ! ЗДЕСЬ! >>> »и анализирует строку, которая следует за ней. __FILE__ - это препроцессорная директива, которая расширяется до полного имени файла скомпилированного исходного файла.

+0

Если он сам компилирует исполняемый файл, он может просто включить добавление небольшого количества отладочной информации, которая делает именно это. Вариант GCC -g1 – datenwolf

0

Если исходные имена файлов присутствуют в исполняемый файл, вы можете найти их с помощью:

strings executable | grep '\.c' 

Но имена файлов могут или не могут присутствовать в исполняемом файле, и они могут или не могут представлять исходные имена файлов.

Изменение .c к тому, что расширение, которое вы предполагается, что программа была написана в.

1

Такого рода помощь попадает в «закрыть дверь сарая после того, как лошадь убежала» рода вещи, но это могло бы помочь будущее плакаты.

Это старая проблема. UNIX и Linux поддерживают команду what, которая была изобретена Марком Рочкиндом (если я правильно помню) для его версии SCCS. Обрабатывает именно этот тип проблемы. Он является только 100% надежным для одного исходного файла -> одного объекта exectuable (или объектного файла). Существуют и другие более важные виды использования.

char unique_id[] = "@(#)identification information"; 

@(#) The называется «что строка» и не встречается в качестве побочного продукта компиляции исходного в исполняемый образ. Используйте what из командной строки.Внутри использование кода может быть что-то вроде этого (предполагается, что вы получите только одно имя файла в качестве ответа, поэтому выбрать какие строки тщательно):

char *foo(char *whoami, size_t len_whoami) 
{ 
    char tmp[80]={0x0}; 
    FILE *cmd; 
    sprintf(tmp, "/usr/bin/grep -F -l '%s' /path/to/*.c", unique_id); 
    cmd=popen(tmp, "r"); 
    fgets(whoami, len_whoami, cmd); 
    pclose(cmd); 
    return whoami; 
} 

возвращает имя файла исходного кода с той же what строкой, из которой исполняемых был построен. Другими словами, именно то, что вы просили, за исключением того, что я уверен, что вы никогда не слышали о строках what, поэтому они не существуют в вашей текущей базе кода.

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