|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH 1/3] x86/build: Rework binary conversion for boot/{cmdline,reloc}.c
On 14.04.2022 13:47, Andrew Cooper wrote:
> --- a/xen/arch/x86/boot/build32.lds
> +++ b/xen/arch/x86/boot/build32.lds
> @@ -31,44 +31,36 @@ SECTIONS
> *(.bss.*)
> }
>
> + /* Dynamic linkage sections. Collected simply so we can check they're
> empty. */
> + .got : {
> + *(.got)
> + }
> .got.plt : {
> - /*
> - * PIC/PIE executable contains .got.plt section even if it is not
> linked
> - * with dynamic libraries. In such case it is just placeholder for
> - * _GLOBAL_OFFSET_TABLE_ symbol and .PLT0. .PLT0 is filled by dynamic
> - * linker and our code is not supposed to be loaded by dynamic
> linker.
> - * So, from our point of view .PLT0 is unused. This means that there
> is
> - * pretty good chance that we can safely drop .got.plt as a whole
> here.
> - * Sadly this is not true. _GLOBAL_OFFSET_TABLE_ is used as a
> reference
> - * for relative addressing (and only for that thing) and ld
> complains if
> - * we remove .got.plt section here because it cannot find required
> symbol.
> - * However, _GLOBAL_OFFSET_TABLE_ is no longer needed in final
> output.
> - * So, drop .got.plt section during conversion to plain binary
> format.
> - *
> - * Please check build32.mk for more details.
> - */
> *(.got.plt)
> }
> -
> - /*
> - * Discarding .shstrtab is not supported by LLD (LLVM LD) and will trigger
> an
> - * error. Also keep the rest of the control sections to match GNU LD
> behavior.
> - */
> - .shstrtab : {
> - *(.shstrtab)
> + .igot.plt : {
> + *(.igot.plt)
> }
> - .strtab : {
> - *(.strtab)
> + .iplt : {
> + *(.iplt)
> }
> - .symtab : {
> - *(.symtab)
> + .plt : {
> + *(.plt)
> }
> -
> - /DISCARD/ : {
> - /*
> - * Discard everything else, to prevent linkers from putting
> - * orphaned sections ahead of .text, which needs to be first.
> - */
> - *(*)
> + .rela : {
> + *(.rela.*)
> }
> }
> +
> +ASSERT(SIZEOF(.got) == 0, ".got non-empty")
> +/*
> + * At least GNU ld 2.30 and earlier fail to discard the generic part of
> + * .got.plt when no actual entries were allocated. Permit this case alongside
> + * the section being empty.
> + */
> +ASSERT(SIZEOF(.got.plt) == 0 ||
> + SIZEOF(.got.plt) == 3 * 4, "unexpected .got.plt size")
While here you've adjusted for this being 32-bit code, ...
> +ASSERT(SIZEOF(.igot.plt) == 0, ".igot.plt non-empty")
> +ASSERT(SIZEOF(.iplt) == 0, ".iplt non-empty")
> +ASSERT(SIZEOF(.plt) == 0, ".plt non-empty")
> +ASSERT(SIZEOF(.rela) == 0, "leftover relocations")
... this (and the construct making the section) would need
converting (or amending) too, as 32-bit uses .rel.*. Then
Reviewed-by: Jan Beulich <jbeulich@xxxxxxxx>
Jan
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |