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

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

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

       2.  于是用c++filt 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 symbol
N这是一个调试符号
D这是一个已经初始化的变量的符号。比如代码中int i = 1和char *str = "Hello"则i和str都是这种类型的符号
TText段的符号。子程序都是这种符号,比如文件中实现了一个函数function,则function就是这种符号
U未定义的符号。如果文件中引用了不存在的函数,则这些未定义的函数符号就是这种类型
S未初始化的符号,比如全局变量int s;则s的符号就是此类型

 

        

 

是不是得用厂家工具链里的编译器编译 bell@bell-virtual-machine:~/nm/nvr_2025/torchlight/staging_dir/toolchain-arm-openwrt-linux-uclibcgnueabihf/bin$ ls arm-buildroot-linux-uclibcgnueabihf-addr2line arm-buildroot-linux-uclibcgnueabihf-ar arm-buildroot-linux-uclibcgnueabihf-as arm-buildroot-linux-uclibcgnueabihf-c++ arm-buildroot-linux-uclibcgnueabihf-c++.br_real arm-buildroot-linux-uclibcgnueabihf-cc arm-buildroot-linux-uclibcgnueabihf-cc.br_real arm-buildroot-linux-uclibcgnueabihf-c++filt arm-buildroot-linux-uclibcgnueabihf-cpp arm-buildroot-linux-uclibcgnueabihf-cpp.br_real arm-buildroot-linux-uclibcgnueabihf-elfedit arm-buildroot-linux-uclibcgnueabihf-g++ arm-buildroot-linux-uclibcgnueabihf-g++.br_real arm-buildroot-linux-uclibcgnueabihf-gcc arm-buildroot-linux-uclibcgnueabihf-gcc-4.9.4 arm-buildroot-linux-uclibcgnueabihf-gcc-4.9.4.br_real arm-buildroot-linux-uclibcgnueabihf-gcc-ar arm-buildroot-linux-uclibcgnueabihf-gcc.br_real arm-buildroot-linux-uclibcgnueabihf-gcc-nm arm-buildroot-linux-uclibcgnueabihf-gcc-ranlib arm-buildroot-linux-uclibcgnueabihf-gcov arm-buildroot-linux-uclibcgnueabihf-gdb arm-buildroot-linux-uclibcgnueabihf-gprof arm-buildroot-linux-uclibcgnueabihf-ld arm-buildroot-linux-uclibcgnueabihf-ld.bfd arm-buildroot-linux-uclibcgnueabihf-ldconfig arm-buildroot-linux-uclibcgnueabihf-ldd arm-buildroot-linux-uclibcgnueabihf-nm arm-buildroot-linux-uclibcgnueabihf-objcopy arm-buildroot-linux-uclibcgnueabihf-objdump arm-buildroot-linux-uclibcgnueabihf-ranlib arm-buildroot-linux-uclibcgnueabihf-readelf arm-buildroot-linux-uclibcgnueabihf-size arm-buildroot-linux-uclibcgnueabihf-strings arm-buildroot-linux-uclibcgnueabihf-strip
最新发布
09-03
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值