Cortex A移植概念备忘录

发布时间:2026/10/8 10:04:56

Cortex A移植概念备忘录 目录1.交叉编译工具链2.工具链的配置与常用命令2.1 ELF 头部信息readelf -h 查看—— 程序的“运行说明书”2. 2 符号表nm 查看strip 去除—— 程序的“源码索引”为什么对最终可执行文件 strip不影响链接也不影响运行3.生成二进制镜像文件4.生成ELF可执行文件Linux系统移植的核心步骤包括搭建交叉编译工具链、编写Bootloader、移植Linux内核、构建根文件系统。1.交叉编译工具链概念由于开发主机PC与目标机嵌入式板子CPU架构不同需要使用在宿主机上运行但能生成目标机可执行代码的工具链称为交叉编译工具链。核心组件工具链通常包含gcc、ld、ar、objcopy等工具。2.工具链的配置与常用命令环境变量配置将交叉编译工具链的路径添加到shell的环境变量PATH中以便在终端中直接调用工具。常用命令解析file用于查看文件的类型和属性确认可执行文件的架构如x86, arm。readelf用于分析ELF格式文件的头部信息如入口地址、各段信息等。size用于查看目标文件各段代码段、数据段、BSS段的大小。nm用于查看目标文件中的符号表帮助定位函数和变量。strip用于去除可执行文件中的符号表和调试信息以减小文件体积适用于最终部署到资源受限的嵌入式设备。2.1 ELF 头部信息readelf -h查看—— 程序的“运行说明书”CPU 本身是“傻子”它不知道从哪里开始执行也不知道内存怎么划分。ELF 头部就是解决这个问题的。入口地址Entry point address作用告诉操作系统或 BootLoader“加载完程序后请从内存的这一个地址开始执行第一条指令”。实战意义在嵌入式裸机开发中这个地址通常由链接脚本Linker Script指定比如 STM32 的0x08000000。如果你用readelf看到入口地址是0x0或者一个奇怪的地址那程序一运行大概率会“跑飞”或崩溃。各段信息Program Headers / Section Headers头部里会写明.text代码段、.data数据段、.bss未初始化全局变量段在文件中的偏移量、在内存中的大小以及加载地址。作用系统加载器Loader根据这些信息把代码搬运到 RAM/Flash 的指定位置并留出足够的内存空间给变量。实战意义假设你的嵌入式板子 RAM 只有 64KB你用readelf -S看到.bss段占了 70KB那程序一运行就会因为内存溢出而挂掉HardFault。提前用readelf检查就能避免烧录进去后才知道出问题。2. 2 符号表nm查看strip去除—— 程序的“源码索引”编译后的机器码全是0和1CPU 只认地址比如0x80001234不认函数名比如uart_send。符号表就是将内存地址和源代码中的函数名、全局变量名一一对应起来的“密码本”。符号表的作用nm定位函数和变量编译报错“未定义引用undefined reference”时用nm检查.o文件能立刻看到哪些函数地址是U未定义哪些是T已定义帮你排查链接错误。分析内存占用用nm --size-sort可以按大小列出所有函数让你一眼看出哪个函数编译后体积最大比如某个数组占了 10KB方便你优化代码。为什么要去除strip符号表里存着成千上万个函数名比如void init_gpio(void)这种字符串这些名字在程序运行时完全没有用CPU 只看地址不看名字。在资源受限的嵌入式设备中Flash 空间寸土寸金。一个带符号表的程序可能有 500KBstrip掉符号表和调试信息后可能只剩下 200KB文件体积直接缩小一半以上。注意strip后的程序无法再用 GDB 进行源码级单步调试崩溃后只能看到地址比如PC0x8001234所以通常是在最终量产发布前才执行strip而保留一份带符号的版本用于后期维护排查问题。如果是对“最终生成的可执行文件”执行strip完全不影响运行时动态链接程序照常运行。如果是对“还没链接的中间文件.o 目标文件或静态库.a”执行strip会严重影响后续的链接导致链接直接失败。Linux 里的“符号表”拆分成“静态符号表.symtab”和“动态符号表.dynsym”看完下面的对比你就全明白了为什么对最终可执行文件 strip不影响链接也不影响运行当你运行gcc main.c -o app生成最终程序后文件里其实有两张表静态符号表.symtab体积巨大记录了所有函数名、变量名、行号信息。这是专门给调试器GDB和链接器ld看的CPU 和操作系统加载器完全无视它。动态符号表.dynsym体积很小只记录外部依赖的库函数比如printf、malloc和导出的接口。strip默认干的事它只把那张巨大的“静态符号表”和调试信息.debug 段撕掉通常不会动“动态符号表”。所以当程序运行时动态链接器ld-linux.so依然能通过动态符号表找到libc.so里的printf地址完成链接和跳转。程序跑起来完全不受影响并且体积缩小了3.生成二进制镜像文件背景裸机程序如Bootloader、内核需要直接运行在物理内存中因此不能使用带ELF头的可执行文件必须生成纯净的二进制镜像。生成流程使用gcc编译C或汇编源码生成目标文件.o。使用ld命令链接目标文件并通过链接脚本linker script指定各段如代码段、数据段的加载地址。使用objcopy命令将链接后生成的ELF文件中的代码段等实际内容剥离生成最终的二进制镜像文件。4.生成ELF可执行文件a. 把高级语言 .c .S 生成 .o目标文件b. 不能使用ld命令而是使用gcc 将.o目标文件 做为 链接原材料进行链接 gcc会自动加载标准C库和OS初始化库的内容c. 在链接时交给默认链接脚本实现链接 使用虚拟地址d. 默认生成ELF格式的可执行文件
延伸阅读

