gpt4 book ai didi

linux - 关于共享库的问题

转载 作者:太空狗 更新时间:2023-10-29 11:27:21 25 4
gpt4 key购买 nike

我有一些关于共享库的问题

  1. 当我运行二进制时谁来加载共享库取决于共享图书馆(.so)?

  2. 在哪里加载共享库?

  3. 如果共享库已经加载并且我运行二进制取决于加载的库,在这种情况下将加载共享库还是二进制将使用加载的库?

最佳答案

Who will load shared libraries when I run binary depends on shared libraries(.so)?

当您exec二进制文件时,Linux 内核将读取文件的elf header 。所有动态链接的ELF文件都在ELF文件的程序头.interp(解释器)中注册了/lib/ld-linux.so.2(运行时动态链接器)。当解释器存在时,Linux 内核将加载解释器的 ELF(通过根据其 header 将其映射到内存),并跳转到其入口点。

运行时动态链接器将读取您的动态链接程序,找到所有需要的共享库并将它们加载到内存中(再次使用 mmap 和来自 ELF header 的信息)。

Where shared libraries loaded?

在所有目录中搜索共享库,在运行时库搜索路径($LD_LIBRARY_PATH/etc/ld.so.conf)中列出。

用于加载每个库的内存地址由 ld-linux.so.2 确定(也可能由内核确定,例如随机化起始地址)。

库加载的实际代码在 glibc,elf/rtld.c 文件中 http://fxr.watson.org/fxr/source/elf/rtld.c?v=GLIBC27#L1731 :

 1731   /* Load all the libraries specified by DT_NEEDED entries. ....  */
1735 _dl_map_object_deps (main_map, preloads, npreloads, mode == trace, 0);

然后链接器将连接目标文件之间的符号引用(重定位过程,如果惰性绑定(bind)处于事件状态,有时会在实际引用符号时完成)。

If shared libraries were already loaded and I run binary depends on loaded libraries, in this case shared libraries will going to be loaded or binary will use loaded libraries?

你应该知道如何mmap处理文件。硬盘驱动器(HDD 或 SSD)上存储有文件,应将其加载到内存中以执行。链接器不会mmap 整个库文件;仅包含库数据和代码的部分。此外,mmap 系统调用是惰性的,它不会将所有请求的文件片段加载到内存中,而只是记住相应的虚拟页面和文件偏移量。第一次访问虚拟页面时,会发生pagefault(major pagefault),部分文件会从硬盘读取(Linux可能会从磁盘加载更多页面;也有预取器读取库在引导过程的早期存储到内存中)。

如果多个进程mmap同一个文件,将使用Copy-On-Write机制。意思是:如果只读内存页,则只有一个物理页。几个虚拟页面将映射到它;全部具有不允许的“写入”访问权限。对于页面上的每次写访问,将完成复制(通过小页面错误),如果将原始物理页面复制到新的物理页面中;并且映射将针对进行写访问的进程进行更改。从页面错误中断返回后,写入指令将重新启动,写入自己的页面副本。

共享库的大部分可执行代码没有被写入,所以它在所有进程之间共享。数据段(.data、.bss、.tdata、.bss)不会被共享,因为有对它们的写入。搬迁也会取消共享某些页面。

关于linux - 关于共享库的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22876949/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com