可执行文件以及其加载过程

在计算机系统中,可执行文件是指包含机器代码的文件,计算机可以直接执行这些代码以运行特定的任务或程序。不同的操作系统对可执行文件有不同的定义和处理方式。本文将探讨常见操作系统中的可执行文件格式及其加载过程,特别是以ELF(Executable and Linkable Format)文件格式为例,深入了解其动态库加载过程。同时,我们还将介绍静态链接和动态链接的区别。

可执行文件简介

可执行文件是程序经过编译和链接后生成的文件,其中包含了机器指令、数据和必要的元信息,使得操作系统能够加载并执行该程序。不同操作系统使用不同的可执行文件格式:

  • Windows:使用PE(Portable Executable)格式,文件扩展名通常为.exe.dll
  • macOS:使用Mach-O(Mach Object)格式,文件扩展名通常为.app.dylib
  • Linux:使用ELF(Executable and Linkable Format)格式,文件扩展名通常为没有特定的要求,但共享库使用.so

ELF 文件格式

ELF文件格式是用于Linux和其他Unix-like操作系统的标准文件格式,适用于可执行文件、目标文件和共享库。ELF文件由多个部分组成,每个部分包含不同类型的数据,主要结构包括:

  1. ELF Header(ELF头)

    • 包含了文件类型、架构、入口点等基本信息。
    • 关键字段包括e_ident、e_type、e_machine、e_entry等。
  2. Program Header Table(程序头表)

    • 描述了文件中各个程序段的位置和属性。
    • 关键字段包括p_type、p_offset、p_vaddr、p_filesz等。
  3. Section Header Table(节头表)

    • 描述了文件中各个节的位置和属性。
    • 关键字段包括sh_name、sh_type、sh_flags、sh_addr等。
  4. Sections(节)

    • 各种类型的数据段,如代码段(.text)、数据段(.data)、只读数据段(.rodata)、未初始化数据段(.bss)。

ABI(Application Binary Interface)

ABI是定义应用程序在特定操作系统和硬件架构上运行的二进制接口的约定。它包括数据类型大小和对齐、函数调用约定、系统调用接口、二进制文件格式等。不同的操作系统和架构有各自的ABI规范,确保应用程序的二进制兼容性。

  • Windows ABI

    • 使用PE文件格式。
    • 定义了多种调用约定,如stdcall、cdecl、fastcall。
    • 使用WinAPI作为主要的系统调用接口。
    • 常用C标准库实现包括MSVCRT。
  • macOS ABI

    • 使用Mach-O文件格式。
    • 使用System V AMD64 ABI调用约定。
    • 使用POSIX标准系统调用接口,扩展了一些特有的系统调用。
    • 使用libSystem作为C标准库实现。

ELF 文件格式在 ABI 中的作用

ELF文件格式是ABI的重要组成部分,规定了二进制文件的结构,确保操作系统能够正确加载和执行应用程序。具体而言:

  • 标准文件格式:定义了可执行文件、目标文件和共享库的标准文件格式,确保二进制兼容性。
  • 程序头表和节头表:定义了二进制文件中各个段和节的布局。
  • 符号表和重定位信息:提供了符号解析和重定位的必要信息。
  • 动态链接:支持动态链接,通过动态库实现代码共享和内存节省。
  • 系统调用和C库接口:通过ELF文件描述库文件的结构,确保应用程序与操作系统接口一致。

静态链接与动态链接

在编译和链接过程中,静态链接和动态链接是两种不同的方法,用于将程序代码和库代码组合在一起。

静态链接
  • 定义:在编译时将所有使用到的库函数代码复制到最终的可执行文件中。
  • 优点
    • 运行时不需要外部库,所有代码都在一个可执行文件中。
    • 可以避免由于库版本变化导致的兼容性问题。
  • 缺点
    • 可执行文件体积较大,因为包含了所有依赖的库代码。
    • 无法在运行时更新或替换库,更新程序需要重新编译整个可执行文件。
动态链接
  • 定义:在运行时将库代码加载到内存中,并与可执行文件链接。
  • 优点
    • 可执行文件体积较小,因为库代码不包含在可执行文件中。
    • 可以在运行时更新或替换库,更新程序只需要替换库文件而不需要重新编译整个可执行文件。
    • 多个程序可以共享同一个库的实例,节省内存。
  • 缺点
    • 运行时依赖于外部库文件,缺少库文件或库版本不兼容可能导致程序无法运行。
    • 动态链接和符号解析会增加一些运行时开销。

ELF 动态库加载过程

