c – 运行时的符号查找错误,而不是加载时间

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

<appname>: symbol lookup error: <appname>: undefined symbol: <mangled_Foo_symbol_name>

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

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

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

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

<appname>: error while loading shared libraries: libname.so.2: cannot open shared object file: No such file or directory

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

<appname>: /path/to/gcc-4.8.0/lib64/libstdc++.so.6: version `GLIBCXX_3.4.20′ not found (required by <appname>)

这种“快速失败”行为更令人满意,我不想先运行我的应用程序很长一段时间,直到我终于意识到它使用了错误的库.
导致加载错误在运行时出现的原因是什么?如何立即显示?

最佳答案 从ld.so的手册页:

ENVIRONMENT

  • LD_BIND_NOW (libc5; glibc since 2.1.1) If set to a nonempty string, causes the dynamic linker to resolve all symbols at program startup instead of deferring function call resolution to the point when they are first referenced. This is useful when using a debugger.
  • LD_WARN (ELF only)(glibc since 2.1.3) If set to a nonempty string, warn about unresolved symbols.
点赞