符号查找错误发生在运行时而不是加载时

And*_*dre 5 c++ linux ld

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

<应用程序名称>:符号查找错误:<应用程序名称>:未定义符号:<mangled_Foo_symbol_name>

现在,事实证明,未损坏的符号是针对 Foo 类的构造函数的,问题只是加载了旧版本的库,其中还不包含 Foo。

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

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

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

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

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

<应用程序名称>:/path/to/gcc-4.8.0/lib64/libstdc++.so.6:找不到版本“GLIBCXX_3.4.20”(<应用程序名称>需要)


这种“快速失败”行为更可取,我不想首先运行我的应用程序很长一段时间,直到我最终意识到它使用了错误的库。是什么导致运行时出现加载错误以及如何使其立即出现?

Tob*_*ght 2

从手册页ld.so

环境

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