在Linux系统中,加载共享库(.so文件)的过程涉及多个步骤,包括解析、映射、符号解析和重定位。以下是详细的加载过程:

  1. 启动程序

    • 操作系统首先加载可执行文件到内存中,读取其ELF头部信息,找到动态段(.dynamic)。
  2. 加载器(Loader)

    • 加载器读取程序头表,找到动态段信息,指示需要加载哪些共享库。
  3. 查找共享库

    • 加载器根据动态段信息查找共享库,路径包括DT_RUNPATH、LD_LIBRARY_PATH和系统默认路径。
  4. 映射共享库

    • 使用mmap将共享库的各个段映射到进程的虚拟地址空间。
  5. 解析符号

    • 加载器解析共享库中的符号,确保所有符号都能在内存中找到。
  6. 重定位(Relocation)

    • 处理重定位条目,调整代码和数据指针,使其指向正确的内存地址。
  7. 调用初始化函数

    • 调用共享库的初始化函数,完成库的初始化。

动态链接器(Dynamic Linker)

动态链接器(如ld.sold-linux.so)是负责加载和链接共享库的程序。在程序启动时,操作系统会先加载动态链接器,然后由动态链接器负责加载所有需要的共享库并进行符号解析和重定位。

示例:动态库加载过程

假设有一个可执行文件app依赖于共享库libfoo.solibbar.so,加载过程如下:

  1. 启动app

    • 操作系统加载app的ELF文件,读取其程序头表,找到动态段。
    • 动态段指示需要加载libfoo.solibbar.so
  2. 查找libfoo.solibbar.so

    • 加载器按顺序查找LD_LIBRARY_PATHDT_RUNPATH和系统默认路径,找到共享库文件。
  3. 映射共享库

    • 使用mmap将共享库的各个段映射到进程的虚拟地址空间。
  4. 解析符号

    • 动态链接器解析共享库中的符号,确保所有符号都能在内存中找到。
  5. 重定位

    • 处理重定位条目,更新内存中的地址使其指向正确的目标。
  6. 调用初始化函数

    • 调用共享库的初始化函数,完成库的初始化。

总结

可执行文件是操作系统运行程序的核心文件类型,不同操作系统有不同的可执行文件格式和加载方式。ELF文件格式是Linux和其他Unix-like操作系统的标准文件格式,通过详细的结构和动态链接支持,实现了程序的高效加载和运行。静态链接和动态链接是两种不同的链接方法,各有优缺点。了解这些技术和过程,对于系统编程和跨平台开发至关重要。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/18303.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

行为设计模式之状态模式

文章目录 概述定义结构图 2.代码示例小结 概述 定义 状态模式(state pattern)的定义: 允许一个对象在其内部状态改变时改变它的行为。 对象看起来似乎修改了它的类。 状态模式就是用于解决系统中复杂对象的状态转换以及不同状态下行为的封装问题.。状态模式将一个对象的状态…

Apache Doris 2.1.3 版本正式发布!

亲爱的社区小伙伴们,Apache Doris 2.1.3 版本已于 2024 年 5 月 20 日正式发布。该版本在功能特性上对数据湖、物化视图、负载管理等方面进行了多项更新,进一步简化湖仓一体架构、加速了查询性能;同时提交了若干改进项以及问题修复&#xff0…

简单的网页分享按钮代码

创建一个网页分享按钮通常涉及到HTML、CSS和JavaScript的组合使用。下面是一个简单的示例代码,展示了如何创建一个包含微博、QQ和QQ空间分享的按钮。请注意,这只是一个前端的实现示例,实际分享功能需要依赖于相应的社交媒体平台提供的API或分…

Flutter 中的 CompositedTransformFollower 小部件:全面指南

Flutter 中的 CompositedTransformFollower 小部件:全面指南 在Flutter的动画和视觉效果世界中,CompositedTransformFollower是一个高级组件,它允许开发者创建复杂的跟随动画。这个小部件通常用于实现视差效果或者当一个组件需要跟随另一个组…

New Phytologist:杨树特有miRNA在调控杨树抗旱中的分子机制

2024年3月6日,林木遗传育种全国重点实验室、北京林业大学生物科学与技术学院尹伟伦与夏新莉教授课题组在New Phytologist(中科院一区,影响因子9.4)期刊发表了题为“The miR6445-NAC029 module regulates drought tolerance by reg…

CSS:transform作用

