Я пытаюсь разобрать файл ELF и создать список символов, определенных в каждом объектном файле.
Вы обрабатываете отдельные объектные файлы ELF или полностью связанный исполняемый файл или общую библиотеку? Поскольку ваш вопрос имеет смысл только во втором случае, давайте предположим, что ваш фактический вопрос таков:
Учитывая полностью связанный a.out
, который определяет символ foo
, как я могу определить, из какого объектного файла было взято это определение, не связывая a.out
повторно?.
В общем, нельзя.
Во-первых, не каждый символ, определенный в a.out
, может даже исходить из объектного файла: некоторые из них могут быть определены с помощью скрипта компоновщика или аргумента командной строки --defsym
.
Во-вторых, слабые символы могут быть определены в нескольких объектных файлах, и компоновщик может выбрать любой из них.
Наконец, в файле a.out
нет абсолютно никакой записи об ассоциации объектного файла -> символа. На самом деле, вы даже не можете извлечь список .o
файлов, которые были связаны (без повторной ссылки и запроса компоновщика напечатать их).
Вы можете восстановить эту связь, взглянув на отладочную информацию, в которой будет указано, из какой единицы перевода был получен символ, а затем предположите, что вероятно foo.c
был скомпилирован в foo.o
, но это снова может привести к ошибке, так как foo.c
может быть скомпилирован в bar.o
и baz.o
(с разными определениями -DFOO
).
person
Employed Russian
schedule
27.07.2019
nm object_file.o
иnm -D stripped_shared_object.so
илиnm -D stripped_binary
вам не сказали? - person mosvy   schedule 26.07.2019