运行时符号查找错误而不是加载时间

时间:2015-10-02 09:05:41

标签: c++ linux ld

我有一个使用.so共享库中的类Foo的应用程序。我遇到了一个问题,在运行时它打印

  

< appname>:符号查找错误:< appname>:未定义的符号:< mangled_Foo_symbol_name>

现在,事实证明,unmangled符号是Foo类的构造函数,问题只是加载了旧版本的库,但它还没有包含Foo。

我的问题不是解决错误(显然使用正确的库),而是为什么它在运行时而不是在加载/启动时出现

导致错误的代码行只是实例化了一个Foo类的对象,所以我没有在这里使用dlopen这样的东西,至少没有明确地/据我所知。

相反,如果我从加载搜索路径中删除整个库,则会在启动时出现错误

  

< appname>:加载共享库时出错:libname.so.2:无法打开共享对象文件:没有这样的文件或目录

当加载路径上出现错误版本的gcc / libstdc ++时,starup上也会出现错误:

  

< appname>:/ path / to / gcc-4.8.0 / lib64 / libstdc + +。so.6:版本`GLIBCXX_3.4.20'找不到(< appname>所需)

这"快速失败"行为更令人满意,我不想先运行我的应用程序一段时间,直到我终于意识到它使用了错误的库。 导致加载错误在运行时出现的原因以及如何使其立即出现?

2 个答案:

答案 0 :(得分:1)

来自ld.so的手册页:

  

环境

     
      
  • LD_BIND_NOW(libc5; glibc自2.1.1开始)如果设置为非空字符串,则导致动态链接器在程序启动时解析所有符号,而不是将函数调用解析推迟到首次引用它们时。这在使用调试器时很有用。
  •   
  • LD_WARN(仅限ELF)(自2.1.3以来的glibc)如果设置为非空字符串,则警告未解析的符号。
  •   

答案 1 :(得分:0)

我认为您无法静态链接.so库。如果要避免加载/运行时错误,则必须使用所有静态库(.a)。如果您没有库和源的静态版本,请尝试查找一些 statifier 。谷歌搜索后,我发现很少有statifiers,但不知道他们是如何工作的,所以留下那部分给你。