gpt4 book ai didi

linux - 关于loader如何在运行时定位库的问题

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

Only a minimum amount of work is done at compile time by the linker; it only records what library routines the program needs and the index names or numbers of the routines in the library. (source)

所以这意味着ld.so不会检查其数据库中的所有库,只会检查应用程序本身记录的那些库,也就是说,只会检查那些由gcc -lxxx指定的库

这与我以前的认识相矛盾,ld.so 会一一检查其数据库中的所有库,直到找到为止。

具体情况是怎样的?

最佳答案

我会努力回答这个问题......

在链接时,链接器(不是 ld.so)将确保被链接在一起的 .o 文件的所有符号都被程序所链接的库所满足。如果这些库中的任何一个是动态库,它还会检查它们所依赖的库(不需要将它们包含在 -l 列表中)以确保满足这些库中的所有符号.它将递归地执行此操作。

只有可执行文件在链接时通过提供的-l 参数直接依赖的库才会被记录在可执行文件中。如果库本身声明了依赖关系,那么这些依赖关系将不会记录在可执行文件中,除非这些库在链接时也用 -l 标志指定。

链接在您运行链接器时发生。对于 gcc,这通常类似于 gcc a.o b.o c.o -lm -o myprogram。这通常发生在编译过程结束时。在幕后,它通常运行一个名为 ld 的程序。但是 ldld.so(运行时加载程序)完全不同。尽管它们是不同的实体,但它们的名称相似,因为它们在不同的时间从事相似的工作。

加载是运行程序时发生的步骤。对于动态库,如果您使用静态库,加载器会做很多链接器会做的工作。

当程序运行时,ld.so(运行时加载程序)实际上将可执行文件上的符号与共享库中的定义 Hook 。如果该共享库依赖于其他共享库(库中记录的事实),它也会加载这些库并将它们连接起来。如果在所有这些都完成后,仍有未解析的符号,加载程序将中止程序。

因此,可执行文件说明了它直接依赖于哪些动态库。这些库中的每一个都说明了它们直接依赖于哪些动态库,等等。加载程序 (ld.so) 使用它来决定在哪些库中查找符号。它不会在“数据库”中随机搜索其他库来查找合适的符号。它们必须位于依赖链中的库中。

关于linux - 关于loader如何在运行时定位库的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6313774/

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