【发布时间】:2011-08-26 10:08:33
【问题描述】:
我对 Linux 上的 RTLD_DEEP_BIND 的理解是,如果你的主程序中有一个函数 A(),并且在动态链接库(称为 lib)中有两个函数 A() 和 B(),其中 B 定义为:
B()
{
A();
}
然后对 B() 的调用总是会从库中调用 A。这是 RTLD_FIRST 在 Mac 上所做的工作吗?抱歉 - 我对文档感到困惑。
【问题讨论】:
我对 Linux 上的 RTLD_DEEP_BIND 的理解是,如果你的主程序中有一个函数 A(),并且在动态链接库(称为 lib)中有两个函数 A() 和 B(),其中 B 定义为:
B()
{
A();
}
然后对 B() 的调用总是会从库中调用 A。这是 RTLD_FIRST 在 Mac 上所做的工作吗?抱歉 - 我对文档感到困惑。
【问题讨论】:
RTLD_DEEPBIND 的作用似乎是 OS X 上的默认设置。默认情况下,OS X 使用称为动态库的两级命名空间的东西。 (您可以在链接时或加载时强制使用平面命名空间。)使用两级命名空间,符号引用不仅记录符号名称,还记录链接时解析符号的库。然后,在加载时,符号仅针对同一个库进行解析。
【讨论】:
没有。 RTLD_FIRST 只是一个标志,它影响dlsym 在使用结果句柄调用时的行为方式,而RTLD_DEEPBIND 影响加载库时符号的解析方式。它们的文档记录都很差,但这是我根据 OSX 和 Linux 的手册页找到的信息。
【讨论】: