将动态链接库必须加载到RAM中

伊夫

众所周知,任何正在运行的可执行文件都被加载到RAM中。

另外,我们有两种库:静态链接库和动态链接库。

两种库也应在需要时也加载到RAM中。

据我所知,我们有两种加载动态库的方法:

  1. 在编译时链接它,例如 g++ -lsofile
  2. 在代码中动态加载,我们必须dlopen这样做

我已经发布了这个问题,但是我仍然不能确保我们可以列出所有的lib文件。对于上述第一种情况,我认为我们可以使用ldd或check获得链接文件/proc/{PID}/maps但是对于第二种情况,我正在考虑是否可以使用某种方法获取链接文件,这是一个示例:

void SomeModule()
{
    //dlopen here to link mysofile
}

int main()
{
    if (user_enter == 'a')
    {
        printf("hello world");
    }
    else
    {
        SomeModule();
    }
}

在此示例中,当我们执行它并键入always时adlopen将永远不会调用它,因此mysofile也永远不会将它链接起来,这意味着mysofile永远不会将其加载到RAM中。我对吗?

如果是这样,除了读取源代码外,如何获取可执行文件的必要lib文件?

斯蒂芬·基特

您是对的,如果dlopen从不调用目标库,则它永远不会加载到(进程的)内存中。

在不阅读源代码的情况下确定必要的库感觉就像是停顿问题的一个变种。您可以使用一些启发式方法:如果程序未链接到libdl,则不能使用dlopen如果是这样,则可以使用strace(请参阅如何在运行时查找可执行文件加载的动态库?)或尝试找出dlopen使用静态分析的参数但是程序可以libdl直接包含(通过静态链接或通过构建代码);而且由于动态链接器不是魔术,所以没有什么可以阻止程序重新实现它,所以您不能绝对确保您已使用这些试探法捕获了所有需要的库。也许有一些程序可以找出正在被跟踪的程序,并跳过库加载...

列出所有所需库的唯一确定方法是阅读源代码。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章