*.ld 文件中我不明白的地方

Something I do not understand in the *.ld file

ARM GCC 的 *.ld 文件中有些语句我无法理解。

.init :
{
__initcall_start = .;
    KEEP(*(.initcall1.init))
    KEEP(*(.initcall2.init))
    KEEP(*(.initcall3.init))
    KEEP(*(.initcall4.init))
    KEEP(*(.initcall5.init))
    KEEP(*(.initcall6.init))
__initcall_end = .;
} >FLASH

我用记事本搜索了整个项目,值initcall1只出现在这个*.ld文件中。

 E:\pos-orig\Gemini\system\sys_generic.ld (1 hit)
    Line 26:         KEEP(*(.initcall1.init))

initcall1,initcall2...有什么用?

我如何理解 KEEP(*(.initcall3.init))

linker script 说 名为 .initcall1.init,...,.initcall6.init 的部分来自 所有输入文件都将在符号 __initcall_start 之间输出 和输出 .init 部分中的 __initcall_end 并且所有这些 将从垃圾收集中保留下来。

What the initcall1,initcall2... used for?

Documentation: Kernel Initialization Mechanisms

how can i understand the 'KEEP(*(.initcall3.init))'?

3.6.4.4 Input Section and Garbage Collection