程序代码如下:(最简单的hello.c)
#include <stdio.h> int main() { printf("hello, world!"); return 0; }我们首先生成可重定位目标文件
gcc -c hello.c这是有关可重定位目标文件的结构图(从mooc ppt上所截) 计算机系统基础(一)第十周第三讲 让我们看一下ELF的文件大体的信息 选取几个解释一下
Type:REL (可重定位文件) 可以看出.o文件的类型为可重定位文件;
Number of program headers:0 可以看出可重定位文件的program header table的长度为0。因为在可重定位文件里不需要program header table;
入口点地址:0x0 由于可重定位文件不能直接执行,因此其入口地址为0(默认值);
本头的大小:52:ELF文件头大小为52 byte。
再看看ELF文件各部分,即看看各个节 共有13个节头
各个节的具体内容如下: .text:保存了可执行代码经过编译的机器代码。
.data和.bss:.data存放已初始化的全局和静态c变量, .bss存放未初始化的全局和静态c变量和初始化为0的全局和静态c变量。仅仅是占位符,不占任何实际磁盘空间,区分初始化和非初始化是为了提高空间效率。
.rodata:存放只读数据,如printf格式串、switch跳转表等,在该程序中占据0xd个字节的空间,存放的就是代码中唯一的一个需要保存到.rodata段的字符串常量”hello world!”。
.commont:存放GCC版本信息;
.strtab:指的是原C文件中的文件名和函数名等信息;
.shstrtab:指的是section header string table,其中保存了各个节的名字;
.symtab:存放函数和全局变量(符号表)信息。
在我们的hello.o中,其.symtab的内容如下: Ndx:指示所在节索引数,即在那个节。其中UND为未定义,ABS为不用重定位。 Bind:为本地or全局 Type:节、文件、函数等