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 在 编码
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