发掘方针文件
一样平常C说话编译后的执行语句都编译成及其代码,生涯在.text段;已初始化的全局变量和局部静态变量都生涯在.data段;未初始化的全局变量和局部静态变量一样平常放在.bss段里。我们知道未初始化的全局变量和局部静态变量默认都是0,原来他们可以存放在.data段中,但它们的值都为0,放在.data段中是没须要的。措施运行的时辰它们简直要占空间,而且可执行文件必需记录全部未初始化的全局变量和局部静态变量的巨细综合,记为.bss段。以是.bss段只是为未初始化的全局变量和局部静态变量预留位置罢了,它并没有内容,以是它在文件中不占有空间。 BSS用于为标记预留一块内存空间 test.c #include?<stdio.h> int?global_init_var=84; int?global_uninit_val; void?func1(int?i) { ????printf("%dn",i); } int?main() { ????static?int?static_var=85; ????static?int?static_var2; ????int?a=1; ????int?b; ????func1(static_var+static_var2+a+b); ????return?a; } 用呼吁 ?objdump -h test.o ?查察 从功效来看,方针文件除了最根基的代码段、数据段、BSS段,尚有3个端别离是只读数据端(.rodata)、注释信息段(.comment)和仓库提醒段(.note.GNU-stack) 从图中可看出,每段的第二行中的CONTENTS,ALLOC等暗示段的各类属性,“CONTENTS”暗示该段在文件中存在,可以看到BSS段中没有CONTENTS,暗示现实上在ELF文件中不存在,而.note.GNU-stack中有CONTENTS,但长度为0,以是临时以为它在ELF文件中不存在,那么,ELF文件中现实存在的就是.text、.data、.bss、.comment四个段了 有一种呼吁size,可用来查察ELF文件的代码段、数据段和BSS段的长度 数据段和只读段 .text段生涯了已初始化的全局变量和局部静态变量。前面test.c文件里一共有两个这样的变量(global_var和static_var)。这两个变量一共8个字节,以是.data这个段巨细为8个字节 我们在挪用printf的时辰,用到了一个字符串常量"%dn",存放在.rodata这个段,巨细为4个字节。 .rodata段存放的是只读数据,一样平常存放的是措施的只读变量(如const修饰的变量)和字符串常量。 值得一提的是偶然辰编译器会把字符串常量放到.data段中,而不会单独放在.rodata段 BSS段 .bss段存放的是未初始化的全局变量和局部静态变量,如上述代码中global_uninit_var和static_var2就放在.bss段中,更精确的说是.bss段为它们预留了空间,我们可以看到.bss段的巨细为4个字节,但这两个变量的巨细总和却为8. 可通过标记表(symbol table)看到,只有static_var2被存放在了.bss段,而global_uninit_var却没有被存放在任何段,只是一个为界说的"COMMON"标记。 值得一提的是编译单位内部可见的静态变量(好比给global_uninit_var加上static修饰)的却是放在.bss段的 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?----------------------摘自措施员的自我涵养 (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |