书上说代码地址总是从0x400000开始，但是查看编译好的elf头起始地址是从0开始的，这是为什么？
书上说程序开始的地址总是0x400000，但是在Ubuntu上编译出的elf文件头是从0x1060进入程序的，而在windows上编译同样的程序后显示的地址是符合书上描述的0x400000

我在网上查的很多人的文章里elf程序头的入口也是0x400000附近，是我漏掉了什么步骤吗？
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开始，

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

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