lv12 交叉编译工具链 7

2023-12-17

目录

1 交叉编译

1.1 镜像来源

1.2 编译原理

1.3 编译过程​编辑

1.4 交叉编译

1.5 交叉编译工具链获取

2 ELF文件格式

​编辑3 BIN文件格式

4 交叉编译工具链常用工具

4.1 size命令举例

4.2 rm命令举例

4.3 strip命令

4.4 OBJDUMP命令介绍

-d 反汇编

4.5 OBJCOPY命令介绍

5 练习


1 交叉编译

1.1 镜像来源

上一节的rootfs、dtb、linux、uboot的都是来自开源软件,这些软件和硬件是不匹配的

整个过程:开源-> 移植- >编译 ->安装

1.2 编译原理

机器码(二进制)是处理器能直接识别的语言,不同的机器码代表不同的运算指令,处理器能够识别哪些机器码是由处理器的硬件设计所决定的,不同的处理器机器码不同,所以机器码不可移植.二进制机器码查错很困难,不可读

汇编语言是机器码的符号化,即汇编就是用一个符号来代替一条机器码,所以不同的处理器汇编也不一样,即汇编语言也不可移植

C语言、C++、python等上层语言在编译时我们可以使用不同的编译器将源码编译成不同架构处理器的汇编,使得上层语言可以移植

1.3 编译过程

例:

1 预处理把不能直接编译成汇编的内容进行处理,头文件展开

2 编译把C语言处理成汇编(x86上的汇编语言)

3 汇编,把汇编转换成二进制文件

4 链接,把不同的机器码(库,别人写好的文件)链接在一块

先预处理、编译和汇编

最后放在一起编译,即ld链接的原理

1.4 交叉编译

1.5 交叉编译工具链获取

1交叉编译工具链的获取:

  • 1) 官网获取(不推荐,需要自己进行复杂配置与编译)         http://ftp.gnu.org/gnu/gcc/
  • 2) BSP板级开发支持包 (推荐) samsung、全志...

2交叉编译工具链的内容

  • 1) 交叉编译工具         gcc/readelf/size/nm/strip/objcopy/objdump/addr2line
  • 2) 库     ARM架构的库

bin工具目录

ARM共享库(与ubuntu直接提供的库不一样,二进制文件都有平台特性)

2 ELF文件格式

ELF格式是Linux平台上应用最广泛的二进制工业标准之一

ELF格式的文件内包含了很多个段不同的段存储了不同的信息;因为ELF格式的文件 要通过Linux系统的加载和管理才能运行 ,所以除了最基本的代码段和数据段之外,其中还存储了很多其它的信息,如符号表、调试信息等(如生成调试文件+G,与不加G生成的elf文件是不一样的)

file
    file + 文件名		查看文件的详细信息
    
readelf
    readelf -h + 文件名 	列出elf文件的头部信息
    readelf -a + 文件名 	列出elf文件的所有信息

示例:

3 BIN文件格式

BIN文件一般是 直接运行在CPU之上 的可执行文件 ,文件内只包含了CPU能够直接识别和运行的指令和数据,不包含其它系统相关的信息

4 交叉编译工具链常用工具

size			列出目标文件每一段的大小以及总体的大小
    size + 文件名		
    
nm			列出目标文件中的符号表(标示符)
    nm + 文件名		

strip		丢弃目标文件中的符号
    strip + 文件名		
    注:对于嵌入式开发,这个命令很重要
objdump			从目标文件中显示信息	
    eg:		
    	objdump -d + 文件名	将目标文件反汇编(机器码->汇编)
    
objcopy			对目标文件进行复制和转换
    eg:
    	objcopy --gap-fill=0xff -O binary a.out a.bin		
	将目标文件转换为bin格式

4.1 size命令举例

text 汇编码

data 存放全局变量(static 局部变量)(int a =100)

bss 存放未初始化全局变量和静态局部变量(int a)

示例:

局部变量存放在栈空间,不占用代码大小

注意:与ll的文件大小相比,size只列出了.text部分的大小

