可执行文件格式详述,ABI和loader……

上回书说到可执行文件的格式,这一节详细描述一下。
可执行文件是由头和体组成的。这跟别的复杂一点的文件一样。它的体分成一些叫做节(section)的东西,这是它的特色。另外比较有特色的东西是:我们一般把可执行文件叫做程序的影像(image)。唔,这个叫法也不赖。可执行文件的价值在于执行,执行的程序也就是活着的程序叫做程序的影像。呵呵,这个概念打通了文件和进程的通道,以前说过的loader。一般情况下,可执行文件放在永久性的存储设备上,进程放在速度较快的主存上——一般是半导体存储设备,易失性的。loader干的主要的活之一就是把可执行文件从速度较慢的哟耐久性存储设备转移到速度较快的主存上。这个转移有什么难处呢?有一定的难点。最主要的就是:由于程序被转移(又叫做装载)到主存的以后,这个程序就要运行了,照常理想来,一个程序要施展其手脚,总得先准备出场地。是的,要准备其场地的。可以想象的到,其中最主要的是要操作的数据。但是别忘了,数据难道不包括在可执行文件影像里面?确实,有一种数据不包括在里面。就是那种没有初始值的数据。没有初始值的数据,包括在image里面也是没有价值的,是吧。所以,需要在主存中开辟这么一块地方,用来存放这种数据。是不是这就完了?不是,参见我写的关于对象生命周期和内存模型的概念就知道,我们还要准备好栈空间,以供程序运行的时候使用,准备好堆空间,以供程序运行的时候使用。是不是就完了?不是,还不是,还有别的。

有一个叫做重定位的概念需要在这儿引入。程序中需要操作数据,这个大家都知道,但是怎么用来指定那个数据呢?比如:程序中说,要把a和b相加的和赋值给c,怎么表达呢?用a b c对象的名字来表达?不是。呵呵,用的是a b c对象的地址。地址!这是一个关键的概念。好,我们现在看看会导致什么问题。c = a + b会演化成,load data from address of a,load data from address of b,add these data,store the result to address of c。我们不关心别的,就关注:address of {a|b|c},它们怎么来的,我们在程序中可没有给它们地址啊。呵呵,肯定是中间某个环节给出来的了。我们看看有可能是那个环节。compiler?嗯,很有可能,compiler给出各个对象一个唯一的地址。linker,对,linker给它们分配地址也很正常。那loader呢?loader给出地址也很合理。其实,这些环节都曾经给出了这些对象的地址。是的,都给出过。这里面会涉及到一个相对地址和绝对地址的问题。绝对地址就是指在运行环境中给准备的地址空间中指定其一。比如:运行环境给准备了4G的地址空间,你说你的某个对象使用3038M139K那个地方的空间。这就是绝对地址。绝对地址不好。原因很简单。你得自己保证对象的地址不冲突,而且,强迫你依赖于运行环境。那么相对地址呢?嗯,它在linker的运作下基本上是一个基本要求。 compiler生成相对地址,linker把它们(模块们)联合起来,放入同一个地址空间中,loader把image装入主存时,很有可能重新定位 image中各个对象的地址。

好的。重定位解释完了。是不是loader的活也干完了呢?哦,no,还有点。这牵扯到外部对象引用的问题。想一想,对连接器面对的各个模块来说,别的模块中的对象也算是外部对象。所以,外部对象的引用问题也不是很难,当然,也不很简单。

好了,说了这些东西以后,我们的可执行文件究竟以什么格式存在呢?且看……
从“claude.exe”报错解析操作系统核心机制:可执行文件、系统调用与生态兼容 可执行文件是操作系统加载和运行程序的基本单元,其格式(如PE、ELF、Mach-O)是操作系统识别程序的“身份证”。操作系统通过系统调用机制为应用程序提供统一的硬件访问和服务接口,这是程序与内核沟通的“暗号”。理解文件格式与系统调用的差异,是解决跨平台兼容性问题的关键,例如通过WSL、Wine等兼容层实现不同系统间程序的运行。在信创和国产化背景下,基于Linux的国产操作系统(如麒麟OS、统信UOS)正构建自主生态,而嵌入式领域的RTOS(如Zephyr)则专注于实时性与轻量化。无论是桌面开发还是云端部署, 阅读详情

相关推荐

ARM交叉编译本质:指令集、ABI与工具链的四层信任链

ARM交叉编译不是简单的环境配置,而是建立在指令集架构(ISA)、应用二进制接口(ABI)、工具链组件协同和SOC硬件映射之上的系统级工程。它要求开发者理解ARMv7-A与AArch64的根本差异、Hard-Float与EABI调用约定的严格约束,并确保gcc/glibc/binutils三者版本兼容。其技术价值在于生成可真实操控目标芯片的可靠二进制——从内存访问、中断响应到硬件加速指令(如crc32、aes)的精准启用。典型应用场景包括RK3566上Qt5.12.10的嵌入式GUI部署、飞腾D2000在银

weixin_34274029的博客 323

android 动态库获取路径问题,虹软人脸识别 - Android平台调用动态库时的常见错误解析...

最近我们发现很多用户在接入虹软ArcFace人脸识别SDK时,经常会遇到动态库加载失败的相关问题。本文详细介绍从编译动态库(.so)到程序调用so的整个流程,模拟在加载虹软人脸识别so文件时经常遇到的一些问题,帮助大家了解这些问题出现的原因以及解决方法。一、 ArcFace库加载常见错误1.1 找不到动态库java.lang.UnsatisfiedLinkError: couldn't find...

weixin_31613447的博客 1054

深入剖析Win32可移植可执行文件格式

你可能想知道为什么要关注可执行文件的格式。答案永远是:操作系统的可执行文件格式和数据结构展现了操作系统内部许多信息。通过理解EXE和DLL的内部情况,你会发现你已经变成你周围一个更优秀的程序员。

EOS系列三:关于ABI文件

1、简介 eos开发工具包eosio.cdt中的eosio-cpp可以根据合约代码自动生成abi文件,但在某些情况下(一些C++高级特性的使用以及某些自定义类型的使用),自动生成失败,则需要了解abi文件的工作机制,以便debug你的代码。 其实abi文件就是用JSON格式进行合约的结构描述,包括合约代码中定义的数据类型、执行函数等。 2、ABI文件格式为JSON,主要结构如下:   ...

weixin_33656634的博客 1502

Fritzing0.9.10下载安装和简单使用

Fritzing 作为一款电子设计自动化软件,其画图用于导入到论文和文档,清晰好看,能解决用相机拍实物照片杜邦线很乱的痛点。

李同学Lino的博客 3万+

Android14 RK3576开发板有线网卡静态IP配置全攻略(附数据库修改详解)

本文详细介绍了在Android 14 RK3576开发板上实现有线网卡出厂默认静态IP配置的完整方案。通过深入修改系统源码和SettingsProvider数据库,扩展全局设置字段并注入默认值,确保设备首次启动即自动应用预设的IP地址、子网掩码、网关和DNS,适用于工业控制、数字标牌等批量部署场景,有效提升生产效率。

weixin_29253711的博客 608

你必须知道的ABI和CPU关系

在这里非常感激腾讯bugly的“Bugly-Android_符号表-Jalen”,对我有很多启发和帮助ABI和CPU的重要知识1、 很多设备都支持多于一种的ABI。 2、 当一个应用安装在设备上,只有该设备支持的CPU架构对应的.so文件会被安装。3、 ABI目录(横向)和cpu(纵向) armeabi armeabi-v7a arm64-v8a mips mips64

薛瑄的博客 1万+

产品竞争策略方法论:构建“差异化 + 结构化 + 系统化”的竞争优势

本文系统探讨了IoT产品竞争策略,指出当前企业普遍存在硬件能力强但商业竞争能力不足的问题。文章构建了五层竞争模型(产品层、体验层、服务层、数据层、生态层),提出五大核心竞争策略(成本领先、差异化竞争、聚焦竞争、生态竞争、数据驱动竞争),并详细阐述了差异化设计方法。通过行业案例分析(小米、苹果、特斯拉)和五步落地方法,强调从硬件竞争向系统优势转变的重要性。文章指出IoT竞争胜负关键在后半场的数据运营和服务延伸,建议企业通过构建差异化能力、完善服务体系、建立数据体系、逐步构建生态来避免价格战陷阱,实现从跟随到领

专注智能硬件软硬件产品经理成长与实战,分享从需求定义到量产落地的真实日记。涵盖IoT趋势洞察、研发协作经验、产品方法论与工具箱,用轻松有趣的“汪式”视角,陪伴产品经理成长、避坑与升级。 360

Ubuntu 16.04 安装 ionCube Loader 详细排错指南

ionCube Loader 是 PHP 运行时字节码解密的核心 Zend 扩展,广泛用于商业加密 PHP 应用(如 CMS、ERP、SaaS 后台)的部署。其原理是通过深度集成 Zend Engine,在 opcode 解析前完成密文还原,技术价值在于保障软件知识产权与运行安全。典型应用场景包括老旧企业系统迁移、工业监控 WebHMI 部署、以及 Apache/Nginx + PHP-FPM 多 SAPI 环境下的兼容性适配。由于 Ubuntu 16.04 长期承载 PHP 7.0/7.1 等已停止维护版

