【问题标题】:ld ignores size of nobits input sectionld 忽略 nobits 输入部分的大小
【发布时间】:2016-08-02 21:17:09
【问题描述】:

在为 x86 架构开发小型 32 位内核时,我发现ld 处理 nobits 部分的方式有些奇怪。

在我的内核中,我定义了一个.bootstrap_stack 部分,它为系统的初始化部分保存一个临时堆栈。我还持有堆栈开始和结束的符号。此输入部分被重定向到.bss 输出部分。我的内核的每个输出部分都有一个表示该部分开始和结束的符号。

问题在于,在最终的可执行文件中,堆栈末尾的符号是.bss 部分的末尾之后。在下面的示例中,符号 stack_top_kernel_ebss(和 _kernel_end)具有相同的值,这不是我想要的。

我预计 _kernel_ebss 等于 stack_bottom

但是,一旦我将 .bootstrap_stack 重命名为 .bss,这不会发生。删除 nobits 也可以,但生成的二进制文件要大得多。

以下是重现我的问题的剥离文件:

boot.s

section .bootstrap_stack, nobits ; this does not work
;section .bootstrap_stack        ; this works
;section .bss                    ; this also works

stack_top:
resb 8096
stack_bottom:

section .text
global _start
_start:
    hlt
    jmp _start

链接器.ld

ENTRY(_start)

SECTIONS
{
    . = 0xC0100000;

    _kernel_start = .;

    .text ALIGN(4K) : AT(ADDR(.text) - 0xC0000000)
    {
        _kernel_text = .;
        *(.multiboot)
        *(.text)
        _kernel_etext = .;
    }

    .bss ALIGN(4K) : AT(ADDR(.bss) - 0xC0000000)
    {
        _kernel_bss = .;
        *(COMMON)
        *(.bss)
        *(.bootstrap_stack)
        _kernel_ebss = .;
    }
    _kernel_end = .;
}

符号如下:

$ objdump -t kernel | sort
00000000 l    df *ABS*              00000000 boot.s
c0100000 g       .text              00000000 _kernel_start
c0100000 g       .text              00000000 _kernel_text
c0100000 g       .text              00000000 _start
c0100000 l    d  .text              00000000 .text
c0100003 g       .text              00000000 _kernel_etext
c0101000 g       .text              00000000 _kernel_bss
c0101000 g       .text              00000000 _kernel_ebss
c0101000 g       .text              00000000 _kernel_end
c0101000 l       .bootstrap_stack,  00000000 stack_top
c0101000 l    d  .bootstrap_stack,  00000000 .bootstrap_stack,
c0102fa0 l       .bootstrap_stack,  00000000 stack_bottom

通过将 .bootstrap_stack 重命名为 .bss,我得到了我的预期。

00000000 l    df *ABS*  00000000 boot.s
c0100000 g       .text  00000000 _kernel_start
c0100000 g       .text  00000000 _kernel_text
c0100000 g       .text  00000000 _start
c0100000 l    d  .text  00000000 .text
c0100003 g       .text  00000000 _kernel_etext
c0101000 g       .bss   00000000 _kernel_bss
c0101000 l       .bss   00000000 stack_top
c0101000 l    d  .bss   00000000 .bss
c0102fa0 g       .bss   00000000 _kernel_ebss
c0102fa0 g       .bss   00000000 _kernel_end
c0102fa0 l       .bss   00000000 stack_bottom

我的问题是这是否是 ld 的预期行为。如果是,我的例子有什么问题,因为据我了解.bss 也是一个 nobits 部分,但它产生了预期的结果?

【问题讨论】:

    标签: linker ld elf linker-scripts


    【解决方案1】:

    好吧,我想通了。

    显然,您不应该在该部分的名称后面加上逗号。 objdump 在部分名称中包含逗号,以便清楚地表明这是错误。

    所以

    section .bootstrap_stack, nobits
    

    应该是

    section .bootstrap_stack nobits
    

    【讨论】:

      猜你喜欢
      • 2021-12-11
      • 2015-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-21
      • 2019-04-12
      • 2013-04-15
      • 1970-01-01
      相关资源
      最近更新 更多