[kvm-unit-tests PATCH v5 16/29] powerpc: Set .got section alignment to 256 bytes

Thomas Huth thuth at redhat.com
Tue Dec 19 23:01:52 AEDT 2023


On 16/12/2023 14.42, Nicholas Piggin wrote:
> Modern powerpc64 toolchains require the .got section have alignment of
> 256 bytes. Incorrect alignment ends up causing the .data section ELF
> load address to move by 8 bytes from its file offset, relative to
> previous sections. This is not a problem for the QEMU bios loader used
> by the pseries machine, but it is a problem for the powernv machine
> using skiboot as the bios and the test programs as a kernel, because the
> skiboot ELF loader is crippled:
> 
>    * Note that we execute the kernel in-place, we don't actually
>    * obey the load informations in the headers. This is expected
>    * to work for the Linux Kernel because it's a fairly dumb ELF
>    * but it will not work for any ELF binary.
> 
> This causes all references to data to be incorrect. Aligning the .got
> to 256 bytes prevents this offset skew and allows the skiboot "flat"
> loader to work. [I don't know why the .got alignment can cause this
> difference in linking.]
> 
> Signed-off-by: Nicholas Piggin <npiggin at gmail.com>
> ---
>   powerpc/flat.lds | 3 +--
>   1 file changed, 1 insertion(+), 2 deletions(-)
> 
> diff --git a/powerpc/flat.lds b/powerpc/flat.lds
> index 5eed368d..e07b91c1 100644
> --- a/powerpc/flat.lds
> +++ b/powerpc/flat.lds
> @@ -41,8 +41,7 @@ SECTIONS
>       /*
>        * tocptr is tocbase + 32K, allowing toc offsets to be +-32K
>        */
> -    tocptr = . + 32K;
> -    .got : { *(.toc) *(.got) }
> +    .got : ALIGN(256) { tocptr = . + 32K; *(.toc .got) }
>       . = ALIGN(64K);
>       edata = .;
>       . += 64K;

Acked-by: Thomas Huth <thuth at redhat.com>



More information about the Linuxppc-dev mailing list