最新消息:

书上说代码地址总是从0x400000开始,但是查看编译好的elf头起始地址是从0开始的,这是为什么?

学习 eben 941浏览 0评论

书上说程序开始的地址总是0x400000,但是在Ubuntu上编译出的elf文件头是从0x1060进入程序的,而在windows上编译同样的程序后显示的地址是符合书上描述的0x400000

我在网上查的很多人的文章里elf程序头的入口也是0x400000附近,是我漏掉了什么步骤吗?

书上说代码地址总是从0x400000开始,但是查看编译好的elf头起始地址是从0开始的,这是为什么?-1

Windows 的这个 0x400000是有历史原因的

0x400000 就是 4 MB

当Windows 还是16位的Win 3.x的时候,Windows内核占用4MB的地址,不是说4MB内存而是4MB的地址空间

当Win 9x系列出现的时候,为了兼容早期的Win 3.x,就为Win 3.x保留了 最低位的 4MB地址空间,并且在Win 9x里 这 4MB里面还加载了一套 Win3.x的部分内核,比如 kernel.dll user.dll gdi.dll等

到了WinNT内核,为了兼容 Win9x,还是保留了这 4MB地址

所以windows上 任何exe的默认其实地址都是 从 0x400000开始,

这都是微软为了兼容付出的代价

现在模块的基址不再重要了,反正都支持动态地址空间配置,运行时操作系统会重新分配基址。

转载请注明:落伍老站长 » 书上说代码地址总是从0x400000开始,但是查看编译好的elf头起始地址是从0开始的,这是为什么?

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址