2个版本
0.1.1 | 2024年6月15日 |
---|---|
0.1.0 | 2024年6月10日 |
#830 in 解析器实现
每月331次下载
115KB
3K SLoC
arm-attr
根据2023Q3 ARM ABI解析ELF文件中的ARM构建属性。
内容
示例
以下两个示例展示了两种不同的读取构建属性的方法:迭代器(懒加载和快速)和结构体( eager(急切)和慢但正确)。
通过迭代器
此第一个示例直接读取标签。它更快,但
- 它不考虑一种类型的标签可能多次出现。
- 它不处理包围作用域,即节或符号特定的属性。
- 如果无法解析标签,迭代器将停止而不会报错。
use arm_attr::{read::Endian, tag::Tag, BuildAttrs};
let data = [/* byte contents of .ARM.attributes */];
let build_attrs = BuildAttrs::new(&data, Endian::Little).unwrap();
for subsection in build_attrs.subsections() {
let subsection = subsection.unwrap();
if subsection.is_aeabi() {
for (_, tag) in subsection.into_public_tag_iter().unwrap() {
match tag {
Tag::CpuName(name) => println!("CPU name: {name}"),
_ => {}
}
}
}
}
通过结构体
此第二个示例使用into_public_attributes
收集所有标签。它较慢,但不受第一个示例中提到的缺陷的影响。
let data = [/* byte contents of .ARM.attributes */];
let build_attrs = BuildAttrs::new(&data, Endian::Little).unwrap();
for subsection in build_attrs.subsections() {
let subsection = subsection.unwrap();
if subsection.is_aeabi() {
let file = subsection.into_public_attributes().unwrap();
if let Some(name) = file.attributes.cpu_name {
println!("CPU name: {name}");
}
for (sections, section) in file.sections {
if let Some(name) = section.attributes.cpu_name {
println!("CPU name in sections {sections:?}: {name}");
}
for (symbols, symbol) in section.symbols {
if let Some(name) = symbol.attributes.cpu_name {
println!("CPU name in symbols {symbols:?} of sections {sections:?}: {name}");
}
}
}
}
}
依赖项
~255–710KB
~17K SLoC