armar是ARM RealView Compilation Tools套件中的静态库管理工具,专门用于处理ARM架构下的库文件(.a格式)。与常见的ar工具不同,armar针对ARM目标文件进行了优化处理,能够正确处理ARM/Thumb指令集的特殊符号和重定位信息。
关键特性:支持ARM/Thumb混合代码库、自动处理符号表对齐、优化库文件组织结构以提升链接效率。
从RealView Compilation Tools v3.0开始,armar的命令行语法发生了重要变化:
-r)r)典型版本差异示例:
bash复制# v2.2及更早版本
armar rc libtest.a file1.o file2.o
# v3.0及以后版本
armar -r -c libtest.a file1.o file2.o
armar支持两种通配符模式:
bash复制armar -t lib.a '*.o' # 列出所有.o文件
bash复制armar -x lib.a 'test?.o' # 提取test1.o, test2.o等
特殊场景:在Unix-like系统使用通配符时,必须用引号包裹参数以防止shell提前展开:
bash复制# 错误方式(shell会先展开通配符) armar -t lib.a *.o # 正确方式 armar -t lib.a '*.o'
创建新库时会自动生成符号表,除非显式指定-n选项:
bash复制# 标准创建方式(含符号表)
armar --create libmath.a add.o sub.o mul.o
# 无符号表创建(适用于调试场景)
armar -n --create libdebug.a debug_log.o
-r是使用频率最高的选项,支持三种工作模式:
bash复制armar -r lib.a updated_file.o
bash复制armar -ru lib.a *.o # 只更新修改时间较新的.o文件
-a/-b指定插入位置bash复制# 在existing.o之后插入新文件
armar -r -a existing.o lib.a new_file.o
删除操作支持通配符,但需注意路径匹配规则:
bash复制# 删除单个文件
armar -d lib.a obsolete.o
# 批量删除测试文件
armar -d lib.a 'test_*.o'
提取文件时需注意路径处理:
bash复制# 提取单个文件到当前目录
armar -x lib.a critical.o
# 提取全部文件(保留库内目录结构)
armar -x lib.a
路径陷阱:如果库中包含
dir/file.o,直接提取可能导致路径冲突。建议使用--workdir指定输出目录。
详细列表模式(-v)显示完整文件属性:
bash复制armar -tv lib.a
输出示例:
code复制rw-r--r-- 1000/1000 1248 Feb 12 10:30 startup.o
rw-r--r-- 1000/1000 2456 Feb 12 10:32 math_utils.o
显示库中所有全局符号:
bash复制armar --zs lib.a
典型输出:
code复制Symbol table:
startup.o:
Reset_Handler
__main
math_utils.o:
fast_sqrt
matrix_multiply
对于大型库文件,可以先创建无符号表的库,最后统一生成:
bash复制# 阶段1:快速构建
armar -n --create libbig.a part1/*.o part2/*.o
# 阶段2:最终生成符号表
armar -s libbig.a
通过组合命令检测重复符号:
bash复制armar --zs lib.a | grep ' T ' | sort | uniq -d
在Makefile中的典型应用:
makefile复制LIB_OBJS := $(patsubst %.c,%.o,$(wildcard src/*.c))
libproject.a: $(LIB_OBJS)
armar -rcs $@ $^
%.o: %.c
armcc -c $< -o $@
对于频繁更新的库,建议添加构建信息:
bash复制armar -s lib.a
echo "Build $(date)" > build_info.txt
armar -r lib.a build_info.txt
| 错误现象 | 可能原因 | 解决方案 |
|---|---|---|
| "malformed archive" | 文件损坏或格式错误 | 尝试重新构建库文件 |
| "symbol table missing" | 使用了-n选项但未重建符号表 |
执行armar -s lib.a |
| "positional argument required" | 缺少-a/-b的位置参数 |
检查命令格式是否正确 |
bash复制armar --show_cmdline -r lib.a new.o
bash复制armar -tv lib.a | awk '{print $6,$7,$8,$9}'
bash复制armar --zt lib.a | grep -E 'ENTRY|Code'
--create替代多次-r操作-s重建符号表提升链接速度bash复制# Cygwin环境需要转换路径
armar -r lib.a $(cygpath -w obj/*.o)
bash复制# 启用长文件名截断
armar -T -x long_name_library.a
bash复制# 将GNU格式库转换为ARM格式
armcc -armar --translate-gnu libgnu.a -o libarm.a
典型嵌入式项目库结构:
code复制lib/
├── drivers.a # 外设驱动
├── rtos.a # 实时操作系统封装
└── utils.a # 通用工具函数
更新策略示例:
bash复制# 增量更新驱动库
find drivers/ -name '*.o' -newer lib/drivers.a | xargs armar -ru lib/drivers.a
# 验证更新结果
armar --zt lib/drivers.a | head -10
对于Cortex-M系列多核项目:
bash复制# 为每个核心创建独立库
armar --create lib_cm4.a $(find . -name 'cm4_*.o')
armar --create lib_cm0.a $(find . -name 'cm0_*.o')
# 合并公共部分
armar -r lib_common.a $(find . -name 'common_*.o')
通过--project选项标准化构建环境:
xml复制<!-- arm_project.cfg -->
<suiteconf>
<tool name="armar">
<cmdline>
--diag_style=ide
--cpu=Cortex-M3
</cmdline>
</tool>
</suiteconf>
调用方式:
bash复制armar --project=arm_project.cfg -r mylib.a new.o
三种诊断风格对比:
code复制Error: #5: Malformed archive
code复制lib.a(10): Error: #5: Malformed archive
code复制armar: lib.a: malformed archive
设置方法:
bash复制armar --diag_style=ide -t lib.a