#arm #attributes #build #elf #elf-file #read #parses

arm-attr

读取ELF文件的ARM构建属性

2个版本

0.1.1 2024年6月15日
0.1.0 2024年6月10日

#830 in 解析器实现

Download history 309/week @ 2024-06-09 143/week @ 2024-06-16 12/week @ 2024-06-23 47/week @ 2024-07-07 93/week @ 2024-07-14 156/week @ 2024-07-21 5/week @ 2024-07-28 38/week @ 2024-08-04 80/week @ 2024-08-11

每月331次下载

MIT许可证

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