gpt4 book ai didi

linker - 可执行文件找不到动态链接的 mkl 库,但 ldd 可以

转载 作者:行者123 更新时间:2023-12-02 04:14:32 25 4
gpt4 key购买 nike

我有一个与 mkl 库动态链接的代码。运行代码时,报告找不到mkl。

./bmdl
/g/software/EMTO/5.7/intel_12.1/ser/bin/bmdl: error while loading shared libraries: libmkl_intel_lp64.so: cannot open shared object file: No such file or directory

但是当我使用 ldd 检查可执行文件中的动态链接库时,它显示找到了 mkl 库

ldd bmdl
libmkl_intel_lp64.so => /g/software/intelXE/composer_xe_2011_sp1/mkl/lib/intel64/libmkl_intel_lp64.so (0x00002b975d76d000)
libmkl_sequential.so => /g/software/intelXE/composer_xe_2011_sp1/mkl/lib/intel64/libmkl_sequential.so (0x00002b975df53000)
libmkl_core.so => /g/software/intelXE/composer_xe_2011_sp1/mkl/lib/intel64/libmkl_core.so (0x00002b975e631000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x0000003785600000)
libm.so.6 => /lib64/libm.so.6 (0x0000003784e00000)
libc.so.6 => /lib64/libc.so.6 (0x0000003784a00000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x000000378a600000)
libdl.so.2 => /lib64/libdl.so.2 (0x0000003785200000)
/lib64/ld-linux-x86-64.so.2 (0x0000003784600000)

知道可能出了什么问题吗?

来自readelf -l ./bmdl的输出

Elf file type is EXEC (Executable file)
Entry point 0x4034b0
There are 8 program headers, starting at offset 64

Program Headers:
Type Offset VirtAddr PhysAddr
FileSiz MemSiz Flags Align
PHDR 0x0000000000000040 0x0000000000400040 0x0000000000400040
0x00000000000001c0 0x00000000000001c0 R E 8
INTERP 0x0000000000000200 0x0000000000400200 0x0000000000400200
0x000000000000001c 0x000000000000001c R 1
[Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]
LOAD 0x0000000000000000 0x0000000000400000 0x0000000000400000
0x00000000000e4eb4 0x00000000000e4eb4 R E 200000
....

更多调试

$ export LD_DEBUG=libs,files
$ ./bmdl
./bmdl: error while loading shared libraries: libmkl_intel_lp64.so: cannot open shared object file: No such file or directory
$ ldd ./bmdl
15133:
15133: file=libtermcap.so.2 [0]; needed by /bin/sh [0]
15133: find library=libtermcap.so.2 [0]; searching
15133: search path=/g/software/intelXE/composer_xe_2011_sp1/mkl/lib/intel64/tls/x86_64:/g/software/intelXE/composer_xe_2011_sp1/mkl/lib/intel64/tls:/g/software/intelXE/composer_xe_2011_sp1/mkl/lib/intel64/x86_64:/g/software/intelXE/composer_xe_2011_sp1/mkl/lib/intel64:/g/software/intelXE/composer_xe_2011_sp1/lib/intel64/tls/x86_64:/g/software/intelXE/composer_xe_2011_sp1/lib/intel64/tls:/g/software/intelXE/composer_xe_2011_sp1/lib/intel64/x86_64:/g/software/intelXE/composer_xe_2011_sp1/lib/intel64 (LD_LIBRARY_PATH)
....

似乎LD_DEBUG对单独运行./bmdl没有影响。

我刚刚意识到旧的 bmdl 有一个“setgid”标志,而我的新构建没有它。也许这就是原因?

-rwxr-sr-x 1 root gants 1123992 Jul 23 16:14 /scratch/helpdesk/bmdl

我从旧的 bmdl 中删除了 setgid 位,并且运行 ./bmdl 不会提示找不到库。现在的问题是为什么setgid会干扰动态链接库?

使用动态链接的可执行文件的 setgid 恰好会导致安全问题,并且受到 GNU glibc 的极大限制。例如,LD_LIBRARY_PATH 将被忽略。也许旧建筑以前从未工作过?!

最佳答案

使用 MKL 需要正确设置环境变量,包括 INCLUDE、MKLROOT、LD_LIBRARY_PATH、LIBRARY_PATH、CPATH、FPATH 和 NLSPATH。

这可以通过英特尔提供的单个脚本来完成。

如果您使用intel编译器,

  $ source ${intel_dir}/bin/compilervars.sh intel64

如果您仅将 MKL 与 gcc 编译器一起使用,

  $ source ${intel_dir}/mkl/bin/mklvars.sh intel64

您可以将此命令行添加到 .bashrc 中,这样您就不需要每次都运行它。

关于linker - 可执行文件找不到动态链接的 mkl 库,但 ldd 可以,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17821530/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com