在/usr/lib递归查找库文件中函数/结构体的命令问题
正确递归查找/usr/lib下.a库中特定函数/结构体的命令
你的命令顺序完全搞反啦!管道是把前一个命令的输出作为后一个的输入,你现在先跑了nm -A(没指定文件的话它会等着读标准输入),再用find找文件,这根本没法正确工作。
给你几个正确的实现方式,按需选用:
最基础的写法(逐个处理文件)
find /usr/lib -name "*.a" -exec nm -A {} \; | grep "FunctionThatIWantFound"
各部分解释:
find /usr/lib -name "*.a":递归遍历/usr/lib目录,筛选出所有静态库文件(后缀为.a)-exec nm -A {} \;:对每个找到的文件({}代表当前匹配到的文件)执行nm -A命令,-A参数会在输出中带上完整文件名,方便你定位到具体是哪个库包含目标符号| grep "FunctionThatIWantFound":过滤nm的输出,只保留包含你要找的函数/结构体的行
优化加速写法(批量处理文件)
如果/usr/lib下的静态库很多,用xargs代替-exec能提升效率(-exec是逐个处理文件,xargs会批量传递文件给nm):
find /usr/lib -name "*.a" | xargs nm -A | grep "FunctionThatIWantFound"
如果担心文件名包含空格(虽然静态库一般不会有这种情况),可以用安全版的写法:
find /usr/lib -name "*.a" -print0 | xargs -0 nm -A | grep "FunctionThatIWantFound"
进阶筛选:只找定义的符号
如果你只想找已定义的函数/结构体(不是被引用的符号),可以结合nm的符号类型标记:
- 大写
T:全局定义的函数/符号 - 小写
t:静态(局部)定义的函数/符号 - 大写
D:全局定义的数据(比如结构体实例) - 小写
d:局部定义的数据
比如只找全局定义的函数:
find /usr/lib -name "*.a" -exec nm -A {} \; | grep -E "FunctionThatIWantFound.*T"
内容的提问来源于stack exchange,提问作者Rubén Pozo
相关产品推荐
相关产品推荐

