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)做了正确的事情,不会造成一些脆弱的情况,并提高了整体的健壮性。