打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

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

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, kbll@tom.com)

[3] About ELF From www.baidu.com

[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.(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.=> /lib/tls/i686/cmov/libc.so.(0xb7d99000)
    /lib/ld-linux.so.(0xb7ef8000)

3)编译共享目标文件:

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


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

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

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
为可执行文件“减肥”(一)
elf文件格式与动态链接库(非常之好)
一步步编写操作系统44elf格式的二进制可执行程序1(linux下可执行文件格式是ELF)
通过gcc用法示例
C语言编译过程
BIN、HEX、AXF、ELF文件格式有什么区别
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服