加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

为什么Linux程序.text部分从0x0804800开始,堆栈顶部从0xbffffff

发布时间:2020-12-14 01:18:21 所属栏目:Linux 来源:网络整理
导读:根据 Assembly Primer For Hackers (Part 2) Virtual Memory Organization,Linux程序.text部分从0x0804800开始,堆栈顶部从0xbffffff开始.这些数字有什么意义?为什么不在0x0000000处启动.text(或0x0000020或0x0000040以接下来的NULL或接下来的32位或64位)?
根据 Assembly Primer For Hackers (Part 2) Virtual Memory Organization,Linux程序.text部分从0x0804800开始,堆栈顶部从0xbffffff开始.这些数字有什么意义?为什么不在0x0000000处启动.text(或0x0000020或0x0000040以接下来的NULL或接下来的32位或64位)?为什么不在0xfffffff处启动堆栈顶部?

解决方法

让我们首先说一下:大部分时间,各个部分不需要放在特定的位置,更重要的是布局.如今,堆栈顶部实际上是随机的,见 here.

0x08048000是ld在Linux / x86上启动第一个PT_LOAD段的默认地址.在Linux / amd64上,默认值为0x400000,您可以使用自定义链接描述文件更改默认值.您还可以将.text部分以-Wl,-Ttext,0xNNNNNNNN标志开头的位置更改为gcc.要理解为什么.text没有映射到地址0,请记住,为方便起见,NULL指针通常映射到((void *)0).因此,将零页面映射为不可访问以捕获NULL指针的使用是有用的. .text开始之前的内存实际上被很多东西使用了;以cat / proc / self / maps为例:

$cat /proc/self/maps 
001c0000-00317000 r-xp 00000000 08:01 245836     /lib/libc-2.12.1.so
00317000-00318000 ---p 00157000 08:01 245836     /lib/libc-2.12.1.so
00318000-0031a000 r--p 00157000 08:01 245836     /lib/libc-2.12.1.so
0031a000-0031b000 rw-p 00159000 08:01 245836     /lib/libc-2.12.1.so
0031b000-0031e000 rw-p 00000000 00:00 0 
00376000-00377000 r-xp 00000000 00:00 0          [vdso]
00852000-0086e000 r-xp 00000000 08:01 245783     /lib/ld-2.12.1.so
0086e000-0086f000 r--p 0001b000 08:01 245783     /lib/ld-2.12.1.so
0086f000-00870000 rw-p 0001c000 08:01 245783     /lib/ld-2.12.1.so
08048000-08051000 r-xp 00000000 08:01 2244617    /bin/cat
08051000-08052000 r--p 00008000 08:01 2244617    /bin/cat
08052000-08053000 rw-p 00009000 08:01 2244617    /bin/cat
09ab5000-09ad6000 rw-p 00000000 00:00 0          [heap]
b7502000-b7702000 r--p 00000000 08:01 4456455    /usr/lib/locale/locale-archive
b7702000-b7703000 rw-p 00000000 00:00 0 
b771b000-b771c000 r--p 002a1000 08:01 4456455    /usr/lib/locale/locale-archive
b771c000-b771e000 rw-p 00000000 00:00 0 
bfbd9000-bfbfa000 rw-p 00000000 00:00 0          [stack]

我们在这里看到的是C库,动态加载器ld.so和内核VDSO(内核映射动态代码库,它为内核提供了一些接口).请注意,堆的开始也是随机的.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读