gpt4 book ai didi

c - .so 文件何时加载 Linux?

转载 作者:太空宇宙 更新时间:2023-11-03 23:25:06 24 4
gpt4 key购买 nike

我有一个共享对象 (a.so),它链接到我的可执行文件 myexe。a.so 公开了一个名为 get_val() 的方法,myexe 正在使用该方法。

现在a.so什么时候会被加载到myexe的进程地址空间?是当 myexe 调用 get_val() API 时,还是当 myexe 启动时。

最佳答案

有两(三)种类型的库:

  • 静态库(后缀:.a/.lib),它本身成为二进制文件的一部分。严格来说,这不是整个库,而是库中需要满足未解析链接的那些对象。
  • 共享(动态)库(后缀:.so/.dll),有两种形式,以时间区分库已加载:
    • 动态链接库,它们是您告诉编译器和链接器的库,您称之为静态库,但它们不是您的库的一部分 - 它们由加载器/链接器加载 (在 Linux 中通常作为 __main() 的一部分来自 libc 通过调用 dlopen()).
    • 动态加载库,您自己调用 dlopen()

(术语看起来有点模糊,我看过不同的文献使用不同的术语;上面的术语是我为了记住概念而背的。)

所以,如果你使用a.so而不自己调用dlopen()a.so是一个动态链接库,所以它在程序启动时加载。在这种情况下,从系统中删除 a.so 将阻止您的程序启动 - 它将被加载,但它会在调用 main() 之前失败。

如果您使用 a.so 并自己调用 dlopen(),它完全在您的控制之下。

关于你的问题

问题 1:如果您自己调用 dlopen(),使用 RTLD_LAZYa.so 将在第一个未解析的调用时加载可以通过a.so来解决。如果您自己调用 dlopen(),使用 RTLD_NOWa.so 会立即加载,即在 dlopen() 之前> 返回。如果您自己不调用 dlopen() 而让 libc 为您完成工作,a.so 将在程序启动时加载。

Q2:你删除了a.so。如果你用RTLD_LAZY调用dlopen(),并且不跑完需要a.so的代码,程序会顺利运行,否则将发出一个信号。如果您不调用 dlopen() 而让 libc 为您完成工作,程序将不会成功启动。

问题 3:实际上,如果不调用 dlopen()(或替代它的等价物),就无法加载 a.so。问题只是,您是自己调用 dlopen(),还是让环境(即 libc)为您完成工作。

免责声明:我不是这方面的专家,我的部分回答可能是错误的。我将验证我自己怀疑的答案的那些部分,即它是否是 libc 调用 dlopen() 或其他东西,以及它是否可能即使您自己不使用 dlopen() 也可以进行惰性绑定(bind)。得到结果后我会更新答案。

关于c - .so 文件何时加载 Linux?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29285546/

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