weixin_30687051的博客 459

5分钟搞定三网话费余额查询:手把手教你用PHP+HTML搭建查询系统(含API调用避坑指南)

本文详细介绍了如何使用PHP+HTML快速搭建三网话费余额查询系统,涵盖API调用避坑指南、前端UI设计及性能优化。通过统一处理移动、电信、联通三大运营商接口差异,实现高可用查询功能,并提供安全防护与生产部署建议,帮助开发者高效构建稳定可靠的话费查询工具。

weixin_29016833的博客 259

物理与工程中的‘黑话’:Kronecker delta和Levi-Civita符号到底简化了什么?

本文深入解析了物理与工程中常用的Kronecker delta和Levi-Civita符号的简化作用。通过对比传统表示与张量表示,展示了这些符号在向量运算、矩阵迹计算及流体力学模拟中的高效应用,显著提升计算效率和代码可读性。特别适合理论物理和工程数学领域的学习者与从业者。

weixin_27215403的博客 400

Ubuntu 16.04 安装 ionCube Loader 兼容性指南

ionCube Loader 是 PHP 运行时字节码加载器,非传统 PHP 扩展,需严格匹配 PHP 主版本、Zend API、ZTS 状态及 libc 版本。其核心原理是通过 Zend 引擎钩子劫持编译流程,直接执行私有字节码,因此对 ABI 兼容性极为敏感。在 Ubuntu 16.04 这类老旧 LTS 环境中,PHP 7.0/7.2、Apache 2.4.18 与 Nginx 1.10.3 的混合部署,极易因多 SAPI 配置分离、Opcache 竞态、ZTS 不一致或 loader 版本错配导致

circularr9834的博客 384

AI辅助游戏开发实战:Kimi K3提升Unity开发效率与代码质量

在游戏开发领域,有限状态机(FSM)是构建角色AI行为逻辑的核心设计模式,它通过定义明确的状态和转换条件,使游戏实体能够智能地响应环境变化。其原理在于将复杂的行为分解为离散的状态节点,并通过事件驱动状态切换,从而实现清晰、可维护的AI架构。这项技术的价值在于显著提升了游戏角色的行为真实感和开发效率,被广泛应用于NPC行为控制、角色动画管理、UI流程等场景。随着AI编程助手的兴起,开发者现在可以借助如Kimi K3这类工具,通过自然语言指令快速生成和优化FSM等复杂系统的代码框架,将更多精力投入到核心玩法与性

weixin_30430677的博客 410

小结-ELF&PE以及dynamic loader

简单聊聊ELF,PE,以及动态加载器的实现

weixin_42804968的博客 412

【优化求解】基于matlab粒子群算法PSO确定最佳开关角对称级联多层逆变器【含Matlab源码 13080期】

粒子群算法PSO确定最佳开关角对称级联多层逆变器 完整代码,包运行;可提供运行操作视频!适合小白!

订阅付费专栏Matlab(奶茶价版),可赠送奶茶价版付费专栏指定代码1份; 97

【100分- 求最多可以派出多少支团队】(题目+思路+Java&C++&Python解析+在线测试)

用数组代表每个人的能力,一个比赛活动要求参赛团队的最低能力值为N,每个团队可以由1人或者2人组成,且1个人只能参加1个团队,计算出最多可以派出多少只符合要求的团队。

m0_73659489的博客 313

Linker and Loader 读书笔记 二

Linker and Loader 读书笔记 二 体系结构相关的问题 链接器和加载器的功能注定了这两个系统级的软件必须与软硬件的体系结构有非常相关的联系。链接器最终会把多个目标文件链接在一起创建一个可以执行的程序,在这个过程中要包括符号解析,重定位等操作,这些操作必然会跟遵循软硬件平台的体系结构。就硬件平台来说,有两个方面会影响到链接器:程序寻址和指令格式。链接器需要做的事情之一就是对数

markened的专栏 961

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

STM32H723外部Flash烧录:为AT25SF128A实现External Loader

在嵌入式开发中,SPI NOR Flash 常作为扩展存储介质,用于存放固件、资源文件或日志。但 STM32CubeProgrammer 默认无法直接访问外部 Flash,需要通过 External Loader 机制,让上位机借助调试器将驱动加载到 MCU RAM,再通过 OSPI 接口完成烧录。本文从外部 Flash 的使用价值切入,说明为何这一机制比独立 Bootloader 更轻量,并逐步讲解基于 STM32H723 的 OSPI 配置、AT25SF128A 驱动实现、Loader 接口导出以及编译

weixin_30652897的博客 439

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

openEuler/elf-loader 多架构支持揭秘:aarch64、x86_64 等平台适配指南

