gpt4 book ai didi

linker - 如何告诉/强制 GNU ld 将节/符号放在输出 ELF 文件的特定部分中?

转载 作者:行者123 更新时间:2023-12-03 03:24:05 30 4
gpt4 key购买 nike

这将是一个很长的过程,所以喝点咖啡/茶/巴拉圭茶。

摘要

如何告诉/强制 GNU ld 放置一个节/符号在输出 ELF 文件的特定部分?

具体来说,我不是在询问符号的物理/加载地址但关于文件内的偏移量。

背景

我正在尝试采用现实世界的 BSD 内核并使其与多重引导并可通过 GRUB 引导。为了使ELF镜像兼容Multiboot并且可识别通过 GRUB,需要将一个魔数(Magic Number) (0x1BADB002) 嵌入到第一个文件大小为 8KiB。

我指的是Multiboot 0.6.96 .

由于原始内核代码相当大,我将使用基于 Bare Bones kernel from OSDev wiki 的示例。由于该内核已经兼容多重启动,我将使用extra_symbol 的值为 0xCAFEBABE 作为我的问题的示例。

boot.s 包含:

.set CAFEBABE, 0xCAFEBABE
; ... snip ...
.section .extras
extra_symbol:
.long CAFEBABE

.text 中的额外符号

最简单的选择是将具有该值的符号放入 .text位于其他任何内容之前的部分:

.text BLOCK(4K) : ALIGN(4K)
{
*(.extras)
*(.multiboot)
*(.text)
}

对于这个例子来说这很好,但对于真正的 BSD 内核 .text从文件中的 0x2000 (8KiB) 之后开始。这种方法不是一种选择。

.text 之前的额外部分?

另一种选择是将整个 .extras 部分放在 .text 之前。我天真地希望在 .text 之前放置这样的部分链接器脚本也会使其出现在输出 ELF 的前面:

SECTIONS
{
// ... some stuff ...

.extras : { *(.extras) }

.text BLOCK(4K) : ALIGN(4K)
{
*(.multiboot)
*(.text)
}

// ... more stuff ...

}

但事实并非如此:

$ i586-elf-readelf -S myos.bin 
There are 10 section headers, starting at offset 0x6078:

Section Headers:
[Nr] Name Type Addr Off Size ES Flg Lk Inf Al
[ 0] NULL 00000000 000000 000000 00 0 0 0
[ 1] .extras PROGBITS 00100000 006010 000004 00 0 0 1
[ 2] .comment PROGBITS 00000000 006014 000011 01 MS 0 0 1
[ 3] .text PROGBITS 00001000 001000 0001e4 00 AX 0 0 4096
[ 4] .rodata.str1.1 PROGBITS 000011e4 0011e4 000016 01 AMS 0 0 1
[ 5] .eh_frame PROGBITS 000011fc 0011fc 000104 00 A 0 0 4
[ 6] .bss PROGBITS 00002000 002000 004010 00 WA 0 0 4096
[ 7] .shstrtab STRTAB 00000000 006025 000050 00 0 0 1
[ 8] .symtab SYMTAB 00000000 006208 000210 10 9 19 4
[ 9] .strtab STRTAB 00000000 006418 000130 00 0 0 1
Key to Flags:
W (write), A (alloc), X (execute), M (merge), S (strings)
I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown)
O (extra OS processing required) o (OS specific), p (processor specific)

事实上,该节在节头表中排在第一位,但是它的文件中的偏移量 (0x6010) 位于 .text 之后。事实上,它甚至来了在.bss之后。

问题

ELF 规范明确指出:

Although the figure shows the program header table immediately after the ELF header, and the section header table following the sections, actual files may differ. Moreover, sections and segments have no specified order. Only the ELF header has a fixed position in the file.

我如何利用它并告诉 GNU ld 放置我的 extra_symbol(可能是整个 .extras 部分)在文件中的任何其他部分之前,最好就在 ELF header 之后?

最佳答案

为了将该节放在 .text 之前,您是否已尝试将其分配 (A) 和可执行文件 (X) ?

如果 .interp 黑客有效,那当然也很好。

关于linker - 如何告诉/强制 GNU ld 将节/符号放在输出 ELF 文件的特定部分中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19912881/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com