Извлечение только имен моих функций из двоичного файла 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;
  }
}'

Труба это через grep ^[^_], [30 знаков]

Другие вопросы по тегам