【发布时间】:2016-01-11 23:38:20
【问题描述】:
对于以下代码:
#include <stdio.h>
int main() {
printf("Hello World");
printf("Hello World1");
return 0;
}
调用printf生成的程序集如下(64位):
400474: be 24 06 40 00 mov esi,0x400624
400479: bf 01 00 00 00 mov edi,0x1
40047e: 31 c0 xor eax,eax
400480: e8 db ff ff ff call 400460 <__printf_chk@plt>
400485: be 30 06 40 00 mov esi,0x400630
40048a: bf 01 00 00 00 mov edi,0x1
40048f: 31 c0 xor eax,eax
400491: e8 ca ff ff ff call 400460 <__printf_chk@plt>
而.rodata部分如下:
Contents of section .rodata:
400620 01000200 48656c6c 6f20576f 726c6400 ....Hello World.
400630 48656c6c 6f20576f 726c6431 00 Hello World1.
根据汇编代码,对 printf 的第一次调用具有地址为 400624 的参数,该参数与 .rodata 的开头有 4 个字节的偏移量。我知道它在这里跳过了这 4 个点前缀的前 4 个字节。但我的问题是为什么 GCC/链接器会为 .rodata 中的字符串生成这个前缀?我在 Ubuntu 14.04 上使用 4.8.4 GCC。编译cmd就是:gcc -Ofast my-source.c -o my-program。
【问题讨论】:
-
那些不是点。 objdump(或您正在使用的任何东西)正在打印点,因为那里没有有效字符。 (同样的原因它为空终止符显示点)