Blob Blame History Raw
From c1a07a5329c0b7db0ec54eea093e5d2d77735c06 Mon Sep 17 00:00:00 2001
From: Joe Lawrence <joe.lawrence@redhat.com>
Date: Fri, 9 Dec 2022 15:37:49 -0500
Subject: [PATCH] v0.9.2 backport: MR!1200 ("Make sure section symbols exist")
Content-type: text/plain

commit 5622e3cc3d393fd77866b9838d16cd064de6fba5
Author: Artem Savkov <asavkov@redhat.com>
Date:   Fri Jun 18 10:59:26 2021 +0200

    Make sure section symbols exist

    Binutils recently became much more aggressive about removing unused
    section symbols. Since we can not rely on those being available anymore
    add additional checks before using them.

    Fixes: #1193

    Signed-off-by: Artem Savkov <asavkov@redhat.com>

Fixes: KLP-216 ("Backport kpatch-build section symbol check")
Signed-off-by: Joe Lawrence <joe.lawrence@redhat.com>
---
 kpatch-build/create-diff-object.c | 15 ++++++++++-----
 1 file changed, 10 insertions(+), 5 deletions(-)

diff --git a/kpatch-build/create-diff-object.c b/kpatch-build/create-diff-object.c
index c9afe33bbdae..94879b5fce6a 100644
--- a/kpatch-build/create-diff-object.c
+++ b/kpatch-build/create-diff-object.c
@@ -1241,7 +1241,8 @@ static void kpatch_correlate_static_local_variables(struct kpatch_elf *base,
 		if (bundled && sym->sec->twin) {
 			UNCORRELATE_ELEMENT(sym->sec);
 
-			UNCORRELATE_ELEMENT(sym->sec->secsym);
+			if (sym->sec->secsym)
+				UNCORRELATE_ELEMENT(sym->sec->secsym);
 
 			if (sym->sec->rela)
 				UNCORRELATE_ELEMENT(sym->sec->rela);
@@ -1744,7 +1745,7 @@ static int kpatch_include_callback_elements(struct kpatch_elf *kelf)
 			sym = rela->sym;
 			log_normal("found callback: %s\n",sym->name);
 			kpatch_include_symbol(sym);
-		} else {
+		} else if (sec->secsym) {
 			sec->secsym->include = 1;
 		}
 	}
@@ -1772,7 +1773,8 @@ static void kpatch_include_force_elements(struct kpatch_elf *kelf)
 			sec->include = 1;
 			if (!is_rela_section(sec)) {
 				/* .kpatch.force */
-				sec->secsym->include = 1;
+				if (sec->secsym)
+					sec->secsym->include = 1;
 				continue;
 			}
 			/* .rela.kpatch.force */
@@ -2381,7 +2383,8 @@ static void kpatch_regenerate_special_section(struct kpatch_elf *kelf,
 	sec->include = 1;
 	sec->base->include = 1;
 	/* include secsym so .kpatch.arch relas can point to section symbols */
-	sec->base->secsym->include = 1;
+	if (sec->base->secsym)
+		sec->base->secsym->include = 1;
 
 	/*
 	 * Update text section data buf and size.
@@ -2564,7 +2567,9 @@ static void kpatch_mark_ignored_sections(struct kpatch_elf *kelf)
 		 * from the section data comparison, but this is a simpler way.
 		 */
 		strsec->include = 1;
-		strsec->secsym->include = 1;
+		if (strsec->secsym)
+			strsec->secsym->include = 1;
+
 		name = strsec->data->d_buf + rela->addend;
 		ignoresec = find_section_by_name(&kelf->sections, name);
 		if (!ignoresec)
-- 
2.38.1