计算机系统基础第四篇-6 elf文件的链接
- 链接两步
elf文件链接分成两个步骤,第一步是符号解析,第二步是重定位。
1.1 符号解析
1.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文件的链接相关推荐
- linux程序卸载动态库,Intel平台下linux中ELF文件动态链接的加载、解析及实例分析(二): 函数解析与卸载...
在 IBM Bluemix 云平台上开发并部署您的下一个应用. 相信读者已经看过了 Intel平台下Linux中ELF文件动态链接的加载.解析及实例分析(一): 加载的内容了,了解了ELF文件被加载的 ...
- Linux下的ELF文件、链接、加载与库(含大量图文解析及例程)
Linux下的ELF文件.链接.加载与库 链接是将将各种代码和数据片段收集并组合为一个单一文件的过程,这个文件可以被加载到内存并执行.链接可以执行与编译时,也就是在源代码被翻译成机器代码时:也可以执行 ...
- 【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 ...
- ELF文件装载链接过程及hook原理
ELF文件格式解析 可执行和可链接格式(Executable and Linkable Format,缩写为ELF),常被称为ELF格式,在计算机科学中,是一种用于执行档.目的档.共享库和核心转储的标 ...
- ELF文件——动态链接
前言 下文所示案例为运行在armV7架构.linux平台之下的动态库文件. ELF文件格式 链接器以ELF文件的固定格式对目标程序进行链接,程序加载器以ELF文件的固定格式对其进行解析.ELF文件的组 ...
- 【Linux从青铜到王者】第二十三篇:Linux网络基础第四篇之kcp协议
系列文章目录 文章目录 系列文章目录 前言 一.kcp协议简介 二.kcp技术特性 1.RTO翻倍vs不翻倍 2.选择性重传 vs 全部重传 3.快速重传 4.延迟ACK vs 非延迟ACK 5.UN ...
- Android JNI入门第四篇——jni头文件分析
转载请标明出处: http://blog.csdn.net/michael1112/article/details/56666407 江东橘子的博客 一. 首先写了java文件: public cla ...
- Android基础第四篇
转载请标明出处: http://blog.csdn.net/gj782128729/article/details/52350060: 本文出自:[高境的博客] 1. Html简介 1.1. 什么是H ...
- python if else用法筛选出成绩不及格的学生的姓名_python 基础第四篇
列表 万恶之源-基本数据类型(list,tuple) 本节主要内容: 纲要: 1. 列表的介绍 列表是python的基础数据类型之⼀ ,其他编程语⾔也有类似的数据类型. 比如JS中的数 组, ja ...
最新文章
- SharePreference工具类
- docker 部署 tomcat 服务
- 独家 | 如何在BigQueryML中使用K-均值聚类来更好地理解和描述数据(附代码)
- Android学习笔记(1)----播放音乐文件
- [转] web无插件播放RTSP摄像机方案,拒绝插件,拥抱H5!
- linux tf命令,Linux 基础命令
- matlab 霍特林变换,数字图像处理(第3版面向CS2013计算机专业规划教材)
- BZOJ 1624 Usaco Clear And Present Danger
- 疯狂ios讲义之创建cocos2d项目(2)
- php 系统找不到指定的路径.,PHP网站(windows2003服务器 IIS6)提示:系统找不到指定的路径。...
- Linux基础命令与进阶
- 30个值得推荐的数据可视化工具--转
- Ubuntu 18.04 安装NVIDIA显卡驱动教程
- 新式汉语拼音使用方法及相关数据,用与交流编程只能用英语字母的环境使用
- windows10配置内外网IP切换bat脚本
- Teclast/台电32G SM3267AC H27UDG8M2MTR 量产记录
- 思科模拟器去除登陆界面
- 线性代数学习之正交性,标准正交矩阵和投影
- 【清华大学】操作系统 陈渝——Part7 进程/线程 管理
- STM32控制启动步进电机
热门文章
- 最新ThinkPHP开发的简约自适应导航网站源码
- 社交营销还是要走到线下
- 为了远方的爱-2016年东方红公益基金捐赠致辞
- iOS开发中,如何防止Crash(闪退,崩溃)?
- 面试题CSS02【21-10-14】
- nyoj 284 坦克大战
- leetcode:前 K 个高频元素、删除字符串中的所有相邻重复项、有多少小于当前数字的数字、有效的山脉数组、独一无二的出现次数(JavaScript)
- java iecapt.exe_【C#】NET截屏网页,生成网页快照开发——IECapt、CutyCapt
- 基于JSP的智能道路交通信息管理系统
- 60个实用Android框架