Message ID | 20231223213800.348426-1-yann.morin.1998@free.fr |
---|---|
State | Accepted |
Headers | show |
Series | boot/syslinux: carry fix for build failures with binutils 2.31+ | expand |
All, On 2023-12-23 22:38 +0100, Yann E. MORIN spake thusly: > From a report on the syslinux mailing list [0]: > > The GNU linker now writes two segments of type PT_LOAD into the > program header. However, this is not supported by the wrapper > script that converts the shared object to an .efi executable. > As per comment in that file: > > (...) Although there may be several LOAD program headers, > only one is currently copied. > > A simple workaround I've found to work is to ask the linker to put > everything into one PT_LOAD program header. > > The issue is ackowledged in the syslinux wiki page about building > syslinux [1]. This page refers to various resources, of which a Debian > patch [2]. > > This information is also referenced in #11861. > > Fixes: #11861 > > [0] https://www.syslinux.org/archives/2018-August/026167.html > [1] https://wiki.syslinux.org/wiki/index.php?title=Building > [2] https://salsa.debian.org/images-team/syslinux/-/blob/debian/master/debian/patches/0017-single-load-segment.patch > > Reported-by: Sam Lancia <sam@gpsm.co.uk> > Reported-by: Meliodas <meliodasren01@gmail.com> > Signed-off-by: Yann E. MORIN <yann.morin.1998@free.fr> Applied to master, thanks. Regards, Yann E. MORIN. > --- > Sam, Meliodas: I have no test-case to validate this change, so it would > be nice if you could report on whether the above does indeed fixes the > issue you reported. Bonus point: it would be even better if we could > improve on the existing runtime test: support/testing/tests/boot/test_syslinux.py > It currently only does a test build, so it does not catch the issue; the > grub2 test we have does run, so we can catch failures. It would be nice > to also have a runtime test for syslinux... > --- > boot/syslinux/0018-single-load-segment.patch | 313 +++++++++++++++++++ > 1 file changed, 313 insertions(+) > create mode 100644 boot/syslinux/0018-single-load-segment.patch > > diff --git a/boot/syslinux/0018-single-load-segment.patch b/boot/syslinux/0018-single-load-segment.patch > new file mode 100644 > index 0000000000..11d73c31a4 > --- /dev/null > +++ b/boot/syslinux/0018-single-load-segment.patch > @@ -0,0 +1,313 @@ > +From: Lukas Schwaighofer <lukas@schwaighofer.name> > +Date: Sat, 18 Aug 2018 16:56:35 +0200 > +Subject: Force the linker to put all sections into a single PT_LOAD segment > + > +This is required when using binutils >= 2.31 which writes two PT_LOAD segments > +by default. This is not supported by the wrapper.c script used to convert the > +shared object into an elf binary. > + > +Forwarded: https://www.syslinux.org/archives/2018-August/026167.html > +[yann.morin.1998@free.fr: > + - grab from the Debian package > + - https://salsa.debian.org/images-team/syslinux/-/blob/fa1349f1f8e5f5d6307e589f02c0a679031d1c7f/debian/patches/0017-single-load-segment.patch > +] > +Signed-off-by: Yann E. MORIN <yann.morin.1998@free.fr> > +Upstream: reported https://www.syslinux.org/archives/2018-August/026167.html > +Upstream: acknowledged https://wiki.syslinux.org/wiki/index.php?title=Building > +--- > + efi/i386/syslinux.ld | 37 +++++++++++++++++++++---------------- > + efi/x86_64/syslinux.ld | 37 +++++++++++++++++++++---------------- > + 2 files changed, 42 insertions(+), 32 deletions(-) > + > +diff --git a/efi/i386/syslinux.ld b/efi/i386/syslinux.ld > +index bab3fc7..19c1647 100644 > +--- a/efi/i386/syslinux.ld > ++++ b/efi/i386/syslinux.ld > +@@ -19,6 +19,11 @@ OUTPUT_FORMAT("elf32-i386", "elf32-i386", "elf32-i386") > + OUTPUT_ARCH(i386) > + ENTRY(_start) > + > ++PHDRS > ++{ > ++ all PT_LOAD ; > ++} > ++ > + SECTIONS > + { > + . = 0; > +@@ -31,7 +36,7 @@ SECTIONS > + *(.text) > + *(.text.*) > + __text_end = .; > +- } > ++ } :all > + > + . = ALIGN(16); > + > +@@ -40,7 +45,7 @@ SECTIONS > + *(.rodata) > + *(.rodata.*) > + __rodata_end = .; > +- } > ++ } :all > + > + . = ALIGN(4); > + > +@@ -49,14 +54,14 @@ SECTIONS > + KEEP (*(SORT(.ctors.*))) > + KEEP (*(.ctors)) > + __ctors_end = .; > +- } > ++ } :all > + > + .dtors : { > + __dtors_start = .; > + KEEP (*(SORT(.dtors.*))) > + KEEP (*(.dtors)) > + __dtors_end = .; > +- } > ++ } :all > + > + . = ALIGN(4096); > + .rel : { > +@@ -64,7 +69,7 @@ SECTIONS > + *(.rel.data) > + *(.rel.data.*) > + *(.rel.ctors) > +- } > ++ } :all > + > + . = ALIGN(4); > + > +@@ -72,14 +77,14 @@ SECTIONS > + __gnu_hash_start = .; > + *(.gnu.hash) > + __gnu_hash_end = .; > +- } > ++ } :all > + > + > + .dynsym : { > + __dynsym_start = .; > + *(.dynsym) > + __dynsym_end = .; > +- } > ++ } :all > + > + . = ALIGN(4); > + > +@@ -87,7 +92,7 @@ SECTIONS > + __dynstr_start = .; > + *(.dynstr) > + __dynstr_end = .; > +- } > ++ } :all > + > + . = ALIGN(4); > + > +@@ -104,7 +109,7 @@ SECTIONS > + KEEP (*(.got.plt)) > + KEEP (*(.got)) > + __got_end = .; > +- } > ++ } :all > + > + . = ALIGN(4); > + > +@@ -112,7 +117,7 @@ SECTIONS > + __dynamic_start = .; > + *(.dynamic) > + __dynamic_end = .; > +- } > ++ } :all > + > + . = ALIGN(16); > + > +@@ -122,19 +127,19 @@ SECTIONS > + *(.data.*) > + *(.lowmem) > + __data_end = .; > +- } > ++ } :all > + > + .reloc : { > + *(.reloc) > +- } > ++ } :all > + > + .symtab : { > + *(.symtab) > +- } > ++ } :all > + > + .strtab : { > + *(.strtab) > +- } > ++ } :all > + > + .bss (NOLOAD) : { > + /* the EFI loader doesn't seem to like a .bss section, > +@@ -148,7 +153,7 @@ SECTIONS > + __bss_end = .; > + *(.sbss) > + *(.scommon) > +- } > ++ } :all > + __bss_len = ABSOLUTE(__bss_end) - ABSOLUTE(__bss_start); > + __bss_dwords = (__bss_len + 3) >> 2; > + > +@@ -161,7 +166,7 @@ SECTIONS > + *(.hugebss) > + *(.hugebss.*) > + __hugebss_end = .; > +- } > ++ } :all > + > + _end = .; > + > +diff --git a/efi/x86_64/syslinux.ld b/efi/x86_64/syslinux.ld > +index 450641c..a2c124f 100644 > +--- a/efi/x86_64/syslinux.ld > ++++ b/efi/x86_64/syslinux.ld > +@@ -19,6 +19,11 @@ OUTPUT_FORMAT("elf64-x86-64", "elf64-x86-64", "elf64-x86-64") > + OUTPUT_ARCH(i386:x86-64) > + ENTRY(_start) > + > ++PHDRS > ++{ > ++ all PT_LOAD ; > ++} > ++ > + SECTIONS > + { > + . = 0; > +@@ -31,7 +36,7 @@ SECTIONS > + *(.text) > + *(.text.*) > + __text_end = .; > +- } > ++ } :all > + > + . = ALIGN(16); > + > +@@ -40,7 +45,7 @@ SECTIONS > + *(.rodata) > + *(.rodata.*) > + __rodata_end = .; > +- } > ++ } :all > + > + . = ALIGN(4); > + > +@@ -49,14 +54,14 @@ SECTIONS > + KEEP (*(SORT(.ctors.*))) > + KEEP (*(.ctors)) > + __ctors_end = .; > +- } > ++ } :all > + > + .dtors : { > + __dtors_start = .; > + KEEP (*(SORT(.dtors.*))) > + KEEP (*(.dtors)) > + __dtors_end = .; > +- } > ++ } :all > + > + . = ALIGN(4096); > + .rel : { > +@@ -64,7 +69,7 @@ SECTIONS > + *(.rel.data) > + *(.rel.data.*) > + *(.rel.ctors) > +- } > ++ } :all > + > + . = ALIGN(4); > + > +@@ -72,14 +77,14 @@ SECTIONS > + __gnu_hash_start = .; > + *(.gnu.hash) > + __gnu_hash_end = .; > +- } > ++ } :all > + > + > + .dynsym : { > + __dynsym_start = .; > + *(.dynsym) > + __dynsym_end = .; > +- } > ++ } :all > + > + . = ALIGN(4); > + > +@@ -87,7 +92,7 @@ SECTIONS > + __dynstr_start = .; > + *(.dynstr) > + __dynstr_end = .; > +- } > ++ } :all > + > + . = ALIGN(4); > + > +@@ -104,7 +109,7 @@ SECTIONS > + KEEP (*(.got.plt)) > + KEEP (*(.got)) > + __got_end = .; > +- } > ++ } :all > + > + . = ALIGN(4); > + > +@@ -112,7 +117,7 @@ SECTIONS > + __dynamic_start = .; > + *(.dynamic) > + __dynamic_end = .; > +- } > ++ } :all > + > + . = ALIGN(16); > + > +@@ -122,19 +127,19 @@ SECTIONS > + *(.data.*) > + *(.lowmem) > + __data_end = .; > +- } > ++ } :all > + > + .reloc : { > + *(.reloc) > +- } > ++ } :all > + > + .symtab : { > + *(.symtab) > +- } > ++ } :all > + > + .strtab : { > + *(.strtab) > +- } > ++ } :all > + > + .bss (NOLOAD) : { > + /* the EFI loader doesn't seem to like a .bss section, > +@@ -148,7 +153,7 @@ SECTIONS > + __bss_end = .; > + *(.sbss) > + *(.scommon) > +- } > ++ } :all > + __bss_len = ABSOLUTE(__bss_end) - ABSOLUTE(__bss_start); > + __bss_dwords = (__bss_len + 3) >> 2; > + > +@@ -161,7 +166,7 @@ SECTIONS > + *(.hugebss) > + *(.hugebss.*) > + __hugebss_end = .; > +- } > ++ } :all > + > + _end = .; > + > -- > 2.43.0 >
On 23/12/2023 22.38, Yann E. MORIN wrote: > From a report on the syslinux mailing list [0]: > > The GNU linker now writes two segments of type PT_LOAD into the > program header. However, this is not supported by the wrapper > script that converts the shared object to an .efi executable. > As per comment in that file: > > (...) Although there may be several LOAD program headers, > only one is currently copied. > > A simple workaround I've found to work is to ask the linker to put > everything into one PT_LOAD program header. > > The issue is ackowledged in the syslinux wiki page about building > syslinux [1]. This page refers to various resources, of which a Debian > patch [2]. > > This information is also referenced in #11861. > > Fixes: #11861 > > [0] https://www.syslinux.org/archives/2018-August/026167.html > [1] https://wiki.syslinux.org/wiki/index.php?title=Building > [2] https://salsa.debian.org/images-team/syslinux/-/blob/debian/master/debian/patches/0017-single-load-segment.patch > > Reported-by: Sam Lancia <sam@gpsm.co.uk> > Reported-by: Meliodas <meliodasren01@gmail.com> > Signed-off-by: Yann E. MORIN <yann.morin.1998@free.fr> > > --- > Sam, Meliodas: I have no test-case to validate this change, so it would > be nice if you could report on whether the above does indeed fixes the > issue you reported. Bonus point: it would be even better if we could > improve on the existing runtime test: support/testing/tests/boot/test_syslinux.py > It currently only does a test build, so it does not catch the issue; the > grub2 test we have does run, so we can catch failures. It would be nice > to also have a runtime test for syslinux... Committed to 2023.02.x and 2023.11.x, thanks
diff --git a/boot/syslinux/0018-single-load-segment.patch b/boot/syslinux/0018-single-load-segment.patch new file mode 100644 index 0000000000..11d73c31a4 --- /dev/null +++ b/boot/syslinux/0018-single-load-segment.patch @@ -0,0 +1,313 @@ +From: Lukas Schwaighofer <lukas@schwaighofer.name> +Date: Sat, 18 Aug 2018 16:56:35 +0200 +Subject: Force the linker to put all sections into a single PT_LOAD segment + +This is required when using binutils >= 2.31 which writes two PT_LOAD segments +by default. This is not supported by the wrapper.c script used to convert the +shared object into an elf binary. + +Forwarded: https://www.syslinux.org/archives/2018-August/026167.html +[yann.morin.1998@free.fr: + - grab from the Debian package + - https://salsa.debian.org/images-team/syslinux/-/blob/fa1349f1f8e5f5d6307e589f02c0a679031d1c7f/debian/patches/0017-single-load-segment.patch +] +Signed-off-by: Yann E. MORIN <yann.morin.1998@free.fr> +Upstream: reported https://www.syslinux.org/archives/2018-August/026167.html +Upstream: acknowledged https://wiki.syslinux.org/wiki/index.php?title=Building +--- + efi/i386/syslinux.ld | 37 +++++++++++++++++++++---------------- + efi/x86_64/syslinux.ld | 37 +++++++++++++++++++++---------------- + 2 files changed, 42 insertions(+), 32 deletions(-) + +diff --git a/efi/i386/syslinux.ld b/efi/i386/syslinux.ld +index bab3fc7..19c1647 100644 +--- a/efi/i386/syslinux.ld ++++ b/efi/i386/syslinux.ld +@@ -19,6 +19,11 @@ OUTPUT_FORMAT("elf32-i386", "elf32-i386", "elf32-i386") + OUTPUT_ARCH(i386) + ENTRY(_start) + ++PHDRS ++{ ++ all PT_LOAD ; ++} ++ + SECTIONS + { + . = 0; +@@ -31,7 +36,7 @@ SECTIONS + *(.text) + *(.text.*) + __text_end = .; +- } ++ } :all + + . = ALIGN(16); + +@@ -40,7 +45,7 @@ SECTIONS + *(.rodata) + *(.rodata.*) + __rodata_end = .; +- } ++ } :all + + . = ALIGN(4); + +@@ -49,14 +54,14 @@ SECTIONS + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + __ctors_end = .; +- } ++ } :all + + .dtors : { + __dtors_start = .; + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + __dtors_end = .; +- } ++ } :all + + . = ALIGN(4096); + .rel : { +@@ -64,7 +69,7 @@ SECTIONS + *(.rel.data) + *(.rel.data.*) + *(.rel.ctors) +- } ++ } :all + + . = ALIGN(4); + +@@ -72,14 +77,14 @@ SECTIONS + __gnu_hash_start = .; + *(.gnu.hash) + __gnu_hash_end = .; +- } ++ } :all + + + .dynsym : { + __dynsym_start = .; + *(.dynsym) + __dynsym_end = .; +- } ++ } :all + + . = ALIGN(4); + +@@ -87,7 +92,7 @@ SECTIONS + __dynstr_start = .; + *(.dynstr) + __dynstr_end = .; +- } ++ } :all + + . = ALIGN(4); + +@@ -104,7 +109,7 @@ SECTIONS + KEEP (*(.got.plt)) + KEEP (*(.got)) + __got_end = .; +- } ++ } :all + + . = ALIGN(4); + +@@ -112,7 +117,7 @@ SECTIONS + __dynamic_start = .; + *(.dynamic) + __dynamic_end = .; +- } ++ } :all + + . = ALIGN(16); + +@@ -122,19 +127,19 @@ SECTIONS + *(.data.*) + *(.lowmem) + __data_end = .; +- } ++ } :all + + .reloc : { + *(.reloc) +- } ++ } :all + + .symtab : { + *(.symtab) +- } ++ } :all + + .strtab : { + *(.strtab) +- } ++ } :all + + .bss (NOLOAD) : { + /* the EFI loader doesn't seem to like a .bss section, +@@ -148,7 +153,7 @@ SECTIONS + __bss_end = .; + *(.sbss) + *(.scommon) +- } ++ } :all + __bss_len = ABSOLUTE(__bss_end) - ABSOLUTE(__bss_start); + __bss_dwords = (__bss_len + 3) >> 2; + +@@ -161,7 +166,7 @@ SECTIONS + *(.hugebss) + *(.hugebss.*) + __hugebss_end = .; +- } ++ } :all + + _end = .; + +diff --git a/efi/x86_64/syslinux.ld b/efi/x86_64/syslinux.ld +index 450641c..a2c124f 100644 +--- a/efi/x86_64/syslinux.ld ++++ b/efi/x86_64/syslinux.ld +@@ -19,6 +19,11 @@ OUTPUT_FORMAT("elf64-x86-64", "elf64-x86-64", "elf64-x86-64") + OUTPUT_ARCH(i386:x86-64) + ENTRY(_start) + ++PHDRS ++{ ++ all PT_LOAD ; ++} ++ + SECTIONS + { + . = 0; +@@ -31,7 +36,7 @@ SECTIONS + *(.text) + *(.text.*) + __text_end = .; +- } ++ } :all + + . = ALIGN(16); + +@@ -40,7 +45,7 @@ SECTIONS + *(.rodata) + *(.rodata.*) + __rodata_end = .; +- } ++ } :all + + . = ALIGN(4); + +@@ -49,14 +54,14 @@ SECTIONS + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + __ctors_end = .; +- } ++ } :all + + .dtors : { + __dtors_start = .; + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + __dtors_end = .; +- } ++ } :all + + . = ALIGN(4096); + .rel : { +@@ -64,7 +69,7 @@ SECTIONS + *(.rel.data) + *(.rel.data.*) + *(.rel.ctors) +- } ++ } :all + + . = ALIGN(4); + +@@ -72,14 +77,14 @@ SECTIONS + __gnu_hash_start = .; + *(.gnu.hash) + __gnu_hash_end = .; +- } ++ } :all + + + .dynsym : { + __dynsym_start = .; + *(.dynsym) + __dynsym_end = .; +- } ++ } :all + + . = ALIGN(4); + +@@ -87,7 +92,7 @@ SECTIONS + __dynstr_start = .; + *(.dynstr) + __dynstr_end = .; +- } ++ } :all + + . = ALIGN(4); + +@@ -104,7 +109,7 @@ SECTIONS + KEEP (*(.got.plt)) + KEEP (*(.got)) + __got_end = .; +- } ++ } :all + + . = ALIGN(4); + +@@ -112,7 +117,7 @@ SECTIONS + __dynamic_start = .; + *(.dynamic) + __dynamic_end = .; +- } ++ } :all + + . = ALIGN(16); + +@@ -122,19 +127,19 @@ SECTIONS + *(.data.*) + *(.lowmem) + __data_end = .; +- } ++ } :all + + .reloc : { + *(.reloc) +- } ++ } :all + + .symtab : { + *(.symtab) +- } ++ } :all + + .strtab : { + *(.strtab) +- } ++ } :all + + .bss (NOLOAD) : { + /* the EFI loader doesn't seem to like a .bss section, +@@ -148,7 +153,7 @@ SECTIONS + __bss_end = .; + *(.sbss) + *(.scommon) +- } ++ } :all + __bss_len = ABSOLUTE(__bss_end) - ABSOLUTE(__bss_start); + __bss_dwords = (__bss_len + 3) >> 2; + +@@ -161,7 +166,7 @@ SECTIONS + *(.hugebss) + *(.hugebss.*) + __hugebss_end = .; +- } ++ } :all + + _end = .; +
From a report on the syslinux mailing list [0]: The GNU linker now writes two segments of type PT_LOAD into the program header. However, this is not supported by the wrapper script that converts the shared object to an .efi executable. As per comment in that file: (...) Although there may be several LOAD program headers, only one is currently copied. A simple workaround I've found to work is to ask the linker to put everything into one PT_LOAD program header. The issue is ackowledged in the syslinux wiki page about building syslinux [1]. This page refers to various resources, of which a Debian patch [2]. This information is also referenced in #11861. Fixes: #11861 [0] https://www.syslinux.org/archives/2018-August/026167.html [1] https://wiki.syslinux.org/wiki/index.php?title=Building [2] https://salsa.debian.org/images-team/syslinux/-/blob/debian/master/debian/patches/0017-single-load-segment.patch Reported-by: Sam Lancia <sam@gpsm.co.uk> Reported-by: Meliodas <meliodasren01@gmail.com> Signed-off-by: Yann E. MORIN <yann.morin.1998@free.fr> --- Sam, Meliodas: I have no test-case to validate this change, so it would be nice if you could report on whether the above does indeed fixes the issue you reported. Bonus point: it would be even better if we could improve on the existing runtime test: support/testing/tests/boot/test_syslinux.py It currently only does a test build, so it does not catch the issue; the grub2 test we have does run, so we can catch failures. It would be nice to also have a runtime test for syslinux... --- boot/syslinux/0018-single-load-segment.patch | 313 +++++++++++++++++++ 1 file changed, 313 insertions(+) create mode 100644 boot/syslinux/0018-single-load-segment.patch