transform作用 介绍常用函数:1.平移(Translate)介绍代码举例 2.旋转(Rotate)介绍代码举例 3.缩放(Scale)介绍代码举例 4.倾斜(Skew)介绍代码举例 5.矩阵变换(…

selenium 学习笔记(一)

pip的安装 新建一个txt curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py 把上面的代码复制进去后,把后缀名改为.bat然后双击运行 当前目录会出现一个这个文件 然后在命令行pyhon get-pip.py等它下好就可以了selenium安装 需要安装到工程目…

linux查看是否被入侵(二)

1、检查异常系统文件 [rootbastion-IDC ~]# find / -uid 0 -perm -4000 -print [rootbastion-IDC ~]# find / -size 10000k –print [rootbastion-IDC ~]# find / -name "…" –print [rootbastion-IDC ~]# find / -name ".." –print [rootbastion-I…

云计算-Lambda事件 (Lambda Events)

检索事件信息 (Retrieving Event Information) 在上一个主题中,我们已经看到了如何创建一个Lambda函数、添加handler、添加触发器和配置执行策略。在本主题中,我们将对其进行扩展。到目前为止,我们看到的handler应用非常简单,但我…

香橙派——创建Service打开热点

文章目录 要创建一个service来创建热点,你可以按照以下步骤进行操作: 创建一个service文件: sudo vim /etc/systemd/system/hotspot.service这将使用nano编辑器创建一个新的service文件。 在打开的文件中,添加以下内容&#xff1…

linux 定时执行shell、python脚本

在linux里设置定时执行一般是用crontab,如果没有的话,可以先安装: 安装 查看是否安装 cron -v # 对于基于Debian的系统(如Ubuntu) sudo apt-get install cron# 对于基于RedHat的系统(如CentOS&#xff…

【5】:三维到二维变换(模型、视图、投影)

观测变换 物体上某一点的坐标变换顺序:M->V->P MVP变换用来描述视图变换的任务,即将虚拟世界中的三维物体映射(变换)到二维坐标中。 1.Model Transformation 模型变换 场景中每个物体上的某一点,从局部坐标系…

YoloV8实战:各种图绘制汇总(mAP50、mAP50-95、loss、PR_curve、F1_curve)|科研必备|绘图神器

摘要 本文的内容是告诉大家如何绘制mAP50、mAP50-95、loss、PR_curve、F1_curve等图像,方便大家写论文。 绘制mAP50、mAP50-95、loss等图。 先上效果,如下图: 首先将,训练的result.csv汇总到一个文件夹下面(这样方便寻找),要不然找起来太麻烦。如下图: 我都放到re…

Pyinstaller打包exe文件解决指南

打包命令 打包 Python 文件 输入如下格式的命令即可 默认命令 Pyinstaller 文件名.py Pyinstaller -option1 -option2 -... 要打包的文件 Pyinstaller 文件名.pyPyinstaller -option1 -option2 -... 要打包的文件 参数选项比较多,这里我列一个表:…

onnx模型转换到rknn脚本

from rknn.api import RKNN ONNX_MODEL ./onnx_models/yolov5s_rm_transpose.onnx # platform"rk1808" platform "rv1109" RKNN_MODEL yolov5s_relu_{}_out_opt.rknn.format(platform) if __name__ __main__: add_perm False # 如果设置成True,则将模…

[C#]winform部署官方yolov10目标检测的onnx模型

【框架地址】 https://github.com/THU-MIG/yolov10 【算法介绍】 今天为大家介绍的是 YOLOv10,这是由清华大学研究团队最新提出的,同样遵循 YOLO 系列设计原则,致力于打造实时端到端的高性能目标检测器。 方法 创新 双标签分配策略 众所…

灯塔工厂产业数字化平台解决方案(50页PPT)

方案介绍: 随着工业4.0和智能制造的快速发展,传统工厂正面临着转型升级的迫切需求。为了提升生产效率、优化资源配置、增强市场竞争力,我们推出了灯塔工厂产业数字化平台解决方案。该方案旨在通过先进的信息技术手段,将传统工厂转…

ROS 程序框架

ROS 程序框架 基本思路(以C为例) 使用catkin_create_pkg创建一个软件包在软件包的src文件夹下创建一个节点的cpp源码文件在节点的源码文件中include包含ROS的头文件构建一个main函数,并在函数的开头执行ros::init()构建while循环&#xff0…

蒙特卡洛法求解机械臂工作空间(以IRB4600型工业机械臂为例)

1. 概念 工作空间是衡量机器人工作能力的一个重要的运动学指标,蒙特卡洛法是一种随机模拟方法,用于在计算机上估计某些统计量,对于要估计的统计量,通过模拟大量的随机抽样,并计算这些样本的随机值来估算这个统计量的值…

数字信号处理实验三:IIR数字滤波器设计及软件实现

一、实验目的 1. 掌握MATLAB中进行IIR模拟滤波器的设计的相关函数的应用; 2. 掌握MATLAB的工具箱中提供的常用IIR数字滤波器的设计函数的应用; 3.掌握MATLAB的工具箱中提供的模拟滤波器转数字滤波器的相关的设计函数的应用。 二、实验内容 本实验为…