今天在测试基于netlib实现的数据包处理模块时,突然提示symbollookup error gxio_mpipe_init , undefined symbol问题。通过查阅资料对于该问题大部分的问题原因都是动态库的版本过旧,导致应用程序找不到对应的符号而引起的。
但是,通过分析makefile文件和更新tilera平台上的gxio所依赖的动态库并不能解决上述问题。后来通过nm配合ldd终于解决了问题。分析步骤如下:
- 用ldd测试应用层序所依赖的动态库
- 使用nm grep分析gxio相关的动态库下是否包含gxio_mpipe_init符号
- 经nm检测发现gxio相关的动态库都不包含gxio_mpipe_init,如$nm libgxio.so | grep gxio_mpipe_init。但gxio静态库(libgxio.a)包含gxio_mpipe_init
- 修改应用程序的 makefile ,将gxio的静态库连接到应用程序中,编译测试问题解决。
- 导致上述问题的愿意就是应用程序依赖的gxio动态库中没有gxio_mpipe_init所对应特定的符号,导致运行时出现问题。
总结:导致该问题的原因一般就是动态库的版本过旧,导致应用程序找不到对应的符号,可以通过更新动态库使之支持确实的符号解决问题,分析过程中可以借助nm和ldd工具。