注册

Linux报 “dynamic linker encountered an error” 异常的原因以及解决办法

Linux 报 dynamic linker encountered an error 的原因:

dynamic linker (动态链接器)是 Linux 中的一个重要的组成部分,它用于链接并加载需要运行的共享库(共享对象)。其错误一般分为两类:

  1. 当我们的应用程序依赖的动态共享库在运行时,找不到合适的共享库时,就会出现以下错误:
error while loading shared libraries: libxxxx.so.x.x.x: cannot open shared object file: No such file or directory
  1. 当我们在编写程序的时候,编写的动态共享库中,其中一个库中有错误,比如缺少了某个符号,那么在应用程序启动时,就会出现以下错误:
/usr/bin/executable-name: symbol lookup error: /path/to/shared-object: undefined symbol: function-name

对于第一种错误,我们可以通过以下方式解决:

  1. 使用缺省的 dynamic linker:

在 Linux 的系统下,我们可以通过环境变量 LD_LIBRARY_PATH 指定需要加载的共享库所在的目录。比如,我们将一个库的路径添加到系统路径中:

export LD_LIBRARY_PATH=/path/to/directory/with/lib:$LD_LIBRARY_PATH
  1. 防止已经安装的库被覆盖:

我们可以使用以下命令查找哪些库引用新的库,并且需要更新:

find / -name "*.so*" -type f -print0 | xargs -0 ldd | grep -v "=>" | grep -v found | awk '{ print $1 }' | sort | uniq | xargs rpm -qf

我们可以在 LD_PRELOAD 中指定使用的共享库,而不是使用标准的 ld.so 。假如我们要使用一个文件名为 libmyown.so.1.0.0 的动态库替换系统中已有的 libexample.so.1.0.0

export LD_PRELOAD=/path/to/libmyown.so.1.0.0

对于第二种错误,我们需要重新编译动态库,保证其中所有的符号都被正确地链接到了共享库中,理论上说十分简单,请仔细检查编译时的依赖项并通过链接选项将所有依赖项编译到共享库中即可。