Linker “如何调试”;无法打开共享对象文件:没有这样的文件或目录;?

Linker “如何调试”;无法打开共享对象文件:没有这样的文件或目录;?,linker,shared-libraries,Linker,Shared Libraries,在我们的工作项目中,当我使用另一个团队管理的构建系统时,我遇到了一个问题,我能够编译和链接二进制文件,但在执行时,它抱怨无法加载共享对象文件,它不应该链接到: /home/me/build/bin/executable: error while loading shared libraries: libicui18n.so.52.1: cannot open shared object file: No such file or directory 奇怪的是,我甚至可以在我的机器上找到的文件名

在我们的工作项目中,当我使用另一个团队管理的构建系统时,我遇到了一个问题,我能够编译和链接二进制文件,但在执行时,它抱怨无法加载共享对象文件,它不应该链接到:

/home/me/build/bin/executable: error while loading shared libraries: libicui18n.so.52.1: cannot open shared object file: No such file or directory
奇怪的是,我甚至可以在我的机器上找到的文件名
libicui18n.so.52.1
的唯一实例是
/opt/onlyoffice/desktopeditors/libicui18n.so.52.1
/home/me/.local/opt/foxitsoftware/foxitreader/lib/libicui18n.so.52.1
,我绝对不会链接到它们,至少根据生成系统执行的链接器命令:

  • 它不会作为任何显式的
    /absolute/path/to/libsomething.so.42.3
    文件出现
  • -L
    选项中未给出任何相关内容
  • 没有任何相关文件作为
    /absolute/path/to/libsomething.a
    文件提供
  • $LD\u LIBRARY\u PATH
    $LIBRARY\u PATH
    中没有相关内容
  • “英特尔Fortran编译器”没有理由将这些文件包含在默认路径中
所以现在我想知道,
libicui18n.So.52.1
是如何与之链接的,我如何调试这样一个问题

libicui18n.so.52.1如何与

ELF库可以独立于库本身的名称指定“运行时应使用的名称”。例如:

gcc -fPIC -shared -o libt.so t.c -Wl,--soname=libfoo.so.1.2.3
gcc main.c -L. -lt

./a.out
./a.out: error while loading shared libraries: libfoo.so.1.2.3: cannot open shared object file: No such file or directory
在这里,库的构建方式要求在运行时使用
libfoo.so.1.2.3
,尽管不存在这样的库。由打包系统提供这样的库(或符号链接)

您可以检查库,查看它在运行时预期使用的名称,如下所示:

readelf -d libt.so | grep SONAME
 0x000000000000000e (SONAME)             Library soname: [libfoo.so.1.2.3]
 readelf -d ./a.out | grep NEEDED
 0x0000000000000001 (NEEDED)             Shared library: [libfoo.so.1.2.3]
 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]
您可以在运行时检查
a.out
所需的库列表,如下所示:

readelf -d libt.so | grep SONAME
 0x000000000000000e (SONAME)             Library soname: [libfoo.so.1.2.3]
 readelf -d ./a.out | grep NEEDED
 0x0000000000000001 (NEEDED)             Shared library: [libfoo.so.1.2.3]
 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]
我如何着手调试这样一个问题

如上所述。您的下一个问题可能是“如何解决此问题?”

由于安装了
libicui18n.so.52.1
,但没有安装到动态链接器默认搜索的目录中,因此您只需告诉二进制文件将非标准的
/opt/onlyoffice/desktopeditors
目录添加到要搜索的目录列表中即可

您可以通过将
-Wl,-rpath=/opt/onlyoffice/desktopeditors
添加到可执行文件的链接行来实现这一点


您也可以将
/opt/onlyoffice/desktopeditors
添加到
LD\u LIBRARY\u路径
,但最好使用
-Wl,-rpath

感谢您的详细回复;它帮助我确保我的修补程序(symlink)做了正确的事情,不会造成一些脆弱的情况,并提高了整体的健壮性。