【问题标题】:Two programs links to dynamic linked library两个程序链接到动态链接库
【发布时间】:2015-11-10 08:20:20
【问题描述】:

我仍然是 C 的菜鸟,所以我有一个关于链接的问题。 我们有两个程序“A”和“B”,它们链接到动态链接库“C”。

现在我们启动程序“A”和“B”。

“C”现在发生了什么事。是两个程序都加载一次,还是每个程序加载两次?

什么是,当程序B是一个Python程序时,它使用了外部函数接口?

【问题讨论】:

    标签: c dynamic dll linker shared-libraries


    【解决方案1】:

    这一切都取决于操作系统,但对于例如Linux 或 Windows 共享库只会加载一次,但会映射两次。每个使用共享库的进程都会映射该库,但这些映射都指向同一个加载的库。

    映射是在每个进程的基础上完成的,进程做什么或是什么并不重要(如果它是您创建的程序、Python 解释器或完全不同的东西)。

    【讨论】:

    • 映射是什么意思?
    • @clausismus 在现代多用户多任务操作系统上,所有进程都有自己的内存映射,称为virtual memory映射 是为进程内存映射添加一些内容。这种内存映射会导致共享库在两个不同的进程中具有不同的虚拟地址
    • 程序“A”和“B”都链接到已加载的库“C”。如果库“C”有一个静态字符缓冲区,以及一个从缓冲区返回指针的函数,那么两个程序应该得到相同的缓冲区指针?
    • @clausismus 两个进程都获得了指向同一个缓冲区的指针,但是由于虚拟内存的原因,进程 A 和 B 中的指针值(地址)可能不同。
    • 那么如果我理解正确的话:当“A”改变缓冲区的值时,“B”可以获得改变的值?如果“C”是静态链接库,并且“A”和“B”链接到它,那么应该有两个缓冲区。对吗?
    【解决方案2】:

    在 google 中搜索 Dynamic linking C 得到以下结果(共享库是动态加载的)

    共享库在程序启动时被加载到内存中。正确加载共享库后,所有稍后启动的程序都会自动使用已加载的共享库。

    【讨论】:

      【解决方案3】:

      在 Windows 的情况下,只有 DLL(动态链接库)代码在进程之间共享。每个进程都有自己的虚拟内存地址空间,包括 DLL 使用的数据。这意味着 DLL 通常不能具有在进程之间共享的静态缓冲区。进程或DLL代码可以设置共享内存,该共享内存可以在进程之间共享。

      MSDN 文章:

      http://msdn.microsoft.com/en-us/library/windows/desktop/ms681914(v=vs.85).aspx

      http://msdn.microsoft.com/en-us/library/windows/desktop/ms682594(v=vs.85).aspx

      http://msdn.microsoft.com/en-s/library/windows/desktop/ms686958(v=vs.85).aspx

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-26
        • 2020-01-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多