### Date: 2017/9/27
假设 module.c 中引用了一个共享模块中定义的全局变量 global,
编译器无法确定变量 global 的定义是在模块内部还是外部。假设 module.c 是可执行文件的一个源文件,可执行程序不是 PIC 的,不会进行重定位。链接器会在 .bss 段创建一个 global 变量的副本,这样造成同一个变量同时存在于多个位置。问题的解决办法是让所有对变量 global 的访问都指向可执行文件中的那个副本。
ELF 共享库在编译时,默认把所有全局变量都当作是定义在其他模块中,通过 GOT 表实现外部访问。当共享模块被装载时,如果某个全局变量在可执行文件中拥有副本,动态链接器就把 GOT 表中的相应地址指向该副本。如果该变量在可执行文件中没有副本,那么 GOT 表中的相应地址就指向模块内部的该变量副本。