当前位置: 首页 > article >正文

和我一起学软件架构:C编译流程

引言我们基于两个材料进行实验一个简单的C语言代码) (GNU工具-GCC)源代码// hello.c#includestdio.h#definePI3.14159intmain(){doubleradius5.0;doubleareaPI*radius*radius;printf(Area %f\n,area);return0;}GCC说明在Linux 环境下gcc命令将源代码转换为可执行文件通常需要经过四个主要阶段预处理、编译、汇编和链接。这个四个过程分别由预处理器、编译器、汇编器、链接器完成这四个过程被同一个命令gcc包装了起来每个阶段都有明确的输入、输出和核心任务。先看一下gcc 命令参数useruser-VirtualBox:~/test$ gcc --help ... ... -v Display the programs invoked by the compiler. -E Preprocess only; do not compile, assemble or link. -S Compile only; do not assemble or link. -c Compile and assemble, but do not link. -o file Place the output into file. ... ...1. 第一阶段预处理输入文件 hello.c输出文件 hello.i#0hello.c#0built-in#0command-line#1/usr/include/stdc-predef.h134#0command-line2#1hello.c......执行命令gcc -v -E hello.c -o hello.i/usr/lib/gcc/x86_64-linux-gnu/11/cc1 是真正的预处理器useruser-VirtualBox:~/test$ gcc-v-Ehello.c-ohello.i... /usr/lib/gcc/x86_64-linux-gnu/11/cc1-E-quiet-v-imultiarchx86_64-linux-gnu hello.c-ohello.i-mtunegeneric-marchx86-64...预处理器行为预处理器负责处理所有以#开头的指令展开宏定义#define插入头文件内容#include处理条件编译#ifdef、#if等删除注释2. 第二阶段编译输入文件 hello.i输出文件 hello.s.filehello.c.text.section.rodata.LC2:.stringArea %f\n.text.globl main.type main,functio main:.LFB0:.cfi_startproc endbr64 pushq%rbp.cfi_def_cfa_offset16.cfi_offset6,-16movq%rsp,%rbp.cfi_def_cfa_register subq $16,%rsp movsd.LC0(%rip),%xmm0执行命令gcc -S -v hello.i -o hello.susr/lib/gcc/x86_64-linux-gnu/11/cc1 是真正的编译器useruser-VirtualBox:~/test$ gcc-S-vhello.i-ohello.s Using built-in specs.COLLECT_GCCgcc usr/lib/gcc/x86_64-linux-gnu/11/cc1-fpreprocessedhello.i-quiet-dumpbasehello.i -dumpbase-ext .i-mtunegeneric-marchx86-64-version-ohello.s...编译器行为将高级语言转换为汇编指令。此阶段是编译器最复杂的部分包含词法分析将源代码拆分成记号token语法分析构建语法树语义分析检查类型、作用域等中间代码生成与优化生成独立于机器的中间表示如 RTL、GIMPLE并执行优化如常量折叠、死代码消除目标代码生成将优化后的中间表示映射为特定 CPU 架构的汇编指令-marchx86-64 指定了生成的汇编代码使用 x86-64 基础指令集 --with-abim64 以及 --with-multilib-listm32,m64,mx32 决定了默认的 ABI 为 64 位 System V ABI常见于 x86_64 Linux并支持生成 32 位、64 位和 x32 代码。ABI 规定了函数调用约定、参数传递方式、数据结构对齐等 Target: x86_64-linux-gnu 中的 linux 部分 系统调用接口由操作系统内核定义GCC 生成的代码通过 C 库如 glibc间接使用系统调用。这里的 linux 表示目标系统为 Linux系统调用号、参数传递方式等遵循 Linux 内核的约定3. 第三阶段汇编输入文件 hello.s输出文件 hello.o 即二进制机器码但尚未链接hello.o:file format elf64-x86-64Disassembly of section.text:0000000000000000main:0:55push%rbp1:4889e5 mov%rsp,%rbp4:4883ec10sub $0x10,%rsp8:f20f1005000000movsd0x0(%rip),%xmm0 #10main0x10f:0010:f20f1145f8 movsd%xmm0,-0x8(%rbp)15:f20f1045f8 movsd-0x8(%rbp),%xmm01a:f20f5945f8 mulsd-0x8(%rbp),%xmm01f:f20f5905000000mulsd0x0(%rip),%xmm0 #27main0x2726:0027:f20f1145f0 movsd%xmm0,-0x10(%rbp)2c:f20f1045f0 movsd-0x10(%rbp),%xmm0执行命令gcc -v -c hello.s -o hello.oas 是真正的汇编器useruser-VirtualBox:~/test$ gcc-v-chello.s-ohello.o Using built-in specs.COLLECT_GCCgcc Target: x86_64-linux-gnuCOLLECT_GCC_OPTIONS-v-c-ohello.o-mtunegeneric-marchx86-64as-v--64-ohello.o hello.s汇编器行为将汇编指令转换为机器码。汇编器如 GNUas将每条助记符翻译成对应的 CPU 指令同时处理符号如标签的地址计算生成一个可重定位的目标文件ELF 格式。目标文件中包含代码段.text数据段.data、.rodata符号表记录了函数和全局变量的名称及位置但地址是相对的4. 第四阶段链接输入文件 hello.o输出文件 hello.elf 即可执行程序经过了链接使用objdump -d hello可以查看已重定位的代码0000000000001149 main: 1149: 55 push %rbp 114a: 48 89 e5 mov %rsp,%rbp 114d: 48 83 ec 10 sub $0x10,%rsp 1151: f2 0f 10 05 df 0e 00 movsd 0xedf(%rip),%xmm0 # 2038 _IO_stdin_used0x8 1158: 00 1159: f2 0f 11 45 f8 movsd %xmm0,-0x8(%rbp) 115e: f2 0f 10 45 f8 movsd -0x8(%rbp),%xmm0 1163: f2 0f 59 45 f8 mulsd -0x8(%rbp),%xmm0 1168: f2 0f 59 05 d0 0e 00 mulsd 0xed0(%rip),%xmm0 # 2040 _IO_stdin_used0x10 116f: 00 1170: f2 0f 11 45 f0 movsd %xmm0,-0x10(%rbp) 1175: f2 0f 10 45 f0 movsd -0x10(%rbp),%xmm0 117a: 48 8d 3d 87 0e 00 00 lea 0xe87(%rip),%rdi # 2008 _IO_stdin_used0x8 1181: b8 01 00 00 00 mov $0x1,%eax 1186: e8 c5 fe ff ff callq 1050 printfplt 118b: b8 00 00 00 00 mov $0x0,%eax 1190: c9 leaveq 1191: c3 retq执行命令gcc hello.o -v -o hello/usr/lib/gcc/x86_64-linux-gnu/11/collect2 是真正的链接器seruser-VirtualBox:~/test$ gcc hello.o-v-ohello Using built-in specs.COLLECT_GCCgcc Target: x86_64-linux-gnuCOLLECT_GCC_OPTIONS-v-ohello-mtunegeneric-marchx86-64-dumpdirhello./usr/lib/gcc/x86_64-linux-gnu/11/collect2-plugin/usr/lib/gcc/x86_64-linux-gnu/11/liblto_plugin.so -plugin-opt/usr/lib/gcc/x86_64-linux-gnu/11/lto-wrapper -plugin-opt-fresolution/tmp/ccXJXVQE.res -plugin-opt-pass-through-lgcc -plugin-opt-pass-through-lgcc_s -plugin-opt-pass-through-lc -plugin-opt-pass-through-lgcc -plugin-opt-pass-through-lgcc_s --build-id --eh-frame-hdr-melf_x86_64 --hash-stylegnu --as-needed -dynamic-linker链接器行为符号解析与重定位。链接器如ld将多个目标文件和库合并为一个可执行文件主要完成符号解析将每个符号引用与一个符号定义关联起来例如printf的实现在libc.so中重定位将每个符号的最终虚拟地址填入代码中合并相同的节section生成完整的可执行文件

