1. 链接两步
    elf文件链接分成两个步骤,第一步是符号解析,第二步是重定位。
    1.1 符号解析

    1.2 重定位
  2. 可重定位目标文件

    linux平台下,可重定位目标文件为elf文件,elf由多个节构成。



    3.可执行目标文件




    4.readelf工具的使用
    首先新建一个main.cpp文件,内容为:
#include <iostream>
using namespace std;
int g_index = 100;int sum(int a, int b)
{int target = 0;target = a + b;return target;
}int main()
{int index1 = sum(45,54);int index2 = 100;int result = index1 + index2 + g_index;cout << result <<endl;return 0;
}

编译生成main.o文件

g++ -c main.cpp

4.1 查看elf文件头

readelf -h main.o
ELF 头:Magic:   7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 类别:                              ELF64数据:                              2 补码,小端序 (little endian)版本:                              1 (current)OS/ABI:                            UNIX - System VABI 版本:                          0类型:                              REL (可重定位文件)系统架构:                          Advanced Micro Devices X86-64版本:                              0x1入口点地址:               0x0程序头起点:          0 (bytes into file)Start of section headers:          1840 (bytes into file)标志:             0x0本头的大小:       64 (字节)程序头大小:       0 (字节)Number of program headers:         0节头大小:         64 (字节)节头数量:         14字符串表索引节头: 11

4.2 查看节头表

readelf -S main.o
共有 14 个节头,从偏移量 0x730 开始:节头:[号] 名称              类型             地址              偏移量大小              全体大小          旗标   链接   信息   对齐[ 0]                   NULL             0000000000000000  000000000000000000000000  0000000000000000           0     0     0[ 1] .text             PROGBITS         0000000000000000  0000004000000000000000cb  0000000000000000  AX       0     0     1[ 2] .rela.text        RELA             0000000000000000  000005280000000000000120  0000000000000018   I      12     1     8[ 3] .data             PROGBITS         0000000000000000  0000010c0000000000000004  0000000000000000  WA       0     0     4[ 4] .bss              NOBITS           0000000000000000  000001100000000000000001  0000000000000000  WA       0     0     1[ 5] .init_array       INIT_ARRAY       0000000000000000  000001100000000000000008  0000000000000000  WA       0     0     8[ 6] .rela.init_array  RELA             0000000000000000  000006480000000000000018  0000000000000018   I      12     5     8[ 7] .comment          PROGBITS         0000000000000000  000001180000000000000036  0000000000000001  MS       0     0     1[ 8] .note.GNU-stack   PROGBITS         0000000000000000  0000014e0000000000000000  0000000000000000           0     0     1[ 9] .eh_frame         PROGBITS         0000000000000000  000001500000000000000098  0000000000000000   A       0     0     8[10] .rela.eh_frame    RELA             0000000000000000  000006600000000000000060  0000000000000018   I      12     9     8[11] .shstrtab         STRTAB           0000000000000000  000006c0000000000000006a  0000000000000000           0     0     1[12] .symtab           SYMTAB           0000000000000000  000001e80000000000000228  0000000000000018          13    12     8[13] .strtab           STRTAB           0000000000000000  000004100000000000000118  0000000000000000           0     0     1
Key to Flags:W (write), A (alloc), X (execute), M (merge), S (strings), l (large)I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown)O (extra OS processing required) o (OS specific), p (processor specific)

4.3 查看符号表

