28

我有一个有效的链接器脚本。我想添加另一个数据部分,其内容是直接从文件中提取的(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 = .;
}
4

4 回答 4

22

您可以尝试使用objcopy将其转换为可以链接的普通对象,然后在链接器脚本中引用其符号,就像对普通对象所做的那样。从objcopy手册页

-B bfdarch --binary-architecture=bfdarch 在将原始二进制输入文件转换为目标文件时很有用。在这种情况下,输出架构可以设置为 bfdarch。如果输入文件具有已知的 bfdarch,则此选项将被忽略。您可以通过引用转换过程创建的特殊符号来访问程序内部的此二进制数据。这些符号称为 _binary_objfile_start和。例如,您可以将图片文件转换为目标文件,然后使用这些符号在您的代码中访问它。_binary_objfile_end_binary_objfile_size

...其中objfile将扩展为输入对象文件的名称。

另请参阅该--rename-section选项。

于 2008-11-29T23:01:47.393 回答
13

您可以将原始文件放在程序集中的单独部分,然后将此部分包含在链接描述文件中。

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

.section .rawdata
.incbin "blob1.raw"

...并根据需要修改链接描述文件以包含此部分:

.data : {

    *(.rawdata*)

}

您也可以在此处查看有关 .S 模板的更多详细信息。

于 2013-08-27T13:52:21.853 回答
6

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

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

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

然后以这种方式包含它:

SECTIONS {
    .text : {

        /* ... */

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

       /* ... */
    }
}
于 2011-12-15T09:13:45.010 回答
1
仅使用链接器的另一种方法是使用 TARGET 和 INPUT

    目标(二进制)
    输入 (./my_binary_data.bin)
    输入 (./my_binary_code.bin)
    # 如果需要,在此处添加更多二进制文件
    
    OUTPUT_FORMAT("elf32-i386")
    
    进入(开始)
    
    部分
    {
        .text 0x100000:{
            *(.multiboot)
            *(。文本)
            *(。代码)
            ./my_binary_code.bin
            *(.rodata*)
        }
        。数据 : {
            *(。数据)
        }
        .bss:{
            *(.bss)
        }
        kernel_end = .;
        roottask_start = .;
        。数据 : {
    
            ./my_binary_data.bin
    
        }
        根任务结束 = .;
    }

于 2021-11-01T18:29:35.283 回答