shell 从ELF二进制文件中只提取我的函数名

pu82cl6c  于 2023-02-09  发布在  Shell
关注(0)|答案(3)|浏览(172)

我正在写一个脚本,用于提取二进制文件中的所有函数(由用户编写)。
下面的shell脚本提取了我的函数名以及一些以__开头的库函数。

readelf -s ./a.out | gawk '
{ 
  if ($4 == "FUNC" && $3 != "0" && $7 == "13" && $8 != "main") { 
    print "b " $NF; //***Updated
  } 
}' &> function_names;

函数名称文件的输出:

b __libc_csu_fini
b PrintDivider    
b PrintFooter    
b __libc_csu_init    
b PrintHeader

我想只提取我的函数。所以如何检查函数名是否以__开头或其他任何替代也非常赞赏。

更新日期:

@djf解决方案可以,如果编译的.c文件中也可能包含以__开头的函数,那么如何区分呢?

af7jpaap

af7jpaap1#

在你的目标文件上使用readelf而不是链接的可执行文件怎么样?这样就不会有来自库函数的垃圾信息。使用-c标志编译到一个目标文件,而不是立即链接。
PS:从可执行文件或目标文件中提取名称的合适工具是nm,而不是readelf。使用nm -P file拥有你想要的一切。

$ nm -P tst.o | awk '$2 == "T" {print "b " $1}'
b foo
b main

EDIT:要忽略main和以下划线开头的符号,请使用

$ nm -P a.out | awk '$2 == "T" && $1 !~ /^_/ && $1 != "main" {print "b " $1}'
ykejflvf

ykejflvf2#

您可以添加正则表达式检查,以确保函数名以字母开头。
我假设$8包含函数名:

readelf -s ./a.out | gawk '
{
  if($4 == "FUNC" && $3 != "0" && $7 == "13" && $8 != "main" && $8~/^[[:alpha:]]/) {
    print $NF;
  }
}'
w8f9ii69

w8f9ii693#

通过grep ^[^_]传输。[30个字符]

相关问题