Найти вызов функции в списке двоичных файлов - PullRequest
4 голосов
/ 12 апреля 2010

У меня есть список исполняемых файлов, которые могут вызывать определенную функцию. Мне нужно выяснить, какие все исполнительные органы вызывают эту функцию. Я знаю, что могу сделать «строки -a», но есть ли какой-то другой лучший способ выяснить это. Полный код написан на C.

Ответы [ 3 ]

4 голосов
/ 12 апреля 2010

Вы можете использовать утилиту nm в сочетании с grep , чтобы найти, какие исполняемые файлы ссылаются на символ, например:

nm <i>name_of_executable</i> | grep <i>symbol</i>

Так, например, если бы у меня был список исполняемых файлов, которые могли бы использовать «strcat», я мог бы проверить это с помощью:

for file in exectuble1 executable2 ... executableN; do
    references_to_strcat=`nm "$file" | grep strcat -c`
    if [ $references_to_strcat -ne 0 ] ; then
       echo "$file"
    fi
done

Небольшой цикл выше (при условии, что BASH) выведет список всех файлов, ссылающихся на "strcat". Обратите внимание, что это только скажет вам, какой исполняемый файл действительно связан с символом ... я не знаю, как определить, какие исполняемые файлы могут ссылаться на функцию с использованием динамической загрузки (например, dlopen / dlsym) / dlcose ).

Обратите внимание, что если у вас есть исходный код, а не только исполняемые файлы, вы можете использовать Doxygen для генерации полного графа вызовов (в дополнение к документации) для вашего исходного кода, так что это еще одна возможность .

1 голос
/ 13 апреля 2010

strace и ltrace также могут быть полезны.

0 голосов
/ 12 апреля 2010

В качестве варианта ответа Майкла Аарона Сафяна вы можете использовать objdump -d для создания списка ассемблера для файла. Затем вы можете grep -wn определить номера строк в списке сборки, где происходит требуемый вызов функции. Когда у вас есть номера строк, вы можете просмотреть свой список и определить функцию / процедуру, в которой они вызываются / используются, и как они используются (вызывается, разветвляется, помещается в стек, ...).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...