#binary-data #elf-file #elf #object-file #object #binary #data-file

bin+lib elfbin

构建包含具有固定二进制数据的符号的 ELF 对象文件

4 个版本 (破坏性)

0.4.0 2022 年 12 月 24 日
0.3.0 2022 年 2 月 21 日
0.2.0 2021 年 7 月 6 日
0.1.0 2021 年 7 月 6 日

1750编码

MIT 许可证

49KB
1K SLoC

elfbin

elfbin 是一个命令行工具和 Rust 库,用于构建包含符号的 ELF 对象文件,这些符号引用您提供的任意文件的正文。然后,您可以将生成的文件链接到您用其他语言(如 C)编写的程序中,该程序可以生成 ELF 对象文件。

这可以用于嵌入式系统和其他类似情况,在这些情况下没有文件系统可用于加载数据,因此所需数据必须直接链接到程序中。

用法

elfbin 期望以 symbolname=filename 的形式提供参数,以指定在对象文件中定义哪些符号以及从哪些文件读取其内容。

例如

elfbin -o data.o image=foo.png music=foo.mid

elfbin 还具有指定要创建的 ELF 文件类型的选项。通常需要将这些设置与目标平台链接器期望的设置匹配

    --class <class>          ELF Class [default: ELF64]
    --encoding <encoding>    ELF Encoding [default: LSB]
    --flags <flags>          Machine-specific ELF flags [default: 0x00000000]
    --machine <machine>      Target machine [default: none]
    -o <out>                 Output filename

例如,要生成适合链接到适用于 ARM-Cortex-M0 (ARMv6-M) 微控制器的程序的文件

elfbin -o data.o --class=ELF32 --encoding=LSB --machine=arm --flags=0x05000000

然后您可以在链接器调用中包含 data.o 文件,以及所有从编译源代码生成的 .o 文件。

编写头文件

elfbin 没有内置支持用于生成 C 头文件,以允许您从程序的其他部分访问对象数据。

您可以通过选择合适的数据类型来表示链接的数据,并声明该类型的 extern const 变量来完成此操作。如果没有特殊的数据类型可以使用 - 例如,如果数据是需要在使用之前解析的文件格式 - 则从 stdint.h 中的 uint8_t 数组可能是合理的选择

#include <stdint.h>

extern uint8_t image[];
extern uint8_t music[];

或者,如果你确保你的输入数据适合编译器使用的结构体布局,那么你可以声明数据为结构体类型。

注意,当你运行 elfbin 时声明的符号名称直接指向数据本身,而不是数据的指针。因此,除非你有意创建包含内存地址的文件,否则你通常不应该在你的头文件中声明符号为指针类型。

依赖

~3MB
~51K SLoC