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

use*_*452 2 linker intel-mkl ldd

我有一个与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
Run Code Online (Sandbox Code Playgroud)

但是当我使用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)
Run Code Online (Sandbox Code Playgroud)

知道什么可能是错的吗?

输出来自 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
  ....
Run Code Online (Sandbox Code Playgroud)

更多调试

$ 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)
     ....      
Run Code Online (Sandbox Code Playgroud)

似乎LD_DEBUG./bmdl单独跑步没有影响.

我刚刚意识到旧的bmdl有一个'setgid'标志,我的新建没有它.也许这就是原因?

-rwxr-sr-x 1 root gants 1123992 Jul 23 16:14 /scratch/helpdesk/bmdl
Run Code Online (Sandbox Code Playgroud)

setgid从旧的删除位bmdl和运行./bmdl不抱怨找不到库.现在的问题是为什么setgid会干扰动态链接的库?

碰巧带有动态链接的可执行文件的setgid会导致安全问题,并且受到GNU glibc的极大限制.例如,LD_LIBRARY_PATH将被忽略.也许旧的建造从来没有工作过?!

kan*_*yin 7

使用MKL需要env变量,包括正确设置INCLUDE,MKLROOT,LD_LIBRARY_PATH,LIBRARY_PATH,CPATH,FPATH和NLSPATH.

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

如果你使用intel编译器,

  $ source ${intel_dir}/bin/compilervars.sh intel64
Run Code Online (Sandbox Code Playgroud)

如果你只使用MKL与gcc编译器,

  $ source ${intel_dir}/mkl/bin/mklvars.sh intel64
Run Code Online (Sandbox Code Playgroud)

您可以将此cmd行添加到您的行中,.bashrc这样您就不必每次都运行它.