2

我有一个与 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

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

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

4

3 回答 3

7

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

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

如果您使用英特尔编译器,

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

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

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

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

于 2013-07-24T05:29:45.040 回答
3

该代码是动态链接的并且具有 setgid 属性。带有动态链接可执行文件的 setgid 可能会导致安全问题,并且受到 GNU glibc 的极大限制。例如,LD_LIBRARY_PATH 将被忽略。这就是为什么代码不断抱怨找不到一些共享库的原因。

于 2013-09-25T20:12:41.513 回答
0

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

您不太可能告诉我们整个故事,因为ldd(在 Linux 上)只是一个围绕ld-linux.so. 如果ld-linux.so在调用时可以找到共享库ldd,则在直接调用可执行文件时ld-linux.so应该能够做到这一点(当您运行时实际映射共享库)。ld-linux.soa.out

我能想到的唯一合理的解释:

  • 您在与您执行bmdl的环境不同的环境中执行ldd,或者
  • 您对 . 进行了修改lddPATH这可能会在运行 "real" 之前修改环境ldd

我怎么知道使用了哪个链接器?

readelf -l bmdl

并寻找“请求程序解释器”。

[Requesting program interpreter: /lib64/ld-linux-x86-64.so.2].

很奇怪。

下一个调试建议:设置LD_DEBUG=libs,files并查看在哪里ld-linux搜索。您可以对ldd和执行此操作bmdl,并查看差异来自何处。

于 2013-07-25T05:15:24.507 回答