【发布时间】:2019-08-25 20:24:01
【问题描述】:
我了解位置无关代码使用当前位置的偏移量,而位置相关代码使用绝对地址。
但是,我不明白为什么共享库必须被视为与位置无关,而静态库则不然?
【问题讨论】:
-
假设您有两个动态库,内存地址重叠。现在一个程序尝试使用(并因此加载)它们。
-
@EOF 内存地址重叠是什么意思?
-
库使用的内存地址集不是(成对)不相交的。 IOW,集合之间存在(非空)成对交集。
-
如果
libA使用地址0x20000的内存来存储代码或数据,而libB使用地址0x20000的内存来存储其他代码或数据,那是行不通的。 -
请记住,当前的计算实践大多来自 32 位甚至 16 位计算时代。想象一下,为了简单起见,您将 32 位地址空间划分为 1 MiB 块,每个库将获得其中一个。不是你有 4096 个不同的“库块”。加上生日悖论和10-100的千库可供选择,你会发现修复动态库的地址是行不通的。对于 64 位地址空间,您甚至可以侥幸成功,但同时 64 位处理器架构往往包含使 PIC 不那么痛苦的功能。
标签: c shared-libraries static-libraries