【PE】Windows平台全局变量动态链接问题

在Windows平台中,当一个可执行文件的模块.c引用全局变量global时,可能存在重复定义的问题。通常,链接器会在.bss段创建global的副本。解决方法是使用__declspec(dllexport)和__declspec(dllimport)确保所有访问指向正确副本。动态链接器通过GOT表处理全局变量,若变量在可执行文件中有副本,则指向该副本,否则指向动态库内部副本。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

### Date: 2017/9/27

假设 module.c 中引用了一个共享模块中定义的全局变量 global,

     编译器无法确定变量 global 的定义是在模块内部还是外部。假设 module.c 是可执行文件的一个源文件,可执行程序不是 PIC 的,不会进行重定位。链接器会在 .bss 段创建一个 global 变量的副本,这样造成同一个变量同时存在于多个位置。问题的解决办法是让所有对变量 global 的访问都指向可执行文件中的那个副本。

      ELF 共享库在编译时,默认把所有全局变量都当作是定义在其他模块中,通过 GOT 表实现外部访问。当共享模块被装载时,如果某个全局变量在可执行文件中拥有副本,动态链接器就把 GOT 表中的相应地址指向该副本。如果该变量在可执行文件中没有副本,那么 GOT 表中的相应地址就指向模块内部的该变量副本。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

飞翔的鲲

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值