for o in 0 1 2 3 s fast g; do g++ -O$o main.cpp -o exe.$o; done
已收到
-rwxrwxr-x 1 user user 15848 Oct 16 15:35 exe.0*
-rwxrwxr-x 1 user user 15848 Oct 16 15:35 exe.1*
-rwxrwxr-x 1 user user 15848 Oct 16 15:35 exe.2*
-rwxrwxr-x 1 user user 15808 Oct 16 15:35 exe.3*
-rwxrwxr-x 1 user user 17320 Oct 16 15:35 exe.fast*
-rwxrwxr-x 1 user user 15848 Oct 16 15:35 exe.g*
-rwxrwxr-x 1 user user 15848 Oct 16 15:35 exe.s*
_ZZ3barvE1x找到生成的二进制文件中符号的位置:
for f in exe*; do echo $f; objdump -t $f | grep _ZZ3barvE1x; done
结果
exe.0
0000000000002010 l O .rodata 0000000000000014 _ZZ3barvE1x
exe.1
0000000000002010 l O .rodata 0000000000000014 _ZZ3barvE1x
exe.2
0000000000002010 l O .rodata 0000000000000014 _ZZ3barvE1x
exe.3
exe.fast
exe.g
0000000000002010 l O .rodata 0000000000000014 _ZZ3barvE1x
exe.s
0000000000002010 l O .rodata 0000000000000014 _ZZ3barvE1x
-O3并对其-Ofast进行了优化,bar()::x
在所有其他情况下,该符号位于.rodata部分0x2010。
地点rodata
objdump -h exe.0 | head -5; for f in exe*; do echo $f; objdump -h $f | grep rodata; done
我不知道链接上的窗口显示什么,但
objdump在这两种情况下,它都显示符号_ZZ3barvE1x放置在.rodataoffset处0x2010。我使用 g++ v11.4.0 编译器和所有关键
-O选项编译了您的示例:已收到
_ZZ3barvE1x找到生成的二进制文件中符号的位置:结果
-O3并对其-Ofast进行了优化,bar()::x.rodata部分0x2010。地点
rodata所有文件中的节都
rodata位于偏移量处0x2000,并且在所有情况下都加载到虚拟地址0x2000章节内容
rodata可以看到,虚拟地址
0x2010包含一个数组[1,2,3,4,5]在使用键
-O3和编译的文件中-Ofast,常量bar()::x没有进行任何优化,因此在这些文件中它rodata要短得多:全部的
在所有情况下,常量
bar()::x都位于二进制文件中的同一位置。或者根本不存在))