前往项目官网免费下载:[https://ar.openeuler.org/ar/](https://ar.openeuler.org/ar/?utm_source=csdn_blog) ELF 程序加载器是操作系统中的关键组件,负责将可执行文件加载到内存中并启动运行。openEuler 社区的 **elf-loader** 项目提供了一个用户空间的 ELF 程序加载器实现,特别值得一提的是它对多

gitblog_06842的博客 139

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

90DaysOfDevOps 实战:在 Kubernetes 上部署高可用 HashiCorp Vault,并实现应用密钥自动注入

> 本文是 90DaysOfDevOps 项目 [2023 系列](https://link.gitcode.com/i/867d4aaa806e327cded107fb998ea1f5) 的实战篇。围绕 HashiCorp Vault,从本地 CLI 安装、Minikube 集群启动、Helm 部署高可用(HA + Raft)Vault,到 KV v2 密钥引擎、Kubernetes 认证与 V

gitblog_00745的博客 101

轻量级的 ELF(Executable and Linkable Format)文件加载器鸿蒙PC构建适配常见问题与解决方案

本文详细记录了使用命令OHOS_ARCH=aarch64 OHOS_ABI=arm64-v8a sh ./create-hnp.sh构建Elf-loader的全过程。Elf-loader是一个轻量级ELF文件加载器,支持aarch64和x86_64架构,具有ELF文件解析、内存管理、系统调用封装等功能。构建流程包括源码获取、补丁应用(添加JIT支持)、交叉编译、安装打包等步骤。验证表明,构建生成的9.9KB大小的loader二进制文件已正确打包到base.hnp中,支持动态链接和ARM64架构。文中还提供了

2401_83596468的博客 1340

fuels-rs 合约部署指南:用 Fuel Rust SDK 加载二进制、配置参数并完成链上部署

本文是 Fuel Network Rust SDK(fuels-rs)中「部署合约」主题的完整实战指南。围绕 [部署章节入口文档](https://link.gitcode.com/i/ba05d0a577ff9463d5dd2d6663546f74),我们从 Sway 编译器 `forc build` 的产物(`.bin` 字节码 + JSON ABI)出发,逐步讲解 `Contract::lo

gitblog_00687的博客 685

ReLinker扩展开发:如何自定义LibraryLoader和LibraryInstaller

ReLinker是一个为Android平台设计的健壮原生库加载器,能够有效解决Android API 23之前版本中常见的`UnsatisfiedLinkError`异常。本文将详细介绍如何通过自定义`LibraryLoader`和`LibraryInstaller`来扩展ReLinker的功能,满足特定的原生库加载需求。 ## 了解ReLinker的核心接口 ReLinker框架提供了两个关

gitblog_00275的博客 1010

2000+ 真实企业文档炼成:ParseBench 数据集的五大维度与 16 万条规则揭秘

**ParseBench** 是一个面向 AI Agent 的**文档解析评测基准(Document Parsing Benchmark)**:它用约 2,000 页经过人工核验的真实企业文档(保险、金融、政府公文),检验 PDF 解析工具能否输出"Agent 可以可靠行动"的结构化结果——而不是仅仅"看起来像参考答案"。整套数据集共包含 **2,078 页、1,211 份文档、169,011 条

gitblog_00679的博客 251

嵌入式系统中Boot Loader与应用程序交互实现

在嵌入式系统开发中,Boot Loader作为系统启动的核心组件,负责硬件初始化和应用程序加载。通过符号表共享机制,可以实现Boot Loader与用户应用程序之间的函数调用,这种技术在固件更新、安全验证等场景中尤为重要。PUBLICSONLY指令和内存映射一致性是技术实现的关键,确保跨程序调用的正确性。实际应用中,这种架构不仅提高了代码复用率,还为动态补丁系统和多应用程序管理提供了基础支持。对于8051、C166等架构,合理配置开发环境和调用约定是确保系统稳定运行的重要前提。

weixin_30461595的博客 338

DeepSeek Harness v0.5.2 插件ABI兼容性修复指南

插件ABI(Application Binary Interface)是本地大模型运行时框架中启动器与插件间交互的契约基础,涉及元数据校验、生命周期函数签名、路径隔离等核心机制。DeepSeek Harness v0.5.2通过Pydantic v2 Schema校验、PluginContext上下文注入和沙箱化缓存路径三大变更重构ABI,提升插件可验证性与生产安全性。该升级虽带来短期兼容性断裂,却为长期可审计、可回滚的插件生态奠定基础。典型问题如PluginManifest校验失败、ModuleNotFo

weixin_29041195的博客 214
上一篇: 操作系统,loader以及应用服务器
下一篇: Ajax的异步用户交互模型问题
lifeNet
博客等级 码龄20年 1粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值