Опитвам се да анализирам 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