的objdump
拆機輸出可爲您提供有關如何編譯器(gcc
,在這種情況下)一些提示處理這種情況:
$ objdump -d a.out
...
000000000040050c <main>:
40050c: 55 push %rbp
40050d: 48 89 e5 mov %rsp,%rbp
400510: 8b 05 fa 03 20 00 mov 0x2003fa(%rip),%eax # 600910 <x.2163>
400516: 89 c6 mov %eax,%esi
400518: bf fc 05 40 00 mov $0x4005fc,%edi
40051d: b8 00 00 00 00 mov $0x0,%eax
400522: e8 b9 fe ff ff callq 4003e0 <[email protected]>
400527: 8b 05 e7 03 20 00 mov 0x2003e7(%rip),%eax # 600914 <x.2162>
40052d: 89 c6 mov %eax,%esi
40052f: bf fc 05 40 00 mov $0x4005fc,%edi
400534: b8 00 00 00 00 mov $0x0,%eax
400539: e8 a2 fe ff ff callq 4003e0 <[email protected]>
40053e: b8 00 00 00 00 mov $0x0,%eax
400543: 5d pop %rbp
400544: c3 retq
使用readelf
,我們可以發現,每個x
都有自己的符號最後的可執行文件:
$ readelf -s a.out
...
45: 0000000000600910 4 OBJECT LOCAL DEFAULT 25 x.2163
46: 0000000000600914 4 OBJECT LOCAL DEFAULT 25 x.2162
下面是C語言代碼:
int main()
{
static int x = 8;
{
static int x = 9;
printf("%d",x);
}
printf("%d",x);
return 0;
}
範圍。範圍。範圍。範圍... – devnull
好的,但它是如何在內存中,區分兩個相同名稱的變量。 – pradipta
爲什麼要爲此投票。我希望這只是我錯過的一個概念。 – pradipta