mirror of https://github.com/dynup/kpatch
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 <jpoimboe@redhat.com>
This commit is contained in:
parent
e425e653aa
commit
a1171b112e
|
@ -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) + \
|
||||
|
|
|
@ -1 +1 @@
|
|||
Subproject commit 94d00075b71e087b73c46d6a1bfdfe910ee62636
|
||||
Subproject commit d9491d9ea422f317573938ee6c2f57ce2f12f786
|
Loading…
Reference in New Issue