使用编译器

4.2 rm命令举例

像main函数即是一个符号

4.3 strip命令

丢弃符号表中的符号.symtab,因为程序运行的是很好只有代码段和数据段会加载到内存,符号表并不参与实际程序运行,但是会使得elf文件所占空间变大。

示例:程序瘦身

注:对于嵌入式开发,这个命令很重要,arm中使用arm工具的strip命令

可以使用file来查看文件是否瘦身

也可以使用nm来查看库文件中的函数

4.4 OBJDUMP命令介绍

主要介绍2个,其余可以自己看

-d 反汇编

arm-none-linux的反汇编

如果大写D可以显示更多信息。

用法:

如拿到可执行程序,有些程序需要账号和密码,如果使用b跳转指令,即可直接使用程序运行。

4.5 OBJCOPY命令介绍

把elf文件转换未bin文件,因为elf文件需要运行在linux之上。原理即把代码段数据段的内容提取出来即为bin文件。把许多段,使用gap-fill 填充为0xff即可。

5 练习

1.简述GCC编译C语言程序的步骤及每一步的主要工作?
2.简述ELF格式文件与BIN格式文件的主要区别是什么?
3.简述交叉编译工具链中strip及objdump工具的主要用途是什么?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

lv12 交叉编译工具链 7 的相关文章

  • 树莓派+OpenCV+Arduino实现二维码与颜色识别检测及物料抓取总结

    1 系统总体设计和分析 系统总体分为硬件设计和软件设计 硬件设计就是基于树莓派2代B型和Arduino的硬件基础平台搭建 能够适应小型 灵活的现实需求 并为软件设计提供可观的计算能力承载和算法改进空间 软件设计就是在嵌入式Arduino上构
  • kiel5编译报错error: L6235E: More than one section matches selector - cannot all be FIRST/LAST.

    原因是startup xxx s文件只能保留其中一种 启动文件分别带有hd md ld和cl vl xl几种种字样 需要查看mcu的flash内存大小来选择 cl 互联型产品 stm32f105 107系列 vl 超值型产品 stm32f1
  • 嵌入式Linux开发环境搭建-2-制作编译工具

    嵌入式Linux开发环境搭建 2 制作编译工具 一 安装基本开发环境 1 1 build essential安装 1 2 bison和flex 4 3 安装C函数库的man手册 二 安装交叉编译工具链 2 1 相关软件下载 2 2 修改一个
  • ARM第五章平时作业

    第 5 章 S3C2440 嵌入式系统 共 63 分 一 简述启动代码存储在 NAND Flash 存储器上时 S3C2440 的启动过程 6 分 为了支持 NAND Flash 的 boot loader S3C2440A 配备了一个内部
  • (大集合)Linux进程和线程的基本编程、通讯和例程【杂记】

    Linux 进程 和 线程 的基本 编程 通讯 和 例程 注 杂记 系列为日常网搜资料的堆砌而积累成之 如有错误恭谢指出 标识为 原创 其实不完全是 只是多引用再整理和加上自己的理解 进行记录备查 大都引自网络 侵删 大量参考 100ask
  • STM32 使用HAL库实现微秒级长延时

    STM32 使用HAL库实现微秒级长延时 背景 定时器初始化 主程序中的设计 背景 STM32 HAL库中有一个延时函数HAL Delay 可以实现毫秒级的延时 能够满足一般延时需求 在有些场合下 我们需要更精准的延时 同时可能会有较长时间
  • Linux驱动-编译驱动模块的Makefile和脚本

    Makefile内容 ARCH arm CROSS COMPILE arm poky linux gnueabi 也可以同时编译多个模块 obj m export symbol o export symbol1 o export symbo
  • ARM——体系架构

    1 ARM简介 ARM是Advanced RISC Machines的缩写 它是一家微处理器行业的知名企业 该企业设计了大量高性能 廉价 耗能低的RISC 精简指令集 处理器 公司的特点是只设计芯片 而不生产 它将技术授权给世界上许多著名的
  • 交换机端口镜像详解

    交换机端口镜像是一种网络监控技术 它允许将一个或多个交换机端口的网络流量复制并重定向到另一个端口上 以便进行流量监测 分析和记录 通过端口镜像 管理员可以实时查看特定端口上的流量 以进行网络故障排查 安全审计和性能优化 以下是关于交换机端口
  • RTL8762DK PWM(七)

    概述 本示例 只要介绍 如何使用PWM 又离成功进了一步 一 环境 1 硬件 RTL8762DK 128M Bits Falsh 2 软件 keil IDE 二 PWM的使用 1 创建examples ble pwm工程 基于 exampl
  • 01_I.MX6U芯片简介

    目录 I MX6芯片简介 Corterx A7架构简介 Cortex A处理器运行模型 Cortex A 寄存器组 IMX6U IO表示形式 I MX6芯片简介 ARM Cortex A7内核可达900 MHz 128 KB L2缓存 并行
  • 【buildroot】buildroot使用总结

    文章目录 一 buildroot使用步骤 1 构建图形配置界面 2 配置Target options 3 配置Build options 4 配置Toolchain 5 配置 System configuration 6 配置 Filesy
  • STM32的介绍及MDK

    文章目录 STM32介绍 单片机 STM32命名 armV7的三个系列 STM32系统结构 CMSIS标准 STM32F4方包绍官方库包 STM32F103 STM32F103资源 STM32F103总线架构 STM32F103引脚 STM
  • Unity(纯C语言单元测试框架!不是那个Unity3d)入门文档

    译者注 译者博客 http blog csdn net lin strong 转载请保留这条 此为Unity手册的翻译 仅供学习交流使用 请勿用于商业用途 翻译的资料是公开的 在docs UnityGettingStartedGuide m
  • STM32 HAL——GPIO

    HAL的代码规范建议 以下内容是我自己参照HAL做的总结 如果公司有固定的编码规范 就跟公司保持一致 如果没有 那就推荐和所用库保持一致 注意 因人而异 并不具有普遍适用性 HAL库有如下代码规范 1 目录名除了专有词汇外 统一是单词首字母
  • 定时器详解

    1 什么是定时器 timer 定时器实际上就是Soc当中的一个内部外设 1 定时器与计数器 定时器常与计数器扯到一起 计数器也是soc当中的一个内部外设 计数器顾名思义是用来计数的 就和我们的秒表一样 秒表实际上就是一个计数器 每隔一个单位
  • 【FMC141】基于VITA57.4标准的4通道2.8GSPS 16位DA播放子卡(2片DAC39J84)

    FMC141是一款基于VITA57 4标准的4通道2 8GSPS 2 5GSPS 1 6GSPS采样率16位DA播放FMC子卡 该板卡为FMC 标准 符合VITA57 4与VITA57 1规范 16通道的JESD204B接口通过FMC 连接
  • lv12 交叉编译工具链 7

    目录 1 交叉编译 1 1 镜像来源 1 2 编译原理 1 3 编译过程 编辑 1 4 交叉编译 1 5 交叉编译工具链获取 2 ELF文件格式 编辑3 BIN文件格式 4 交叉编译工具链常用工具 4 1 size命令举例 4 2 rm命令
  • <sa8650>sa8650 CDT-之-汽车CDT配置用户指南(上)

    sa8650 sa8650 CDT 之 汽车CDT配置用户指南 上 2 CDT概述 2 1 Platform ID值 2 2 CDT一般结构 2 3 CDT头 2 4 块元数据 2 5 CDBs 2 6 加载CDT的启动过程
  • 【学习分享】全志平台TWI子系统源码分析(1)从设备树到寄存器

    全志平台TWI子系统源码分析 1 从设备树到寄存器 前言 一 名词解释 二 从设备树入手看源码 1 TWI设备树 2 TWI源码位置 3 TWI总线相关寄存器 总结 前言 这次开坑主要是想把全志平台TWI子系统在源

随机推荐