linux - 了解 ldd 输出 - 符号链接(symbolic link)

标签 linux shared-libraries ldd

通常共享库有两个符号链接(symbolic link):

libexample.so -> libexample.so.1
libexample.so.1 -> libexample.so.1.1

我将一个共享库链接到我的程序,它也有两个符号链接(symbolic link):

libassimp.so -> libassimp.so.3
libassimp.so.3 -> libassimp.so.3.1.1

当我运行 ldd myprogram 时,我得到:

libassimp.so.3 => /home/user/libs/assimp-3.1.1/lib/libassimp.so.3 
(0x00007f34ab0bd000)'

这是什么意思?为什么 ldd 显示第二个符号链接(symbolic link)?当我运行 grep assimp/proc/myprogrampid/maps 时,我得到了 libassimp.so.3.1.1 的路径,这表明库已加载,但我没有了解 ldd 输出的形式。

最佳答案

引用 Michael 在 https://unix.stackexchange.com/questions/475/how-do-so-shared-object-numbers-work 上的回答

二进制文件本身知道它们所依赖的共享库的哪个版本,并专门请求它。 符号链接(symbolic link)的原因是链接器。当你想直接链接 libpthread.so 时,你给 gcc 标志 -lpthread,它会自动添加 lib 前缀和 .so 后缀。您不能告诉它添加 .so.0 后缀,因此符号链接(symbolic link)指向最新版本的库以促进这一点

关于linux - 了解 ldd 输出 - 符号链接(symbolic link),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28440206/

相关文章:

gcc构建链接,但共享库未与ldd一起出现

linux - 交叉编译器ldd

c - 在 Linux 上自己的进程上读取调试/静态符号,而没有 C/Linux 中的磁盘 I/O?

php: DateTime() 和 time() 有不同的时间

c - Golang C (.so) 在调用时导入分段违规

linux - 删除原始文件夹时删除符号链接(symbolic link)

c - 如何使链接到静态库也链接到其依赖项?

shared-libraries - Angular 6 Library - 很难符号链接(symbolic link)到新项目

java - 有效地存储和查询字符串列表

linux - 当进程崩溃时,操作系统是否会刷新 CPU 缓存?