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