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

use*_*378 4 linux resources gcc ld

我需要将一些数据嵌入Linux上的可执行文件或SO文件中。我发现我可以使用ld --format binary,但是,我看到的所有示例都假定数据文件位于当前目录中。如果不是,那么生成的符号名称将变得很复杂,因为它试图包含文件的完整路径。

有没有一种方法可以为ex明确提供符号名称。说这个数据的符号名称应该是MyData吗?

谢谢

Kon*_*rov 5

您绝对不能在--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
Run Code Online (Sandbox Code Playgroud)

并使用以下代码将其与您的C代码链接在一起:

extern char MyData[];
extern unsigned MyData_size;
Run Code Online (Sandbox Code Playgroud)

另外(与上面列出的链接器方法一样),您可以使用简单的形式:

    .incbin "MyData.bin"
Run Code Online (Sandbox Code Playgroud)

并指定-Ilongpath/to/my/binary/为GCC选项。

  • 如果能够扩展如何控制链接器的搜索路径,那就太好了。`-L` 似乎不起作用,因为它用于搜索与 `-lfoo` 链接的库,而不是输入文件...... (2认同)