当前位置:  开发笔记 > 编程语言 > 正文

使用GNU ld链接描述文件包含二进制文件

如何解决《使用GNUld链接描述文件包含二进制文件》经验,为你挑选了3个好方法。

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

CesarB.. 20

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

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

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

另请参见--rename-section选项.



1> CesarB..:

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

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

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

另请参见--rename-section选项.



2> lmctl..:

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

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

.section .rawdata
.incbin "blob1.raw"

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

.data : {

    *(.rawdata*)

}

您还可以在这里查看有关.S模板的更多详细信息.



3> 小智..:

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

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

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

然后以这种方式包含它:

SECTIONS {
    .text : {

        /* ... */

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

       /* ... */
    }
}

推荐阅读
kikokikolove
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有