Re: [PATCH v2] MIPS: move _stext definition to vmlinux.lds.S

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thu, Nov 14, 2024 at 12:55 AM Maciej W. Rozycki <macro@xxxxxxxxxxx> wrote:
>
> On Tue, 12 Nov 2024, Rong Xu wrote:
>
> > The _stext symbol is intended to reference the start of the text section.
> > However, it currently relies on a fragile link order because the existing
> > EXPORT(_stext) resides within the .text section, which is not guaranteed
> > to be placed first.
>
>  Umm, arch/mips/kernel/head.S does mean to be linked first.  We rely on it
> for environments where there's no entry point is available and execution
> starts from the beginning of the image.  See the comment right below your
> change.
>
> > Move the _stext definition to the linker script to enforce an explicit
> > ordering.
>
>  So if you say that the link order is fragile (which it may well be), then
> that problem has to be fixed instead, likely with the linker script too,
> and then perhaps an ASSERT placed there to verify that it has worked and
> `_stext' refers to the beginning, taking into account what follows too.


arch/mips/kernel/head.S is always passed as the first object
in the link command because it is listed in scripts/head-object-list.txt

What you missed to understand is, the .text section of the first object
is NOT guaranteed to be placed at the start of the image.


Assume, we pass 3 objects, head.o, foo.o, bar.o to the linker
in this order.

- head.o  contains a .text section
- foo.o contains .text and .text.hot sections
- bar.o contains .text and .text.hot sections


The output will contain the sections in this order:
   foo.o#.text.hot
   bar.o#.text.hot
   head.o#.text
   foo.o#.text
   bar.o#.text


This result comes from the fact that TEXT_MAIN
is not necessarily placed first.

See the macro in include/asm-generic/vmlinux.lds.h

#define TEXT_TEXT                                                       \
                ALIGN_FUNCTION();                                       \
                *(.text.hot .text.hot.*)                                \
                *(TEXT_MAIN .text.fixup)                                \
                *(.text.unlikely .text.unlikely.*)                      \
                *(.text.unknown .text.unknown.*)                        \




BTW, "head.o must be passed to the linker as the first object"
is a bad convention in old days.
If you expect the entry point at the beginning of the kernel image,
it must be marked as __HEAD, which is placed in the .head.text section.

See commit ce697ccee1a8

Well-maintained architectures got rid of
stupid "head.o must be passed first" requirement:

 - 2348e6bf4421
 - 994b7ac1697b
 - 5353fff29e42

If MIPS migrates to the cleaner __HEAD solution,
it will be appreciated, but this is another story.




>  Also note that `_stext' currently points beyond the space reserved for
> exception handlers.  Have you analysed what the consequences would be if
> it was moved ahead of it, which your change does AFAICT?
>
>   Maciej







-- 
Best Regards
Masahiro Yamada





[Index of Archives]     [LKML Archive]     [Linux ARM Kernel]     [Linux ARM]     [Git]     [Yosemite News]     [Linux SCSI]     [Linux Hams]

  Powered by Linux