GCCLinker脚本忽略PHDR / PHDR?

问题描述 投票:0回答:3
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 {...}

定义(或者似乎您不需要它)。
gcc ld linker-scripts
3个回答
1
投票
/* If we're on a newer compiler */ /DISCARD/: { *(.interp) *(.dynsym) *(.dynstr) *(.hash) *(.gnu.hash) *(.header) } : phdr

如果您想生成一个平坦的二进制文件,则可以将输出格式指定为“二进制”。
确定这是您想要的

很久以前,当我研究引导加载器时,我正使用它生成MBR。

title:
修复
.note.gnu.pvh

0
投票

问题声明:

使用CoreBoot有效载荷或PVH可启动精灵二进制文件时,链接问题通常是由于未正确分配到细分市场中而出现的。错误消息通常显示为:

.note.gnu.pvh


0
投票

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
    )。
    • 分配到pt_note段:
    • 确保Qemu和Xen等工具将精灵识别为具有PVH的二进制文件。
      

    • 校正部分分配:

    • .note.gnu.pvh

      .note.gnu.pvh
      .text

    • .rodata
    明确分配给相应的phdrs。
  1. verification步骤

    
    重建有效载荷后,验证:

      .data
    • 确定
    .bss
  2. 出现在
  3. 段下的

    程序标题中。 最终测试QEMU中的有效载荷:

    readelf -l payload_pvh_fixed.elf readelf -n payload_pvh_fixed.elf
    • 现在应该在没有PVH相关的ELF错误的情况下启动!
      
      GNU LD的ADDICENAL修复> =2.42
      
      
      对于GNU LD的较新版本,某些部分可能会引起冲突。要丢弃不需要的标头,请在链接脚本中添加以下内容:
      .note.gnu.pvh
    • 这只能提供只有必要部分的清洁精灵二进制。
结论:
通过明确定义PHDR并将

PT_NOTE分配给qemu-system-i386 -kernel payload_pvh_fixed.elf -m 2G -serial stdio

/DISCARD/ : { *(.interp) *(.dynsym) *(.dynstr) *(.hash) *(.gnu.hash) *(.header) } : phdr

,链接器正确映射了该部分,使Elf可启动为PVH访客。该解决方案对于使用CoreBoot,Xen或基于自定义PVH的任何人都至关重要。
	

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.