Извлечение только имен моих функций из двоичного файла ELF
Я пишу скрипт для извлечения всех функций (написанных пользователем) в двоичном виде.
Следующий скрипт оболочки извлекает имена моих функций, а также некоторые библиотечные функции, которые начинаются с __
readelf -s ./a.out | gawk '
{
if($4 == "FUNC" && $3 != "0" && $7 == "13" && $8 != "main") {
print "b " $NF; //***Updated
}
}' &> function_names;
Вывод файла function_names:
b __libc_csu_fini
b PrintDivider
b PrintFooter
b __libc_csu_init
b PrintHeader
Я хотел бы извлечь только мою функцию. так как проверить, начинается ли имя функции с __ или какие-либо другие альтернативы, также высоко оцененные.
Обновить::
Решение @djf работает отлично. Что, если .c
файлы, которые скомпилированы, также могут содержать функцию, которая начинается с __
? В таком случае, как дифференцировать?
3 ответа
Как насчет использования readelf
на вашем объектном файле (ах) вместо связанного исполняемого файла? Тогда нет спама из библиотечных функций. Использовать -c
флаг для компиляции в объектный файл и немедленной ссылки.
PS: правильный инструмент для извлечения имен из исполняемого или объектного файла nm
не readelf
, С помощью nm -P file
есть все, что вы хотите.
$ nm -P tst.o | awk '$2 == "T" {print "b " $1}'
b foo
b main
РЕДАКТИРОВАТЬ: игнорировать main
и символы, начинающиеся с подчеркивания, используйте
$ nm -P a.out | awk '$2 == "T" && $1 !~ /^_/ && $1 != "main" {print "b " $1}'
Вы можете добавить проверку регулярных выражений, чтобы убедиться, что имя функции начинается с буквы.
Я предполагаю, что $8 содержит имя функции:
readelf -s ./a.out | gawk '
{
if($4 == "FUNC" && $3 != "0" && $7 == "13" && $8 != "main" && $8~/^[[:alpha:]]/) {
print $NF;
}
}'