在为最终可能与某个类的目标代码链接的主要功能分解C ++目标代码时,我偶然发现了一个奇怪的情况。
没有显式调用析构函数,并且该对象不是通过复制构造函数构造的。在第30行,通过 bl 调用析构函数,然后在第54行再次调用。但是,主函数应该已经在第48行使用 blr 指令退出了... / p>
int main(void){
c: 90 01 00 24 stw r0,36(r1)
10: 93 e1 00 1c stw r31,28(r1)
int temp;
SimpleMemory mem;
14: 48 00 00 01 bl 14 <main+0x14>
14: R_PPC_REL24 _ZN12SimpleMemoryC1Ev
mem.setData(42);
18: 38 61 00 08 addi r3,r1,8
1c: 38 80 00 2a li r4,42
20: 48 00 00 01 bl 20 <main+0x20>
20: R_PPC_REL24 _ZN12SimpleMemory7setDataEi
temp = mem.getData();
24: 38 61 00 08 addi r3,r1,8
28: 48 00 00 01 bl 28 <main+0x28>
28: R_PPC_REL24 _ZN12SimpleMemory7getDataEv
2c: 38 61 00 08 addi r3,r1,8
30: 48 00 00 01 bl 30 <main+0x30>
30: R_PPC_REL24 _ZN12SimpleMemoryD1Ev
return 0;
34: 80 01 00 24 lwz r0,36(r1)
38: 38 60 00 00 li r3,0
3c: 83 e1 00 1c lwz r31,28(r1)
40: 38 21 00 20 addi r1,r1,32
44: 7c 08 03 a6 mtlr r0
48: 4e 80 00 20 blr
4c: 7c 7f 1b 78 mr r31,r3
50: 38 61 00 08 addi r3,r1,8
54: 48 00 00 01 bl 54 <main+0x54>
54: R_PPC_REL24 _ZN12SimpleMemoryD1Ev
58: 7f e3 fb 78 mr r3,r31
5c: 48 00 00 01 bl 5c <main+0x5c>
5c: R_PPC_REL24 _Unwind_Resume
通过混淆对象成员函数调用的不同组合,每当至少有一个成员函数调用(无论它是什么)时,都会引入第二个析构函数调用。
那么基本上,为什么会有两个具有相同重定位符号的间接函数调用?
我正在使用的编译器是GCC DDCI PowerPC ELF 4.6.1-1。