相关文章:

和我一起学软件架构:C编译流程

引言 我们基于两个材料进行实验&#xff1a;&#xff08;一个简单的C语言代码) (GNU工具-GCC) 源代码 // hello.c #include <stdio.h> #define PI 3.14159 int main() {double radius 5.0;double area PI * radius * radius;printf("Area %f\n", area);re…...

【力扣-239. 滑动窗口最大值[特殊字符]】Python笔记

单调队列与滑动窗口算法详解滑动窗口概念滑动窗口技术用于在数组或字符串上维护一个固定大小的子区间。传统暴力解法每次滑动窗口后重新计算极值会导致O(nk)时间复杂度&#xff0c;在数据规模较大时效率低下。单调队列特性单调队列通过特殊结构保证队列元素始终有序&#xff1a…...

linux的指令(2)

find&#xff08;用于查找文件&#xff09;find目录/ -name文件名&#xff08;文件名中加*是通配符&#xff0c;如第二张图&#xff09;which 用于查找指令通常指令都是处于bin文件中&#xff08;所有指令本质上都已Linux中的一个文件&#xff09;&#xff08;is where用于少数…...

工具管理化技术工具选型与集成评估

工具管理化技术工具选型与集成评估&#xff1a;提升企业效率的关键路径 在数字化转型的浪潮中&#xff0c;技术工具的选型与集成已成为企业提升运营效率、优化资源分配的核心环节。面对市场上种类繁多的技术工具&#xff0c;如何科学评估、合理选型&#xff0c;并实现高效集成…...

