From 54279f87ecbcb3eab45fbdd52f44c1be998a9ab3 Mon Sep 17 00:00:00 2001 From: Jan Beulich Date: Fri, 22 Apr 2022 14:56:23 +0200 Subject: [PATCH] x86/build: make linking work again with ld incapable of generating build ID The retaining of .note.* in a PT_NOTE segment requires a matching program header to be present in the first place. Drop the respective conditional and adjust mkelf32 to deal with (ignore) the potentially present but empty extra segment (but have the new code be generic by dropping any excess trailing entirely empty segments). Fixes: dedb0aa42c6d ("x86/build: use --orphan-handling linker option if available") Signed-off-by: Jan Beulich Acked-by: Andrew Cooper --- xen/arch/x86/boot/mkelf32.c | 13 +++++++++++++ xen/arch/x86/xen.lds.S | 2 -- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/xen/arch/x86/boot/mkelf32.c b/xen/arch/x86/boot/mkelf32.c index bcbde1a056..3d639c2e08 100644 --- a/xen/arch/x86/boot/mkelf32.c +++ b/xen/arch/x86/boot/mkelf32.c @@ -320,6 +320,19 @@ int main(int argc, char **argv) (int)in64_ehdr.e_phentsize, (int)sizeof(in64_phdr)); return 1; } + + /* Ignore entirely empty trailing program headers. */ + while ( in64_ehdr.e_phnum > num_phdrs ) + { + (void)lseek(infd, + in64_ehdr.e_phoff + in64_ehdr.e_phnum * sizeof(in64_phdr), + SEEK_SET); + do_read(infd, &in64_phdr, sizeof(in64_phdr)); + endianadjust_phdr64(&in64_phdr); + if ( in64_phdr.p_memsz ) + break; + --in64_ehdr.e_phnum; + } if ( in64_ehdr.e_phnum != num_phdrs ) { fprintf(stderr, "Expect precisly %d program header; found %d.\n", diff --git a/xen/arch/x86/xen.lds.S b/xen/arch/x86/xen.lds.S index 68501c7186..6e4abbc1ce 100644 --- a/xen/arch/x86/xen.lds.S +++ b/xen/arch/x86/xen.lds.S @@ -40,9 +40,7 @@ OUTPUT_ARCH(i386:x86-64) PHDRS { text PT_LOAD ; -#if defined(BUILD_ID) || defined(CONFIG_PVH_GUEST) note PT_NOTE ; -#endif } #define PHDR(x) :x #else -- 2.30.2