`
Fangrn
  • 浏览: 818255 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

阅读更多

本文使用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
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]                   NULL            00000000 000000 000000 00      0   0 0
[ 1] .text             PROGBITS        00000000 000034 000038 00 AX 0   0 4
[ 2] .rela.text        RELA            00000000 000388 000024 0c      9   1 4
[ 3] .data             PROGBITS        00000000 00006c 000000 00 WA 0   0 1
[ 4] .bss              NOBITS          00000000 00006c 000000 00 WA 0   0 1
[ 5] .rodata           PROGBITS        00000000 00006c 000014 00   A 0   0 4
[ 6] .note.GNU-stack   PROGBITS        00000000 000080 000000 00      0   0 1
[ 7] .comment          PROGBITS        00000000 000080 000040 00      0   0 1
[ 8] .shstrtab         STRTAB          00000000 0000c0 000052 00      0   0 1
[ 9] .symtab           SYMTAB          00000000 0002cc 0000a0 10     10   8 4
[10] .strtab           STRTAB          00000000 00036c 00001c 00      0   0 1
Key to Flags:
W (write), A (alloc), X (execute), M (merge), S (strings)
I (info), L (link order), G (group), x (unknown)
O (extra OS processing required) o (OS specific), p (processor specific)
[ygliu@publicPC-6 home]$ ppc_85xx-objdump -d -j .text myprintf.o

myprintf:文件格式 elf32-powerpc

反汇编 .text 节:

00000000 <myprintf>:
   0:   94 21 ff f0     stwu    r1,-16(r1)
   4:   7c 08 02 a6     mflr    r0
   8:   93 e1 00 0c     stw     r31,12(r1)
   c:   90 01 00 14     stw     r0,20(r1)
10:   7c 3f 0b 78     mr      r31,r1
14:   3d 20 00 00     lis     r9,0
18:   38 69 00 00     addi    r3,r9,0
1c:   48 00 00 01     bl      1c <myprintf+0x1c>
20:   81 61 00 00     lwz     r11,0(r1)
24:   80 0b 00 04     lwz     r0,4(r11)
28:   7c 08 03 a6     mtlr    r0
2c:   83 eb ff fc     lwz     r31,-4(r11)
30:   7d 61 5b 78     mr      r1,r11
34:   4e 80 00 20     blr
其中-d可以看到反汇编结果 -j 指定需要查看的节区.

分享到:
评论

相关推荐

    linux静态库和动态库

    ### Linux静态库与动态库详解 #### 一、引言 在Linux环境下,库是一种重要的软件组件,用于封装一组相关的函数或数据结构,以便于在不同的应用程序之间共享代码。库通常分为两大类:静态库(static libraries)和...

    Linux静态库和动态库

    **Linux库的分类**:Linux下的库主要分为两大类——静态库与动态库,它们的核心区别在于代码的加载时机。静态库在编译阶段即与目标程序结合,而动态库则是在程序运行时动态加载。 #### 静态库与动态库的生成与使用 ...

    Linux下Gcc生成和使用静态库和动态库详解

    ### Linux下Gcc生成和使用静态库和动态库详解 #### 一、基本概念 **1.1 什么是库** 库本质上是一种可执行代码的二进制形式,它可以被操作系统载入内存执行。无论是Windows还是Linux平台,都广泛地使用着库。然而...

    《ELF文件格式分析.pdf》与elf解析代码

    ELF(Executable and Linkable Format)是Linux和其他类UNIX系统中广泛使用的可执行文件、共享库和对象文件的标准格式。这个格式提供了丰富的信息,包括程序的入口点、符号表、重定位信息等,使得编译器、链接器、...

    Linux下的ELF文件格式简介.doc

    在ELF文件中,动态链接允许程序在运行时才加载共享库,降低了程序的启动时间和内存占用。`.dynamic`节包含了与动态链接相关的元数据,如库名、版本信息、符号解析规则等。 8. **调试信息** 虽然不是ELF格式的核心...

    linux静态库及动态库创建及使用

    ### Linux静态库及动态库创建及使用 ...通过以上步骤,我们可以清楚地看到在Linux环境下如何创建和使用静态库及动态库,以及它们之间的区别和优势。这些基础知识对于理解和使用Linux系统中的库非常有帮助。

    Intel平台下Linux中ELF文件动态链接的加载1

    在Intel平台下的Linux系统中,ELF(Executable and Linkable Format)文件是一种广泛使用的可执行文件格式,它支持静态和动态链接。动态链接是Linux程序加载和执行的关键机制,允许程序在运行时加载所需的共享库(....

    ELF文件格式分析

    ELF格式不仅支持可重定位对象文件和可执行文件,还支持共享库,这使其成为现代操作系统中软件构件静态和动态组装的关键技术。 #### 二、相关标准 ##### 2.1 SYSTEM V ABI SYSTEM V Application Binary Interface ...

    linux的elf手册

    本文档主要介绍了Linux环境下ELF文件格式的相关知识。 #### 二、基本概念 **1. ELF文件结构** - **ELF头部** (`ElfN_Ehdr`): 文件最开始的部分,描述了整个ELF文件的基本信息。 - **程序头表** (`ElfN_Phdr`): ...

    linux gcc生成动态库和静态库

    ### Linux GCC 生成动态库与静态库详解 #### 一、基本概念 1.1 **什么是库** 在软件开发领域,库是指预先编写并编译好的...以上便是关于如何在Linux环境下使用GCC生成静态库和动态库的详细介绍,希望对您有所帮助。

    ELF文件symbol分析

    ### ELF文件Symbol分析 在深入探讨ELF(Executable and Linkable Format)文件...通过深入研究ELF文件的符号表结构和解析过程,开发者可以更好地理解和优化自己的程序,尤其是在涉及多文件链接和动态库使用的情况下。

    PE文件格式 ELF文件格式详解

    总之,PE文件格式和ELF文件格式分别代表了Windows和Linux下的可执行文件标准。理解它们的结构和工作原理有助于开发者更好地优化代码、调试程序以及进行系统级别的操作。通过深入学习"PE文件格式详解.chm"和"ELF 文件...

    LinuxELF病毒感染技术研究

    1. **链接视图**:静态分析ELF文件的内部结构,即文件是如何组织的。 2. **执行视图**:动态分析,关注如何创建进程映像以及文件的执行流程。 #### 三、ELF文件结构详解 ELF文件主要由以下几个部分组成: - **ELF...

    linux静态库和共享库.pdf

    本文主要讨论两种类型的库:静态库和共享库(也称为动态库)。 首先,库是一种可执行代码的二进制形式,可以在操作系统加载到内存中执行。尽管Windows和Linux都使用库,但由于它们的体系结构差异,它们的库文件是不...

    ELF文件系统格式

    每个ELF文件都包含一个头部,用于描述文件的基本信息,如文件类型(可执行、动态库、核心转储等)、机器架构、入口点地址、节区头部表的指针等。头部有多种类型,对应于不同的目标体系结构,例如32位或64位系统。 *...

    ELF文件格式解析,对于嵌入式开发的朋友非常有帮助

    此外,ELF文件还包含程序头表(Program Header Table)和节头表(Section Header Table),分别描述了加载到内存时的段信息和文件中的节信息。 2. 节与段的区别: - 节(Section):主要用于组织和管理文件内部的...

    elf for linux.rar_elf_linux elf

    动态链接器(如ld-linux.so)负责解析ELF文件中的动态链接信息,将所需的共享库加载到内存,并完成符号解析和重定位。 五、调试信息 ELF文件还可以包含调试信息,如DWARF格式,这对于GDB等调试工具至关重要。这些...

    Android 加载执行ELF可执行文件

    Android支持两种类型的重定位:静态重定位(针对静态链接的库)和动态重定位(针对动态链接的库)。 3. **符号解析**:动态链接器会查找并加载所有被程序引用的共享库,这些库可能已经存在于内存中,也可能需要从...

    ELF文件格式详细分析

    ### ELF文件格式详细分析 #### 1. 简介 可执行链接格式(Executable and Linkable Format,简称ELF)是一种广泛应用于Unix类操作系统的目标文件格式。它由UNIX系统实验室开发并发布,旨在作为应用程序二进制接口...

Global site tag (gtag.js) - Google Analytics