readelf -s main.oSymbol table '.symtab' contains 23 entries:Num:    Value          Size Type    Bind   Vis      Ndx Name0: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT  UND 1: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS main.cpp2: 0000000000000000     0 SECTION LOCAL  DEFAULT    1 3: 0000000000000000     0 SECTION LOCAL  DEFAULT    3 4: 0000000000000000     0 SECTION LOCAL  DEFAULT    4 5: 0000000000000000     1 OBJECT  LOCAL  DEFAULT    4 _ZStL8__ioinit6: 0000000000000078    62 FUNC    LOCAL  DEFAULT    1 _Z41__static_initializati7: 00000000000000b6    21 FUNC    LOCAL  DEFAULT    1 _GLOBAL__sub_I_g_index8: 0000000000000000     0 SECTION LOCAL  DEFAULT    5 9: 0000000000000000     0 SECTION LOCAL  DEFAULT    8 10: 0000000000000000     0 SECTION LOCAL  DEFAULT    9 11: 0000000000000000     0 SECTION LOCAL  DEFAULT    7 12: 0000000000000000     4 OBJECT  GLOBAL DEFAULT    3 g_index13: 0000000000000000    33 FUNC    GLOBAL DEFAULT    1 _Z3sumii14: 0000000000000021    87 FUNC    GLOBAL DEFAULT    1 main15: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND _ZSt4cout16: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND _ZNSolsEi17: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND _ZSt4endlIcSt11char_trait18: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND _ZNSolsEPFRSoS_E19: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND _ZNSt8ios_base4InitC1Ev20: 0000000000000000     0 NOTYPE  GLOBAL HIDDEN   UND __dso_handle21: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND _ZNSt8ios_base4InitD1Ev22: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND __cxa_atexit

4.4 查看重定位信息

readelf -r main.o重定位节 '.rela.text' 位于偏移量 0x528 含有 12 个条目:偏移量          信息           类型           符号值        符号名称 + 加数
000000000034  000d00000002 R_X86_64_PC32     0000000000000000 _Z3sumii - 4
00000000004c  000c00000002 R_X86_64_PC32     0000000000000000 g_index - 4
00000000005b  000f0000000a R_X86_64_32       0000000000000000 _ZSt4cout + 0
000000000060  001000000002 R_X86_64_PC32     0000000000000000 _ZNSolsEi - 4
000000000065  00110000000a R_X86_64_32       0000000000000000 _ZSt4endlIcSt11char_tr + 0
00000000006d  001200000002 R_X86_64_PC32     0000000000000000 _ZNSolsEPFRSoS_E - 4
000000000096  00040000000a R_X86_64_32       0000000000000000 .bss + 0
00000000009b  001300000002 R_X86_64_PC32     0000000000000000 _ZNSt8ios_base4InitC1E - 4
0000000000a0  00140000000a R_X86_64_32       0000000000000000 __dso_handle + 0
0000000000a5  00040000000a R_X86_64_32       0000000000000000 .bss + 0
0000000000aa  00150000000a R_X86_64_32       0000000000000000 _ZNSt8ios_base4InitD1E + 0
0000000000af  001600000002 R_X86_64_PC32     0000000000000000 __cxa_atexit - 4重定位节 '.rela.init_array' 位于偏移量 0x648 含有 1 个条目:偏移量          信息           类型           符号值        符号名称 + 加数
000000000000  000200000001 R_X86_64_64       0000000000000000 .text + b6重定位节 '.rela.eh_frame' 位于偏移量 0x660 含有 4 个条目:偏移量          信息           类型           符号值        符号名称 + 加数
000000000020  000200000002 R_X86_64_PC32     0000000000000000 .text + 0
000000000040  000200000002 R_X86_64_PC32     0000000000000000 .text + 21
000000000060  000200000002 R_X86_64_PC32     0000000000000000 .text + 78
000000000080  000200000002 R_X86_64_PC32     0000000000000000 .text + b6

