在Linux中的可执行文件中嵌入数据时如何控制符号名称?

时间:2013-10-03 20:53:30

标签: linux gcc resources ld

我需要将一些数据嵌入到Linux上的可执行文件或SO文件中。我发现我可以用ld --format binary来做,但是,我看过的所有例子都假设数据文件在当前目录中。如果不是,则生成的符号名称变得复杂,因为它尝试包括文件的完整路径。

有没有办法明确地为符号提供名称,例如。假设此数据的符号名称应为MyData?

由于

1 个答案:

答案 0 :(得分:5)

您绝对无法在--format=binary方法中指定链接器生成的二进制符号名称。但是使用-L选项,您可以指定二进制路径,链接器将在任何路径中看到它而不指定文件名中的路径,使符号名称简短而漂亮。

但是让我们更多地讨论自定义符号名称。您可以使用内联汇编程序魔术(incbin directive)。准备汇编程序文件,如:

    .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选项。