gpt4 book ai didi

c - 为什么对与位置无关的代码函数调用使用惰性绑定(bind)

转载 作者:行者123 更新时间:2023-12-03 09:57:35 25 4
gpt4 key购买 nike

我正在读一本教科书,上面写着:
延迟绑定(bind)的动机是典型的应用程序将只调用由共享库(如 libc.so)导出的数百或数千个函数中的一小部分。通过延迟解析函数地址直到它被实际调用,动态链接器可以避免在加载时成百上千次不必要的重定位。
我有点明白这个想法,但仍然感到困惑。假设一个程序只调用一个内部有 100 个函数的共享库的 10 个函数。如果没有惰性绑定(bind),链接器只需要对程序使用的函数进行 10 次重定位,那么使用惰性绑定(bind),动态链接器如何避免成百上千(在这种情况下为 100 个函数)不必要的重定位?就像你试图解决一个实际上并不存在的问题一样?
从我对延迟绑定(bind)的了解来看,加载时不需要重定位,所以你确实节省了做 10 次重定位的时间,这是我能看到的唯一好处,我的理解是否正确?但是作者似乎表明没有延迟绑定(bind),链接器需要做 100 次重定位?

最佳答案

该文本在编写时令人困惑,但它所谈论的是被引用但从未调用过的函数,而不是从未被引用过的函数。无论是否使用惰性绑定(bind),都不需要查找未引用的函数。
如果您的程序引用了库中的 10 个函数但调用了其中的 0 个,则延迟绑定(bind)与立即绑定(bind)的区别是 0 次查找与 10 次查找。如果您的程序引用了库中的 100 个函数但只调用了其中的 10 个,则差异是 10 次查找与 100 次查找。延迟绑定(bind)应该为您节省时间的预期情况是,由于一个共享库依赖于另一个共享库而引用了大量函数。例如,假设你的程序使用了依赖于库 B 的库 A,而库 A 引用了库 B 中的所有 10000 个函数,但你的程序只使用了库 A 中的一小部分功能,它只调用了库 B 中的一个函数。现在,只需完成一次查找,而不是 10000 次查找。这听起来像是一个主要的好处。
然而,另一方面,惰性绑定(bind)非常容易出错(由于惰性解析器的调用机制、它如何与调用 ABI 合约交互关于寄存器使用的机制,以及第一次调用发生在非常尴尬的情况下的可能性)上下文(例如来自信号处理程序)并在调用函数时一次查找一个,而不是一次全部查找,对程序流程、缓存利用率等的破坏性更大,并且如果所有这些都将花费更多的总时间实际上调用了库中的函数。当然,这是一次性(每个流程实例)成本。

关于c - 为什么对与位置无关的代码函数调用使用惰性绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63745016/

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