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将被忽略.也许旧的建造从来没有工作过?!
使用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这样您就不必每次都运行它.