Windows 和 Linux 操作系统架构对比以及交叉编译
操作系统与架构兼容性详解
1. 可执行文件格式:PE vs ELF
Windows: PE (Portable Executable) 格式
详细解释:
-
PE 格式是 Windows 下的可执行文件标准
-
包含多个区段(Sections),如代码段、数据段、资源段
-
文件头包含重要的系统和链接信息
-
支持多种架构,但格式统一
关键特点:
-
支持的架构:x86、x64、ARM
-
文件扩展名:
.exe -
格式标识:
-
PE32:32位可执行文件 -
PE32+:64位可执行文件
-
Linux: ELF (Executable and Linkable Format)
详细解释:
-
ELF 是 Linux 和 Unix 系统的标准可执行文件格式
-
由 Unix 系统实验室(USL)开发
-
具有高度灵活的段(Segment)和节(Section)结构
-
支持动态链接和共享库
关键特点:
-
支持的架构:x86、x64、ARM
-
无固定文件扩展名
-
格式标识:
-
ELF 32-bit:32位可执行文件 -
ELF 64-bit:64位可执行文件
-
2. 架构编译示例
x86 架构编译过程
Linux x86 编译示例
# 32位编译 $ gcc -m32 hello.c -o hello32 $ file hello32 hello32: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV) # 64位编译 $ gcc hello.c -o hello64 $ file hello64 hello64: ELF 64-bit LSB executable, x86-64, version 1 (SYSV)
Windows x86 编译示例
# 32位编译 $ gcc -m32 hello.c -o hello32.exe $ file hello32.exe hello32.exe: PE32 executable (console) Intel 80386, for MS Windows # 64位编译 $ gcc -m64 hello.c -o hello64.exe $ file hello64.exe hello64.exe: PE32+ executable (console) x86-64, for MS Windows
ARM 架构编译示例
Linux ARM 编译
# ARM 编译 $ arm-linux-gnueabi-gcc hello.c -o hello_arm $ file hello_arm hello_arm: ELF 32-bit LSB executable, ARM, version 1 (SYSV)
Windows ARM 编译
# Windows ARM 编译 $ arm-none-eabi-gcc hello.c -o hello_arm.exe $ file hello_arm.exe hello_arm.exe: PE32 executable (console) ARM, for MS Windows
3. 架构和操作系统兼容性限制
不同架构和操作系统的运行限制原理
操作系统差异限制
-
相同架构(如 x86_64)下,Windows 和 Linux 的可执行文件不能互相运行
-
相同操作系统下,不同架构的可执行文件不能互相运行
-
系统调用(System Calls)接口完全不同
-
Windows 使用 Win32/Win64 API
-
Linux 使用 POSIX 系统调用
-
程序依赖的系统级库和函数不兼容
指令集差异
-
x86_64 使用 CISC(复杂指令集)架构
-
ARM 使用 RISC(精简指令集)架构
-
处理器无法解析不同架构的机器指令
二进制格式限制
-
每种架构的可执行文件有独特的头部结构
-
系统加载器只能识别特定架构的文件格式
-
运行时链接和系统调用依赖于特定架构
示例:跨系统兼容性限制
# Linux x86_64 可执行文件在 Windows 下无法运行 $ file linux_program linux_program: ELF 64-bit LSB executable, x86-64 # Windows x86_64 可执行文件在 Linux 下无法运行 $ file windows_program.exe windows_program.exe: PE32+ executable, x86-64
4. 跨平台运行解决方案
交叉编译
详细解释:
-
在一种架构上为另一种架构生成可执行文件
-
需要特定的交叉编译工具链
-
提前将代码编译为目标架构的机器码
# x86_64 系统上为 ARM 编译 $ arm-linux-gnueabi-gcc hello.c -o hello_arm
模拟器
详细解释:
-
通过软件模拟不同架构的硬件环境
-
QEMU 是最常用的跨架构模拟器
-
实时将源架构指令翻译为目标架构指令
# 在 x86_64 系统上运行 ARM 可执行文件 $ qemu-arm ./hello_arm
容器技术
详细解释:
-
使用 Docker 等容器创建特定架构的运行环境
-
容器提供完整的系统级架构模拟
-
减少依赖和环境配置的复杂性
5. 默认输出文件 a.out
Linux 下的 a.out
# 默认编译 $ gcc hello.c $ file a.out a.out: ELF 64-bit LSB executable, x86-64, version 1 (SYSV) # 32位编译 $ gcc -m32 hello.c $ file a.out a.out: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV)
Windows 下的 a.out
# 默认编译 $ gcc hello.c $ file a.out a.out: PE32 executable (console) Intel 80386, for MS Windows
6. 总结:架构兼容性的关键点
-
指令集差异
-
不同架构使用不同的机器指令
-
处理器无法直接执行未知架构的代码
-
-
二进制文件格式
-
PE (Windows) 和 ELF (Linux) 格式不通用
-
文件头和段落结构独特
-
-
系统调用和链接
-
每种架构的系统调用接口不同
-
链接库和运行时环境架构特定
-
-
跨平台解决方案
-
交叉编译
-
硬件模拟器
-
容器技术
-
核心建议:
-
提前规划跨平台需求
-
选择合适的开发和部署策略
-
理解不同架构的技术限制
相关文章:
Windows 和 Linux 操作系统架构对比以及交叉编译
操作系统与架构兼容性详解 1. 可执行文件格式:PE vs ELF Windows: PE (Portable Executable) 格式 详细解释: PE 格式是 Windows 下的可执行文件标准 包含多个区段(Sections),如代码段、数据段、资源段 文件头包含…...
heapq库的使用——python代码
Python中heapq库的基础使用方法和示例代码,包含详细注释说明: 1. 基本功能 heapq 实现的是最小堆(父节点值 ≤ 子节点值),核心操作包括: 插入元素:heappush(heap, item)弹出最小值:…...
新手村:逻辑回归-理解02:逻辑回归中的伯努利分布
新手村:逻辑回归-理解02:逻辑回归中的伯努利分布 伯努利分布在逻辑回归中的潜在含义及其与后续推导的因果关系 1. 伯努利分布作为逻辑回归的理论基础 ⭐️ 逻辑回归的核心目标是: 建模二分类问题中 目标变量 y y y 的概率分布。 伯努利分布(…...
golang Error的一些坑
golang Error的一些坑 golang error的设计可能是被人吐槽最多的golang设计了。 最经典的err!nil只影响代码风格设计,而有一些坑会导致我们的程序发生一些与我们预期不符的问题,开发过程中需要注意。 errors.Is判断error是否Wrap不符合预期 …...
【干货,实战经验】nginx缓存问题
文章目录 案例背景出现的问题:定位到问题解决方式修改配置修改后的nginx配置 案例背景 有2个服务器A 和B,A是一个动态ip经常变公网ip,B是一个云服务器,公网ip固定. 于是我通过ddns ,找了个域名C,动态解析A服务器上的公…...
分布式理论:CAPBASE理论
1 CAP理论 1.1 简介 CAP也就是Consistency(一致性)、Availability(可用性)、Partition Tolenrance(分区容错性)这三个单词首字母组合。 在理论计算机科学中,CAP定理(CAP theorem&…...
大数据学习(86)-Zookeeper去中心化调度
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言📝支持一…...
uniapp再次封装uni-nav-bar导航栏组件
<!-- components/custom-nav-bar/custom-nav-bar.vue --> <template><view class"custom-nav" :style"{ backgroundColor: bgColor }"><!-- 状态栏占位 --><view class"status-bar" :style"{ height: statusBar…...
ngx_http_index_t
定义在 src\http\modules\ngx_http_index_module.c typedef struct {ngx_str_t name;ngx_array_t *lengths;ngx_array_t *values; } ngx_http_index_t; 该结构体用于 存储和解析 index 指令中单个索引文件的信息 ,支持静态…...
深入解析Flink Kafka Connector的分布式流数据采集架构与底层实现
目录 1. Flink Kafka连接器的分布式流采集架构 1.1 架构组成 1.2 分布式流模型 2. 数据分区分配策略 3. 为什么重写序列化和偏移量管理 3.1 与Flink分布式架构集成 3.2 与Flink检查点机制集成同时承接多级并行架构 3.3 OffsetsInitializer与细粒度偏移量控制 3.4 与Fl…...
vcd波形转仿真激励
我们使用vivado的ila抓取波形后,常常希望用该波形作为激励参与仿真。稍微复杂的项目中手动输入的工作量巨大,几乎是不可能采取的方式。我的方法是保存ila波形为vcd格式文件,用python解析vcd文件,转换成仿真激励的代码。 python代码…...
【STM32】知识点介绍二:GPIO引脚介绍
文章目录 一、概述二、GPIO的工作模式三、寄存器编程 一、概述 GPIO(英语:General-purpose input/output),即通用I/O(输入/输出)端口,是STM32可控制的引脚。STM32芯片的GPIO引脚与外部设备连接起来,可实现与外部通讯、…...
【AI】NLP
不定期更新,建议关注收藏点赞。 目录 transformer大语言模型Google Gemma疫情网民情绪识别 整体框架 baseline构建 模型调参、模型优化、其他模型 数据trick、指标优化、magic feature 数据增强、伪标签、迁移学习 模型融合sklearn中TFIDF参数详解 频率阈值可以去掉…...
Go 代理爬虫
现在注册,还送15美金注册奖励金 --- 亮数据-网络IP代理及全网数据一站式服务商 使用代理服务器,通过 Colly、Goquery、Selenium 进行网络爬虫的基础示例程序 本仓库包含两个分支: basic 分支包含供 Go Proxy Servers 这篇文章改动的基础代码…...
【NLP 43、大模型技术发展】
目录 一、ELMo 2018 训练目标 二、GPT-1 2018 训练目标 三、BERT 2018 训练目标 四、Ernie —— baidu 2019 五、Ernie —— Tsinghua 2019 六、GPT-2 2019 七、UNILM 2019 八、Transformer - XL & XLNet 2019 1.模型结构 Ⅰ、循环机制 Recurrence Mechanism Ⅱ、相对位置…...
在普通用户下修改root用户密码
1 从普通用户切换到root用户 sudo -s 再输入密码。 2 输入passwd ,会提醒你输入当前用户密码,验证后会提醒你输入root用户密码。 3 切换到root用户,使用修改过的密码登陆。 4 成功进入root用户。...
【每日算法】Day 6-1:哈希表从入门到实战——高频算法题(C++实现)
摘要 :掌握高频数据结构!今日深入解析哈希表的核心原理与设计实现,结合冲突解决策略与大厂高频真题,彻底掌握O(1)时间复杂度的数据访问技术。 一、哈希表核心思想 哈希表(Hash Table) 是一种基于键值对的…...
go命令使用
查看配置信息 go env配置go国内源 export GO111MODULEon export GOPROXYhttps://goproxy.cn测试 go install github.com/jesseduffield/lazydockerlatesthttps://github.com/jesseduffield/lazydocker...
深入 SVG:矢量图形、滤镜与动态交互开发指南
1.SVG 详细介绍 SVG(Scalable Vector Graphics) 是一种基于 XML 的矢量图形格式,用于描述二维图形。 1. 命名空间 (Namespace) 命名空间 URI:http://www.w3.org/2000/svg 用途:在 XML 或 XHTML 中区分不同标记语言的…...
SPPAS安装及问题汇总
SPPAS下载地址 文件找不到,可能是MAC的自动化操作问题,解决方案有二: 方案一: 直接查看SPPAS中的readme,运行sppas.command 方案二: 在自动化脚本中添加 export PATH/usr/local/bin:$PATH...
LINUX基础 [三] - 进程创建
目录 前言 进程创建的初次了解(创建进程的原理) 什么是fork函数? 初识fork函数 写时拷贝 fork函数存在的意义 fork调用失败的原因 进程终止 运行完毕结果不正确 main函数返回 库函数函数exit 系统调用接口_exit 进程异常终止 进…...
【day1】数据结构刷题 链表
一 反转链表 206. 反转链表 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 示例 1: 输入:head [1,2,3,4,5] 输出:[5,4,3,2,1]示例 2: 输入:head [1,2] 输出:[2,1]…...
鼠标在客户区内按下左键和双击右键
书籍:《Visual C 2017从入门到精通》的2.6鼠标 环境:visual studio 2022 内容:【例2.44】鼠标在客户区内按下左键和双击右键 1.创建一个单文档程序 一个简单的单文档程序-CSDN博客https://blog.csdn.net/qq_20725221/article/details/1463…...
c++ map和vector模板类
在这一章中C语法之模板函数和模板类-CSDN博客 我们学习了怎样写模板函数和模板类,接下来我们来学习系统给我们写好的两个模板类:map和vector。 我相信有了上文的基础,能帮助我们更好的理解这些模板类。 map和vector 是C STL(标准模板库) 中的一部分&a…...
hn航空app hnairSign unidbg 整合Springboot
声明: 本文章中所有内容仅供学习交流使用,不用于其他任何目的,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关! 逆向分析 学习unidbg补环境。先弄一个…...
Arm Linux ceres库编译
由于工作需要,需在国产化系统上编译ceres库,手上有一块树莓派,就在树莓派上面进行测试编译ceres库,总体来说比较顺利。只出现了一点小问题 参考链接: Ceres中文教程-安装 Ceres官方网站(英文) …...
c++中的四种cast转换
文章目录 前言一、dynamic_cast二、static_cast三、const_cast四、reinterpret_cast总结 前言 C继承并扩展C语言的传统类型转换方式,提供了功能更加强大的转型机制(检查与风险) 转换类型典型用途安全性static_cast相关类型转换(…...
矩阵补充,最近邻查找
矩阵补充,最近邻查找 矩阵补充是向量召回最简单的一种方法,现在不常用,学习矩阵补充是为了更好的理解后面学到的双塔模型 下图,输入用户ID和物品ID后从Eebedding层拿到对应的向量做内积,内积的结果就是矩阵补充 模型…...
gradio调用多个CSS的HTML页
很多博客介绍的gradio读取html和css比较简单,如果要做很细致的前端页面优化,比如丰富的响应式的cssjs,至少要有html多个css,是暂不能实现的。bootstrap、font-awesome、jquery等 方案一当然是直接更换htmlcss为主的部署方式&#…...
NVIDIA NeMo 全面教程:从入门到精通
NVIDIA NeMo 全面教程:从入门到精通 文章目录 NVIDIA NeMo 全面教程:从入门到精通目录框架介绍NeMo的核心特点NeMo的架构NeMo与其他框架的比较NeMo的模型集合NeMo的工作流程NeMo 2.0的新特性 安装指南系统要求使用Docker容器安装步骤1:安装Do…...
