一、首先看一个简单的程序:

   #include<stdlib.h>

   int main()
{
while(1)
{
sleep(1000);
}
return 0;
}

gcc -static SectionMapping.c -o SectionMapping.elf
/usr/bin/ld: cannot find
-lc

yum install glibc-static 

查看一下静态链接之后,SectionMapping.elf的段分布情况

readelf -S SectionMapping.elf

There are 34 section headers, starting at offset 0xd0aa0:

Section Headers:
[Nr] Name Type Address Offset
Size EntSize Flags Link Info Align
[ 0] NULL 0000000000000000 00000000
0000000000000000 0000000000000000 0 0 0
[ 1] .note.ABI-tag NOTE 0000000000400190 00000190
0000000000000020 0000000000000000 A 0 0 4
[ 2] .note.gnu.build-i NOTE 00000000004001b0 000001b0
0000000000000024 0000000000000000 A 0 0 4
[ 3] .rela.plt RELA 00000000004001d8 000001d8
0000000000000108 0000000000000018 AI 0 25 8
[ 4] .init PROGBITS 00000000004002e0 000002e0
000000000000001a 0000000000000000 AX 0 0 4
[ 5] .plt PROGBITS 0000000000400300 00000300
00000000000000b0 0000000000000000 AX 0 0 16
[ 6] .text PROGBITS 00000000004003b0 000003b0
0000000000091916 0000000000000000 AX 0 0 16
[ 7] __libc_thread_fre PROGBITS 0000000000491cd0 00091cd0
00000000000000b2 0000000000000000 AX 0 0 16
[ 8] __libc_freeres_fn PROGBITS 0000000000491d90 00091d90
0000000000001aef 0000000000000000 AX 0 0 16
[ 9] .fini PROGBITS 0000000000493880 00093880
0000000000000009 0000000000000000 AX 0 0 4
[10] .rodata PROGBITS 00000000004938a0 000938a0
00000000000196f8 0000000000000000 A 0 0 32
[11] .stapsdt.base PROGBITS 00000000004acf98 000acf98
0000000000000001 0000000000000000 A 0 0 1
[12] __libc_thread_sub PROGBITS 00000000004acfa0 000acfa0
0000000000000008 0000000000000000 A 0 0 8
[13] __libc_subfreeres PROGBITS 00000000004acfa8 000acfa8
0000000000000050 0000000000000000 A 0 0 8
[14] __libc_IO_vtables PROGBITS 00000000004ad000 000ad000
00000000000006a8 0000000000000000 A 0 0 32
[15] __libc_atexit PROGBITS 00000000004ad6a8 000ad6a8
0000000000000008 0000000000000000 A 0 0 8
[16] .eh_frame PROGBITS 00000000004ad6b0 000ad6b0
000000000000e234 0000000000000000 A 0 0 8
[17] .gcc_except_table PROGBITS 00000000004bb8e4 000bb8e4
0000000000000105 0000000000000000 A 0 0 1
[18] .tdata PROGBITS 00000000006bbeb0 000bbeb0
0000000000000020 0000000000000000 WAT 0 0 16
[19] .tbss NOBITS 00000000006bbed0 000bbed0
0000000000000038 0000000000000000 WAT 0 0 16
[20] .init_array INIT_ARRAY 00000000006bbed0 000bbed0
0000000000000010 0000000000000008 WA 0 0 8
[21] .fini_array FINI_ARRAY 00000000006bbee0 000bbee0
0000000000000010 0000000000000008 WA 0 0 8
[22] .jcr PROGBITS 00000000006bbef0 000bbef0
0000000000000008 0000000000000000 WA 0 0 8
[23] .data.rel.ro PROGBITS 00000000006bbf00 000bbf00
00000000000000e4 0000000000000000 WA 0 0 32
[24] .got PROGBITS 00000000006bbfe8 000bbfe8
0000000000000008 0000000000000008 WA 0 0 8
[25] .got.plt PROGBITS 00000000006bc000 000bc000
0000000000000070 0000000000000008 WA 0 0 8
[26] .data PROGBITS 00000000006bc080 000bc080
0000000000001690 0000000000000000 WA 0 0 32
[27] .bss NOBITS 00000000006bd720 000bd710
0000000000002158 0000000000000000 WA 0 0 32
[28] __libc_freeres_pt NOBITS 00000000006bf878 000bd710
0000000000000030 0000000000000000 WA 0 0 8
[29] .comment PROGBITS 0000000000000000 000bd710
000000000000002d 0000000000000001 MS 0 0 1
[30] .note.stapsdt NOTE 0000000000000000 000bd740
0000000000000f88 0000000000000000 0 0 4
[31] .symtab SYMTAB 0000000000000000 000be6c8
000000000000b9e8 0000000000000018 32 815 8
[32] .strtab STRTAB 0000000000000000 000ca0b0
0000000000006870 0000000000000000 0 0 1
[33] .shstrtab STRTAB 0000000000000000 000d0920
000000000000017b 0000000000000000 0 0 1
Key to Flags:
W (write), A (alloc), X (execute), M (merge), S (strings), I (info),
L (link order), O (extra OS processing required), G (group), T (TLS),
C (compressed), x (unknown), o (OS specific), E (exclude),
l (large), p (processor specific)

 可执行文件中共有33个段。

