程序员的自我修养学习笔记
------------------------------------------------------------------------
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\n", 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;
* 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\n", 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;
}