各个`libc.so`之间有什么区别和联系?

各个`libc.so`之间有什么区别和联系?

在 Lubntu 18.04 上

$ 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

谢谢。

答案1

它们都有不同的目的:

  • /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

/* 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.so由 所使用ld,并指向libfoo.so.1或由 所使用的任何内容ld.so,并且其本身通常是指向当前安装的库版本的符号链接,例如 libfoo.so.1.2.3)。在 GNU C 库的情况下,虽然动态链接的程序仍然需要静态库中的一些符号,所以使用链接器脚本来代替,以便链接器可以尝试两者。链接器脚本还指将在运行时使用的动态链接器(/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2上面),其名称嵌入在可执行文件中(在 中.interp)。

术语“动态链接器”和“动态加载器”是同义的并且可以互换使用(参见联机ld.so帮助页)。

相关内容