Linker 理解动态链接器

Linker 理解动态链接器,linker,elf,Linker,Elf,我想知道为什么动态链接器必须搜索哪个库中的哪个函数 编译时链接器能否将此信息放入elf文件中 如果这样做,动态链接器可以直接查找函数,而不是搜索 我想知道为什么动态链接器必须搜索哪个库中的哪个函数 与在静态链接时记录符号在哪个共享库中定义,并仅搜索该库不同,类似于在Windows上发生的情况 有几个原因: 最初,共享库是为了模拟归档库而设计的,通常有多个归档库定义相同的符号 事实证明,不记录库名称允许在运行时插入符号,特别是在LD\u PRELOAD的情况下 在一些共享库的常见情况下,搜索附加库

我想知道为什么动态链接器必须搜索哪个库中的哪个函数

编译时链接器能否将此信息放入elf文件中

如果这样做,动态链接器可以直接查找函数,而不是搜索

我想知道为什么动态链接器必须搜索哪个库中的哪个函数

与在静态链接时记录符号在哪个共享库中定义,并仅搜索该库不同,类似于在Windows上发生的情况

有几个原因:

  • 最初,共享库是为了模拟归档库而设计的,通常有多个归档库定义相同的符号
  • 事实证明,不记录库名称允许在运行时插入符号,特别是在
    LD\u PRELOAD
    的情况下
  • 在一些共享库的常见情况下,搜索附加库的成本不会太高(搜索是通过哈希表完成的,而不是线性完成的)
  • 对于(1),您仍然可以记录符号在其中定义的第一个库


    对于(3),一些构建系统违反了通常的情况(有10000个共享库),搜索它们的开销变得非常大。但是,有一些方法可以避免这种开销,而不会使常用的符号查找规则失效。

    这将不再是动态的,是吗?不。只有链接器才能知道哪个共享库中的哪个函数。链接仍然可以在运行时完成。这就是动态链接所做的;将共享库映射到可执行的地址空间。如果延迟绑定处于活动状态,则在调用函数时,链接器会找到该函数的位置并更新全局偏移量表。您不能仅将延迟加载称为“动态链接”,并期望任何人都能理解您所说的内容。无论如何,主要目的是加快启动时间并减少内存消耗。当然,作为一种折衷,调用函数的速度要慢一点。