在 Linux 下,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_]*$'
nm ./a.out
或
objdump -t ./a.out
你会看到:
0000000000401136 T main
0000000000401150 T foo
T 表示在文本段(函数)。
nm ./a.out
会看到:
_Z3fooi
用 c++filt 还原:
nm ./a.out | c++filt
或:
strings ./a.out | c++filt
nm -D ./a.out
或
objdump -T ./a.out
strings 只能看到:
printf, malloc)strings ./a.out | grep -i func
objdump -d ./a.out | less
你会看到:
0000000000401136 <main>:
这里的 <main> 就是函数名(如果没被 strip)。
| 目标 | 推荐命令 |
|---|---|
| 看符号函数名 | nm / objdump -t |
| C++ 函数名 | `nm |
| 粗略看字符串 | strings |
| 已 strip | strings + objdump -d |
| 动态函数 | nm -D |
如果你愿意,可以告诉我:
我可以给你更精确的命令。