Chinaunix首页 | 论坛 | 博客
  • 博客访问: 228690
  • 博文数量: 29
  • 博客积分: 1477
  • 博客等级: 上尉
  • 技术积分: 451
  • 用 户 组: 普通用户
  • 注册时间: 2010-12-06 14:48
文章分类
文章存档

2012年(1)

2011年(14)

2010年(14)

我的朋友

分类: LINUX

2011-03-01 10:48:59

ELF文件格式学习(一)——ELF文件类型

Daniel Wood 20110301
转载时请注明出处和作者
文章出处:http://danielwood.cublog.cn
作者:Daniel Wood
------------------------------------------------------------
写在前面的话:
在阅读TCP/IP相关书籍的时候遇到ELF文件格式(ELF和TCP/IP无直接关系
),所以查阅了网上很多这方面的资料,现在整理成篇,方便自己以后review。
如果你是ELF的高手,那么你可以跳过了,如果你和我一样,对ELF文件格式一窍不通,或者你还未曾听说过这种格式(虽然你在平时工作中已经接触了很多这种格式的文件),那么你也许可以看看这篇基础的文章。如果你确实无聊的话,可以动手实践一下。
 
注:文章最后有这篇文章的pdf格式下载

参考文献:

[1] Executable and Linkable Format (ELF).pdf

[2] 结合实例解读ELF文件-阅读笔记 bkbll(bkbll@cnhonker.net, )

[3] About ELF From

[4] 

[5]

UNIX系统实验室(USL)开发和发布了Executable and linking Format(ELF)这样的二进制格式以后,在*nix系统上ELF就取代了out可执行文件格式,成为了主要的目标文件格式。

注:这里的目标文件是指(可暂时理解为)gcc –c-o-shared所产生的.o,可执行(默认是a.out).so文件。

1.    ELF文件类型

目标文件(也就是ELF文件)格式主要三种:

l  可重定向文件(Relocatable File):文件保存着代码和适当的数据,用来和其他的目标文件一起来创建一个可执行文件或者是一个共享目标文件。由编译器和汇编器生成,将由链接器处理。

l  可执行文件(Executable File):文件保存着一个用来执行的程序;该文件指出了exec(BA_OS)如何来创建程序进程映象。所有重定向和符号都解析完成了,如果存在共享库的链接,那么将在运行时解析。

l  共享目标文件(Shared Object File):就是所谓的共享库。文件保存着代码和合适的数据,用来被下面的两个链接器链接。第一个是连接编辑器[请参看ld(SD_CMD)],可以和其他的可重定向和共享目标文件来创建其他的目标文件。第二个是动态链接器,联合一个可执行文件和其他的共享目标文件来创建一个进程映象。包含链接时所需的符号信息和运行时所需的代码。

下面用实例来认识这三种ELF文件。

代码hello.c

#include <stdio.h>
int main()
{
    printf("Hello World\n");
    return 0;
}

gcc编译hello.c文件

编译环境:

$ uname -a


Linux ubuntu804 2.6.24-26-generic #1 SMP Tue Dec 1 18:37:31 UTC 2009 i686 GNU/Linux


$ gcc --version


gcc (GCC) 4.2.4 (Ubuntu 4.2.4-1ubuntu4)
Copyright (C) 2007 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

1)编译重定向文件:

$ gcc -c hello.c
$file hello.o


hello.o: ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), not stripped

2)编译可执行文件:

$ gcc -o hello hello.o
$ file hello


hello: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.6.8, dynamically linked (uses shared libs), not stripped

可以用ldd命令查看hello这个可执行文件动态链接的共享库。

$ ldd hello


    libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb7d99000)
    /lib/ld-linux.so.2 (0xb7ef8000)

3)编译共享目标文件:

$ gcc -shared hello.c -o hello.so
$ file hello.so


hello.so: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), not stripped

注:这里只是为了说明共享目标文件的ELF格式,这并不是平常的共享库,因为里面没有函数接口等东东。




阅读(2309) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~