#elf #relocation

no-std relox

ELF32重定位压缩和解压缩

1 个不稳定版本

0.1.0 2020年4月12日

#724嵌入式开发

MIT/Apache

44KB
891

relox

Latest Version Documentation Release Build Status Code Coverage

压缩和解压缩ELF32重定位部分

此crate可以在链接后使用,用于压缩ELF32重定位部分。它还提供了一种解压缩方法,可用于重定位过程中。

如果重定位部分使用了太多的静态存储空间,这种方法对于嵌入式系统可能很有用。

解压缩重定位是一种在初始化期间处理重定位所需的CPU时间和使用的静态存储空间之间的权衡。

ELF32压缩部分布局

/// ELF32 relocations grouped by relocation type.
struct Elf32CRelGroup {
    // Type of the relocation.
    relocation_type: u8,
    // Number of relocations encoded as ULEB128.
    count: u32,
    // Offsets are encoded as ULEB128.
    // First offset is relative to `base_address`,
    // otherwise offset[i+1] is relative to offset[i].
    offsets: [u32; count],
}

/// A compressed ELF32 relocation section.
struct Elf32CRel {
    // Base address of all the relocations.
    base_address: u32,
    // Number of relocation groups.
    count: u8,
    // Relocation groups.
    groups: [Elf32CRelGroup; count],
}

在宿主机器上,在链接后处理期间,使用host功能组。

当针对嵌入式设备时,使用embeddedembedded_minimal功能组。后者启用no_bounds_checkno_sanity_check功能以进一步减少内存占用。

可选功能列表

  • compress:包含与压缩相关的方法和结构。
  • decompress:包含与解压缩相关的结构和方法。
  • no-std:不使用标准库。
  • no_bounds_check:使用unsafe代码代替边界检查变体。
  • no_sanity_check:在处理LEB128编码时不执行额外的检查。

许可证

根据您的选择,在Apache License, Version 2.0MIT许可证下获得许可。

除非您明确声明,否则您提交给relox的任何贡献,根据Apache-2.0许可证的定义,将根据上述许可证双授权,不附加任何额外的条款或条件。

依赖关系

~115KB