温馨提示×

如何用linux strings看函数名

小樊
47
2026-10-11 08:39:57
栏目: 智能运维

在 Linux 下,strings 命令本身不能直接区分“函数名”,因为它只是从二进制文件中提取可打印的字符串。不过,函数名(尤其是符号名)通常会出现在二进制里,所以可以用 strings 配合一些技巧来“看函数名”。

下面按常见场景说明。


一、直接用 strings 看“像函数名”的字符串

strings ./a.out

如果你看到类似:

main
foo
bar
printf
strlen

这些就可能是函数名(也可能是普通字符串)。

过滤更像函数名的(带括号或下划线)

strings ./a.out | grep '('

或(C/C++ 常见):

strings ./a.out | grep -E '^[a-zA-Z_][a-zA-Z0-9_]*$'

二、重点:函数名在符号表里(更正确方式)

1️⃣ C 语言(有符号)

nm ./a.out

或

objdump -t ./a.out

你会看到:

0000000000401136 T main
0000000000401150 T foo

T 表示在文本段(函数)。


2️⃣ C++(函数名被 mangled)

nm ./a.out

会看到:

_Z3fooi

用 c++filt 还原:

nm ./a.out | c++filt

或:

strings ./a.out | c++filt

三、如果程序被 strip(没有符号)

情况 1:动态符号还在

nm -D ./a.out

或

objdump -T ./a.out

情况 2:完全 strip

strings 只能看到:

  • 动态库函数名(printf, malloc)
  • 错误信息里的函数名
  • 日志/调试字符串
strings ./a.out | grep -i func

四、结合 strings + objdump(反汇编辅助)

objdump -d ./a.out | less

你会看到:

0000000000401136 <main>:

这里的 <main> 就是函数名(如果没被 strip)。


五、总结建议

目标 推荐命令
看符号函数名 nm / objdump -t
C++ 函数名 `nm
粗略看字符串 strings
已 strip strings + objdump -d
动态函数 nm -D

如果你愿意,可以告诉我:

  • 是 C 还是 C++
  • 是 可执行文件 / .so / 内核模块
  • 是否被 strip

我可以给你更精确的命令。

0 踩