计算机系统基础第四篇-6 elf文件的链接相关推荐

  1. linux程序卸载动态库,Intel平台下linux中ELF文件动态链接的加载、解析及实例分析(二): 函数解析与卸载...

    在 IBM Bluemix 云平台上开发并部署您的下一个应用. 相信读者已经看过了 Intel平台下Linux中ELF文件动态链接的加载.解析及实例分析(一): 加载的内容了,了解了ELF文件被加载的 ...

  2. Linux下的ELF文件、链接、加载与库(含大量图文解析及例程)

    Linux下的ELF文件.链接.加载与库 链接是将将各种代码和数据片段收集并组合为一个单一文件的过程,这个文件可以被加载到内存并执行.链接可以执行与编译时,也就是在源代码被翻译成机器代码时:也可以执行 ...

  3. 【Linux基础】四、常用基本命令——文件权限类(ls -al,chmod,chown,chgrp)、搜索查找类(find,locate,grep,wc,which)

    文件权限命令.搜索查找命令 4.6 ```文件权限类``` 4.6.1 文件属性 4.6.2 chmod 改变权限 4.6.3 chown 改变所有者 4.6.4 chgrp 改变所属组 ```4.7 ...

  4. ELF文件装载链接过程及hook原理

    ELF文件格式解析 可执行和可链接格式(Executable and Linkable Format,缩写为ELF),常被称为ELF格式,在计算机科学中,是一种用于执行档.目的档.共享库和核心转储的标 ...

  5. ELF文件——动态链接

    前言 下文所示案例为运行在armV7架构.linux平台之下的动态库文件. ELF文件格式 链接器以ELF文件的固定格式对目标程序进行链接,程序加载器以ELF文件的固定格式对其进行解析.ELF文件的组 ...

  6. 【Linux从青铜到王者】第二十三篇:Linux网络基础第四篇之kcp协议

    系列文章目录 文章目录 系列文章目录 前言 一.kcp协议简介 二.kcp技术特性 1.RTO翻倍vs不翻倍 2.选择性重传 vs 全部重传 3.快速重传 4.延迟ACK vs 非延迟ACK 5.UN ...

  7. Android JNI入门第四篇——jni头文件分析

    转载请标明出处: http://blog.csdn.net/michael1112/article/details/56666407 江东橘子的博客 一. 首先写了java文件: public cla ...

  8. Android基础第四篇

    转载请标明出处: http://blog.csdn.net/gj782128729/article/details/52350060: 本文出自:[高境的博客] 1. Html简介 1.1. 什么是H ...

  9. python if else用法筛选出成绩不及格的学生的姓名_python 基础第四篇

    列表 万恶之源-基本数据类型(list,tuple) 本节主要内容: 纲要: 1.   列表的介绍 列表是python的基础数据类型之⼀ ,其他编程语⾔也有类似的数据类型. 比如JS中的数 组, ja ...

最新文章

  1. SharePreference工具类
  2. docker 部署 tomcat 服务
  3. 独家 | 如何在BigQueryML中使用K-均值聚类来更好地理解和描述数据(附代码)
  4. Android学习笔记(1)----播放音乐文件
  5. [转] web无插件播放RTSP摄像机方案,拒绝插件,拥抱H5!
  6. linux tf命令,Linux 基础命令
  7. matlab 霍特林变换,数字图像处理(第3版面向CS2013计算机专业规划教材)
  8. BZOJ 1624 Usaco Clear And Present Danger
  9. 疯狂ios讲义之创建cocos2d项目(2)
  10. php 系统找不到指定的路径.,PHP网站(windows2003服务器 IIS6)提示:系统找不到指定的路径。...
  11. Linux基础命令与进阶
  12. 30个值得推荐的数据可视化工具--转
  13. Ubuntu 18.04 安装NVIDIA显卡驱动教程
  14. 新式汉语拼音使用方法及相关数据,用与交流编程只能用英语字母的环境使用
  15. windows10配置内外网IP切换bat脚本
  16. Teclast/台电32G SM3267AC H27UDG8M2MTR 量产记录
  17. 思科模拟器去除登陆界面
  18. 线性代数学习之正交性,标准正交矩阵和投影
  19. 【清华大学】操作系统 陈渝——Part7 进程/线程 管理
  20. STM32控制启动步进电机

热门文章

  1. 最新ThinkPHP开发的简约自适应导航网站源码
  2. 社交营销还是要走到线下
  3. 为了远方的爱-2016年东方红公益基金捐赠致辞
  4. iOS开发中,如何防止Crash(闪退,崩溃)?
  5. 面试题CSS02【21-10-14】
  6. nyoj 284 坦克大战
  7. leetcode:前 K 个高频元素、删除字符串中的所有相邻重复项、有多少小于当前数字的数字、有效的山脉数组、独一无二的出现次数(JavaScript)
  8. java iecapt.exe_【C#】NET截屏网页,生成网页快照开发——IECapt、CutyCapt
  9. 基于JSP的智能道路交通信息管理系统
  10. 60个实用Android框架