快速业务通道

linux下ELF文件和动态库,静态库分析

作者 佚名技术 来源 Linux系统 浏览 发布时间 2012-04-17

  本文使用readelf和objdump工具,对PPC处理器下的ELF可执行文件进行分析.

  展示一下我们将要分析的对象:

  [ygliu@publicPC-6 home]$ cat test.c

  #include <stdio.h>

  int main(void)

  {

  myprintf();

  return 0;

  }

  [ygliu@publicPC-6 home]$ cat myprintf.c

  #include <stdio.h>

  void myprintf(void)

  {

  printf("hello,ferrysnow!\n");

  }

  编译如下:

  [ygliu@publicPC-6 home]$ ppc_85xx-gcc -c test.c

  [ygliu@publicPC-6 home]$ ppc_85xx-gcc -c myprintf.c

  查看生成的目标代码:

  [ygliu@publicPC-6 home]$ ppc_85xx-readelf -h test.o | grep Type

  Type: REL (可重定位文件)

  [ygliu@publicPC-6 home]$ ppc_85xx-readelf -h myprintf.o | grep Type

  Type: REL (可重定位文件)

  将目标代码生成可执行文件:

  [ygliu@publicPC-6 home]$ ppc_85xx-gcc -o test test.o myprintf.o

  [ygliu@publicPC-6 home]$ ppc_85xx-readelf -h test | grep Type

  Type: EXEC (可执行文件)

  root@ppc:/home# ./test

  hello,ferrysnow!

  创建静态链接库:

  [ygliu@publicPC-6 home]$ ppc_85xx-ar rcsv libmyprintf.a myprintf.o

  a - myprintf.o

  [ygliu@publicPC-6 home]$ ppc_85xx-readelf -h libmyprintf.a | grep Type

  Type: REL (可重定位文件)

  可以看出,静态链接库也是可重定位文件,它实际上是多个可重定位文件的集合.

  使用静态链接库:

  [ygliu@publicPC-6 home]$ ppc_85xx-gcc -o test test.o libmyprintf.a

  root@ppc:/home# ./test

  hello,ferrysnow!

  创建动态链接库:

  [ygliu@publicPC-6 home]$ ppc_85xx-gcc myprintf.o -shared -fPIC -o libmyprintf.so

  [ygliu@publicPC-6 home]$ ppc_85xx-readelf -h libmyprintf.so | grep Type

  Type: DYN (共享目标文件)

  使用动态链接库:

  [ygliu@publicPC-6 home]$ ppc_85xx-gcc -o testdyn test.o -lmyprintf -L./

  root@ppc:/home# LD_LIBRARY_PATH=./ ./testdyn

Empire CMS,phome.net

  hello,ferrysnow!

  其中LD_LIBRARY_PATH用于指定动态链接库的搜索路径.

  小结:

  静态链接库和动态链接库由可重定位文件链接而成.

  静态链接库由多个可重定位文件组成,并且在链接时加到可执行文件中去.

  动态链接库在链接时,库文件本身并没有加到可执行文件中去,只是在可执行文件中加入了该库的名字等信息,以便在可执行文件运行过程中引用库中的函数时,由动态链接器去查找相关函数的地址,并调用它们.

  ELF文件具有很大的灵活性,它通过文件头组织整个文件的总体结构,通过节区表 (Section Headers Table)和程序头(Program Headers Table或者叫段表)来分别描述可重定位文件和可执行文件.但不管是哪种类型,它们都需要它们的主体,即各种节区.在可重定位文件中,节区 表描述的就是各种节区本身;而在可执行文件中,程序头描述的是由各个节区组成的段(Segment),以便程序运行时动态装载器知道如何对它们进行内存映像,从而方便程序加载和运行.先来看看 一些常见的节区.

  [ygliu@publicPC-6 home]$ ppc_85xx-readelf -S myprintf.o

  共有11 个节头,从偏移量 0x114开始:

  节头:

  [Nr] Name Type Addr Off Size ES Flg Lk Inf Al

  [ 0]

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号