c - libdl 和 libltdl 有什么区别?

标签 c module linker libtool

libdllibltdl 有什么区别? 。我刚刚注意到 libodbc 链接到它们

ldd /usr/lib/x86_64-linux-gnu/libodbc.so.2 | grep -i dl
    libltdl.so.7 => /usr/lib/x86_64-linux-gnu/libltdl.so.7 (0x00007f411b822000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f411b01f000)

我知道 Perl 又链接了 libdl

ldd /usr/bin/perl | grep -i dl
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f55faa2e000)

我在系统上看到两个独立的共享对象,

ls -lah /usr/lib/x86_64-linux-gnu/libltdl.so.7.3.1 /lib/x86_64-linux-gnu/libdl-2.26.so 
-rw-r--r-- 1 root root 39K Aug 20  2016 /usr/lib/x86_64-linux-gnu/libltdl.so.7.3.1
-rw-r--r-- 1 root root 15K Oct 11 15:21 /lib/x86_64-linux-gnu/libdl-2.26.so

它们也链接到类似的东西,

ldd /usr/lib/x86_64-linux-gnu/libltdl.so.7.3.1
    linux-vdso.so.1 =>  (0x00007ffc3e66b000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007efcbad4c000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007efcba96c000)
    /lib64/ld-linux-x86-64.so.2 (0x00007efcbb15a000)
ldd /lib/x86_64-linux-gnu/libdl-2.26.so
    linux-vdso.so.1 =>  (0x00007ffe7889c000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fbc9a14e000)
    /lib64/ld-linux-x86-64.so.2 (0x00007fbc9a732000)

libltdl 有何不同?

最佳答案

libtool 的一项功能是为具有相同或相似功能的许多不同平台提供 libdl API(例如 dlopen)(例如 POSIX 的 dlopen 等、Windows 的 LoadLibrary 等),以及链接器不支持动态链接的平台的共享库模拟。

我在我的 Linux 机器上对 libodbc.so.2 进行了一些分析。 nm -D 似乎仅显示 libodbc.so.2libltdl 符号,而 objdump -p 似乎在 NEEDED 部分中只有 libltdl.so.7,因此在这种情况下 ldd 似乎没有打印出完全准确的信息(您的 grep 输出看起来与我所看到的类似)。

关于c - libdl 和 libltdl 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47782554/

相关文章:

php 扩展 >> 错误

代码打印额外的内存垃圾

javascript - 如何在 javascript 字符串文字中使用 `onclick`

oop - Lua - 如何动态调用模块?

ruby - 模块嵌套在 instance_eval/exec 或 module_eval/exec 中

c++ - 插件中的 Clang C++ 模板单例

c - 如何管理 Linux 加密 api 使用的分散列表?

c - SetEvent 和 WaitForMultipleObjects 的不可预测行为

c - 03优化后如何列出任意c程序使用的所有库函数

c++ - 库中的链接时间优化