首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >只从ELF二进制文件中提取函数名

只从ELF二进制文件中提取函数名
EN

Stack Overflow用户
提问于 2013-07-05 10:47:57
回答 3查看 7.4K关注 0票数 4

我正在编写一个脚本,用于提取二进制文件中的所有函数(由用户编写)。

下面的shell脚本提取我的函数名以及一些以__开头的库函数

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

function_names文件的输出:

代码语言:javascript
复制
b __libc_csu_fini
b PrintDivider    
b PrintFooter    
b __libc_csu_init    
b PrintHeader

我只想提取我的功能。因此,如何检查函数名是否以__开头,或者其他任何其他选项也是非常有用的。

更新::

@djf解决方案运行良好。如果编译的.c文件也可能包含以__开头的函数,该怎么办?在这种情况下,如何区分?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-07-05 11:14:12

在您的对象文件上使用readelf而不是链接的可执行文件如何?那么就没有来自库函数的垃圾邮件了。使用-c标志编译到对象文件,而不是立即链接。

PS:从可执行文件或对象文件中提取名称的正确工具是nm,而不是readelf。使用nm -P file可以得到你想要的任何东西。

代码语言:javascript
复制
$ nm -P tst.o | awk '$2 == "T" {print "b " $1}'
b foo
b main

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

代码语言:javascript
复制
$ nm -P a.out | awk '$2 == "T" && $1 !~ /^_/ && $1 != "main" {print "b " $1}'
票数 9
EN

Stack Overflow用户

发布于 2013-07-05 11:09:49

您可以添加一个regex检查,以确保函数名以字母开头。

我假定$8包含函数名:

代码语言:javascript
复制
readelf -s ./a.out | gawk '
{
  if($4 == "FUNC" && $3 != "0" && $7 == "13" && $8 != "main" && $8~/^[[:alpha:]]/) {
    print $NF;
  }
}'
票数 5
EN

Stack Overflow用户

发布于 2013-07-05 10:51:33

用管道通过grep ^[^_]。30焦炭

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17487089

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档