2008-11-29 95 views
22

我有一个可用的链接描述文件。我想添加另一个数据部分,其内容直接从文件中拉出(ld不应该解析它并提取部分等)。我怎样才能做到这一点?包含GNU ld链接描述文件的二进制文件

OUTPUT_FORMAT("elf32-i386") 
ENTRY(start) 
SECTIONS 
{ 
    .text 0x100000 : { 
    *(.multiboot) 
    *(.text) 
    *(.code) 
    *(.rodata*) 
    } 
    .data : { 
    *(.data) 
    } 
    .bss : { 
    *(.bss) 
    } 
    kernel_end = .; 
    roottask_start = .; 
    .data : { 

    HERE I WANT TO INCLUDE THE ENTIRE CONTENTS OF ANOTHER (BINARY) FILE 

    } 
    roottask_end = .; 
} 
+0

GCC:https://stackoverflow.com/questions/4864866/cc-with-gcc-statically-add-resource-files-to-executable-library – 2018-02-21 12:24:45

回答

16

你可以尝试使用objcopy将其转换成一个正常的对象,你可以在链接,然后引用它的符号链接脚本像你会做一个正常的对象。从objcopy manual page

-B bfdarch --binary架构= bfdarch 转化原始二进制输入文件到一个对象 文件时是有用的。在这种情况下,输出体系结构可以设置为bfdarch。 如果输入文件具有已知的bfdarch,则该选项将被忽略。 您可以通过引用由转换过程创建的 特殊符号来访问程序中的二进制数据。这些符号被称为_binary_objfile_start_binary_objfile_end_binary_objfile_size。例如您可以将图片文件转换为 目标文件,然后使用这些符号在代码中访问它。

...其中objfile将被扩展为输入对象文件的名称。请参阅--rename-section选项。

+0

`bfdarch`文本不是字面意思(而且不是需要)。有关混淆,请参阅[使用gcc arm toolchain链接任意数据](http://stackoverflow.com/questions/17265950/linking-arbitrary-data-using-gcc-arm-toolchain)。 – 2013-06-24 14:06:16

5

另一种解决方案是使用​​函数生成包含二进制字节的第二个链接描述文件,然后使用INCLUDE指令将其包含在前一个链接描述文件中。

您可以从您的二进制文件以下列方式使用hexdump生成脚本:

cat ramelfs | hexdump -v -e '"BYTE(0x" 1/1 "%02X" ")\n"' > ramelfs.ld 

然后包括这样说:

SECTIONS { 
    .text : { 

     /* ... */ 

     kramelfs = .; 
     INCLUDE "ramelfs.ld" ; 
     kramelfs_end = .; 

     /* ... */ 
    } 
} 
6

你可以把原始文件,以在不同的章节程序集,然后将此部分包含在链接器脚本中。

首先您需要创建模板.S文件,例如。

.section .rawdata 
.incbin "blob1.raw" 

...和修改链接脚本,只要你喜欢它包括此节:

.data : { 

    *(.rawdata*) 

} 

您也可以到这里看看here关于.S模板更多的详细信息。