更多相关文章

2026/10/8 10:04:46

家务机器人从炫技到实用:可收纳设计与软硬协同是关键突破

最近两年,机器人领域的热闹,大家有目共睹。从波士顿动力的炫技,到各种“具身智能”的宏大叙事,再到层出不穷的“家务机器人”Demo视频,我们似乎总在“未来已来”的兴奋和“何时能买”的困惑之间摇摆。一个常见的场景是…

2026/10/3 7:02:09

一站式海外公关传播,美联社发稿找传播易

随着越来越多国内企业加速全球化布局,如何在国际舆论场建立品牌公信力、实现有效信息触达,成为出海传播的核心难题。海外社交媒体流量竞争白热化,普通门户网站软文影响力有限,拥有全球辐射能力的权威通讯社发稿,逐渐成…

2026/10/4 17:11:17

DDrawCompat:3步拯救Windows老游戏,让经典重获新生

DDrawCompat:3步拯救Windows老游戏,让经典重获新生 【免费下载链接】DDrawCompat DirectDraw and Direct3D 1-7 compatibility, performance and visual enhancements for Windows Vista, 7, 8, 10 and 11 项目地址: https://gitcode.com/gh_mirrors/d…

2026/10/8 10:04:10

Flutter开发入门:Dart基础语法、环境配置与状态管理实战

如果你打算玩Flutter,第一道绕不过去的门槛就是Dart。市面上讲Flutter的中文资料虽然多,但很多教程默认你已经会Dart,上来就直接甩一堆组件代码,新手跟着敲半天也不知道自己在写什么。这篇我就以“艺术探索”的心态,带…

2026/10/8 10:04:10

容错率不是玄学:连跪两天后的状态恢复实战指南

连跪这事,老玩家都不陌生。但有意思的是,连跪两天之后,我明显感觉到自己操作的“许可范围”在收缩——以前那种残血敢回头反打、半血敢卡视野秀操作的底气,没了。不是手生了,是容错率变了。我花了两个通宵,…

2026/10/8 10:04:10

智能体连不上ERP/OA/CRM?不是API问题,是语义没对齐

1. 项目概述:当企业智能体要“读懂”ERP、OA和CRM,它真正需要的不是更多API,而是更懂业务的连接逻辑最近帮三家企业落地智能体项目,客户问得最多的一句话就是:“我们系统都有API,为什么智能体还是连不上、读…

2026/10/8 10:04:10

Claude Code多Agent编排与闭环自愈:从聊天到工程流水线

从"单步聊天"到"工程流水线",这是我用Claude Code之后感受最深的一个转变。早期用Agent干活,基本是开一个对话窗口,把需求一股脑丢进去,然后就是漫长的对话拉锯:代码改一处、上下文乱一段&#xf…

2026/10/8 9:59:08

Java异步编程实战:CompletableFuture多任务编排与线程池避坑指南

在 Java 并发编程里,CompletableFuture 算是把异步编程门槛拉低了一个档位的存在。本来我不太想写这个被写烂了的主题,但最近连续在两个项目里看到有人把它用成"加强版 Future 加回调"——该编排的没编排,该兜底的没兜底&#xff0…

2026/10/8 10:03:18

Jev+Agent接管浏览器:browser-use实战与jev-ultrafast性能优化

1. 从“Jev”说起:为什么我要把Agent接进浏览器“Jev”这个词最近在圈子里出现的频率越来越高,很多人第一次听到会以为是某个新模型的名字,其实它更像是一种思路——把Jev模型的能力当作底座,通过Agent的方式去接管浏览器&#xf…

2026/10/8 10:03:20

多智能体集群实战:DeepAgents编排、MCP与A2A协议及Skills体系

1. 从"单兵作战"到"集群协同":多智能体编排到底在解决什么问题如果你最近在折腾 Agent 相关的东西,大概率会有一种感觉:单个 Agent 能做的事情,其实很快就摸到天花板了。你给它一个提示词,挂几个工…

2026/10/8 6:05:44

无源低通滤波器设计实战:从RC到LC,手把手教你避开那些坑

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 0:02:17

自然数立方等于连续奇数之和:从证明到编程验证

十几年来我一直游走在数学科普和编程教学这两块内容之间,对“看起来像魔法、拆开全是数学”的结论总是格外敏感。最近翻资料时又撞见一句话:任何一个自然数 m 的立方,都可以写成 m 个连续奇数之和。2 的立方等于 3 加 5,3 的立方等…

2026/10/8 0:02:17

C#上位机SSH连接实战:用SSH.NET补齐超时、批量与密钥认证

简介:这是一份基于 C# 开发的 SSH 连接功能半成品工程,原本作为另一个主项目的子功能模块,现独立打包分享。工程采用 WinForms 界面,包含源码、解决方案、安装部署工程、NuGet 依赖包及说明文档,适合正在做远程连接、网…

2026/10/8 0:02:17

Java SpringBoot一体化智能售后系统设计与实现全解析

毕业设计年年做,Java Web 方向的题目翻来覆去就那么几个,但“一体化智能售后系统”这个题,每次看到我都觉得值得认真聊一聊。它不是一个简单 curd 堆出来的管理系统,而是把客户、工单、派单、处理、回访、统计整条链路串起来的一套…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