一、什么是Map文件
map文件就是通过编译器编译之后,生成的程序、数据及IO空间信息的一种映射文件,里面包含函数大小,入口地址等一些重要信息。从map文件我们可以了解到:
- 程序各区段的寻址是否正确
- 程序各区段的size,即目前存储器的使用量
- 程序中各个symbol的地址
- 各个symbol在存储器中的顺序关系(这在调试时很有用)
- 各个程序文件的存储用量
二、实例说明
1.简单的C 程序,生成map 文件
- main.c
- #include <stdio.h>
- #include "add.h"
- char* Hello="HelloWorld!";
- char array[4]={0,1,2,3};
- char array0[6];
- int g_gloableInt;
- double doubletest = 10;
- char* testP = NULL;
- int* pInt;
- #define READ_SIZE (0x7A0)
- void main(void)
- {
- int a = 5,b = 6,sum=0;
- static int staticInt = 0;
- char data[READ_SIZE]={0};
- int ret = 0;
- FILE* fp = fopen("abuf_apu_nbsm_o1_1_00720.mpg","r");
- //FILE* fp_out = fopen("abuf_apu_nbsm_o1_1_00720_out.mpg","w+");
- FILE* fp_out = fopen("abuf_apu_nbsm_o1_1_00720_out.mpg","w+");
- if(!fp || !fp_out)
- {
- printf("NULL data file!");
- return;
- }
-
- sum=math(a,b);
- printf("sum is %d\n",sum);
- staticInt += sum;
- g_gloableInt =0;
- printf("main=%016llx,math=%016llx,add=%016llx,sub=%016llx\ng_gloableInt=%016llx staticInt=%016llx Hello=%016llx\n",(long long)main,(long long)math,(long long)add,(long long)sub,(long long)&g_gloableInt,(long long)&staticInt,(long long)Hello);
- printf("sizeof(doubletest)=%ld sizeof(testP)=%ld sizeof(array0)=%ld \n",sizeof(doubletest),sizeof(testP),sizeof(array0));
- printf("&doubletest=%016llx,testP=%016llx array0=%016llx\n",(long long)&doubletest,(long long)testP,(long long)array0);
- fseek(fp, 0, SEEK_SET);
- fseek(fp_out, 0, SEEK_SET);
- do
- {
- ret=fread(data,1,READ_SIZE,fp);
- //printf("read %d byte data\n",ret);
- fwrite((data+32),(ret-32),1,fp_out);
- }while(ret==READ_SIZE);
- fclose(fp);
- fclose(fp_out);
- return;
- }
- ---------------------------------------------------------------------------------------
- add.c
- #include "add.h"
- int Min = 10;
- int sub(int* v)
- {
- *v = (*v >Min)? (*v - Min):*v ;
- return 0;
- }
- int add(int a, int b)
- {
- int sum = a+b;
- sub(&sum);
- return sum;
- }
- int math(int a,int b)
- {
- return add(a,b);
- }
- ---------------------------------------------------------------------------------------
- #ifndef __ADD_H__
- #define __ADD_H__
- int math(int a, int b);
- int add(int a, int b);
- int sub(int* a);
- #endif
- --------------------------------------------------------------------------------------
- dummy.c
- #include "dummy.h"
- int dummy_ver0(int dummmy)
- {
- return 0;
- }
- --------------------------------------------------------------------------------------
- #ifndef __DUMMY_H__
- #define __DUMMY_H__
- int dummy_ver0(int dummmy);
- #endif
复制代码
编译命令
gcc main.c add.c -Wl,-Map,add.map -o main
生成的map 文件为:
2.对比C 程序,读map 文件
tmp/testC$ ./main
sum is 1
main=000055854636e83a,math=000055854636eb4d,add=000055854636eb00,sub=000055854636eac3
g_gloableInt=0000558546570050 staticInt=0000558546570040 Hello=000055854636ec08
sizeof(doubletest)=8 sizeof(testP)=8 sizeof(array0)=6
&doubletest=0000558546570018,testP=0000000000000000 array0=0000558546570054
1)首先是included archive file
Archive member included to satisfy reference by file (symbol) ==>included archive
/usr/lib/x86_64-linux-gnu/libc_nonshared.a(elf-init.oS)
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/Scrt1.o (__libc_csu_init)
解析:
> Scrt1.o 这个目标文件会调用到__libc_csu_init 这个函数
> __libc_csu_init 这个函数在elf-init.oS 目标文件中
> elf-init.oS 目标文件 被打包在libc_nonshared.a 这个archive file
2)然后是library included
As-needed library included to satisfy reference by file (symbol) ==>link 的lib
libc.so.6 /tmp/ccYQAtfU.o (fopen@@GLIBC_2.2.5)
解析:
> /tmp/ccYQAtfU.o(实际是main.0) 这个目标文件会调用到fopen 这个函数
> fopen这个函数在libc.so.6 这个lib 中
3)然后是common symbols
Allocating common symbols
Common symbol size file
pInt 0x8 /tmp/ccYQAtfU.o
g_gloableInt 0x4 /tmp/ccYQAtfU.o
array0 0x6 /tmp/ccYQAtfU.o
解析:
> /tmp/ccYQAtfU.o(实际是main.0)
> 上述3个变量都是main.c 文件中定义的全局变量,并且没有初始化
> 上述3个全局变量,可以被任何module 访问到,使用并且改变
> 实际写程序中,可以通过common symbols 列出的变量,来检查是否有必要写全局变量,如没有必要,则改成static.
4)Discarded input sections
Discarded input sections
.note.GNU-stack
0x0000000000000000 0x0 /usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/Scrt1.o
.note.GNU-stack
0x0000000000000000 0x0 /usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/crti.o
.note.GNU-stack
0x0000000000000000 0x0 /usr/lib/gcc/x86_64-linux-gnu/7/crtbeginS.o
.note.GNU-stack
0x0000000000000000 0x0 /tmp/ccYQAtfU.o ==>实际是main.o
.note.GNU-stack
0x0000000000000000 0x0 /tmp/ccetcq5K.o ==>实际是add.o
.note.GNU-stack
0x0000000000000000 0x0 /tmp/ccYNVa0B.o ==>实际是dummy.o
.note.GNU-stack
0x0000000000000000 0x0 /usr/lib/x86_64-linux-gnu/libc_nonshared.a(elf-init.oS)
.note.GNU-stack
0x0000000000000000 0x0 /usr/lib/gcc/x86_64-linux-gnu/7/crtendS.o
.note.GNU-stack
0x0000000000000000 0x0 /usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/crtn.o
解析:
> 原本以为测试程序dummy.c 这个文件中的function 没有被引用,只会把dummy.o 放在discarded input sections
> 实际测试结果,add.o (所有function和变量都被引用)也被放在了这里,有些不理解
5)Memory Configuration
Memory Configuration
Name Origin Length Attributes
*default* 0x0000000000000000 0xffffffffffffffff
解析:
> 因为我是在linux pc 上编译,因此这部分没有特殊的memory 限制
6)Linker script and memory map
LOAD /usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/Scrt1.o
LOAD /usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/crti.o
LOAD /usr/lib/gcc/x86_64-linux-gnu/7/crtbeginS.o
LOAD /tmp/ccYQAtfU.o
LOAD /tmp/ccetcq5K.o
LOAD /tmp/ccYNVa0B.o
LOAD /usr/lib/gcc/x86_64-linux-gnu/7/libgcc.a
LOAD /usr/lib/gcc/x86_64-linux-gnu/7/libgcc_s.so
START GROUP
LOAD /usr/lib/gcc/x86_64-linux-gnu/7/libgcc_s.so.1
LOAD /usr/lib/gcc/x86_64-linux-gnu/7/libgcc.a
END GROUP
......
(.text start address is 0x0000000000000730, total size is x4c2)
.text 0x0000000000000730 0x4c2
*(.text.unlikely .text.*_unlikely .text.unlikely.*)
*(.text.exit .text.exit.*)
*(.text.startup .text.startup.*)
*(.text.hot .text.hot.*)
*(.text .stub .text.* .gnu.linkonce.t.*)
.text 0x0000000000000730 0x2b /usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/Scrt1.o
0x0000000000000730 _start
.text 0x000000000000075b 0x0 /usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/crti.o
*fill* 0x000000000000075b 0x5
.text 0x0000000000000760 0xda /usr/lib/gcc/x86_64-linux-gnu/7/crtbeginS.o
(这里根据函数的调用关系,依次排列函数在memory 中的位置,先执行的先占memory)
.text 0x000000000000083a 0x289 /tmp/ccYQAtfU.o(main.o)
0x000000000000083a main
.text 0x0000000000000ac3 0xa9 /tmp/ccetcq5K.o(add.o)
0x0000000000000ac3 sub(0xb00-0xac3=0x3D 表示sub函数占用的memory,不包含函数的data)
0x0000000000000b00 add
0x0000000000000b4d math
.text 0x0000000000000b6c 0xe /tmp/ccYNVa0B.o(dummy.o)
0x0000000000000b6c dummy_ver0
*fill* 0x0000000000000b7a 0x6
.text 0x0000000000000b80 0x72 /usr/lib/x86_64-linux-gnu/libc_nonshared.a(elf-init.oS)
0x0000000000000b80 __libc_csu_init
0x0000000000000bf0 __libc_csu_fini
.text 0x0000000000000bf2 0x0 /usr/lib/gcc/x86_64-linux-gnu/7/crtendS.o
.text 0x0000000000000bf2 0x0 /usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/crtn.o
*(.gnu.warning)
.fini 0x0000000000000bf4 0x9
*(SORT_NONE(.fini))
.fini 0x0000000000000bf4 0x4 /usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/crti.o
0x0000000000000bf4 _fini
.fini 0x0000000000000bf8 0x5 /usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/crtn.o
[!provide] PROVIDE (__etext = .)
[!provide] PROVIDE (_etext = .)
[!provide] PROVIDE (etext = .)
(这里是read only data 区域,比如程序中的“helloWorld”就放在这里)
(这块区域start address 是0x0000000000000c00,total size is 0x152 )
.rodata 0x0000000000000c00 0x152
*(.rodata .rodata.* .gnu.linkonce.r.*)
.rodata.cst4 0x0000000000000c00 0x4 /usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/Scrt1.o
0x0000000000000c00 _IO_stdin_used
*fill* 0x0000000000000c04 0x4
.rodata 0x0000000000000c08 0x14a /tmp/ccYQAtfU.o("helloWorld"?)
.rodata1
*(.rodata1)
.eh_frame_hdr 0x0000000000000d54 0x5c
*(.eh_frame_hdr)
.eh_frame_hdr 0x0000000000000d54 0x5c /usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/Scrt1.o
0x0000000000000d54 __GNU_EH_FRAME_HDR
*(.eh_frame_entry .eh_frame_entry.*)
.eh_frame 0x0000000000000db0 0x188
*(.eh_frame)
.eh_frame 0x0000000000000db0 0x30 /usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/Scrt1.o
0x2c (size before relaxing)
*fill* 0x0000000000000de0 0x0
.eh_frame 0x0000000000000de0 0x40 /usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/Scrt1.o
.eh_frame 0x0000000000000e20 0x18 /usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/Scrt1.o
0x30 (size before relaxing)
.eh_frame 0x0000000000000e38 0x20 /tmp/ccYQAtfU.o
0x38 (size before relaxing)
.eh_frame 0x0000000000000e58 0x60 /tmp/ccetcq5K.o
0x78 (size before relaxing)
.eh_frame 0x0000000000000eb8 0x20 /tmp/ccYNVa0B.o
0x38 (size before relaxing)
.eh_frame 0x0000000000000ed8 0x5c /usr/lib/x86_64-linux-gnu/libc_nonshared.a(elf-init.oS)
0x78 (size before relaxing)
.eh_frame 0x0000000000000f34 0x4 /usr/lib/gcc/x86_64-linux-gnu/7/crtendS.o
*(.eh_frame.*)
6).data 区域
(start address is 0x0000000000202000,total size is 0x2c)
.data 0x0000000000202000 0x2c
*(.data .data.* .gnu.linkonce.d.*)
.data 0x0000000000202000 0x4 /usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/Scrt1.o
0x0000000000202000 data_start
0x0000000000202000 __data_start
.data 0x0000000000202004 0x0 /usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/crti.o
.data 0x0000000000202004 0x0 /usr/lib/gcc/x86_64-linux-gnu/7/crtbeginS.o
*fill* 0x0000000000202004 0x4
.data.rel.local
0x0000000000202008 0x8 /usr/lib/gcc/x86_64-linux-gnu/7/crtbeginS.o
0x0000000000202008 __dso_handle
.data 0x0000000000202010 0x10 /tmp/ccYQAtfU.o
0x0000000000202010 array(array 占用8byte,说明pointer 占用8byte,64bit 系统)
0x0000000000202018 doubletest(double 类型占用8byte)
.data.rel.local
0x0000000000202020 0x8 /tmp/ccYQAtfU.o(Hello 字符指针占用8byte)
0x0000000000202020 Hello
.data 0x0000000000202028 0x4 /tmp/ccetcq5K.o(int 类型占用4byte)
0x0000000000202028 Min
.data 0x000000000020202c 0x0 /tmp/ccYNVa0B.o(没有全局变量,因此size 是0)
.data 0x000000000020202c 0x0 /usr/lib/x86_64-linux-gnu/libc_nonshared.a(elf-init.oS)
.data 0x000000000020202c 0x0 /usr/lib/gcc/x86_64-linux-gnu/7/crtendS.o
.data 0x000000000020202c 0x0 /usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/crtn.o
解析:
> 初始化的全局变量,会放在这里
> 未初始化的全局变量,不会放在这里
> 如全局变量初始化为0,有的编译器会优化到.bss 。
6).bss 区域
(start address is 0x0000000000202030,total size is 0x30)
.bss 0x0000000000202030 0x30
*(.dynbss)
.dynbss 0x0000000000202030 0x0 /usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/Scrt1.o
*(.bss .bss.* .gnu.linkonce.b.*)
.bss 0x0000000000202030 0x0 /usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/Scrt1.o
.bss 0x0000000000202030 0x0 /usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/crti.o
.bss 0x0000000000202030 0x1 /usr/lib/gcc/x86_64-linux-gnu/7/crtbeginS.o
*fill* 0x0000000000202031 0x7
.bss 0x0000000000202038 0xc /tmp/ccYQAtfU.o(bss 中指针占12byte?No)
0x0000000000202038 testP
.bss 0x0000000000202044 0x0 /tmp/ccetcq5K.o
.bss 0x0000000000202044 0x0 /tmp/ccYNVa0B.o
.bss 0x0000000000202044 0x0 /usr/lib/x86_64-linux-gnu/libc_nonshared.a(elf-init.oS)
.bss 0x0000000000202044 0x0 /usr/lib/gcc/x86_64-linux-gnu/7/crtendS.o
.bss 0x0000000000202044 0x0 /usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/crtn.o
*(COMMON)
*fill* 0x0000000000202044 0x4
COMMON 0x0000000000202048 0x12 /tmp/ccYQAtfU.o
0x0000000000202048 pInt(此处指针占8byte)
0x0000000000202050 g_gloableInt(int 占4byte)
0x0000000000202054 array0(占6byte=0x12-0x8-0x4)(正好对应其定义:char array0[6];)
0x0000000000202060 . = ALIGN ((. != 0x0)?0x8:0x1)
*fill* 0x000000000020205a 0x6
.lbss
*(.dynlbss)
*(.lbss .lbss.* .gnu.linkonce.lb.*)
*(LARGE_COMMON)
0x0000000000202060 . = ALIGN (0x8)
0x0000000000202060 . = SEGMENT_START ("ldata-segment", .)
.lrodata
*(.lrodata .lrodata.* .gnu.linkonce.lr.*)
.ldata 0x0000000000602060 0x0
*(.ldata .ldata.* .gnu.linkonce.l.*)
0x0000000000602060 . = ALIGN ((. != 0x0)?0x8:0x1)
0x0000000000602060 . = ALIGN (0x8)
0x0000000000602060 _end = .
[!provide] PROVIDE (end = .)
0x0000000000602060 . = DATA_SEGMENT_END (.)
解析:
> 定义的未初始化全局变量放在bss 区域
6)_end
_end 可以体现main 可执行程序最终占用的memory 是 0x 2060 byte?
7)程序执行期间打印地址,以确认上述解读是否正确
$ ./main
sum is 1
main=000055854636e83a,math=000055854636eb4d,add=000055854636eb00,sub=000055854636eac3
g_gloableInt=0000558546570050 staticInt=0000558546570040 Hello=000055854636ec08
sizeof(doubletest)=8 sizeof(testP)=8 sizeof(array0)=6
&doubletest=0000558546570018,testP=0000000000000000 array0=0000558546570054
解析:
> 程序执行期间打印的是虚拟地址
> 全局函数address 与map 文件一致(低12bit 相同)
> 未初始化全局变量 address 与map 文件一致(低8byte 相同)
> 初始化全局变量 address 与map 文件一致(低8byte 相同)
> Hello 指向的是存放“HelloWorld”的address 0x000055854636ec08,对应到map 文件的这里
.rodata 0x0000000000000c08 0x14a /tmp/ccYQAtfU.o
基于以上分析,map 文件可以很准确反应程序的memory 使用情况。
8).comment
它存放的是编译器版本等信息。
9)总结
程序放在.text
常量字符串放在.rodata
全局初始化变量放在.data
全局未初始化变量放在.bss
static 函数,不体现在map 文件
static 全局变量(初始化/不初始化)都不体现在map 文件,located in .data
malloc 分配的memory 不在map 文件体现,实际在heap
可执行程序由.text / .data /.bss 3部分组成。
.text 和 .data 都存在可执行文件中,由系统从可执行文件中加载,.bss 不在可执行文件中,由系统初始化。
10).data 与.bss 的区别
- 初始化全局变量,放在data 区
- char array[1024*1024]={0,1,2,3};
复制代码
.data 0x0000000000202020 0x100008 /tmp/ccuT7WjH.o
0x0000000000202020 array
编译后的exe size 为
- testC$ ls -al main
- -rwxrwxr-x 1 xa00000 xa00000 1061920 May 11 16:57 main
复制代码
- 未初始化全局变量,放在bss 区
- char array[1024*1024];
复制代码
.bss 0x0000000000202040 0x100050
......
*(COMMON)
*fill* 0x0000000000202058 0x8
COMMON 0x0000000000202060 0x10002a /tmp/ccKlvAPJ.o
0x0000000000202060 malloc_ptr
0x0000000000202068 pInt
0x0000000000202080 array
0x0000000000302080 g_gloableInt
0x0000000000302084 array0
- testC$ ls -al main
- -rwxrwxr-x 1 xa00000 xa00000 13328 May 11 17:02 main
复制代码
1061920 - 13328=1048592 byte
结论:.bss size 不占用文件空间,只占用运行时的内存空间。
11)static 变量
- main.c
- static int tmpdata = 100;
- static int tmpdata_uni = 100;
- static void test_fun()
- {
- printf("test!");
- }
- void main(void)
- {
- int a = 5,b = 6,sum=0;
- static int staticInt = 0;
- char data[READ_SIZE]={0};
- int ret = 0;
- FILE* fp = fopen("abuf_apu_nbsm_o1_1_00720.mpg","r");
- //FILE* fp_out = fopen("abuf_apu_nbsm_o1_1_00720_out.mpg","w+");
- FILE* fp_out = fopen("abuf_apu_nbsm_o1_1_00720_out.mpg","w+");
- static int tmpdata_2= 10;
- static int tmpdata_2_uni= 10;
- ......
- }
复制代码
- testC$ objdump -t main
- main: file format elf64-x86-64
- SYMBOL TABLE:
- 0000000000000238 l d .interp 0000000000000000 .interp
- 0000000000000254 l d .note.ABI-tag 0000000000000000 .note.ABI-tag
- 0000000000000274 l d .note.gnu.build-id 0000000000000000 .note.gnu.build-id
- 0000000000000298 l d .gnu.hash 0000000000000000 .gnu.hash
- 00000000000002b8 l d .dynsym 0000000000000000 .dynsym
- 0000000000000420 l d .dynstr 0000000000000000 .dynstr
- 00000000000004ec l d .gnu.version 0000000000000000 .gnu.version
- 0000000000000510 l d .gnu.version_r 0000000000000000 .gnu.version_r
- 0000000000000540 l d .rela.dyn 0000000000000000 .rela.dyn
- 0000000000000618 l d .rela.plt 0000000000000000 .rela.plt
- 00000000000006f0 l d .init 0000000000000000 .init
- 0000000000000710 l d .plt 0000000000000000 .plt
- 00000000000007b0 l d .plt.got 0000000000000000 .plt.got
- 00000000000007c0 l d .text 0000000000000000 .text
- 0000000000000d04 l d .fini 0000000000000000 .fini
- 0000000000000d10 l d .rodata 0000000000000000 .rodata
- 0000000000000e84 l d .eh_frame_hdr 0000000000000000 .eh_frame_hdr
- 0000000000000ee8 l d .eh_frame 0000000000000000 .eh_frame
- 0000000000201d78 l d .init_array 0000000000000000 .init_array
- 0000000000201d80 l d .fini_array 0000000000000000 .fini_array
- 0000000000201d88 l d .dynamic 0000000000000000 .dynamic
- 0000000000201f78 l d .got 0000000000000000 .got
- 0000000000202000 l d .data 0000000000000000 .data
- 0000000000202040 l d .bss 0000000000000000 .bss
- 0000000000000000 l d .comment 0000000000000000 .comment
- 0000000000000000 l df *ABS* 0000000000000000 crtstuff.c
- 00000000000007f0 l F .text 0000000000000000 deregister_tm_clones
- 0000000000000830 l F .text 0000000000000000 register_tm_clones
- 0000000000000880 l F .text 0000000000000000 __do_global_dtors_aux
- 0000000000202040 l O .bss 0000000000000001 completed.7698
- 0000000000201d80 l O .fini_array 0000000000000000 __do_global_dtors_aux_fini_array_entry
- 00000000000008c0 l F .text 0000000000000000 frame_dummy
- 0000000000201d78 l O .init_array 0000000000000000 __frame_dummy_init_array_entry
- 0000000000000000 l df *ABS* 0000000000000000 main.c
- 0000000000202018 l O .data 0000000000000004 tmpdata
- 000000000020201c l O .data 0000000000000004 tmpdata_uni
- 00000000000008ca l F .text 0000000000000018 test_fun
- 0000000000202050 l O .bss 0000000000000004 staticInt.2347
- 0000000000202020 l O .data 0000000000000004 tmpdata_2_uni.2353
- 0000000000202024 l O .data 0000000000000004 tmpdata_2.2352
- 0000000000000000 l df *ABS* 0000000000000000 add.c
- 0000000000000000 l df *ABS* 0000000000000000 dummy.c
- 0000000000000000 l df *ABS* 0000000000000000 crtstuff.c
- 000000000000108c l O .eh_frame 0000000000000000 __FRAME_END__
- 0000000000000000 l df *ABS* 0000000000000000
- 0000000000201d80 l .init_array 0000000000000000 __init_array_end
- 0000000000201d88 l O .dynamic 0000000000000000 _DYNAMIC
- 0000000000201d78 l .init_array 0000000000000000 __init_array_start
- 0000000000000e84 l .eh_frame_hdr 0000000000000000 __GNU_EH_FRAME_HDR
- 0000000000201f78 l O .got 0000000000000000 _GLOBAL_OFFSET_TABLE_
- 0000000000000d00 g F .text 0000000000000002 __libc_csu_fini
- 0000000000000000 F *UND* 0000000000000000 free@@GLIBC_2.2.5
- 0000000000202060 g O .bss 0000000000000008 malloc_ptr
- 0000000000202068 g O .bss 0000000000000008 pInt
- 0000000000000000 w *UND* 0000000000000000 _ITM_deregisterTMCloneTable
- 0000000000202000 w .data 0000000000000000 data_start
- 0000000000000c10 g F .text 000000000000004d add
- 0000000000000000 F *UND* 0000000000000000 fread@@GLIBC_2.2.5
- 0000000000202080 g O .bss 0000000000100000 array
- 0000000000302080 g O .bss 0000000000000004 g_gloableInt
- 0000000000202034 g .data 0000000000000000 _edata
- 0000000000202030 g O .data 0000000000000004 Min
- 0000000000000000 F *UND* 0000000000000000 fclose@@GLIBC_2.2.5
- 0000000000000d04 g F .fini 0000000000000000 _fini
- 0000000000000000 F *UND* 0000000000000000 __stack_chk_fail@@GLIBC_2.4
- 0000000000000000 F *UND* 0000000000000000 printf@@GLIBC_2.2.5
- 0000000000000c7c g F .text 000000000000000e dummy_ver0
- 0000000000000000 F *UND* 0000000000000000 __libc_start_main@@GLIBC_2.2.5
- 0000000000202000 g .data 0000000000000000 __data_start
- 0000000000000000 w *UND* 0000000000000000 __gmon_start__
- 0000000000202008 g O .data 0000000000000000 .hidden __dso_handle
- 0000000000000d10 g O .rodata 0000000000000004 _IO_stdin_used
- 0000000000202028 g O .data 0000000000000008 Hello
- 0000000000000c90 g F .text 0000000000000065 __libc_csu_init
- 0000000000000000 F *UND* 0000000000000000 malloc@@GLIBC_2.2.5
- 0000000000302084 g O .bss 0000000000000006 array0
- 0000000000302090 g .bss 0000000000000000 _end
- 00000000000007c0 g F .text 000000000000002b _start
- 0000000000000000 F *UND* 0000000000000000 fseek@@GLIBC_2.2.5
- 0000000000202034 g .bss 0000000000000000 __bss_start
- 00000000000008e2 g F .text 00000000000002f1 main
- 0000000000000000 F *UND* 0000000000000000 fopen@@GLIBC_2.2.5
- 0000000000202010 g O .data 0000000000000008 doubletest
- 0000000000000c5d g F .text 000000000000001f math
- 0000000000202048 g O .bss 0000000000000008 testP
- 0000000000000000 F *UND* 0000000000000000 fwrite@@GLIBC_2.2.5
- 0000000000202038 g O .data 0000000000000000 .hidden __TMC_END__
- 0000000000000000 w *UND* 0000000000000000 _ITM_registerTMCloneTable
- 0000000000000bd3 g F .text 000000000000003d sub
- 0000000000000000 w F *UND* 0000000000000000 __cxa_finalize@@GLIBC_2.2.5
- 00000000000006f0 g F .init 0000000000000000 _init
复制代码
objdump -t main
0000000000202018 l O .data 0000000000000004 tmpdata
000000000020201c l O .data 0000000000000004 tmpdata_uni
00000000000008ca l F .text 0000000000000018 test_fun
0000000000202050 l O .bss 0000000000000004 staticInt.2347
0000000000202020 l O .data 0000000000000004 tmpdata_2_uni.2353
0000000000202024 l O .data 0000000000000004 tmpdata_2.2352
conclusion:
static gloable (initialed or not-initialed) vars are located in .data
static non-gloable (initialed or not-initialed) vars are located in .data
三、reference
充分理解Linux GCC 链接生成的Map文件 - 知乎 (zhihu.com)