我有一个工作的链接器脚本.我想添加另一个数据部分,其内容直接从文件中提取(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
选项.
您可以尝试使用objcopy
它将其转换为可链接的普通对象,然后在链接器脚本中引用其符号,就像对普通对象一样.从objcopy
手册页:
-B bfdarch --binary-architecture = bfdarch将原始二进制输入文件转换为目标文件时很有用.在这种情况下,输出架构可以设置为bfdarch.如果输入文件具有已知的bfdarch,则将忽略此选项.您可以通过引用转换过程创建的特殊符号来访问程序内的二进制数据.这些符号被称为
_binary_objfile_start
,_binary_objfile_end
和_binary_objfile_size
.例如,您可以将图片文件转换为目标文件,然后使用这些符号在代码中访问它.
...其中objfile将扩展为输入对象文件的名称.
另请参见--rename-section
选项.
您可以将原始文件放入程序集中的单独部分,然后在链接描述文件中包含此部分.
首先,您需要创建模板.S文件,例如.
.section .rawdata .incbin "blob1.raw"
...并根据需要修改链接描述文件以包含此部分:
.data : { *(.rawdata*) }
您还可以在这里查看有关.S模板的更多详细信息.
另一个解决方案是使用该BYTE
函数生成包含二进制文件中字节的第二个链接描述文件,然后使用该INCLUDE
指令将其包含在以前的链接描述文件中.
您可以使用hexdump
以下方式从二进制文件生成脚本:
cat ramelfs | hexdump -v -e '"BYTE(0x" 1/1 "%02X" ")\n"' > ramelfs.ld
然后以这种方式包含它:
SECTIONS { .text : { /* ... */ kramelfs = .; INCLUDE "ramelfs.ld" ; kramelfs_end = .; /* ... */ } }