缺lessldd中的共享库

我在CentOS 6.x上编译了Apache httpd。 在那里工作很好。

然后我把二进制文件移到了CentOS 7.我需要安装一些丢失的,现在可以正常工作了。

然后我把二进制文件移到Archlinux。 正如我预料的那样,它并没有直接开始:

httpd: symbol lookup error: /software_pack/httpd-2.2.25/lib/libapr-1.so.0: undefined symbol: dlopen 

但是,如果我做了ldd /software_pack/httpd-2.2.25/lib/libapr-1.so.0它在CentOS和Archlinux上给出了不同的结果。 在Archlinux上,libdl.so根本不显示?

从CentOS哪里知道该文件需要libdl.so.2?

CentOS 6.x:

 # ls -la /software_pack/httpd-2.2.25/lib/libaprutil-1.so.0 lrwxrwxrwx 1 root root 21 Jul 30 09:47 /software_pack/httpd-2.2.25/lib/libaprutil-1.so.0 -> libaprutil-1.so.0.5.2 # ldd /software_pack/httpd-2.2.25/lib/libaprutil-1.so.0.5.2 linux-vdso.so.1 => (0x00007fffec400000) libexpat.so.0 => /software_pack/httpd-2.2.25/lib/libexpat.so.0 (0x00007f5ec94d8000) libapr-1.so.0 => /software_pack/httpd-2.2.25/lib/libapr-1.so.0 (0x00007f5ec92a8000) librt.so.1 => /lib64/librt.so.1 (0x00007f5ec9098000) libcrypt.so.1 => /lib64/libcrypt.so.1 (0x00007f5ec8e60000) libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f5ec8c40000) libc.so.6 => /lib64/libc.so.6 (0x00007f5ec88a8000) /lib64/ld-linux-x86-64.so.2 (0x00007f5ec9928000) libfreebl3.so => /lib64/libfreebl3.so (0x00007f5ec8630000) libdl.so.2 => /lib64/libdl.so.2 (0x00007f5ec8428000) <<<<<<<< Missing in arch 

在Archlinux上:

 # ls -la /software_pack/httpd-2.2.25/lib/libaprutil-1.so.0 lrwxrwxrwx 1 root root 21 Jul 30 10:47 /software_pack/httpd-2.2.25/lib/libaprutil-1.so.0 -> libaprutil-1.so.0.5.2 # ldd /software_pack/httpd-2.2.25/lib/libaprutil-1.so.0.5.2 linux-vdso.so.1 (0x00007fff7cdd3000) libexpat.so.0 => /software_pack/httpd-2.2.25/lib/libexpat.so.0 (0x00007f5aef4e7000) libapr-1.so.0 => /software_pack/httpd-2.2.25/lib/libapr-1.so.0 (0x00007f5aef2ba000) librt.so.1 => /usr/lib/librt.so.1 (0x00007f5aef084000) libcrypt.so.1 => /usr/lib/libcrypt.so.1 (0x00007f5aeee4b000) libpthread.so.0 => /usr/lib/libpthread.so.0 (0x00007f5aeec2d000) libc.so.6 => /usr/lib/libc.so.6 (0x00007f5aee87f000) /usr/lib64/ld-linux-x86-64.so.2 (0x00007f5aef934000) 

dlopen通常由libdl.so.2提供。 在Arch Linux上, libdl.so.2glibc包提供。 如果你没有安装glibc将会很奇怪,但无论如何,检查你的系统是否有libdl.so.2

您还可以使用readelf命令为共享对象输出符号表,并检查是否导出了特定符号:

 readelf -Ws /usr/lib/libdl.so.2 

关于为什么ldd输出为相同的二进制可能会在不同的系统上有所不同的信息可以在这里find:

https://stackoverflow.com/questions/12714219/ldd-different-output-same-binary-different-distros