Phi-3 Forest Laboratory 工具链整合:Visual Studio Code高效开发插件推荐与配置

Phi-3 Forest Laboratory 工具链整合&#xff1a;Visual Studio Code高效开发插件推荐与配置 你是不是也遇到过这种情况&#xff1a;写代码写到一半&#xff0c;突然卡在一个函数实现上&#xff0c;或者面对一段复杂的遗留代码&#xff0c;需要花半天时间去理解它的逻辑。传统…...

AnythingtoRealCharacters2511部署教程:NVIDIA Jetson Orin Nano边缘端轻量部署方案

AnythingtoRealCharacters2511部署教程&#xff1a;NVIDIA Jetson Orin Nano边缘端轻量部署方案 1. 引言&#xff1a;让动漫角色走进现实 你是否曾经想过&#xff0c;让喜欢的动漫角色变成真实人物的样子&#xff1f;现在&#xff0c;通过AnythingtoRealCharacters2511模型&a…...

Nano-Banana部署优化指南:Euler Ancestral调度器提升生成稳定性

Nano-Banana部署优化指南&#xff1a;Euler Ancestral调度器提升生成稳定性 1. 项目概述与价值 Nano-Banana Studio是一款专注于物理结构拆解风格的AI创作工具&#xff0c;能够将复杂的服装、鞋包或电子产品转化为极具美感的平铺图&#xff08;Knolling&#xff09;或分解视图…...

YOLO12与UltraISO结合:制作启动U盘中的图像识别

YOLO12与UltraISO结合&#xff1a;制作启动U盘中的图像识别 1. 引言 每次制作系统启动U盘时&#xff0c;最让人头疼的就是确认下载的ISO镜像文件是否正确无误。下载过程中网络波动、文件损坏&#xff0c;或者不小心选错了版本&#xff0c;都可能导致制作出来的启动盘无法正常…...

游戏战斗系统伤害计算与技能冷却

在充满策略与挑战的游戏世界中&#xff0c;战斗系统的伤害计算与技能冷却机制是决定胜负的核心要素。无论是角色扮演游戏中的BOSS战&#xff0c;还是MOBA竞技中的团战对决&#xff0c;精准的伤害预估与技能节奏把控往往能扭转战局。本文将深入剖析战斗系统的设计逻辑&#xff0…...

AnimateDiff模型架构解析:从文生图到文生视频的技术演进

AnimateDiff模型架构解析&#xff1a;从文生图到文生视频的技术演进 深入理解AnimateDiff如何通过精巧的架构设计&#xff0c;将静态图像生成进化为动态视频创作 1. 引言&#xff1a;视频生成的技术挑战 视频生成相比图像生成面临着一个核心挑战&#xff1a;时间维度的一致性。…...

一键部署人脸识别:Retinaface+CurricularFace镜像快速体验

一键部署人脸识别&#xff1a;RetinafaceCurricularFace镜像快速体验 1. 为什么选择这个镜像 你是否遇到过这样的情况&#xff1a;想尝试人脸识别技术&#xff0c;却被复杂的模型部署和环境配置搞得焦头烂额&#xff1f;这个RetinafaceCurricularFace镜像就是为了解决这个问题…...

节省50%编码时间:Qwen2.5-Coder-1.5B在真实项目中的应用分享

