summaryrefslogtreecommitdiffstats
path: root/tools/elf2efi.py
diff options
context:
space:
mode:
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2024-03-14 10:33:11 +0100
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2024-03-22 15:42:57 +0100
commit6d03e5523cc26a4f4cecf277788ae62bba44f88e (patch)
treec2423c66e8501bb211b66fb38cd1613d67e7eb26 /tools/elf2efi.py
parenttools/elf2efi: rework exception messages (diff)
downloadsystemd-6d03e5523cc26a4f4cecf277788ae62bba44f88e.tar.xz
systemd-6d03e5523cc26a4f4cecf277788ae62bba44f88e.zip
tools/elf2efi: skip empty .got section and its .relro_padding
Resolves https://github.com/systemd/systemd/issues/31637. lld-18 does the section setup differently than older versions. There is a bunch of ordering chagnes, but it also inserts the following: Sections: Idx Name Size VMA LMA File off Algn ... 9 .got 00000000 00000000000283c0 00000000000283c0 000283c0 2**3 CONTENTS, ALLOC, LOAD, DATA 10 .relro_padding 00000c40 00000000000283c0 00000000000283c0 000283c0 2**0 ALLOC 11 .data 00000024 00000000000293c0 00000000000293c0 000283c0 2**4 CONTENTS, ALLOC, LOAD, DATA ... This causes a problem for us, because we try to map the .got to .rodata, and the subsequent .data to .data, and round down the VMA to the nearest page, which causes the PE sections to overlap. https://github.com/llvm/llvm-project/pull/66042 adds .relro_padding to make sure that the RELRO segment is properly write protected and allocated. For our binaries, the .got section is empty, so we can skip it safely, and the .relro_padding section is not useful once .got has been dropped. We don't expect .got sections, but they are apparently inserted on i386 and aarch64 builds. Emit a warning until we figure out why they are there.
Diffstat (limited to 'tools/elf2efi.py')
-rwxr-xr-xtools/elf2efi.py6
1 files changed, 6 insertions, 0 deletions
diff --git a/tools/elf2efi.py b/tools/elf2efi.py
index a37c5246bd..2e7ca9f6c4 100755
--- a/tools/elf2efi.py
+++ b/tools/elf2efi.py
@@ -26,6 +26,7 @@ import hashlib
import io
import os
import pathlib
+import sys
import time
import typing
from ctypes import (
@@ -212,6 +213,7 @@ IGNORE_SECTIONS = [
".eh_frame",
".eh_frame_hdr",
".ARM.exidx",
+ ".relro_padding",
]
IGNORE_SECTION_TYPES = [
@@ -274,10 +276,14 @@ def iter_copy_sections(elf: ELFFile) -> typing.Iterator[PeSection]:
elf_s["sh_flags"] & SH_FLAGS.SHF_ALLOC == 0
or elf_s["sh_type"] in IGNORE_SECTION_TYPES
or elf_s.name in IGNORE_SECTIONS
+ or elf_s["sh_size"] == 0
):
continue
if elf_s["sh_type"] not in ["SHT_PROGBITS", "SHT_NOBITS"]:
raise BadSectionError(f"Unknown section {elf_s.name} with type {elf_s['sh_type']}")
+ if elf_s.name == '.got':
+ # FIXME: figure out why those sections are inserted
+ print("WARNING: Non-empty .got section", file=sys.stderr)
if elf_s["sh_flags"] & SH_FLAGS.SHF_EXECINSTR:
rwx = PE_CHARACTERISTICS_RX