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