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

yulinlin123 2011-11-06 05:36:04
#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
...全文
87 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
我的送神 2011-11-10
  • 打赏
  • 举报
回复
不一样正常,你多试几个程序。
lengxujun 2011-11-10
  • 打赏
  • 举报
回复
程序有所谓的 VMA/LMA地址,可google/baidu一下,或参考书籍《Liners and Loaders》,或:
如果是windows平台,研究一下PE格式,有些工具可以使用,如PEiD;
如果是linux平台,研究一下elf文件格式,辅助工具有很多,如nm,objdump等。
lengxujun 2011-11-06
  • 打赏
  • 举报
回复
这个世界上有一样东西叫做 loader.
taodm 2011-11-06
  • 打赏
  • 举报
回复
为什么要一样呢?c语言标准有规定说要一样么?

64,649

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