readelf -l SectionMapping.elf: 查看elf文件的Segment 即程序头。它描述ELF文件该如何被映射到进程的虚拟地址空间

Elf file type is EXEC (Executable file)
Entry point 0x400ecd
There are 6 program headers, starting at offset 64 Program Headers:
Type Offset VirtAddr PhysAddr
FileSiz MemSiz Flags Align
LOAD 0x0000000000000000 0x0000000000400000 0x0000000000400000
0x00000000000bb9e9 0x00000000000bb9e9 R E 200000
LOAD 0x00000000000bbeb0 0x00000000006bbeb0 0x00000000006bbeb0
0x0000000000001860 0x00000000000039f8 RW 200000
NOTE 0x0000000000000190 0x0000000000400190 0x0000000000400190
0x0000000000000044 0x0000000000000044 R 4
TLS 0x00000000000bbeb0 0x00000000006bbeb0 0x00000000006bbeb0
0x0000000000000020 0x0000000000000058 R 10
GNU_STACK 0x0000000000000000 0x0000000000000000 0x0000000000000000
0x0000000000000000 0x0000000000000000 RW 10
GNU_RELRO 0x00000000000bbeb0 0x00000000006bbeb0 0x00000000006bbeb0
0x0000000000000150 0x0000000000000150 R 1 Section to Segment mapping:
Segment Sections...
00 .note.ABI-tag .note.gnu.build-id .rela.plt .init .plt .text __libc_thread_freeres_fn __libc_freeres_fn .fini .rodata .stapsdt.base __libc_thread_subfreeres __libc_subfreeres __libc_IO_vtables __libc_atexit .eh_frame .gcc_except_table
01 .tdata .init_array .fini_array .jcr .data.rel.ro .got .got.plt .data .bss __libc_freeres_ptrs
02 .note.ABI-tag .note.gnu.build-id
03 .tdata .tbss
04
05 .tdata .init_array .fini_array .jcr .data.rel.ro .got

  

二、堆和栈

在操作系统中,VMA除了被用来映射可执行文件中的各个"segment"以外,他还可以有其他作用。操作系统通过使用VMA来管理进程的地址空间。程序执行时,要用到栈和堆,事实上,它们也是以VMA的形式存在。一般情况,一个进程中的栈和堆分别都有一个对应的VMA。在Linux中可以由/proc查看:

./SectionMapping.elf &
[1] 59117
[root@tlinux /]# cat /proc/59117/maps

00400000-004bc000 r-xp 00000000 08:05 4456                               /SectionMapping.elf
006bb000-006be000 rw-p 000bb000 08:05 4456 /SectionMapping.elf
006be000-006c0000 rw-p 00000000 00:00 0
017e1000-01804000 rw-p 00000000 00:00 0 [heap]
7ffc12ce6000-7ffc12d07000 rw-p 00000000 00:00 0 [stack]
7ffc12db7000-7ffc12db9000 r-xp 00000000 00:00 0 [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]

输出中:第一列是VMA地址范围,第二列是VMA权限,“p”表示私有,“s”表示共享。第三列是偏移。表示VMA对应的Segment在映像文件中的偏移。第四列是映像文件的主设备号与次设备号。第五列表示文件结点。

