64 位内核 ELF 的 GNU LD 部分属性和标志

问题描述 投票:0回答:0

我正在尝试使用 GNU LD 链接 64 位内核 ELF。我有一个名为

lowerhalf
的可执行部分,然后是其他常用部分。我使用的链接描述文件是这个

ENTRY(kernelCompatibilityModeStart);

SECTIONS {
    . = 0x80000000; /* lowerhalf origin */
    .lowerhalf : ALIGN(0x1000) {
        *(.lowerhalf);
    }

    . = 0xffffffff80000000; /* higherhalf origin */
    .GDT64 : ALIGN(0x1000) {
        *(.GDT64);
    }
    .IDT64 : ALIGN(0x1000) {
        *(.IDT64);
    }
    .TSS64 : ALIGN(0x1000) {
        *(.TSS64);
    }
    .KERNELSTACK : ALIGN(0x1000) {
        *(.KERNELSTACK);
    }
    .ISTs : ALIGN(0x1000) {
        *(.ISTs);
    }
    .text : ALIGN(0x1000) {
        *(.text);
    }
    .data : ALIGN(0x1000) {
        *(.data);
    }
    .rodata : ALIGN(0x1000) {
        *(.rodata*);
    }
    .bss : ALIGN(0x1000) {
        *(COMMON);
        *(.bss);
    }
}

当我使用

readelf
查看生成的片段时,我看到类似的内容

Elf file type is EXEC (Executable file)
Entry point 0x80000000
There are 3 program headers, starting at offset 64

Program Headers:
  Type           Offset             VirtAddr           PhysAddr
                 FileSiz            MemSiz              Flags  Align
  LOAD           0x0000000000001000 0x0000000080000000 0x0000000080000000
                 0x0000000000000030 0x0000000000000030  R      0x1000
  LOAD           0x0000000000002000 0xffffffff80000000 0xffffffff80000000
                 0x0000000000026718 0x0000000000026718  R E    0x1000
  LOAD           0x0000000000029000 0xffffffff80027000 0xffffffff80027000
                 0x0000000000004954 0x00000000000053d8  RW     0x1000

 Section to Segment mapping:
  Segment Sections...
   00     .lowerhalf 
   01     .GDT64 .IDT64 .TSS64 .KERNELSTACK .ISTs .text
   02     .data .ctors .rodata .eh_frame .bss

ELF输出的一些问题:

  1. .text
    部分与其他部分捆绑在一起,如
    .GDT64
    .KERNELSTACK
  2. .lowerhalf
    应该有
    RE
    属性而不仅仅是
    R
  3. all
    .data
    ,
    .ctors
    , and
    .rodata
    end up with the
    RW
    flags.

我尝试使用

MEMORY
指令,但这会导致大量链接器错误或警告,并且无法提供所需的输出。

我希望这些部分具有适当的

RWE
属性,以便我可以相应地创建我的分页条目。

c++ linker ld linker-scripts
© www.soinside.com 2019 - 2024. All rights reserved.