PHDR segment not covered by LOAD segment
或如果我在链接器脚本中定义了phdrs属性,请如下:
PHDRS
{
header PT_NULL FILEHDR;
text PT_NULL PHDRS;
data PT_NULL FILEHDR;
}
no sections assigned to phdrs
我似乎找不到任何方法来强迫海湾合作委员会仅信任我而不散发PHDR。 我可以在链接器脚本中放置什么,以告诉海湾合作委员会我的意思是我的意思。
eDit 我发现了这一点:https://sourceware.org/bugzilla/show_bug.cgi?id =25585
如果我将以下内容添加到我的GCC调用中,它似乎无论如何都会输出二进制文件:-Wl,--noinhibit-exec
我找到了解决方案! 顶部有一个空的
PHDRS {...}
/* If we're on a newer compiler */
/DISCARD/: {
*(.interp)
*(.dynsym)
*(.dynstr)
*(.hash)
*(.gnu.hash)
*(.header)
} : phdr
如果您想生成一个平坦的二进制文件,则可以将输出格式指定为“二进制”。确定这是您想要的 很久以前,当我研究引导加载器时,我正使用它生成MBR。
title:
修复
.note.gnu.pvh
使用CoreBoot有效载荷或PVH可启动精灵二进制文件时,链接问题通常是由于未正确分配到细分市场中而出现的。错误消息通常显示为:
.note.gnu.pvh
Solution:在Linker脚本中明确定义PHDR
问题源于ld: warning: allocated section `.note.gnu.pvh' not in segment
未明确分配给链接器脚本中的段。为了确保正确的分配,在.note.gnu.pvh
中定义
Phdrs并明确分配部分。 fixed Linker脚本(
payload.lds
)
payload.lds
修复的解释:
定义的PHDR(程序标头):ENTRY(_start)
SECTIONS
{
. = 0x100000; /* Example load address */
/* Define program headers */
PHDRS
{
text PT_LOAD FLAGS(5); /* R-X (Read + Execute) */
data PT_LOAD FLAGS(6); /* RW- (Read + Write) */
note PT_NOTE FLAGS(4); /* R-- (Read-Only) */
}
/* Text section (Executable Code) */
.text : {
*(.text)
} :text
/* Read-only Data Section */
.rodata : {
*(.rodata)
} :text /* Include in the text segment (R-X) */
/* Data Section */
.data : {
*(.data)
} :data
/* BSS Section */
.bss : {
*(.bss)
} :data
/* Ensure PVH note is included in a segment */
.note.gnu.pvh : {
*(.note.gnu.pvh)
} :note
}
对于可执行部分。
text
对于可写的部分。
data
对于仅阅读部分(包括note
确保Qemu和Xen等工具将精灵识别为具有PVH的二进制文件。
校正部分分配:
.note.gnu.pvh
,
.note.gnu.pvh
,
.text
和.rodata
verification步骤
重建有效载荷后,验证:.data
.bss
程序标题中。 最终测试QEMU中的有效载荷:
readelf -l payload_pvh_fixed.elf
readelf -n payload_pvh_fixed.elf
对于GNU LD的较新版本,某些部分可能会引起冲突。要丢弃不需要的标头,请在链接脚本中添加以下内容:
.note.gnu.pvh
PT_NOTE
分配给qemu-system-i386 -kernel payload_pvh_fixed.elf -m 2G -serial stdio
/DISCARD/ : {
*(.interp)
*(.dynsym)
*(.dynstr)
*(.hash)
*(.gnu.hash)
*(.header)
} : phdr