我需要将一些数据嵌入到 Linux 上的可执行文件或 SO 文件中。我发现我可以做到这一点ld --format binary
,但是,我看到的所有示例都假设数据文件位于当前目录中。如果不是,则生成的符号名称会变得复杂,因为它会尝试包含文件的完整路径。
有没有办法明确地为符号提供名称,例如。说这个数据的符号名称应该是 MyData ?
谢谢
您绝对不能在--format=binary
方法中指定链接器生成的二进制符号名称。但是使用-L
选项,您可以指定二进制文件的路径,链接器将在任何路径中看到它,而无需在文件名中指定路径,从而使符号名称简短而漂亮。
但是让我们更多地讨论自定义符号名称。您可以使用很少的内联汇编程序魔法(incbin 指令)来做到这一点。准备汇编文件,如:
.section .rodata
.global MyData
.type MyData, @object
.align 4
MyData:
.incbin "longpath/to/my/binary/MyData.bin"
.global MyData_size
.type MyData_size, @object
.align 4
MyData_size:
.int MyData_size - MyData
并将其与您的 C 代码链接在一起,安全地使用:
extern char MyData[];
extern unsigned MyData_size;
此外(与上面列出的链接器方法一样)您可以使用简单的形式:
.incbin "MyData.bin"
并指定-Ilongpath/to/my/binary/
为 GCC 选项。