- 论坛徽章:
- 0
|
原帖由 cugb_cat 于 2010-1-28 23:16 发表 ![]()
全局变量的地址还能变?值能变是肯定的,根据编译器编译后的内存布局,可以在f中找到gi的位置,但是改变地址,该咋做呢?
我举个极端的例子:
fflush函数部分代码 , gcc编译 , powerpc架构
.text0:8001DB78 .long 0x34804
.text0:8001DB7C
.text0:8001DB7C fflush:
.text0:8001DB7C
.text0:8001DB7C .set var_10, -0x10
.text0:8001DB7C .set var_C, -0xC
.text0:8001DB7C .set var_8, -8
.text0:8001DB7C .set var_4, -4
.text0:8001DB7C .set arg_4, 4
.text0:8001DB7C
.text0:8001DB7C stwu %sp, -0x20(%sp)
.text0:8001DB80 mflr %r0
.text0:8001DB84 stw %r28, 0x20+var_10(%sp)
.text0:8001DB88 stw %r29, 0x20+var_C(%sp)
.text0:8001DB8C stw %r30, 0x20+var_8(%sp)
.text0:8001DB90 stw %r31, 0x20+var_4(%sp)
.text0:8001DB94 stw %r0, 0x20+arg_4(%sp)
.text0:8001DB98 bl loc_8001DB9C
.text0:8001DB9C
.text0:8001DB9C loc_8001DB9C:
.text0:8001DB9C mflr %r30
.text0:8001DBA0 lwz %r0, -0x24(%r30)
.text0:8001DBA4 add %r30, %r0, %r30
.text0:8001DBA8 mr. %r31, %r3
.text0:8001DBAC bne loc_8001DBC4
.text0:8001DBB0 lwz %r9, -0x8000(%r30)
.text0:8001DBB4 lwz %r4, -0x7FFC(%r30)
红色部分为"全局变量" . r30的值 - 0x8000 的结果就是全局变量的"地址".
原本r30的值是不变 , 也就是全局变量的"地址"是不变的 , 它是在代码段中.
但某种情况下 , 如果r30的值被修改了(可以办到) , 那么本来不可能的情况就出现了. |
|