binary hacks读数笔记(堆、栈 VMA的分布)的更多相关文章

  1. binary hacks读数笔记(装载)

    1.地址空间 在linux系统中,每个进程拥有自己独立的虚拟地址空间,这个虚拟地址空间的大小是由计算机硬件决定的,具体地说,是由CPU的位数决定的.比如,32位硬件平台决定的虚拟地址空间大小:0--2 ...

  2. binary hacks读数笔记(readelf基本命令)

    一.首先对readelf常用的参数进行简单说明: readelf命令是Linux下的分析ELF文件的命令,这个命令在分析ELF文件格式时非常有用,下面以ELF格式可执行文件test为例详细介绍: 1. ...

  3. binary hacks读数笔记(ld 链接讲解 二)

    这块将介绍一下ld链接命令的具体使用.ld的作用:ld是GNU binutils工具集中的一个,是众多Linkers(链接器)的一种.完成的功能自然也就是链接器的基本功能:把各种目标文件和库文件链接起 ...

  4. binary hacks读数笔记(ld 链接讲解 一)

    首先我们先看两段代码: a.c extern int shared; int main(){ int a=100; swap(&a,&shared); } b.c int shared ...

  5. binary hacks读数笔记(objdump命令)

    一.首先看一下几个常用参数的基本含义: objdump命令是Linux下的反汇编目标文件或者可执行文件的命令,它还有其他作用,下面以ELF格式可执行文件test为例详细介绍: 1.objdump -f ...

  6. binary hacks读数笔记(共享库)

    共享库从文件结构上来讲,与共享对象没什么区别.Linux下,共享库就是普通的ELF共享对象. 1.共享库命名: libname.so.x.y.z :其中最前面使用前缀lib,中间是库的名字和后缀&qu ...

  7. binary hacks读数笔记(dlopen、dlsym、dlerror、dlclose)

    1.dlopen是一个强大的库函数.该函数将打开一个动态库,并把它装入内存.该函数主要用来加载库中的符号,这些符号在编译的时候是不知道的.比如 Apache Web 服务器利用这个函数在运行过程中加载 ...

  8. binary hacks读数笔记(nm命令)

    nm命令(names):输出包含三个部分:1 符号值.默认显示十六进制,也可以指定: 2 符号类型.小写表示是本地符号,大写表示全局符号(external); 3 符号名称. 例如:nm Simple ...

  9. binary hacks读数笔记(readelf命令)

    可以用readelf命令来查看elf文件内容,跟objdump相比,这个命令更详细. 1. readelf -h SimpleSection.o ELF Header: Magic: 7f 45 4c ...

随机推荐

  1. 【转】了解nodejs、javascript间的关系!bom&dom&ecmascript

    地址:https://www.cnblogs.com/JetpropelledSnake/p/9450810.html bom&dom:https://www.cnblogs.com/wang ...

  2. JVM系列【6】GC与调优1

    JVM系列笔记目录 虚拟机的基础概念 class文件结构 class文件加载过程 jvm内存模型 JVM常用指令 GC与调优 GC基础知识 什么是垃圾 ​ 没有任何引用指向的一个对象或多个对象(循环引 ...

  3. Git hub加载慢?下载慢?浏览慢?几个小技巧让你一键起飞!

    记得,那是一个风和日丽,艳阳高照的夜晚,只因为当初的一次回眸,于是便决然走向了程序员的道路,从此,CV大法心中记,代码伴我身. 这一天,正当我打开电脑准备开开心心的使用CV大法完成任务的时候,却恼人的 ...

  4. Monkey常用操作

    原文:https://www.cnblogs.com/lauren1003/p/6193277.html 一.Monkey测试原理:Monkey是Android中的一个命令行工具,可以运行在模拟器里或 ...

  5. elk-安装 通过docker

      一. github地址   https://github.com/deviantony/docker-elk   cd /usr/local/src   git clone https://git ...

  6. spring boot:shardingsphere+druid整合seata分布式事务(spring boot 2.3.3)

    一,shardingshpere为什么要整合seata? 分库分表是数据库扩展中最常用的处理方法, shardingshpere作为使用最广泛的分表中间件, 如果不支持分布式事务,则它的数据一致性就会 ...

  7. Flink + 强化学习 搭建实时推荐系统

    如今的推荐系统,对于实时性的要求越来越高,实时推荐的流程大致可以概括为这样: 推荐系统对于用户的请求产生推荐,用户对推荐结果作出反馈 (购买/点击/离开等等),推荐系统再根据用户反馈作出新的推荐.这个 ...

  8. HTML5/HTML 4.01/XHTML 元素和有效的 DTD

    HTML5/HTML 4.01/XHTML 元素和有效的 DTD 下面的表格列出了所有的 HTML5/HTML 4.01/XHTML 元素,以及它们会出现在什么文档类型 (DTD) 中: 标签 HTM ...

  9. lerna管理前端模块实践

    最近在工作中使用了 lerna 进行前端包的管理,效率提升了很多.所以打算总结一下最近几个月使用 lerna 的一些心得.有那些不足的地方,请包涵. 该篇文章主要包括在使用 lerna 的一些注意事项 ...

  10. 源代码 VS 汇编代码 VS 目标代码 VS 字节码 VS 机器码

    1.源代码(source code) 源代码就是平时我们开发的代码:比如C.Java.Python.Shell...等 public class HelloWorld { public static ...