diff options
Diffstat (limited to 'abs')
| -rw-r--r-- | abs/extra/syslinux/PKGBUILD | 231 | ||||
| -rw-r--r-- | abs/extra/syslinux/syslinux-6.02-fix-bios-isolinux.patch | 12 | ||||
| -rw-r--r-- | abs/extra/syslinux/syslinux-6.02-fix-chainloading.patch | 47 | ||||
| -rw-r--r-- | abs/extra/syslinux/syslinux-6.02-fix-efi-ovmf.patch | 621 | ||||
| -rw-r--r-- | abs/extra/syslinux/syslinux-install_update | 4 | ||||
| -rw-r--r-- | abs/extra/syslinux/syslinux.cfg | 4 | ||||
| -rw-r--r-- | abs/extra/syslinux/syslinux.install | 43 | 
7 files changed, 78 insertions, 884 deletions
| diff --git a/abs/extra/syslinux/PKGBUILD b/abs/extra/syslinux/PKGBUILD index e68cc11..4b81011 100644 --- a/abs/extra/syslinux/PKGBUILD +++ b/abs/extra/syslinux/PKGBUILD @@ -1,18 +1,26 @@ -# Maintainer : Tobias Powalowski <tpowa@archlinux.org> -# Maintainer : Thomas Bächler <thomas@archlinux.org> -# Contributor: Keshav Padram Amburay <(the ddoott ridikulus ddoott rat) (aatt) (gemmaeiil) (ddoott) (ccoomm)> +# Maintainer: Tobias Powalowski <tpowa@archlinux.org> +# Maintainer: Thomas Bächler <thomas@archlinux.org> +# Maintainer: Anatol Pomozov <anatol.pomozov@gmail.com> +# Contributor: Keshav Amburay <(the ddoott ridikulus ddoott rat) (aatt) (gemmaeiil) (ddoott) (ccoomm)> -pkgname="syslinux" -pkgver="6.02" -pkgrel="8" -arch=('x86_64' 'i686') -pkgdesc="Collection of boot loaders that boot from FAT, ext2/3/4 and btrfs filesystems, from CDs and via PXE" -url="http://syslinux.zytor.com/" -license=('GPL2') -options=('!makeflags' '!emptydirs') -backup=('boot/syslinux/syslinux.cfg') -makedepends=('python2' 'nasm' 'gnu-efi-libs') -depends=('perl' 'glibc') +pkgname=syslinux +pkgver=6.03 +_tag=syslinux-$pkgver +pkgrel=2 +pkgdesc='Collection of boot loaders that boot from FAT, ext2/3/4 and btrfs filesystems, from CDs and via PXE' +url='http://www.syslinux.org/' +arch=(i686 x86_64) +backup=(boot/syslinux/syslinux.cfg) +install=syslinux.install +license=(GPL2) +# syslinux build system is a mess of submakes that does not work with -jN +# efi32/com32 do not like Arch cflags/ldflags, though it would be nice to have the flags for userspace tools +options=(!makeflags !buildflags) +makedepends=(git python2 nasm upx asciidoc) +if [[ "$CARCH" == x86_64 ]]; then +  # efi32 needs it +  makedepends+=(lib32-glibc) +fi  optdepends=('perl-passwd-md5:  For md5pass'              'perl-digest-sha1: For sha1pass'              'mtools:           For mkdiskimage and syslinux support' @@ -20,174 +28,53 @@ optdepends=('perl-passwd-md5:  For md5pass'              'util-linux:       For isohybrid'              'efibootmgr:       For EFI support'              'dosfstools:       For EFI support') -install="${pkgname}.install" -source=("https://www.kernel.org/pub/linux/utils/boot/syslinux/${pkgname}-${pkgver}.tar.xz" -        'syslinux.cfg' -        'syslinux-install_update' -        'syslinux-6.02-fix-chainloading.patch' -        'syslinux-6.02-fix-bios-isolinux.patch' -        'syslinux-6.02-fix-efi-ovmf.patch') -prepare() { -     -    cd "${srcdir}/${pkgname}-${pkgver}/" -     -    ## Do not try to build the Windows or DOS installers and DIAG files -    sed 's|diag libinstaller dos win32 win64 dosutil txt|libinstaller txt|g' -i "${srcdir}/${pkgname}-${pkgver}/Makefile" || true -    sed 's|win32/syslinux.exe win64/syslinux64.exe||g' -i "${srcdir}/${pkgname}-${pkgver}/Makefile" || true -    sed 's|dosutil/*.com dosutil/*.sys||g' -i "${srcdir}/${pkgname}-${pkgver}/Makefile" || true -    sed 's|dos/syslinux.com||g' -i "${srcdir}/${pkgname}-${pkgver}/Makefile" || true -    sed 's|INSTALLSUBDIRS = com32 utils dosutil|INSTALLSUBDIRS = com32 utils|g' -i "${srcdir}/${pkgname}-${pkgver}/Makefile" || true -    sed 's|install -m 644 -c $(INSTALL_DIAG) $(INSTALLROOT)$(DIAGDIR)|# install -m 644 -c $(INSTALL_DIAG) $(INSTALLROOT)$(DIAGDIR)|g' -i "${srcdir}/${pkgname}-${pkgver}/Makefile" || true -     -    ## Fix FHS manpage path -    sed 's|/usr/man|/usr/share/man|g' -i "${srcdir}/${pkgname}-${pkgver}/mk/syslinux.mk" || true -     -    # fix chainloading -    # http://bugzilla.syslinux.org/show_bug.cgi?id=31 -    # http://www.syslinux.org/archives/2013-October/020971.html -    patch -Np1 -i "${srcdir}/syslinux-6.02-fix-chainloading.patch" -     -    # fix bios booting from isohybrid -    # http://www.syslinux.org/archives/2013-November/021189.html -    patch -Np1 -i "${srcdir}/syslinux-6.02-fix-bios-isolinux.patch" -    # fix efi booting in qemu/ovmf -    # http://bugzilla.syslinux.org/show_bug.cgi?id=23 -    patch -Np1 -i  "${srcdir}/syslinux-6.02-fix-efi-ovmf.patch" -     -} +# The syslinux-install_update script is maintained at https://gist.github.com/pyther/772138 +# Script not yet updated for syslinux-efi +source=(git://git.kernel.org/pub/scm/boot/syslinux/syslinux.git#tag=$_tag +        syslinux.cfg +        syslinux-install_update) +sha1sums=('SKIP' +          '1145f454bd297d373ad123425f93620c3e92f585' +          'd22e7e3fc544cf8a49f27ae9a25f17e65f575ea1') -_build_syslinux_bios() { -     -    rm -rf "${srcdir}/${pkgname}-${pkgver}-bios/" || true -    cp -r "${srcdir}/${pkgname}-${pkgver}" "${srcdir}/${pkgname}-${pkgver}-bios" -    cd "${srcdir}/${pkgname}-${pkgver}-bios/" -     -    ## Do not try to build syslinux with our default LDFLAGS, it will fail -    unset LDFLAGS -    make PYTHON="python2" bios -    make PYTHON="python2" bios installer -     -} +_targets='bios efi32' +case "$CARCH" in +  x86_64) _targets+=' efi64' ;; +esac -_build_syslinux_efi64() { -     -    rm -rf "${srcdir}/${pkgname}-${pkgver}-efi64/" || true -    cp -r "${srcdir}/${pkgname}-${pkgver}" "${srcdir}/${pkgname}-${pkgver}-efi64" -    cd "${srcdir}/${pkgname}-${pkgver}-efi64/" -     -    ## Unset all compiler FLAGS for efi64 build -    unset CFLAGS -    unset CPPFLAGS -    unset CXXFLAGS -    unset LDFLAGS -    unset MAKEFLAGS -     -    make PYTHON="python2" efi64 -    make PYTHON="python2" efi64 installer -     -} +prepare() { +  cd syslinux -_build_syslinux_efi32() { -     -    rm -rf "${srcdir}/${pkgname}-${pkgver}-efi32/" || true -    cp -r "${srcdir}/${pkgname}-${pkgver}" "${srcdir}/${pkgname}-${pkgver}-efi32" -    cd "${srcdir}/${pkgname}-${pkgver}-efi32/" -     -    ## Unset all compiler FLAGS for efi32 build -    unset CFLAGS -    unset CPPFLAGS -    unset CXXFLAGS -    unset LDFLAGS -    unset MAKEFLAGS -     -    make PYTHON="python2" efi32 -    make PYTHON="python2" efi32 installer -     -} +  # do not swallow efi compilation output to make debugging easier +  sed 's|> /dev/null 2>&1||' -i efi/check-gnu-efi.sh -build() { -     -    cd "${srcdir}/${pkgname}-${pkgver}/" -     -    ## Build syslinux-efi -    if [[ "${CARCH}" == "x86_64" ]]; then -        _build_syslinux_efi64 -    fi -     -    if [[ "${CARCH}" == "i686" ]]; then -        _build_syslinux_efi32 -    fi -     -    ## Build syslinux-bios -    _build_syslinux_bios -     +  # disable debug and development flags to reduce bootloader size +  truncate --size 0 mk/devel.mk  } -_package_syslinux_bios() { -     -    cd "${srcdir}/${pkgname}-${pkgver}-bios/" -     -    ## Install Syslinux bios -    make INSTALLROOT="${pkgdir}/" AUXDIR="/usr/lib/syslinux/bios/" bios install -     -    ## Remove syslinux.exe,syslinux64.exe,syslinux.com and dosutil dir -    rm "${pkgdir}/usr/lib/syslinux/bios"/syslinux.{com,exe} || true -    rm "${pkgdir}/usr/lib/syslinux/bios/syslinux64.exe" || true -    rm -rf "${pkgdir}/usr/lib/syslinux/bios/dosutil/" || true -     -    ## Remove com32 and diag dirs -    rm -rf "${pkgdir}/usr/lib/syslinux/bios/diag/" || true -    rm -rf "${pkgdir}/usr/lib/syslinux/bios/com32/" || true -     -    ## Move extlinux binary to /usr/bin -    install -d "${pkgdir}/usr/bin" -    mv "${pkgdir}/sbin/extlinux" "${pkgdir}/usr/bin/extlinux" -    rm -rf "${pkgdir}/sbin/" -     -    ## Install docs -    install -d "${pkgdir}/usr/share/doc" -    cp -ar "${srcdir}/${pkgname}-${pkgver}/doc" "${pkgdir}/usr/share/doc/syslinux" -     -    ## Install the default configuration -    install -D -m0644 "${srcdir}/syslinux.cfg" "${pkgdir}/boot/syslinux/syslinux.cfg" -     -    ## Install the installation and update script -    ## This script is maintained at git://gist.github.com/772138.git -    ## Script not yet updated for syslinux-efi -    install -D -m0755 "${srcdir}/syslinux-install_update" "${pkgdir}/usr/bin/syslinux-install_update" -     +build() { +  cd syslinux +  make PYTHON=python2 $_targets  } -_package_syslinux_efi() { -     -    cd "${srcdir}/${pkgname}-${pkgver}/" -     -    if [[ "${CARCH}" == "x86_64" ]]; then -        cd "${srcdir}/${pkgname}-${pkgver}-efi64/" -        make INSTALLROOT="${pkgdir}/" AUXDIR="/usr/lib/syslinux/" efi64 install -    fi -     -    if [[ "${CARCH}" == "i686" ]]; then -        cd "${srcdir}/${pkgname}-${pkgver}-efi32/" -        make INSTALLROOT="${pkgdir}/" AUXDIR="/usr/lib/syslinux/" efi32 install -    fi -     +check() { +  cd syslinux +  make unittest  }  package() { -     -    cd "${srcdir}/${pkgname}-${pkgver}/" -     -    _package_syslinux_efi -     -    _package_syslinux_bios -     -} +  cd syslinux +  make $_targets install INSTALLROOT="$pkgdir" SBINDIR=/usr/bin MANDIR=/usr/share/man AUXDIR=/usr/lib/syslinux -md5sums=('6f275813a1b08cf852e55c0a3f8fbc78' -         '46ca150f53322ff8f1597d9a342f7e40' -         '9376f18fa3e42fc36cffa4cff0a84c09' -         '9dbede6b71a4de9e46aac4aad65334d7' -         'adf71eceb4fccecd9a7efe1ab3d54918' -         '62d22b101ef2ef53e25b4f86d9f41cb5') +  rm -r "$pkgdir"/usr/lib/syslinux/{com32,dosutil,syslinux.com} +  install -D -m644 COPYING "$pkgdir"/usr/share/licenses/syslinux/COPYING +  install -d "$pkgdir"/usr/share/doc +  cp -ar doc "$pkgdir"/usr/share/doc/syslinux + +  install -d "$pkgdir"/usr/lib/syslinux/bios +  mv "$pkgdir"/usr/lib/syslinux/{*.bin,*.c32,*.0,memdisk} "$pkgdir"/usr/lib/syslinux/bios  + +  install -D -m0644 ../syslinux.cfg "$pkgdir"/boot/syslinux/syslinux.cfg +  install -D -m0755 ../syslinux-install_update "$pkgdir"/usr/bin/syslinux-install_update +} diff --git a/abs/extra/syslinux/syslinux-6.02-fix-bios-isolinux.patch b/abs/extra/syslinux/syslinux-6.02-fix-bios-isolinux.patch deleted file mode 100644 index 48df46f..0000000 --- a/abs/extra/syslinux/syslinux-6.02-fix-bios-isolinux.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff --git a/core/isolinux.asm b/core/isolinux.asm -index bd4e9556922d..c4db4133e274 100644 ---- a/core/isolinux.asm -+++ b/core/isolinux.asm -@@ -420,7 +420,7 @@ MaxLMA		equ 384*1024		; Reasonable limit (384K) - 		call getlinsec - 		pop eax - 		pop cx --		mov dx,cx -+		movzx edx,cx - 		pop bp - 		pop bx diff --git a/abs/extra/syslinux/syslinux-6.02-fix-chainloading.patch b/abs/extra/syslinux/syslinux-6.02-fix-chainloading.patch deleted file mode 100644 index 6fd7ef4..0000000 --- a/abs/extra/syslinux/syslinux-6.02-fix-chainloading.patch +++ /dev/null @@ -1,47 +0,0 @@ -Reported-by: Dark Raven <drdarkraven at gmail.com> -Signed-off-by: Raphael S. Carvalho <raphael.scarv at gmail.com> ---- - com32/lib/syslinux/disk.c |   22 ++++++++++++++-------- - 1 files changed, 14 insertions(+), 8 deletions(-) - -diff --git a/com32/lib/syslinux/disk.c b/com32/lib/syslinux/disk.c -index 0b0c737..47ecb52 100644 ---- a/com32/lib/syslinux/disk.c -+++ b/com32/lib/syslinux/disk.c -@@ -171,22 +171,28 @@ out: - static void *ebios_setup(const struct disk_info *const diskinfo, com32sys_t *inreg, - 			 uint64_t lba, uint8_t count, uint8_t op_code) - { --    static __lowmem struct disk_ebios_dapa dapa; -+    static struct disk_ebios_dapa *dapa = NULL; -     void *buf; - -+    if (!dapa) { -+	dapa = lmalloc(sizeof *dapa); -+	if (!dapa) -+	    return NULL; -+    } -+ -     buf = lmalloc(count * diskinfo->bps); -     if (!buf) - 	return NULL; - --    dapa.len = sizeof(dapa); --    dapa.count = count; --    dapa.off = OFFS(buf); --    dapa.seg = SEG(buf); --    dapa.lba = lba; -+    dapa->len = sizeof(*dapa); -+    dapa->count = count; -+    dapa->off = OFFS(buf); -+    dapa->seg = SEG(buf); -+    dapa->lba = lba; - -     inreg->eax.b[1] = op_code; --    inreg->esi.w[0] = OFFS(&dapa); --    inreg->ds = SEG(&dapa); -+    inreg->esi.w[0] = OFFS(dapa); -+    inreg->ds = SEG(dapa); -     inreg->edx.b[0] = diskinfo->disk; - -     return buf; diff --git a/abs/extra/syslinux/syslinux-6.02-fix-efi-ovmf.patch b/abs/extra/syslinux/syslinux-6.02-fix-efi-ovmf.patch deleted file mode 100644 index f33f4c1..0000000 --- a/abs/extra/syslinux/syslinux-6.02-fix-efi-ovmf.patch +++ /dev/null @@ -1,621 +0,0 @@ -The value of the field rva_and_sizes_nr is used by OVMF to check the -consistency of the PE file with respect to the field optional_hdr_sz. It -now have the right value. - -Signed-off-by: Celelibi <celelibi at gmail.com> ---- - efi/wrapper.c |  6 +++--- - efi/wrapper.h | 28 ++++++++++++++++------------ - 2 files changed, 19 insertions(+), 15 deletions(-) - -diff --git a/efi/wrapper.c b/efi/wrapper.c -index 04c895f..ec77271 100644 ---- a/efi/wrapper.c -+++ b/efi/wrapper.c -@@ -102,7 +102,7 @@ static void write_header(FILE *f, __uint32_t entry, size_t data_size, - 		e_hdr.image_sz = total_sz; - 		e_hdr.headers_sz = 512; - 		e_hdr.subsystem = IMAGE_SUBSYSTEM_EFI_APPLICATION; --		e_hdr.rva_and_sizes_nr = 1; -+		e_hdr.rva_and_sizes_nr = sizeof(e_hdr.data_directory) / sizeof(__uint64_t); - 		fwrite(&e_hdr, sizeof(e_hdr), 1, f); - 	} - 	else if (class == ELFCLASS64) { -@@ -130,7 +130,7 @@ static void write_header(FILE *f, __uint32_t entry, size_t data_size, - 		e_hdr_pe32p.image_sz = total_sz; - 		e_hdr_pe32p.headers_sz = 512; - 		e_hdr_pe32p.subsystem = IMAGE_SUBSYSTEM_EFI_APPLICATION; --		e_hdr_pe32p.rva_and_sizes_nr = 1; -+		e_hdr_pe32p.rva_and_sizes_nr = sizeof(e_hdr_pe32p.data_directory) / sizeof(__uint64_t); - 		fwrite(&e_hdr_pe32p, sizeof(e_hdr_pe32p), 1, f); - 	} -  -@@ -237,7 +237,7 @@ int main(int argc, char **argv) - 		fprintf(stderr, "Unsupported architecture\n"); - 		exit(EXIT_FAILURE); - 	} --		 -+ - 	if (id[EI_MAG0] != ELFMAG0 || - 	    id[EI_MAG1] != ELFMAG1 || - 	    id[EI_MAG2] != ELFMAG2 || -diff --git a/efi/wrapper.h b/efi/wrapper.h -index 4f76991..0e6b38e 100644 ---- a/efi/wrapper.h -+++ b/efi/wrapper.h -@@ -102,12 +102,14 @@ struct extra_hdr { - 	__uint32_t heap_commit_sz; - 	__uint32_t loader_flags; - 	__uint32_t rva_and_sizes_nr; --	__uint64_t export_table; --	__uint64_t import_table; --	__uint64_t resource_table; --	__uint64_t exception_table; --	__uint64_t certification_table; --	__uint64_t base_relocation_table; -+	struct { -+		__uint64_t export_table; -+		__uint64_t import_table; -+		__uint64_t resource_table; -+		__uint64_t exception_table; -+		__uint64_t certification_table; -+		__uint64_t base_relocation_table; -+	} data_directory; - } __packed; -  - /* Extra header for PE32+ format  -@@ -136,12 +138,14 @@ struct extra_hdr_pe32p { - 	__uint64_t heap_commit_sz; - 	__uint32_t loader_flags; - 	__uint32_t rva_and_sizes_nr; --	__uint64_t export_table; --	__uint64_t import_table; --	__uint64_t resource_table; --	__uint64_t exception_table; --	__uint64_t certification_table; --	__uint64_t base_relocation_table; -+	struct { -+		__uint64_t export_table; -+		__uint64_t import_table; -+		__uint64_t resource_table; -+		__uint64_t exception_table; -+		__uint64_t certification_table; -+		__uint64_t base_relocation_table; -+	} data_directory; - } __packed; -  - struct section { -In the generated PE file, the section header for the .text section used -to address more than the whole file. Starting at offset 0 (before the -end of the headers) is illegal and is rejected by OVMF. Giving a size -greater than the actual file size is also illegal and rejected. - -Moreover, the actual data inside the PE file have to be aligned to at -least 512 bytes. Hence, .text need to be aligned as well. - -Signed-off-by: Celelibi <celelibi at gmail.com> ---- - efi/wrapper.c | 44 +++++++++++++++++++++++++------------------- - 1 file changed, 25 insertions(+), 19 deletions(-) - -diff --git a/efi/wrapper.c b/efi/wrapper.c -index ec77271..bd2c175 100644 ---- a/efi/wrapper.c -+++ b/efi/wrapper.c -@@ -54,11 +54,15 @@ static void write_header(FILE *f, __uint32_t entry, size_t data_size, - 	struct coff_hdr c_hdr; - 	struct header hdr; - 	struct coff_reloc c_rel; --	__uint32_t total_sz = so_size; -+	__uint32_t total_sz = data_size; - 	__uint32_t dummy = 0; - 	__uint32_t hdr_sz; - 	__uint32_t reloc_start, reloc_end; -  -+	hdr_sz = 512; -+	total_sz += hdr_sz; -+	entry += hdr_sz; -+ - 	memset(&hdr, 0, sizeof(hdr)); - 	hdr.msdos_signature = MSDOS_SIGNATURE; -  -@@ -77,11 +81,6 @@ static void write_header(FILE *f, __uint32_t entry, size_t data_size, - 	c_hdr.nr_sections = 2; - 	c_hdr.nr_syms = 1; - 	if (class == ELFCLASS32) { --		hdr_sz = sizeof(o_hdr) + sizeof(t_sec) + sizeof(e_hdr) + --				sizeof(r_sec) + sizeof(c_hdr) + sizeof(hdr) + sizeof(c_rel) --				+ sizeof(dummy); --		total_sz += hdr_sz; --		entry += hdr_sz; - 		c_hdr.arch = IMAGE_FILE_MACHINE_I386; - 		c_hdr.characteristics = IMAGE_FILE_32BIT_MACHINE | - 			IMAGE_FILE_DEBUG_STRIPPED | IMAGE_FILE_EXECUTABLE_IMAGE | -@@ -92,25 +91,20 @@ static void write_header(FILE *f, __uint32_t entry, size_t data_size, - 		o_hdr.format = PE32_FORMAT; - 		o_hdr.major_linker_version = 0x02; - 		o_hdr.minor_linker_version = 0x14; --		o_hdr.code_sz = total_sz; -+		o_hdr.code_sz = data_size; - 		o_hdr.entry_point = entry; - 		o_hdr.initialized_data_sz = data_size; - 		fwrite(&o_hdr, sizeof(o_hdr), 1, f); - 		memset(&e_hdr, 0, sizeof(e_hdr)); - 		e_hdr.section_align = 4096; - 		e_hdr.file_align = 512; --		e_hdr.image_sz = total_sz; --		e_hdr.headers_sz = 512; -+		e_hdr.image_sz = hdr_sz + so_size; -+		e_hdr.headers_sz = hdr_sz; - 		e_hdr.subsystem = IMAGE_SUBSYSTEM_EFI_APPLICATION; - 		e_hdr.rva_and_sizes_nr = sizeof(e_hdr.data_directory) / sizeof(__uint64_t); - 		fwrite(&e_hdr, sizeof(e_hdr), 1, f); - 	} - 	else if (class == ELFCLASS64) { --		hdr_sz = sizeof(o_hdr_pe32p) + sizeof(t_sec) + sizeof(e_hdr_pe32p) + --				sizeof(r_sec) + sizeof(c_hdr) + sizeof(hdr) + sizeof(c_rel) --				+ sizeof(dummy); --		total_sz += hdr_sz; --		entry += hdr_sz; - 		c_hdr.arch = IMAGE_FILE_MACHINE_X86_64; - 		c_hdr.characteristics = IMAGE_FILE_DEBUG_STRIPPED | IMAGE_FILE_EXECUTABLE_IMAGE | - 			IMAGE_FILE_LINE_NUMBERS_STRIPPED; -@@ -120,15 +114,15 @@ static void write_header(FILE *f, __uint32_t entry, size_t data_size, - 		o_hdr_pe32p.format = PE32P_FORMAT; - 		o_hdr_pe32p.major_linker_version = 0x02; - 		o_hdr_pe32p.minor_linker_version = 0x14; --		o_hdr_pe32p.code_sz = total_sz; -+		o_hdr_pe32p.code_sz = data_size; - 		o_hdr_pe32p.entry_point = entry; - 		o_hdr.initialized_data_sz = data_size; - 		fwrite(&o_hdr_pe32p, sizeof(o_hdr_pe32p), 1, f); - 		memset(&e_hdr_pe32p, 0, sizeof(e_hdr)); - 		e_hdr_pe32p.section_align = 4096; - 		e_hdr_pe32p.file_align = 512; --		e_hdr_pe32p.image_sz = total_sz; --		e_hdr_pe32p.headers_sz = 512; -+		e_hdr_pe32p.image_sz = hdr_sz + so_size; -+		e_hdr_pe32p.headers_sz = hdr_sz; - 		e_hdr_pe32p.subsystem = IMAGE_SUBSYSTEM_EFI_APPLICATION; - 		e_hdr_pe32p.rva_and_sizes_nr = sizeof(e_hdr_pe32p.data_directory) / sizeof(__uint64_t); - 		fwrite(&e_hdr_pe32p, sizeof(e_hdr_pe32p), 1, f); -@@ -136,8 +130,10 @@ static void write_header(FILE *f, __uint32_t entry, size_t data_size, -  - 	memset(&t_sec, 0, sizeof(t_sec)); - 	strcpy((char *)t_sec.name, ".text"); --	t_sec.virtual_sz = total_sz; --	t_sec.raw_data_sz = total_sz; -+	t_sec.virtual_sz = data_size; -+	t_sec.virtual_address = hdr_sz; -+	t_sec.raw_data_sz = t_sec.virtual_sz; -+	t_sec.raw_data = t_sec.virtual_address; - 	t_sec.characteristics = IMAGE_SCN_CNT_CODE | - 		IMAGE_SCN_ALIGN_16BYTES | IMAGE_SCN_MEM_EXECUTE | - 		IMAGE_SCN_MEM_READ; -@@ -163,6 +159,16 @@ static void write_header(FILE *f, __uint32_t entry, size_t data_size, - 	fwrite(&c_rel, sizeof(c_rel), 1, f); - 	fwrite(&dummy, sizeof(dummy), 1, f); -  -+	/* -+	 * Add some padding to align the ELF as needed -+	 */ -+	if (ftell(f) > t_sec.virtual_address) { -+		// A fseek that rewind would be a bug hard to track -+		fprintf(stderr, "PE+ headers are too large.\n"); -+		exit(EXIT_FAILURE); -+	} -+ -+	fseek(f, t_sec.virtual_address, SEEK_SET); - } -  - static void usage(char *progname) -There is no need to have a relocation section that nothing points at. -The image is still seen as relocatable as long as the Characteristics of -the FileHeader do not say otherwise. - -Moreover, the field base_relocation_table wasn't initialized properly -leading to unpredictable bugs. - -Signed-off-by: Celelibi <celelibi at gmail.com> ---- - -I'm not 100% positive about the uselessness of the relocation section. However: -1) it works on my real hardware; -2) OVMF doesn't check the section headers at all; -3) all the docs I could find say that the section names are arbitrary; -4) the only way to make the relocation actually happen is by setting the -base_relocation_table field of the extra headers to point to this section; -5) The right way to indicate the image is not relocatable would be by setting -the characteristics IMAGE_FILE_RELOCS_STRIPPED in the coff header. - -Moreover, the relocation entry cannot be inserted before the end of the headers -(512 bytes), this mean we would have to push everything a few bytes further. -And I think it's better if it can be avoided. :) - - efi/wrapper.c | 28 +++------------------------- - 1 file changed, 3 insertions(+), 25 deletions(-) - -diff --git a/efi/wrapper.c b/efi/wrapper.c -index bd2c175..9652368 100644 ---- a/efi/wrapper.c -+++ b/efi/wrapper.c -@@ -48,14 +48,12 @@ static void write_header(FILE *f, __uint32_t entry, size_t data_size, - { - 	struct optional_hdr o_hdr; - 	struct optional_hdr_pe32p o_hdr_pe32p; --	struct section t_sec, r_sec; -+	struct section t_sec; - 	struct extra_hdr e_hdr; - 	struct extra_hdr_pe32p e_hdr_pe32p; - 	struct coff_hdr c_hdr; - 	struct header hdr; --	struct coff_reloc c_rel; - 	__uint32_t total_sz = data_size; --	__uint32_t dummy = 0; - 	__uint32_t hdr_sz; - 	__uint32_t reloc_start, reloc_end; -  -@@ -78,7 +76,7 @@ static void write_header(FILE *f, __uint32_t entry, size_t data_size, - 	fwrite(&hdr, sizeof(hdr), 1, f); -  - 	memset(&c_hdr, 0, sizeof(c_hdr)); --	c_hdr.nr_sections = 2; -+	c_hdr.nr_sections = 1; - 	c_hdr.nr_syms = 1; - 	if (class == ELFCLASS32) { - 		c_hdr.arch = IMAGE_FILE_MACHINE_I386; -@@ -118,7 +116,7 @@ static void write_header(FILE *f, __uint32_t entry, size_t data_size, - 		o_hdr_pe32p.entry_point = entry; - 		o_hdr.initialized_data_sz = data_size; - 		fwrite(&o_hdr_pe32p, sizeof(o_hdr_pe32p), 1, f); --		memset(&e_hdr_pe32p, 0, sizeof(e_hdr)); -+		memset(&e_hdr_pe32p, 0, sizeof(e_hdr_pe32p)); - 		e_hdr_pe32p.section_align = 4096; - 		e_hdr_pe32p.file_align = 512; - 		e_hdr_pe32p.image_sz = hdr_sz + so_size; -@@ -140,26 +138,6 @@ static void write_header(FILE *f, __uint32_t entry, size_t data_size, - 	fwrite(&t_sec, sizeof(t_sec), 1, f); -  - 	/* --	 * Write our dummy relocation and reloc section. --	 */ --	memset(&r_sec, 0, sizeof(r_sec)); --	strcpy((char *)r_sec.name, ".reloc"); --	r_sec.virtual_sz = sizeof(c_rel); --	r_sec.virtual_address = ftell(f) + sizeof(r_sec); --	r_sec.raw_data_sz = r_sec.virtual_sz; --	r_sec.raw_data = r_sec.virtual_address; --	r_sec.characteristics = IMAGE_SCN_CNT_INITIALIZED_DATA | --		IMAGE_SCN_ALIGN_1BYTES | IMAGE_SCN_MEM_DISCARDABLE | --		IMAGE_SCN_MEM_READ; --	fwrite(&r_sec, sizeof(r_sec), 1, f); -- --	memset(&c_rel, 0, sizeof(c_rel)); --	c_rel.virtual_address = ftell(f) + sizeof(c_rel); --	c_rel.symtab_index = 10; --	fwrite(&c_rel, sizeof(c_rel), 1, f); --	fwrite(&dummy, sizeof(dummy), 1, f); -- --	/* - 	 * Add some padding to align the ELF as needed - 	 */ - 	if (ftell(f) > t_sec.virtual_address) { -PE headers code_sz and image_sz indicate more or less, the size of the -file and the size of the in-memory image. They are now given the right -value. - -In the ELF format, only the program headers are reliable to determine -the actually needed part of the file and the in-memory size. - -The .bss section should always be marked as NOLOAD for ld since its -content shouldn't be included into the binary file. - -Signed-off-by: Celelibi <celelibi at gmail.com> ---- - -Again, I'm not 100% positive about the semantics of NOLOAD in a linker script. -However I found this make things work better. -Actually the file core/fs/fs.o have a .bss16 section that is not empty. If I -understood correctly, only .bss can be empty in a .o. Thus ld generates the -zeros that belong to that section in the .o. Then, when merging the section -.bss16 into the .bss of syslinux.so, ld is forced to generate ALL the zeros -that belong to the .bss section. Marking this section as NOLOAD make ld to -ignore its content but still produce a PT_LOAD program header with the right -memory size, as needed for the bss. - - efi/i386/syslinux.ld   |   4 +- - efi/wrapper.c          | 138 +++++++++++++++---------------------------------- - efi/x86_64/syslinux.ld |   4 +- - 3 files changed, 45 insertions(+), 101 deletions(-) - -diff --git a/efi/i386/syslinux.ld b/efi/i386/syslinux.ld -index 523a9b9..bab3fc7 100644 ---- a/efi/i386/syslinux.ld -+++ b/efi/i386/syslinux.ld -@@ -136,7 +136,7 @@ SECTIONS - 		*(.strtab) - 	} -  --	.bss : { -+	.bss (NOLOAD) : { - 		/* the EFI loader doesn't seem to like a .bss section, - 		   so we stick it all into .data: */ - 		__bss_start = .; -@@ -153,7 +153,7 @@ SECTIONS - 	__bss_dwords = (__bss_len + 3) >> 2; -  - 	. = ALIGN(128); --	 -+ - 	/* Very large objects which don't need to be zeroed */ -  - 	.hugebss : { -diff --git a/efi/wrapper.c b/efi/wrapper.c -index 9652368..a5247ae 100644 ---- a/efi/wrapper.c -+++ b/efi/wrapper.c -@@ -35,7 +35,7 @@ typedef Elf64_Addr Elf_Addr; - #endif -  - /* -- * 'so_size' is the file size of the ELF shared object. -+ * 'so_memsz' is the size of the ELF shared object once loaded. -  * 'data_size' is the size of initialised data in the shared object. -  *  'class' dictates how the header is written -  * 	For 32bit machines (class == ELFCLASS32), the optional -@@ -44,7 +44,7 @@ typedef Elf64_Addr Elf_Addr; -  * 	header includes PE32+header fields -  */ - static void write_header(FILE *f, __uint32_t entry, size_t data_size, --			 __uint32_t so_size, __uint8_t class) -+			 __uint32_t so_memsz, __uint8_t class) - { - 	struct optional_hdr o_hdr; - 	struct optional_hdr_pe32p o_hdr_pe32p; -@@ -96,7 +96,7 @@ static void write_header(FILE *f, __uint32_t entry, size_t data_size, - 		memset(&e_hdr, 0, sizeof(e_hdr)); - 		e_hdr.section_align = 4096; - 		e_hdr.file_align = 512; --		e_hdr.image_sz = hdr_sz + so_size; -+		e_hdr.image_sz = hdr_sz + so_memsz; - 		e_hdr.headers_sz = hdr_sz; - 		e_hdr.subsystem = IMAGE_SUBSYSTEM_EFI_APPLICATION; - 		e_hdr.rva_and_sizes_nr = sizeof(e_hdr.data_directory) / sizeof(__uint64_t); -@@ -119,7 +119,7 @@ static void write_header(FILE *f, __uint32_t entry, size_t data_size, - 		memset(&e_hdr_pe32p, 0, sizeof(e_hdr_pe32p)); - 		e_hdr_pe32p.section_align = 4096; - 		e_hdr_pe32p.file_align = 512; --		e_hdr_pe32p.image_sz = hdr_sz + so_size; -+		e_hdr_pe32p.image_sz = hdr_sz + so_memsz; - 		e_hdr_pe32p.headers_sz = hdr_sz; - 		e_hdr_pe32p.subsystem = IMAGE_SUBSYSTEM_EFI_APPLICATION; - 		e_hdr_pe32p.rva_and_sizes_nr = sizeof(e_hdr_pe32p.data_directory) / sizeof(__uint64_t); -@@ -157,17 +157,16 @@ static void usage(char *progname) -  - int main(int argc, char **argv) - { --	struct stat st; - 	Elf32_Ehdr e32_hdr; - 	Elf64_Ehdr e64_hdr; - 	__uint32_t entry; - 	__uint8_t class; --	__uint64_t shoff; --	__uint16_t shnum, shentsize, shstrndx; -+	__uint64_t phoff = 0; -+	__uint16_t phnum = 0, phentsize = 0; - 	unsigned char *id; - 	FILE *f_in, *f_out; - 	void *buf; --	size_t datasz, rv; -+	size_t datasz, memsz, rv; -  - 	if (argc < 3) { - 		usage(argv[0]); -@@ -180,11 +179,6 @@ int main(int argc, char **argv) - 		exit(EXIT_FAILURE); - 	} -  --	if (stat(argv[1], &st) != 0) { --		perror("stat"); --		exit(EXIT_FAILURE); --	} -- - 	f_out = fopen(argv[2], "w"); - 	if (!f_out) { - 		perror("fopen"); -@@ -194,15 +188,14 @@ int main(int argc, char **argv) - 	/* - 	 * Parse the ELF header and find the entry point. - 	 */ -- 	fread((void *)&e32_hdr, sizeof(e32_hdr), 1, f_in); -+	fread((void *)&e32_hdr, sizeof(e32_hdr), 1, f_in); - 	if (e32_hdr.e_ident[EI_CLASS] == ELFCLASS32) { - 		id = e32_hdr.e_ident; - 		class = ELFCLASS32; - 		entry = e32_hdr.e_entry; --		shoff = e32_hdr.e_shoff; --		shnum = e32_hdr.e_shnum; --		shstrndx = e32_hdr.e_shstrndx; --		shentsize = e32_hdr.e_shentsize; -+		phoff = e32_hdr.e_phoff; -+		phnum = e32_hdr.e_phnum; -+		phentsize = e32_hdr.e_phentsize; - 	} - 	else if (e32_hdr.e_ident[EI_CLASS] == ELFCLASS64) { - 		/* read the header again for x86_64  -@@ -213,10 +206,9 @@ int main(int argc, char **argv) - 		fread((void *)&e64_hdr, sizeof(e64_hdr), 1, f_in); - 		id = e64_hdr.e_ident; - 		entry = e64_hdr.e_entry; --		shoff = e64_hdr.e_shoff; --		shnum = e64_hdr.e_shnum; --		shstrndx = e64_hdr.e_shstrndx; --		shentsize = e64_hdr.e_shentsize; -+		phoff = e64_hdr.e_phoff; -+		phnum = e64_hdr.e_phnum; -+		phentsize = e64_hdr.e_phentsize; - 	} else { - 		fprintf(stderr, "Unsupported architecture\n"); - 		exit(EXIT_FAILURE); -@@ -230,98 +222,47 @@ int main(int argc, char **argv) - 		exit(EXIT_FAILURE); - 	} -  --	if (!shoff || !shnum || (shstrndx == SHN_UNDEF)) { --		fprintf(stderr, "Cannot find section table\n"); -+	if (!phoff || !phnum) { -+		fprintf(stderr, "Cannot find segment table\n"); - 		exit(EXIT_FAILURE); - 	} -  - 	/* --	 * Find the beginning of the .bss section. Everything preceding --	 * it is copied verbatim to the output file. -+	 * Find the LOAD program header. Everything in this segment -+	 * is copied verbatim to the output file. -+	 * Although there may be several LOAD program headers, only -+	 * one is currently copied. - 	 */ - 	if (e32_hdr.e_ident[EI_CLASS] == ELFCLASS32) { --		const char *shstrtab, *name; --		Elf32_Shdr shdr; -+		Elf32_Phdr phdr; - 		int i; --		void *strtab; -- --		fseek(f_in, shoff, SEEK_SET); -- --		/* First find the strtab section */ --		fseek(f_in, shstrndx * shentsize, SEEK_CUR); --		fread(&shdr, sizeof(shdr), 1, f_in); -  --		strtab = malloc(shdr.sh_size); --		if (!strtab) { --			fprintf(stderr, "Failed to malloc strtab\n"); --			exit(EXIT_FAILURE); --		} -- --		fseek(f_in, shdr.sh_offset, SEEK_SET); --		fread(strtab, shdr.sh_size, 1, f_in); -- --		/* Now search for the .bss section */ --		fseek(f_in, shoff, SEEK_SET); --		for (i = 0; i < shnum; i++) { --			rv = fread(&shdr, sizeof(shdr), 1, f_in); --			if (!rv) { --				fprintf(stderr, "Failed to read section table\n"); --				exit(EXIT_FAILURE); --			} -+		/* Find the first LOAD program header */ -+		for (i = 0; i < phnum; i++) { -+			fseek(f_in, phoff + i * phentsize, SEEK_SET); -+			fread(&phdr, sizeof(phdr), 1, f_in); -  --			name = strtab + shdr.sh_name; --			if (!strcmp(name, ".bss")) -+			if (phdr.p_type == PT_LOAD) - 				break; - 		} -  --		if (i == shnum) { --			fprintf(stderr, "Failed to find .bss section\n"); --			exit(EXIT_FAILURE); --		} -- --		datasz = shdr.sh_offset; --	} --	else if (e32_hdr.e_ident[EI_CLASS] == ELFCLASS64) { --		const char *shstrtab, *name; --		Elf64_Shdr shdr; -+		datasz = phdr.p_filesz; -+		memsz = phdr.p_memsz; -+	} else if (e32_hdr.e_ident[EI_CLASS] == ELFCLASS64) { -+		Elf64_Phdr phdr; - 		int i; --		void *strtab; -- --		fseek(f_in, shoff, SEEK_SET); -  --		/* First find the strtab section */ --		fseek(f_in, shstrndx * shentsize, SEEK_CUR); --		fread(&shdr, sizeof(shdr), 1, f_in); -- --		strtab = malloc(shdr.sh_size); --		if (!strtab) { --			fprintf(stderr, "Failed to malloc strtab\n"); --			exit(EXIT_FAILURE); --		} -+		/* Find the first LOAD program header */ -+		for (i = 0; i < phnum; i++) { -+			fseek(f_in, phoff + i * phentsize, SEEK_SET); -+			fread(&phdr, sizeof(phdr), 1, f_in); -  --		fseek(f_in, shdr.sh_offset, SEEK_SET); --		fread(strtab, shdr.sh_size, 1, f_in); -- --		/* Now search for the .bss section */ --		fseek(f_in, shoff, SEEK_SET); --		for (i = 0; i < shnum; i++) { --			rv = fread(&shdr, sizeof(shdr), 1, f_in); --			if (!rv) { --				fprintf(stderr, "Failed to read section table\n"); --				exit(EXIT_FAILURE); --			} -- --			name = strtab + shdr.sh_name; --			if (!strcmp(name, ".bss")) -+			if (phdr.p_type == PT_LOAD) - 				break; - 		} -  --		if (i == shnum) { --			fprintf(stderr, "Failed to find .bss section\n"); --			exit(EXIT_FAILURE); --		} -- --		datasz = shdr.sh_offset; -+		datasz = phdr.p_filesz; -+		memsz = phdr.p_memsz; - 	} -  - 	buf = malloc(datasz); -@@ -330,7 +271,7 @@ int main(int argc, char **argv) - 		exit(EXIT_FAILURE); - 	} -  --	write_header(f_out, entry, datasz, st.st_size, class); -+	write_header(f_out, entry, datasz, memsz, class); -  - 	/* Write out the entire ELF shared object */ - 	rewind(f_in); -@@ -341,5 +282,8 @@ int main(int argc, char **argv) - 	} -  - 	fwrite(buf, datasz, rv, f_out); -+	free(buf); -+	fclose(f_out); -+	fclose(f_in); - 	return 0; - } -diff --git a/efi/x86_64/syslinux.ld b/efi/x86_64/syslinux.ld -index 95160bd..450641c 100644 ---- a/efi/x86_64/syslinux.ld -+++ b/efi/x86_64/syslinux.ld -@@ -136,7 +136,7 @@ SECTIONS - 		*(.strtab) - 	} -  --	.bss : { -+	.bss (NOLOAD) : { - 		/* the EFI loader doesn't seem to like a .bss section, - 		   so we stick it all into .data: */ - 		__bss_start = .; -@@ -153,7 +153,7 @@ SECTIONS - 	__bss_dwords = (__bss_len + 3) >> 2; -  - 	. = ALIGN(128); --	 -+ - 	/* Very large objects which don't need to be zeroed */ -  - 	.hugebss : { diff --git a/abs/extra/syslinux/syslinux-install_update b/abs/extra/syslinux/syslinux-install_update index 3843b5f..513d06b 100644 --- a/abs/extra/syslinux/syslinux-install_update +++ b/abs/extra/syslinux/syslinux-install_update @@ -1,4 +1,4 @@ -#!/usr/bin/env bash +#!/usr/bin/bash  #  # Syslinux Installer / Updater Script (for BIOS only)  # Copyright (C) 2011-2013  Matthew Gyurgyik <pyther@pyther.net> @@ -449,5 +449,3 @@ if [[ $SET_ACTIVE ]] || [[ $MBR ]]; then  fi  exit 0 - -# vim: set et sw=4: diff --git a/abs/extra/syslinux/syslinux.cfg b/abs/extra/syslinux/syslinux.cfg index 2b77038..d7f69c2 100644 --- a/abs/extra/syslinux/syslinux.cfg +++ b/abs/extra/syslinux/syslinux.cfg @@ -19,13 +19,13 @@  # The wiki provides further configuration examples  DEFAULT arch -PROMPT 0        # Set to 1 if you always want to display the boot: prompt  +PROMPT 0        # Set to 1 if you always want to display the boot: prompt  TIMEOUT 50  # You can create syslinux keymaps with the keytab-lilo tool  #KBDMAP de.ktl  # Menu Configuration -# Either menu.c32 or vesamenu32.c32 must be copied to /boot/syslinux  +# Either menu.c32 or vesamenu32.c32 must be copied to /boot/syslinux  UI menu.c32  #UI vesamenu.c32 diff --git a/abs/extra/syslinux/syslinux.install b/abs/extra/syslinux/syslinux.install index 4bb7f85..cbc4e9e 100644 --- a/abs/extra/syslinux/syslinux.install +++ b/abs/extra/syslinux/syslinux.install @@ -1,43 +1,32 @@ -post_install() { -   +show_efi_msg() {    cat << EOF -==> For setting up Syslinux BIOS using the syslinux-install_update script follow  -    https://wiki.archlinux.org/index.php/Syslinux#Automatic_Install -EOF -   -  ## Message specific to Syslinux 4.xx (or 5.xx) to 6.xx upgrade -  if [ "$(vercmp $2 6.00)" -lt 0 ]; then -     -    cat << EOF +==> For setting up Syslinux EFI follow +    https://wiki.archlinux.org/index.php/Syslinux#UEFI_Systems -==> If you are upgrading from Syslinux 4.xx or 5.xx, please re-install -    (not update) Syslinux BIOS manually (not using the install script) once -    by following https://wiki.archlinux.org/index.php/Syslinux#Manual_install +==> The syslinux-install_update script does not currently support EFI install -==> The install script may not properly upgrade Syslinux to 6.xx version  EOF -     -  fi -   +} + +show_bios_autoupdate_msg() {    cat << EOF -==> For setting up Syslinux EFI follow -    https://wiki.archlinux.org/index.php/Syslinux#UEFI_Systems +==> For setting up Syslinux BIOS using the syslinux-install_update script follow +    https://wiki.archlinux.org/index.php/Syslinux#Automatic_Install +EOF +} -==> The syslinux-install_update script does not currently support EFI install +post_install() { +  [ -f /boot/syslinux/SYSLINUX_AUTOUPDATE ] || show_bios_autoupdate_msg +  [ -d /sys/firmware/efi ] && show_efi_msg -EOF -   +  true  }  post_upgrade() { -      ## auto-update syslinux if /boot/syslinux/SYSLINUX_AUTOUPDATE exists    /usr/bin/syslinux-install_update -s -   +    post_install -    } - -# vim:set ts=2 sw=2 et: | 
