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