运行时链接程序在装入应用程序所需的全部依赖项之后,将会处理每个目标文件并执行所有必需的重定位。
在目标文件的链接编辑过程中,随输入可重定位目标文件提供的任何重定位信息均会应用于输出文件。但是,在创建动态可执行文件或共享目标文件时,许多重定位无法在链接编辑时完成。这些重定位需要仅在目标文件装入内存时才知道的逻辑地址。在这种情况下,链接编辑器将在输出文件映像中生成新的重定位记录。然后,运行时链接程序必须处理这些新的重定位记录。
有关许多重定位类型的更详细说明,请参见重定位。重定位存在两个基本类型。
使用 elfdump(1) 可以显示目标文件的重定位记录。在以下示例中,文件 libbar.so.1 包含两条重定位记录,用于指示必须更新全局偏移表或 .got 节。
$ elfdump -r libbar.so.1 Relocation Section: .rel.got: type offset section symbol R_SPARC_RELATIVE 0x10438 .rel.got R_SPARC_GLOB_DAT 0x1043c .rel.got foo
第一个重定位是一个简单的相对重定位,这可通过重定位类型以及没有符号引用看出。此重定位需要使用将目标文件装入内存的基本地址来更新关联的 .got 偏移。
第二个重定位需要符号 foo 的地址。要完成此重定位,运行时链接程序必须从动态可执行文件或其依赖项之一查找该符号。