用ldd -r, c++filt, nm搞定一个so库缺符号的问题

来源:互联网 发布:淘宝蛋蛋家全名 编辑:程序博客网 时间:2024/05/21 10:42

       最近, 编译了一个detailpage.so库, 直接放到测试环境, 准备验证业务功能, 结果, 服务重启的时候显示: failed to open ....

       1. 这个问题一看就知道原因了, 不是缺静态库, 而是缺符号了(符号未定义), 用ldd -r detailpage.so看了一下, 果然如下, 缺符号xxx

       2.  于是用c++file xxx查了一下, 查到了函数。

       3.  于是查找函数在那么目录, 可以用之前说过的findcpp命令, 查到了对应的静态库libyyy.a.  到了这不有点纳闷了, 一切都有啊, 怎么异常呢? 准备去请教, 但还是想独立解决这个问题。 再细想了一下, 继续搞起。

       4.  看看libyyy.a中缺符号xxx,  用nm命令看了一下, 发现xxx符号前面是U, 果然是未定义啊

       5.  于是更新这个目录的代码, 重编, 就OK了, 一切搞定。


       最后附上nm命令的操作结果:

nm输出字符含义RRead only symbol. 比如在代码中有一个const MAXDATA = 3095; 则MAXDATA就是一个Read only symbolN这是一个调试符号D这是一个已经初始化的变量的符号。比如代码中int i = 1和char *str = "Hello"则i和str都是这种类型的符号TText段的符号。子程序都是这种符号,比如文件中实现了一个函数function,则function就是这种符号U未定义的符号。如果文件中引用了不存在的函数,则这些未定义的函数符号就是这种类型S未初始化的符号,比如全局变量int s;则s的符号就是此类型

        

1 0
原创粉丝点击