首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

只读变量编译期与运行期的地址不一致,求解?解决思路

2012-04-05 
只读变量编译期与运行期的地址不一致,求解?C/C++ code#include stdio.h#include stdlib.hint data_arr

只读变量编译期与运行期的地址不一致,求解?

C/C++ code
#include <stdio.h>#include <stdlib.h>int data_array[1024 * 1024] = {0};int data = 0;int i1 = 1;int i2 = 1;char* t1 = "1234556";char* t2 = "1234556";int main(int argc, char* argv[]){    int i3 = 5;    int i4 = 5;    printf("data:  %p, %p\n", &i1, &i2);    printf("bss:   %p, %p\n", data_array, &data);    printf("rodata:%p, %p\n", t1, t2);    printf("stack: %p, %p\n", &i3, &i4);    pause();    return 0;}



nm工具查看编译期分配地址,t1,t2分配到Data区间
0000000000a00980 B data
0000000000600980 B data_array
0000000000600940 W data_start
0000000000600960 b dtor_idx.6147
00000000004004b0 t frame_dummy
0000000000600948 D i1
000000000060094c D i2
00000000004004e0 T main
  U pause@@GLIBC_2.2.5
  U printf@@GLIBC_2.2.5
0000000000600950 D t1
0000000000600958 D t2

运行期分配到只读页面区间
./rodata 
data: 0x600948, 0x60094c
bss: 0x600980, 0xa00980
rodata:0x400694, 0x400694
stack: 0x7fff3d1ff824, 0x7fff3d1ff820


[解决办法]
为什么要一样呢?c语言标准有规定说要一样么?
[解决办法]
这个世界上有一样东西叫做 loader.
[解决办法]
程序有所谓的 VMA/LMA地址,可google/baidu一下,或参考书籍《Liners and Loaders》,或:
如果是windows平台,研究一下PE格式,有些工具可以使用,如PEiD;
如果是linux平台,研究一下elf文件格式,辅助工具有很多,如nm,objdump等。
[解决办法]
不一样正常,你多试几个程序。

热点排行