挖掘SimpleSection.o
int printf(const char* format,...);
int global_init_var = 84; int global_uninit_var; void func1(int i) { ? ? printf("%dn",i ); } int main(void) { ? ? ? static int static_var = 85; ? ? static int static_var2; ? ? int a=1; ? ? int b; ? ? func1(static_var+static_var2+a+b); ? ? return a; } --------------------------------------------------------------------------------------------------------- 用GCC来编译(参数-c表示只编译不链接):$ gcc -c SimpleSection.c 用objdump来查看object内部的结构:$ objdump -h SimpleSection.o (-h打印各个段的基本信息) .rodata只读数据段,存放字符串常量和只读变量(如const修饰的变量) .comment注释信息段 .note.GNU-stack堆栈提示段 .eh_frame CONTENTS表示该段在文件中存在。可得.bss在ELF文件中不存在内容 ---------------------------------------------------------------------------------------------------------- objdump的“-s”可以将所有段的内容以十六进制的方式打印出来;“-d”可以将所有包含指令的段反汇编。 .text段里包含且仅包含函数func1()和main()的指令。 --------------------------------------------------------------------------------------------------------------- .data段保存已经初始化了的全局变量和局部静态变量,global_init_var和static_var共8字节。 .rodata段存放字符串常量“%dn”,4字节。 ---------------------------------------------------------------------------------------------------------------- .bss段存放未初始化的全局变量和局部静态变量,但此处该段大小只有4字节。 global_uninit_var没有被存放在任何段,只是一个未定义的“COMMON符号”,只是预留一个未定义 的全局变量符号,等到最终链接时再在.bss段分配空间。(与编译器有关) 但,编译单元内部可见的静态变量的确存放在.bss段。 ---------------------------------------------------------------------------------------------------------------- 编译器的优化 0认为是未初始化的,优化后放在了.bss段。 ----------------------------------------------------------------------------------------------------------------- 自定义段 在全局变量或函数之前加上“_attribute_((section("section_name")))”属性即可将其放到指定的段中。 _attribute_((section("FOO"))) int global = 42; _attribute_((section("BAR"))) void foo() {} (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |