systemd: fix efi stubs

Before the patch:

| $ objdump -h deploy/images/intel-corei7-64/linuxx64.efi.stub
| objdump: deploy/images/intel-corei7-64/linuxx64.efi.stub (.reloc): section flag STYP_GROUP (0x4) ignored
| objdump: deploy/images/intel-corei7-64/linuxx64.efi.stub (.reloc): section flag STYP_GROUP (0x4) ignored
| objdump: deploy/images/intel-corei7-64/linuxx64.efi.stub: file format not recognized

After the patch:

| $objdump -h deploy/images/intel-corei7-64/linuxx64.efi.stub
|
| deploy/images/intel-corei7-64/linuxx64.efi.stub:     file format pei-x86-64
|
| Sections:
| Idx Name          Size      VMA               LMA               File off  Algn
|   0 .text         0000f99f  000000014df91000  000000014df91000  00000400  2**4
|                   CONTENTS, ALLOC, LOAD, READONLY, CODE
|   1 .rodata       00002c40  000000014dfa1000  000000014dfa1000  0000fe00  2**2
|                   CONTENTS, ALLOC, LOAD, READONLY, DATA
|   2 .data         000002d8  000000014dfa4000  000000014dfa4000  00012c00  2**4
|                   CONTENTS, ALLOC, LOAD, DATA
|   3 .sdmagic      00000032  000000014dfa5000  000000014dfa5000  00013000  2**2
|                   CONTENTS, ALLOC, LOAD, READONLY, DATA
|   4 .reloc        00000080  000000014dfa6000  000000014dfa6000  00013200  2**2
|                   CONTENTS, ALLOC, LOAD, READONLY, DATA

(From OE-Core rev: 2d4a5305c8b7a5fb15086a86dfdc64630c686602)

Signed-off-by: Jose Quaresma <jose.quaresma@foundries.io>
Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
Jose Quaresma
2023-08-08 16:08:28 +00:00
committed by Richard Purdie
parent 1bdcd76d29
commit c558fddff7
2 changed files with 71 additions and 0 deletions

View File

@@ -17,6 +17,7 @@ LIC_FILES_CHKSUM = "file://LICENSE.GPL2;md5=751419260aa954499f7abaabaa882bbe \
SRCREV = "994c7978608a0bd9b317f4f74ff266dd50a3e74e"
SRCBRANCH = "v254-stable"
SRC_URI = "git://github.com/systemd/systemd-stable.git;protocol=https;branch=${SRCBRANCH} \
file://0001-elf2efi-Fix-header-size-calculation.patch \
"
S = "${WORKDIR}/git"

View File

@@ -0,0 +1,70 @@
From d082d6502fa86e08dda858933838dde0406b824f Mon Sep 17 00:00:00 2001
From: Jan Janssen <medhefgo@web.de>
Date: Sun, 30 Jul 2023 20:59:04 +0200
Subject: [PATCH] elf2efi: Fix header size calculation
The PE header size calculation failed to take the PE magic and coff
header size into account, which will lead to header truncation if we are
writing only 5 sections.
Upstream-Status: Backport [https://github.com/systemd/systemd/commit/ee91e06a5841c30bc7306260528ef407e0ebbab3]
Signed-off-by: Jose Quaresma <jose.quaresma@foundries.io>
---
tools/elf2efi.py | 12 ++++++++++--
1 file changed, 10 insertions(+), 2 deletions(-)
diff --git a/tools/elf2efi.py b/tools/elf2efi.py
index e233c8e3ab..2e478940f5 100755
--- a/tools/elf2efi.py
+++ b/tools/elf2efi.py
@@ -210,6 +210,7 @@ FILE_ALIGNMENT = 512
# Nobody cares about DOS headers, so put the PE header right after.
PE_OFFSET = 64
+PE_MAGIC = b"PE\0\0"
def align_to(x: int, align: int) -> int:
@@ -304,7 +305,10 @@ def copy_sections(elf: ELFFile, opt: PeOptionalHeader) -> typing.List[PeSection]
def apply_elf_relative_relocation(
- reloc: ElfRelocation, image_base: int, sections: typing.List[PeSection], addend_size: int
+ reloc: ElfRelocation,
+ image_base: int,
+ sections: typing.List[PeSection],
+ addend_size: int,
):
# fmt: off
[target] = [
@@ -439,7 +443,7 @@ def write_pe(
file.seek(0x3C, io.SEEK_SET)
file.write(PE_OFFSET.to_bytes(2, byteorder="little"))
file.seek(PE_OFFSET, io.SEEK_SET)
- file.write(b"PE\0\0")
+ file.write(PE_MAGIC)
file.write(coff)
file.write(opt)
@@ -453,6 +457,8 @@ def write_pe(
file.write(pe_s)
offset = align_to(offset + len(pe_s.data), FILE_ALIGNMENT)
+ assert file.tell() <= opt.SizeOfHeaders
+
for pe_s in sections:
file.seek(pe_s.PointerToRawData, io.SEEK_SET)
file.write(pe_s.data)
@@ -515,6 +521,8 @@ def elf2efi(args: argparse.Namespace):
opt.SizeOfHeaders = align_to(
PE_OFFSET
+ + len(PE_MAGIC)
+ + sizeof(PeCoffHeader)
+ coff.SizeOfOptionalHeader
+ sizeof(PeSection) * max(coff.NumberOfSections, args.minimum_sections),
FILE_ALIGNMENT,
--
2.34.1