我正在编写一个脚本,用于在二进制文件中提取所有函数(由用户编写)。
以下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
我想只提取我的功能。那么如何检查函数名称是否以__开头,否则任何其他替代品也会高度评价。
更新::
@djf解决方案工作正常。如果编译的.c
文件也可能包含以__
开头的函数,该怎么办?在那种情况下,如何区分?
答案 0 :(得分:7)
如何在目标文件上使用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}'
答案 1 :(得分:5)
您可以添加regex检查以确保函数名称以字母开头。
我认为$ 8包含函数名称:
readelf -s ./a.out | gawk '
{
if($4 == "FUNC" && $3 != "0" && $7 == "13" && $8 != "main" && $8~/^[[:alpha:]]/) {
print $NF;
}
}'
答案 2 :(得分:1)
通过grep ^[^_]
管道。 [30 char]