“cannot open shared object file” 尽管 ldd 显示它可以找到

huangapple go评论72阅读模式
英文:

Getting "cannot open shared object file" even though ldd shows it can find it

问题

以下是您提供的内容的翻译:

"I looked for similar post on this topic but none the solutions work for me. I am trying to build a small program using openssl."

"我尝试寻找类似的帖子,但其中没有一个解决方案适用于我。我试图使用openssl构建一个小程序。"

/mnt/sda1/openssl$ gcc tstsvr.c -I/mnt/sda1/openssl/include -L/mnt/sda1/openssl -lcrypto -lssl

"当我尝试运行它:"

"当我尝试运行它:"

./a.out: error while loading shared libraries: libcrypto.so.81.1.1: cannot open shared object file: No such file or directory```

"但是:"

"但是:"

```$ ldd a.out
        linux-vdso.so.1 (0x00007fff23fe6000)
        libcrypto.so.81.1.1 => /mnt/sda1/openssl/libcrypto.so.81.1.1 (0x00007f82f1db9000)
        libssl.so.81.1.1 => /mnt/sda1/openssl/libssl.so.81.1.1 (0x00007f82f1d1e000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f82f1b1a000)
        libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f82f1b14000)
        libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f82f1af1000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f82f20ad000)

"格式看起来正常(位于/mnt/sda1/openssl):"

"格式看起来正常(位于/mnt/sda1/openssl):"

a.out: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=760dc5f7be4f51f598bab38a0b1eab1a42ef8a68, for GNU/Linux 3.2.0, not stripped
$ file libcrypto.so.81.1.1
libcrypto.so.81.1.1: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=404d1e7ed143383801efbb10ed7914f2cd0858d4, not stripped
$ ldd libcrypto.so.81.1.1
        linux-vdso.so.1 (0x00007ffc44b5a000)
        libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f1083a8c000)
        libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f1083a69000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f1083877000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f1083d93000)

"只是为了确保,我还添加了路径到LD_LIBRARY_PATH。甚至运行了sudo ldconfig。都没有任何不同。"

"只是为了确保,我还添加了路径到LD_LIBRARY_PATH。甚至运行了sudo ldconfig。都没有任何不同。"

"我还可以尝试什么?"

英文:

I looked for similar post on this topic but none the solutions work for me. I am trying to build a small program using openssl.

/mnt/sda1/openssl$ gcc tstsvr.c -I/mnt/sda1/openssl/include -L/mnt/sda1/openssl -lcrypto -lssl

When I try to run it:

$ sudo ./a.out
./a.out: error while loading shared libraries: libcrypto.so.81.1.1: cannot open shared object file: No such file or directory

But:

$ ldd a.out
        linux-vdso.so.1 (0x00007fff23fe6000)
        libcrypto.so.81.1.1 => /mnt/sda1/openssl/libcrypto.so.81.1.1 (0x00007f82f1db9000)
        libssl.so.81.1.1 => /mnt/sda1/openssl/libssl.so.81.1.1 (0x00007f82f1d1e000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f82f1b1a000)
        libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f82f1b14000)
        libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f82f1af1000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f82f20ad000)

Format looks fine (inside /mnt/sda1/openssl):

$ file a.out
a.out: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=760dc5f7be4f51f598bab38a0b1eab1a42ef8a68, for GNU/Linux 3.2.0, not stripped
$ file libcrypto.so.81.1.1
libcrypto.so.81.1.1: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=404d1e7ed143383801efbb10ed7914f2cd0858d4, not stripped
$ ldd libcrypto.so.81.1.1
        linux-vdso.so.1 (0x00007ffc44b5a000)
        libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f1083a8c000)
        libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f1083a69000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f1083877000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f1083d93000)

Just to make sure, I added path to LD_LIBRARY_PATH as well. Even ran sudo ldconfig. Neither made any difference.

What else can I try?

答案1

得分: 1

根据sudoers(5)

默认情况下,启用了env_reset标志。这会导致使用新的最小环境执行命令。
...
请注意,大多数操作系统上的动态链接器会从设置用户ID可执行文件(包括sudo)的环境中删除可以控制动态链接的变量,这可能包括_RLD*、DYLD_、LD_、LDR_*、LIBPATH、SHLIB_PATH等等,具体取决于操作系统。这些类型的变量在sudo开始执行之前就从环境中删除了,因此sudo无法保留它们。

您可能最容易的选择是执行以下操作:

sudo LD_LIBRARY_PATH=/mnt/sda1/openssl ./a.out
英文:

Per sudoers(5):

> By default, the env_reset flag is enabled. This causes commands to be executed with a new, minimal environment.
> ...
> Note that the dynamic linker on most operating systems will remove variables that can control dynamic linking from the environment of set-user-ID executables, including sudo. Depending on the operating system this may include RLD*, DYLD, LD_, LDR_*, LIBPATH, SHLIB_PATH, and others. These type of variables are removed from the environment before sudo even begins execution and, as such, it is not possible for sudo to preserve them.

Your easiest option is probably to do:

sudo LD_LIBRARY_PATH=/mnt/sda1/openssl ./a.out

huangapple
  • 本文由 发表于 2023年2月8日 12:16:30
  • 转载请务必保留本文链接:https://go.coder-hub.com/75381332.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定