diff --git a/kpatch-build/create-diff-object.c b/kpatch-build/create-diff-object.c index 360441111..1967bd804 100644 --- a/kpatch-build/create-diff-object.c +++ b/kpatch-build/create-diff-object.c @@ -2719,7 +2719,9 @@ static void kpatch_mark_ignored_sections(struct kpatch_elf *kelf) /* Ignore any discarded sections */ list_for_each_entry(sec, &kelf->sections, list) { if (!strncmp(sec->name, ".discard", 8) || - !strncmp(sec->name, ".rela.discard", 13)) + !strncmp(sec->name, ".rela.discard", 13) || + !strncmp(sec->name, ".llvm_addrsig", 13) || + !strncmp(sec->name, ".llvm.", 6)) sec->ignore = 1; } diff --git a/kpatch-build/kpatch-elf.c b/kpatch-build/kpatch-elf.c index 58dbe1a1f..c7d12ec93 100644 --- a/kpatch-build/kpatch-elf.c +++ b/kpatch-build/kpatch-elf.c @@ -607,7 +607,7 @@ void kpatch_create_shstrtab(struct kpatch_elf *kelf) shstrtab = find_section_by_name(&kelf->sections, ".shstrtab"); if (!shstrtab) - ERROR("find_section_by_name"); + return; /* determine size of string table */ size = 1; /* for initial NULL terminator */ @@ -648,7 +648,7 @@ void kpatch_create_shstrtab(struct kpatch_elf *kelf) void kpatch_create_strtab(struct kpatch_elf *kelf) { - struct section *strtab; + struct section *strtab, *shstrtab; struct symbol *sym; size_t size = 0, offset = 0, len; char *buf; @@ -657,6 +657,8 @@ void kpatch_create_strtab(struct kpatch_elf *kelf) if (!strtab) ERROR("find_section_by_name"); + shstrtab = find_section_by_name(&kelf->sections, ".shstrtab"); + /* determine size of string table */ list_for_each_entry(sym, &kelf->symbols, list) { if (sym->type == STT_SECTION) @@ -664,6 +666,15 @@ void kpatch_create_strtab(struct kpatch_elf *kelf) size += strlen(sym->name) + 1; /* include NULL terminator */ } + /* and when covering for missing .shstrtab ... */ + if (!shstrtab) { + /* factor out into common (sh)strtab feeder */ + struct section *sec; + + list_for_each_entry(sec, &kelf->sections, list) + size += strlen(sec->name) + 1; /* include NULL terminator */ + } + /* allocate data buffer */ buf = malloc(size); if (!buf) @@ -682,8 +693,20 @@ void kpatch_create_strtab(struct kpatch_elf *kelf) offset += len; } + if (!shstrtab) { + struct section *sec; + + /* populate string table and link with section header */ + list_for_each_entry(sec, &kelf->sections, list) { + len = strlen(sec->name) + 1; + sec->sh.sh_name = (unsigned int)offset; + memcpy(buf + offset, sec->name, len); + offset += len; + } + } + if (offset != size) - ERROR("shstrtab size mismatch"); + ERROR("strtab size mismatch"); strtab->data->d_buf = buf; strtab->data->d_size = size; @@ -928,7 +951,9 @@ void kpatch_write_output_elf(struct kpatch_elf *kelf, Elf *elf, char *outfile, shstrtab = find_section_by_name(&kelf->sections, ".shstrtab"); if (!shstrtab) - ERROR("missing .shstrtab section"); + shstrtab = find_section_by_name(&kelf->sections, ".strtab"); + if (!shstrtab) + ERROR("missing .shstrtab, .strtab sections"); ehout.e_shstrndx = (unsigned short)shstrtab->index;