我正在编写一个脚本,用于提取二进制文件中的所有函数(由用户编写)。
以下 shell 脚本提取我的函数名称以及一些以以下开头的库函数__
.
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
我只想提取我的功能。那么如何检查函数名是否以__
或者任何其他替代方案也受到高度赞赏。
Update::
@djf 解决方案工作正常。如果什么.c
编译的文件还可能包含一个以以下开头的函数__
?既然如此,该如何区分呢?
使用怎么样readelf
在您的目标文件而不是链接的可执行文件上?这样就不会出现来自库函数的垃圾邮件。
使用-c
标志编译为目标文件并且不立即链接。
PS:从可执行文件或目标文件中提取名称的正确工具是nm
, not readelf
. Using 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}'
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)