节省50%编码时间&#xff1a;Qwen2.5-Coder-1.5B在真实项目中的应用分享 1. 为什么选择Qwen2.5-Coder-1.5B 1.1 从手动编码到AI辅助的转变 在过去的三个月里&#xff0c;我们的开发团队从一个完全手动编码的工作流程&#xff0c;逐步过渡到使用Qwen2.5-Coder-1.5B作为日常开…...

Java 从入门到精通(六):抽象类与接口到底怎么选?

Java 从入门到精通&#xff08;六&#xff09;&#xff1a;抽象类与接口到底怎么选&#xff1f; 学到继承和多态之后&#xff0c;很多人会马上遇到一个新问题&#xff1a; 抽象类和接口看起来都像是在“定义规范”&#xff0c;那它们到底有什么区别&#xff1f; 更麻烦的是&…...

手把手教你用OMNet++和NESTING搭建TSN仿真环境(Ubuntu 16.04/18.04版)

在Ubuntu系统中构建TSN仿真环境的完整指南&#xff1a;OMNet与NESTING实战 时间敏感网络&#xff08;TSN&#xff09;作为工业自动化、车载通信等关键领域的核心技术&#xff0c;其仿真验证环节的重要性不言而喻。本文将带您完成从零开始在Ubuntu 16.04/18.04系统上搭建基于OMN…...

NetBox IPAM实战:如何用Redis提升你的网络管理效率(附详细配置步骤)

NetBox IPAM实战&#xff1a;Redis加速网络管理的全流程指南 在数字化基础设施快速扩张的今天&#xff0c;网络地址管理(IPAM)系统正面临前所未有的性能挑战。NetBox作为开源IPAM领域的标杆工具&#xff0c;其默认配置虽然能满足基础需求&#xff0c;但当遇到大规模网络设备管理…...

Python 异步下载任务调度机制

Python异步下载任务调度机制&#xff1a;高效处理网络IO的利器 在当今数据驱动的时代&#xff0c;高效下载网络资源成为许多应用的核心需求。Python凭借其强大的异步编程能力&#xff0c;通过asyncio、aiohttp等库构建的异步下载任务调度机制&#xff0c;能够显著提升网络IO密…...

墨语灵犀快速上手:Anaconda虚拟环境配置与模型调用测试

墨语灵犀快速上手&#xff1a;Anaconda虚拟环境配置与模型调用测试 你是不是刚接触大模型开发&#xff0c;想快速搭建一个干净、独立的Python环境来测试模型&#xff1f;或者你已经在多个项目间切换&#xff0c;被各种依赖冲突搞得焦头烂额&#xff1f; 今天&#xff0c;我就…...

使用WebSocket构建实时应用

WebSocket技术为实时应用开发带来了革命性变化。传统HTTP协议只能实现单向通信&#xff0c;而WebSocket支持全双工通信&#xff0c;使得服务器可以主动推送数据到客户端&#xff0c;极大提升了实时交互体验。如今&#xff0c;从在线聊天到股票行情&#xff0c;从多人游戏到协同…...

3个月速通大模型:告别 GitHub 沉迷,从算法老炮到 LLM 工程师!

如果你在读这篇文章&#xff0c;大概率你已经收藏了50个GitHub仓库&#xff0c;却连一个完整的RAG系统都没跑通。承认一个事实&#xff1a;你现在走的弯路&#xff0c;就是别人3年前走过的。 我做了10年推荐算法&#xff0c;见过太多技术人在新浪潮面前的焦虑。大模型这波浪潮&…...

Nanbeige4.1-3B参数详解与性能实测:SFT+RL增强版小模型效果深度解析

Nanbeige4.1-3B参数详解与性能实测&#xff1a;SFTRL增强版小模型效果深度解析 1. 引言&#xff1a;小模型也能有大智慧 最近在开源社区里&#xff0c;有一个小模型悄悄火了起来——Nanbeige4.1-3B。你可能在想&#xff0c;现在动辄几十亿、几百亿参数的大模型满天飞&#xf…...

深度学习项目训练环境模型即服务:训练完直接导出ONNX,无缝对接Flask/FastAPI

