【发布时间】:2019-05-09 19:39:17
【问题描述】:
所以我正试图围绕静态和动态链接。 SO和网络上有很多资源。我想我几乎明白了,但仍有一件事让我感到困扰。另外,如果我的整体理解有误,请纠正我。
我想我理解静态链接: 链接器解压缩链接的库,实际上将库的目标文件包含在生成的可执行文件中。然后,应用程序对象文件中的未解析存根被实际的函数调用代码替换,该代码调用构建时已知地址中的函数。
另一方面,动态链接更让我困惑:我知道在动态链接中,对象代码中引用尚未解析的名称的存根将一直作为存根直到运行时。
然后在运行时,操作系统的动态加载器将查看存储在标准文件系统位置的预编译库。它会在库的目标文件中查找它们的符号表 (?),并尝试为每个未解析的存根找到匹配的函数定义。然后它将匹配的目标文件加载到内存中,并替换存根以指向函数定义。
所以我缺少的部分是:操作系统动态加载程序在哪里查找 - 它是否在系统库目录中所有目标文件的符号表中查找?还是它只查看应用程序可执行文件中某处指定的目标文件?这就是为什么在编译时我们必须指定程序的所有动态依赖项的原因吗?另外,动态库是否也暴露了符号表?
【问题讨论】:
标签: c build linker operating-system