程序员的自我修养学习笔记

------------------------------------------------------------------------
1.查看各种目标文件的结构和内容
objdump -h SimpleSection.o
------------------------------------------------------------------------
2.查看ELF文件代码段、数据段、BSS(Block Stated by Symbol)段的长度
size SimpleSection.o
注解:
程序源码被编译后主要分成两种段:程序指令和程序数据。
代码段属于程序指令,而数据段和.bss属于程序数据
BSS最初是UA-SAP汇编器的一个伪指令,用于为符号预留一块内存空间
------------------------------------------------------------------------
3.查看某个段的内容
objdump使用:
-s  将所有段的内容以十六进制方式打印出来
-d  将所有包含指令的段反汇编
-x  显示所有文件头的内容
代码段:objdump -s -d SimpleSection.o
数据段:objdump -x -s -d SimpleSection.o
------------------------------------------------------------------------
4.自定义段
将某二进制文件,比如图片、MP3音乐、词典一类的东西作为目标文件中的一个段
objcopy -I binary -O elf32-i386 -B i386 image.jpg image.o
objdump -ht image.o
GCC关于自定义段的扩展机制:
格式:__attribute__((section(name"))) 
__attribute__((section("FOO"))) int global = 42;
__attribute__((section("BAR"))) void foo()
------------------------------------------------------------------------
5.文件头
可以用readelf命令来详细查看ELF文件
readelf -h SimpleSection.o
-----------------------------------------------------------------------
6.查看文件符号
nm SimpleSection.o
------------------------------------------------------------------------
7.查看文件的段表
readelf -S SimpleSection.o
------------------------------------------------------------------------

测试代码:

/*
 * SimpleSection.c
 * 
 * Linux:
 *     gcc -c SimpleSection.c
 *
 * Windows:
 *     cl SimpleSection.c /c /2a
 
*/

int printf(const char * format, ...);

int global_init_var = 84;
int global_uninit_var;

void funcl(int i)
{
    printf("%d ", i);
}

int main(void)
{
    static int static_var = 85;
    static int static_var2;
    int a = 1;
    int b;

    funcl(static_var + static_var2 + a + b);
    return a;

} 

原文地址:https://www.cnblogs.com/awiki/p/5521814.html