1
0
mirror of https://github.com/dynup/kpatch synced 2025-05-13 05:17:58 +00:00

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: 

Signed-off-by: Artem Savkov <asavkov@redhat.com>
This commit is contained in:
Artem Savkov 2021-06-18 10:59:26 +02:00
parent 59aabd154e
commit 5622e3cc3d

View File

@ -1282,6 +1282,7 @@ static void kpatch_correlate_static_local_variables(struct kpatch_elf *base,
if (bundled && sym->sec->twin) { if (bundled && sym->sec->twin) {
UNCORRELATE_ELEMENT(sym->sec); UNCORRELATE_ELEMENT(sym->sec);
if (sym->sec->secsym)
UNCORRELATE_ELEMENT(sym->sec->secsym); UNCORRELATE_ELEMENT(sym->sec->secsym);
if (sym->sec->rela) if (sym->sec->rela)
@ -1785,7 +1786,7 @@ static int kpatch_include_callback_elements(struct kpatch_elf *kelf)
sym = rela->sym; sym = rela->sym;
log_normal("found callback: %s\n",sym->name); log_normal("found callback: %s\n",sym->name);
kpatch_include_symbol(sym); kpatch_include_symbol(sym);
} else { } else if (sec->secsym) {
sec->secsym->include = 1; sec->secsym->include = 1;
} }
} }
@ -1813,6 +1814,7 @@ static void kpatch_include_force_elements(struct kpatch_elf *kelf)
sec->include = 1; sec->include = 1;
if (!is_rela_section(sec)) { if (!is_rela_section(sec)) {
/* .kpatch.force */ /* .kpatch.force */
if (sec->secsym)
sec->secsym->include = 1; sec->secsym->include = 1;
continue; continue;
} }
@ -2431,6 +2433,7 @@ static void kpatch_regenerate_special_section(struct kpatch_elf *kelf,
sec->include = 1; sec->include = 1;
sec->base->include = 1; sec->base->include = 1;
/* include secsym so .kpatch.arch relas can point to section symbols */ /* include secsym so .kpatch.arch relas can point to section symbols */
if (sec->base->secsym)
sec->base->secsym->include = 1; sec->base->secsym->include = 1;
/* /*
@ -2614,7 +2617,9 @@ static void kpatch_mark_ignored_sections(struct kpatch_elf *kelf)
* from the section data comparison, but this is a simpler way. * from the section data comparison, but this is a simpler way.
*/ */
strsec->include = 1; strsec->include = 1;
if (strsec->secsym)
strsec->secsym->include = 1; strsec->secsym->include = 1;
name = strsec->data->d_buf + rela->addend; name = strsec->data->d_buf + rela->addend;
ignoresec = find_section_by_name(&kelf->sections, name); ignoresec = find_section_by_name(&kelf->sections, name);
if (!ignoresec) if (!ignoresec)