d1c008
From 3112397f3b7b59f8e9089143965d889165c16d13 Mon Sep 17 00:00:00 2001
d1c008
From: Josh Poimboeuf <jpoimboe@redhat.com>
d1c008
Date: Mon, 6 Jun 2022 17:05:41 -0700
d1c008
Subject: [PATCH] create-diff-object: Create missing section symbol
d1c008
d1c008
Recent toolchains only create a section symbol if it's needed, i.e. if
d1c008
there's a reference to it.  If there's a missing section symbol in
d1c008
kpatch_create_intermediate_sections(), create one instead of erroring
d1c008
out.
d1c008
d1c008
Fixes #1272.
d1c008
d1c008
Signed-off-by: Josh Poimboeuf <jpoimboe@redhat.com>
d1c008
---
d1c008
 kpatch-build/create-diff-object.c | 21 ++++++++++++++++-----
d1c008
 1 file changed, 16 insertions(+), 5 deletions(-)
d1c008
d1c008
diff --git a/kpatch-build/create-diff-object.c b/kpatch-build/create-diff-object.c
d1c008
index 319ed68d..420d55d8 100644
d1c008
--- a/kpatch-build/create-diff-object.c
d1c008
+++ b/kpatch-build/create-diff-object.c
d1c008
@@ -3397,12 +3397,23 @@ static void kpatch_create_intermediate_sections(struct kpatch_elf *kelf,
d1c008
 
d1c008
 			/* add rela to fill in krelas[index].dest field */
d1c008
 			ALLOC_LINK(rela2, &krela_sec->rela->relas);
d1c008
-			if (sec->base->secsym)
d1c008
-				rela2->sym = sec->base->secsym;
d1c008
-			else
d1c008
-				ERROR("can't create dynrela for section %s (symbol %s): no bundled or section symbol",
d1c008
-				      sec->name, rela->sym->name);
d1c008
+			if (!sec->base->secsym) {
d1c008
+				struct symbol *sym;
d1c008
 
d1c008
+				/*
d1c008
+				 * Newer toolchains are stingy with their
d1c008
+				 * section symbols, create one if it doesn't
d1c008
+				 * exist already.
d1c008
+				 */
d1c008
+				ALLOC_LINK(sym, &kelf->symbols);
d1c008
+				sym->sec = sec->base;
d1c008
+				sym->sym.st_info = GELF_ST_INFO(STB_LOCAL, STT_SECTION);
d1c008
+				sym->type = STT_SECTION;
d1c008
+				sym->bind = STB_LOCAL;
d1c008
+				sym->name = sec->base->name;
d1c008
+				sec->base->secsym = sym;
d1c008
+			}
d1c008
+			rela2->sym = sec->base->secsym;
d1c008
 			rela2->type = absolute_rela_type(kelf);
d1c008
 			rela2->addend = rela->offset;
d1c008
 			rela2->offset = (unsigned int)(index * sizeof(*krelas) + \