首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >不同的`libc.so`之间有什么区别和关系?

不同的`libc.so`之间有什么区别和关系?
EN

Unix & Linux用户
提问于 2018-06-11 13:36:49
回答 1查看 11.2K关注 0票数 5

论Lubntu 18.04

代码语言:javascript
运行
复制
$ whereis libc
libc: /usr/lib/x86_64-linux-gnu/libc.a /usr/lib/x86_64-linux-gnu/libc.so /usr/share/man/man7/libc.7.gz

$ locate libc.so
/lib/i386-linux-gnu/libc.so.6
/lib/x86_64-linux-gnu/libc.so.6
/usr/lib/x86_64-linux-gnu/libc.so

$ ls -li /usr/lib/x86_64-linux-gnu/libc.so  /lib/x86_64-linux-gnu/libc.so.6 /lib/i386-linux-gnu/libc.so.6
 2101838 lrwxrwxrwx 1 root root  12 Apr 16 16:14 /lib/i386-linux-gnu/libc.so.6 -> libc-2.27.so
 2101796 lrwxrwxrwx 1 root root  12 May 13 20:09 /lib/x86_64-linux-gnu/libc.so.6 -> libc-2.27.so
15736469 -rw-r--r-- 1 root root 298 Apr 16 16:14 /usr/lib/x86_64-linux-gnu/libc.so

不同的libc.so之间有什么区别和关系?

哪一个在使用?

谢谢。

我的问题来自https://stackoverflow.com/questions/50798907/why-does-loading-the-libc-shared-library-have-libraryloader-object-is-not-cal

谢谢。

EN

回答 1

Unix & Linux用户

回答已采纳

发布于 2018-06-11 13:42:04

它们都有不同的目的:

  • /lib/i386-linux-gnu/libc.so.6是32位x86 C库的符号链接,用于运行32位可执行文件;
  • /lib/x86_64-linux-gnu/libc.so.6是指向64位x86 C库的符号链接,用于运行64位可执行文件;
  • /usr/lib/x86_64-linux-gnu/libc.so (通常)是指向64位C库(根据需要动态或共享)和动态链接器的链接器脚本,用于链接64位可执行文件(在构建它们时)。

在构建和运行程序时,有三种不同类型的链接:

  • 静态链接:构建时链接器(ld)解析程序在构建过程中使用的所有对象,合并所使用的对象,并生成不使用外部库的可执行二进制文件;
  • 动态链接,在构建时:ld解析程序中使用的所有对象,但它只存储对它们的引用,而不是存储在可执行文件中;
  • 动态链接,在运行时:运行时链接器(ld.so)或动态链接器解析存储在可执行文件中的所有引用,加载所有必需的库,并在运行程序之前更新所有对象引用。

libc.so链接器脚本以链接器脚本的形式为ld提供说明:

代码语言:javascript
运行
复制
/* GNU ld script
   Use the shared library, but some functions are only in
   the static library, so try that secondarily.  */
OUTPUT_FORMAT(elf64-x86-64)
GROUP ( /lib/x86_64-linux-gnu/libc.so.6 /usr/lib/x86_64-linux-gnu/libc_nonshared.a  AS_NEEDED ( /lib/x86_64-linux-gnu/ld-linux-x86-64.so.2 ) )

通常,动态库只使用符号链接(libfoo.sold使用,指向libfoo.so.1ld.so使用的任何东西,它本身通常是指向当前安装的库版本的符号链接,例如libfoo.so.1.2.3)。在GNU C库的情况下,尽管动态链接的程序仍然需要来自静态库的一些符号,所以使用一个链接器脚本,以便链接器可以同时尝试这两种方式。链接器脚本还引用了将在运行时使用的动态链接器(上面的/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2),其名称嵌入到可执行文件中(在.interp中)。

术语“动态链接器”和“动态加载器”是同义词,可以互换使用(参见这个ld.so命令页)。

票数 6
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/449107

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档