## Linux 中的共享库与加载时重定位
本文解释了 Linux 如何利用加载时重定位来实现共享库的使用。与加载到固定地址的可执行文件不同,共享库会动态加载到可用的虚拟内存中,这意味着它们的最终地址直到运行时才可知。这带来了一个挑战:库中的代码通常引用库*内部*的数据(如全局变量)或其他函数,需要编译期间未固定的地址。
加载时重定位通过最初在库的代码中嵌入占位符地址(如 0x0)来解决这个问题。一个重定位段详细说明了这些占位符的位置以及它们所引用的符号。当库被加载时,动态加载器会根据库的实际运行时地址调整这些占位符,从而有效地“重定位”这些引用。
例如,对库内函数的调用最初包含相对偏移量。动态加载器根据库的加载地址计算绝对地址并更新指令。类似地,对全局变量的访问会被修补为正确的内存位置。
虽然位置无关代码 (PIC) 现在是首选方法,但理解加载时重定位可以提供共享库如何工作的基本理解,并简化对 PIC 概念的掌握。此过程对于现代操作系统的有效内存使用和代码共享至关重要。