diff mbox series

x86/build: make linking work again with ld incapable of generating build ID

Message ID 971a1a9a-ab4a-38cd-2c20-534846b440f6@suse.com (mailing list archive)
State New, archived
Headers show
Series x86/build: make linking work again with ld incapable of generating build ID | expand

Commit Message

Jan Beulich April 21, 2022, 10:40 a.m. UTC
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 <jbeulich@suse.com>

Comments

Andrew Cooper April 21, 2022, 10:46 a.m. UTC | #1
On 21/04/2022 11:40, Jan Beulich wrote:
> 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 <jbeulich@suse.com>

Acked-by: Andrew Cooper <andrew.cooper3@citrix.com>
diff mbox series

Patch

--- 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",
--- 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