so库的static 变量深入了解

本文详细探讨了Linux环境下动态链接库(SO)中static变量的工作原理。static变量存储于数据段,加载SO时通过内存映射放入进程地址空间。在多进程共享时,静态全局变量以Copy-On-Write方式实现。如果两个SO都初始化同一个static变量,系统仅认可第一次初始化。通过示例代码和readelf命令,展示了static变量的全局性和初始化行为。
摘要由CSDN通过智能技术生成

理解 so 的机制

    进程内存空间分成代码段(code),数据段(data),堆(heap),  栈(stack), 考虑加载 .so,进程空间应该不只一份 code 和 data segment)

    static 变量保存可执行文件或 so 的数据段(data segement) 中,并且有初始值

     编译程序在在 link 的时候,为 static 分配地址到数据段,当so被 load 的时候,应该是直接把so 用物理内存映射的放到load进程地址空间,用户可以直接读取 static 变量;但当用户改写此 static 变量的时候,操作系统会重新分配物理内存并映射,原来 static 变量使用的进程地址并不改变, 这就是 copy on write, 看下面的摘要:

Shared libraries are loaded into a process by memory-mapping the file into some portion of the process's address-space. When multiple processes load the same library, the OS simply lets them share the same physical RAM.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值