首页 > 代码库 > ELF学习

ELF学习

add.c

int shared = 1;
int add(int num1, int num2)
{
  int sum = 0;
  sum = num1 + num2;
  return sum;
}

编译add.c成.o文件

gcc -c add.c(-c表示只编译不链接)

file add.o输出结果如下:

技术分享

此结果表明add.o是个重定位文件。

查看elf header可查看到更详细信息:readelf -h add.o

技术分享

由于是重定位文件,ELF中并没有program header,entry point为0x0,有11个section. section header的字符串表在section 中的索引为8.ELF header的size为52.

通过readelf -S add.o 查看section header。

技术分享

Off这一列是表示section在ELF文件中的偏移量,.text的偏移量是0x34,转换成十进制正好是52(ELF header大小),说明header后面紧接着是.text。

.text内容可以通过objdump来查看:objdump -s -d add.o(-s表示将内容以16进制打印出来,-d表示反汇编)

技术分享

.text只包含add函数,其大小为0x1d.

.data保存了初始化了的全局变量和静态变量。在add.c中.data只包含shared这一个int型变量,所以其size为4。

.data的偏移量为0x34+0x1d=0x51,由于.data是4字节对其的,所以offset为0x54.

.bss保存的是未初始化的全局变量和局部静态变量。

ELF学习