深度学习项目训练环境模型即服务&#xff1a;训练完直接导出ONNX&#xff0c;无缝对接Flask/FastAPI 1. 环境准备与快速上手 深度学习项目开发最头疼的就是环境配置问题。不同的框架版本、CUDA版本、Python版本&#xff0c;再加上各种依赖库&#xff0c;光是配环境就能耗掉大…...

Qwen1.5-1.8B-GPTQ-Int4开源协作实践:GitHub Issue管理、PR审核、CI/CD流水线搭建

Qwen1.5-1.8B-GPTQ-Int4开源协作实践&#xff1a;GitHub Issue管理、PR审核、CI/CD流水线搭建 1. 项目概述与价值 通义千问1.5-1.8B-Chat-GPTQ-Int4是一个经过量化的轻量级语言模型&#xff0c;专门针对资源受限环境优化。这个模型基于Transformer架构&#xff0c;采用了SwiG…...

神经符号AI:让机器人“想”得更清楚,“做”得更精准

神经符号AI&#xff1a;让机器人“想”得更清楚&#xff0c;“做”得更精准 引言 在机器人迈向通用智能的道路上&#xff0c;一个核心挑战是如何让其既能理解复杂抽象的任务目标&#xff0c;又能适应开放动态的真实环境。纯符号AI擅长逻辑推理与规划&#xff0c;但“不接地气”…...

智能组合实体员中的树形结构管理与遍历算法

智能组合实体中的树形结构管理与遍历算法 在人工智能与大数据时代&#xff0c;智能组合实体&#xff08;如知识图谱、组织结构或自动化决策系统&#xff09;的高效管理离不开树形结构的支持。树形结构以其清晰的层次关系和高效的遍历能力&#xff0c;成为复杂数据组织的重要工…...

Echarts + China.js 实现中国地图数据可视化实战

1. 快速上手Echarts与China.js 最近在做一个疫情数据展示项目时&#xff0c;我发现Echarts配合China.js做中国地图可视化简直不要太方便。记得第一次接触这个组合时&#xff0c;被网上的各种教程绕得晕头转向&#xff0c;今天我就把踩过的坑都总结出来&#xff0c;让你10分钟就…...

玩转OpenClaw:主配置文件参数详解指南手册

配置文件概述 OpenClaw 使用 JSON / JSON5 格式的配置文件来管理系统所有组件的设置。配置文件采用分层结构,支持灵活的配置覆盖和环境变量注入。 主要特性 JSON5 支持:支持注释、尾随逗号、单引号等扩展语法 环境变量:可通过 env 字段或者 .env文件注入环境变量 配置合并…...

【译】 如何使用 .NET MAUI 构建 Android 小部件

▲ 点击上方“DotNet NB”关注公众号回复“1”获取开发者路线图学习分享 丨作者 / 郑 子 铭 这是DotNet NB 公众号的第239篇原创文章原文 | Toine de Boer翻译 | 郑子铭这是Toine de Boer的客座博文。这篇博客将探讨上一篇关于iOS 小部件的博客中创建的交互式小部件的 Andro…...

AgentCPM研报助手应用指南:如何用它高效完成课题研究与论文写作

AgentCPM研报助手应用指南&#xff1a;如何用它高效完成课题研究与论文写作 1. 为什么选择本地研报生成工具&#xff1f; 在学术研究和商业分析领域&#xff0c;撰写深度报告是每个研究者必须面对的任务。传统流程通常包括&#xff1a; 收集和阅读大量文献资料整理数据并构建…...

StructBERT效果展示:真实业务中语义相似度从0.82→0.09的修复

StructBERT效果展示&#xff1a;真实业务中语义相似度从0.82→0.09的修复 1. 项目背景与问题痛点 在实际业务场景中&#xff0c;文本相似度计算是个常见但棘手的问题。你可能遇到过这样的情况&#xff1a;明明两个完全不相关的句子&#xff0c;用传统方法计算出来的相似度却高…...

SAM 3功能全解析:点、框、掩码、文本,多种提示方式随心用

SAM 3功能全解析&#xff1a;点、框、掩码、文本&#xff0c;多种提示方式随心用 1. 引言&#xff1a;从“分割一切”到“提示一切” 想象一下&#xff0c;你有一张复杂的街景照片&#xff0c;里面有行人、车辆、树木和建筑。现在&#xff0c;你想把其中一辆红色的汽车单独“…...