GCC在不应该存在的地方添加了取消引用

时间:2018-07-27 09:50:27

标签: gcc mips gnu

我正在使用gccmips32进行编译,并且在全局范围内声明了一个指向名为OSEvent的结构的指针,如下所示:

OSEvent *__osMainEventQueue = NULL;

此外,某个函数中的代码在调用函数时会引用此指针:

__osEnqueueEvent(event, __osMainEventQueue);

该函数声明如下:

extern void __osEnqueueEvent (OSEvent *event, OSEvent *queue);

但是,在调试此代码时,尽管我没有在其中放置任何东西,但gcc似乎取消了对__osMainEventQueue的指针引用。您可以在反汇编中看到以下内容:

 118:   3c020000    lui v0,0x0
            118: R_MIPS_HI16    __osMainEventQueue
 11c:   8c420000    lw  v0,0(v0)
            11c: R_MIPS_LO16    __osMainEventQueue
 120:   00402825    move    a1,v0
 124:   8fc40018    lw  a0,24(s8)
 128:   0c000000    jal 0 <osScheduleEvent>
            128: R_MIPS_26  __osEnqueueEvent
 12c:   00000000    nop

gcc是否有任何理由会取消引用该指针?我需要用&引用它吗? (这会导致类型不匹配警告,因此我不会认为这是令人满意的解释/答案)

1 个答案:

答案 0 :(得分:3)

没有指针取消引用。代码只是将__osMainEventQueue value 加载到$a1(即它指向的地址)中。

请考虑以下情形:__osMainEventQueue位于地址0x12345678处,并包含值0xDEADBEEF。因此,luilw组合的作用是首先向$v0加载值0x12340000。然后它从0x5678($v0)开始加载,即从(0x12345678)开始加载,因此您最终在0xDEADBEEF中进入了$v0。在此代码中,从不尝试读取(0xDEADBEEF)