以下是一个非常好的参考:http : //www.ibm.com/developerworks/linux/library/l-dynamic-libraries/。它在不同级别的各种不同参考文献的末尾都包含一个参考书目。如果您想了解每一个细节,可以直接访问源:http : //www.akkadia.org/drepper/dsohowto.pdf。(Ulrich Drepper编写了Linux动态链接器。)
通过运行“ objdump -h myexe”或“ readelf -S myexe”之类的命令,您可以对可执行文件中的所有部分获得非常好的了解。
.interp部分包含动态加载程序的名称,该名称将用于动态链接此对象中的符号。.dynamic节是对程序头的精炼,其格式易于动态加载程序读取。(因此,它具有指向所有其他部分的指针。)
.got(全局偏移表)和.plt(过程链接表)是由动态链接器操纵的两个主要结构。.got是变量的间接表,.plt是函数的间接表。每个可执行文件或库(称为“共享库”)都有其自己的.got和.plt,这些是该共享库所引用的符号的表,这些表实际上包含在其他共享库中。
.dynsyn包含有关共享库中符号的所有信息(定义的符号和需要引用的外部符号。).dynsyn不包含实际的符号名称。这些包含在.dynstr中,而.dynsyn具有指向.dynstr的指针。.gnu.hash是用于按名称快速查找符号的哈希表。它还仅包含指针(指向.dynstr的指针和用于创建存储桶链的指针。)
当共享对象取消引用某个符号“ foo”时,动态链接程序必须在要链接的所有动态对象中查找“ foo”,以找出哪个对象包含要查找的“ foo”(然后是相对的)。动态链接器通过搜索所有链接的共享库的.gnu.hash节(或在.hash节中查找没有.gnu的旧共享库)来实现此目的。哈希部分。)一旦在链接的共享库中找到正确的地址,就会将其放入共享库的.got或.plt中。