将应用程序链接到动态共享库时,例如
gcc -o myprog myprog.o -lmylib
Run Code Online (Sandbox Code Playgroud)
我知道链接器(ld在我的 Linux 上)使用 -l 选项将库的名称(mylib在本例中)存储在生成的 myprog ELF 可执行文件中,该名称将在加载和链接时使用(都在程序启动时)如果我们忽略惰性动态链接)。我想知道ld关于动态共享库的其他工作是什么(我只是说在编译时完成的静态链接步骤)?
ld 必须检查提供的动态共享库中是否存在未定义的符号此外,我会对您使用的有关 ELF 格式以及动态链接和加载过程的指针(书籍、在线文档)感兴趣。
虽然您ld在链接到 ELF 共享库时遇到了最明显的事情,但还有一些您错过了。我将重新陈述您提到的那些并添加更多内容:
确保解析所有未定义的符号(除非输出本身是共享库,在这种情况下未定义的符号是有效的)。
在输出文件DT_NEEDED的_DYNAMIC对象记录中存储对库的引用。
如果输出不是位置无关的并且引用了共享库中的对象(在数据意义上,而不是函数),则生成复制重定位以在加载时将对象的原始图像复制到主程序的数据段中,以及正确的符号表条目,以便对共享库本身中的对象的引用解析为主程序中的新副本,而不是库中的原始副本。
为输出中每个函数调用的目标生成 PLT thunk,这些函数调用在ld-time 中未解析为输出中的定义。
这些是我能想到的特定于使用共享库的任务,当然不包括链接器已经完成的所有工作,这些工作与静态链接相同。考虑ld动态链接的作用的一种方法是,它采用具有大量重定位类型(代表编译器或汇编器可以生成的任何内容)的目标文件,并解析除少数之外的所有内容(对于静态链接,该数量将为零),其中所有剩余的重定位都适合在加载时动态链接器可解析的更有限的类型集。
| 归档时间: |
|
| 查看次数: |
2058 次 |
| 最近记录: |