在使用ARM机型进行开发的时候,都会用到ARM底层提供的执行文件,今天就来分析一下这几个文件。
1.fromelf.exe
该文件的主要功能是生成.bin文件。该工具的语法为
fromelf [options] input_file
详细参数如下:
可选参数
--help 显示帮助
--vsn 显示版本信息
--output_file 输出文件(默认文本格式)
--nodebug 在生成的镜像中不包含调试信息
--nolinkview 在生成的镜像中不包含段信息
二进制输出格式
--bin 二进制输出
--m32 摩托罗拉32位hex
--i32 因特尔32位hex
--vhx 适配字节hex格式
--base addr 可选择设置基础地址对于m32i32
需要调试信息的输出格式
--fieldoffsets 结构/类的汇编语言描述
--expandarrays 被扩展的内部或外部数组
其他输出格式
--elf ELF(Executable and Linking Format)格式
--text 文本格式
文本格式的标志
-v 打印详细信息
-a 打印数据地址(针对镜像调试编译)
-c 打印反汇编代码
-d 打印数据段的内容
-e 打印异常表
-g 打印调试表
-r 打印重定位信息
-s 打印字符表
-t 打印字符串表
-y 打印动态段的内容
-z 打印代码和数据大小信息
因为keil是默认生成.axf文件的,该文件包含了二进制和调试信息。现在就是通过.axf文件通过这个工具转换成bin文件。
路径/fromelf.exe --bin -o [输出Bin文件的路径] [.axf的路径]
正常我们输入的路径应该是这样的
G:\keil_5\ARM\ARMCC\bin\fromelf.exe --bin -o ./bin/输出名.bin ./Objects/输出名.axf
这里可以简化一下
G:\keil_5\ARM\ARMCC\bin\fromelf.exe --bin -o ./bin/@L.bin ./Objects/@L.axf
@L的意思是自己再keil中设置的输出文件名。
可以再简化一下
$KARM\ARMCC\bin\fromelf.exe --bin -o ./bin/@L.bin ./Objects/@L.axf
$K的意思是MDK的安装路径。
这里也可以写成
$J\..\bin\fromelf.exe --bin -o ./bin/@L.bin ./Objects/@L.axf
$J是编译器的绝对地址,通常是MDK安装路径\ARM\ARMCC\include
再简单一点可以写成
$J\..\bin\fromelf.exe --bin -o ./bin/@L.bin #L
#L就是.axf完整路径和文件名
再简单一点可以写成
$J\..\bin\fromelf.exe --bin -o $L@L.bin #L
$L本工程的输出路径。在Output->create Executable中。
详细可以看windows bat脚本学习一(基础指令)_qq_34981的博客-CSDN博客_bat设置环境变量文章的第7小节。
注:这里有时候在生成bin文件的时候会生成一个.bin的文件夹。可以将参数bin修改为bincombined来解决。这个生成文件夹的原因目前只知道跟修改了ROM的起始地址有关,具体的原因还未知。
2.armar.exe
该文件主要是从.a和lib文件中提取信息。
命令格式:armar options archive [file_list]
-r 在 <file_list> 插入文件, 替换掉已经存在的同名成员.
-d 在 <file_list> 中删除成员.
-x 在 <file_list> 中提取同名的成员.
-m 在 <file_list> 中移动文件.
-p 打印文件到标准输出设备.
-a pos 插入/删除 <pos> 后面的文件.
-b pos 插入/删除 <pos> 前面的文件.
-u 只更新旧的文件, 与 -r 一起使用.
-n 不要向object文件中添加符号表.
-s 强制重新生成文档符号表.
-t 打印文档的内容表.
--zs 显示符号表.
--zt 汇总文档内容 (大小和输入).
-c 当一个新文档被创建的时候不显示警告.
-C 提取的时候不要覆盖一个已经存在的文件.
-T 截取系统最大长度文件名.
-v 提供详细输出.
--create 强制创建一个新的文档.
--via file 从 via 文件中获取额外参数.
--sizes 列出所有成员大小与库的总大小.
--entries 列出包括入口点的部分.
--vsn 打印最新的armar版本.
--help 打印帮助信息.
比如要打印一个.a或lib的相关信息,可以调用如下指令armar.exe -zt 路径\文件.a。
结果如图
3.armasm.exe
命令格式:armasm [options] sourcefile
--list 生成列表文件
-o outputfile 最终输出文件名
--depend 保留make源文件的依赖
--errors 把标准错误判断放入errorsfile
-I dir 添加源文件的搜索目录
--pd
--predefine 预执行SET{L,A,S}指令
--maxcache <n> 最大闪存空间(默认 8MB)
--no_esc 忽略C文件
--no_warn 关闭警告信息
-g 输出调试表
--apcs 编译预定义去匹配已选择的过程调度回调
--checkreglist 警告关于输出指令LDM/STM寄存器列表
--li ARM小段模式、
--bi ARM大端模式
-M 写源文件依赖列表到stdout
--MD 写源文件依赖列表到inputfile.d文件
--keep 保持本地列表在目标文件的同步列表中
--regname none 不预定义寄存器名
--split_ldm 错误长LDM/STM
--unsafe 下载明确的错误到警告表
--via <file> 从file中读取更多的参数
--cpu <target-cpu> 设置目标ARM内核类型
--cpu list 输出所有可选择的CPU列表
--fpu <target-arch> 设置目标FP体系结构版本
--fpu_list 输出所有可选择的FP体系结构
--thumb 以thumb指令集编译
4.armcc.exe
链接编译器
命令格式:armcc [options] file1 file2......file n
--arm 创建ARM代码
--thumb 创建Thumb代码
--c90 切换到C模式(默认是.c文件)
--cpp 切换到C++模式(默认是.cpp文件)
-00 最小优先级
-01 受限的调试级别优化
-02 高优化
-03 最大优化
-Ospace 对代码大小进行优化
-Otime 优化最大优化级别的运行时间
--cpu <cpu> 选择CPU
--cpu list 输出所有被选中的CPU列表
-o <file> 最终输出文件的名字
-c 只进行编译,不链接
-asm 输出汇编以及obj文件
-s 只输出汇编文件
--interleave 交叉反汇编(同--asm 或 -s共同使用)
-E 仅仅预处理C代码
-D <symbol> 定义<symbol>符号并且传入编译过程
-g 为高级别调试创建表
-I <directory> 在编译的时候包含<directory>作为头文件搜索目录
5.armlink.exe
ARM链接工具
命令格式:armlink option-list input-file-list
option-list 不区分大小写的选项列表
input-file-file 输入对象或者库文件列表
--output file 指定输出文件名
--via file 从文件中读更多的参数
--partial 创建一个被分数链接的对象文件
--scatter file 分散加载文件
--ro-base n 设置执行地址空间域,包含RO只读数据段
--rw-base n 设置执行地址空间域,包含RW/ZI段
--bestdebug 添加调试信息为image 提供调试视图
--datacompressor off 不要压缩RW数据段
--no_debug 不要添加调试信息
--entry 指定输入段与输入点
--libpath 指定系统库文件路径
--userlibpath 指定用户库文件路径
--no_locals 不要添加局部标号到image的标号列表
--no_remove 不要移除image的未使用段
--callgraph 创建一个函数静态调用图
--info topic 列出镜像信息
--map 显示镜像内存映射
--symbols 列出惊险符号
--xref 列出输入的段之间所有的交叉引用,最终输出会放在.map 文件里面