在使用ARM机型进行开发的时候,都会用到ARM底层提供的执行文件,今天就来分析一下这几个文件。

1.fromelf.exe

该文件的主要功能是生成.bin文件。该工具的语法为

fromelf        [options]        input_file

详细参数如下:

bat脚本调用wireshark抓包 bat脚本调用exe_编译

可选参数

--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]

bat脚本调用wireshark抓包 bat脚本调用exe_keil_02

 -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。

结果如图

bat脚本调用wireshark抓包 bat脚本调用exe_bat脚本调用wireshark抓包_03

3.armasm.exe

命令格式:armasm [options] sourcefile

bat脚本调用wireshark抓包 bat脚本调用exe_bat脚本调用wireshark抓包_04

--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指令集编译

--arm 以ARM指令集编译

4.armcc.exe

链接编译器

命令格式:armcc [options] file1 file2......file n

bat脚本调用wireshark抓包 bat脚本调用exe_arm_05

--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

 

bat脚本调用wireshark抓包 bat脚本调用exe_keil_06

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 文件里面