mirror of
https://github.com/dynup/kpatch
synced 2025-02-20 03:36:52 +00:00
kpatch-elf: add kpatch_reindex_elements() and kpatch_rebuild_rela_section_data()
Move functions kpatch_reindex_elements() and kpatch_rebuild_rela_section_data() from create-diff-object.c to kpatch-elf.c. These functions will be used to rebuild kpatch elf data in create-klp-module and create-kpatch-module, i.e. during the second "phase" of kpatch-build.
This commit is contained in:
parent
6e43062409
commit
2c3c44fec2
@ -1311,26 +1311,6 @@ static void kpatch_reorder_symbols(struct kpatch_elf *kelf)
|
||||
list_replace(&symbols, &kelf->symbols);
|
||||
}
|
||||
|
||||
static void kpatch_reindex_elements(struct kpatch_elf *kelf)
|
||||
{
|
||||
struct section *sec;
|
||||
struct symbol *sym;
|
||||
int index;
|
||||
|
||||
index = 1; /* elf write function handles NULL section 0 */
|
||||
list_for_each_entry(sec, &kelf->sections, list)
|
||||
sec->index = index++;
|
||||
|
||||
index = 0;
|
||||
list_for_each_entry(sym, &kelf->symbols, list) {
|
||||
sym->index = index++;
|
||||
if (sym->sec)
|
||||
sym->sym.st_shndx = sym->sec->index;
|
||||
else if (sym->sym.st_shndx != SHN_ABS)
|
||||
sym->sym.st_shndx = SHN_UNDEF;
|
||||
}
|
||||
}
|
||||
|
||||
static int bug_table_group_size(struct kpatch_elf *kelf, int offset)
|
||||
{
|
||||
static int size = 0;
|
||||
@ -2265,38 +2245,6 @@ static void kpatch_build_strings_section_data(struct kpatch_elf *kelf)
|
||||
}
|
||||
}
|
||||
|
||||
static void kpatch_rebuild_rela_section_data(struct section *sec)
|
||||
{
|
||||
struct rela *rela;
|
||||
int nr = 0, index = 0, size;
|
||||
GElf_Rela *relas;
|
||||
|
||||
list_for_each_entry(rela, &sec->relas, list)
|
||||
nr++;
|
||||
|
||||
size = nr * sizeof(*relas);
|
||||
relas = malloc(size);
|
||||
if (!relas)
|
||||
ERROR("malloc");
|
||||
|
||||
sec->data->d_buf = relas;
|
||||
sec->data->d_size = size;
|
||||
/* d_type remains ELF_T_RELA */
|
||||
|
||||
sec->sh.sh_size = size;
|
||||
|
||||
list_for_each_entry(rela, &sec->relas, list) {
|
||||
relas[index].r_offset = rela->offset;
|
||||
relas[index].r_addend = rela->addend;
|
||||
relas[index].r_info = GELF_R_INFO(rela->sym->index, rela->type);
|
||||
index++;
|
||||
}
|
||||
|
||||
/* sanity check, index should equal nr */
|
||||
if (index != nr)
|
||||
ERROR("size mismatch in rebuilt rela section");
|
||||
}
|
||||
|
||||
struct arguments {
|
||||
char *args[4];
|
||||
int debug;
|
||||
|
@ -671,6 +671,58 @@ struct section *create_section_pair(struct kpatch_elf *kelf, char *name,
|
||||
return sec;
|
||||
}
|
||||
|
||||
void kpatch_reindex_elements(struct kpatch_elf *kelf)
|
||||
{
|
||||
struct section *sec;
|
||||
struct symbol *sym;
|
||||
int index;
|
||||
|
||||
index = 1; /* elf write function handles NULL section 0 */
|
||||
list_for_each_entry(sec, &kelf->sections, list)
|
||||
sec->index = index++;
|
||||
|
||||
index = 0;
|
||||
list_for_each_entry(sym, &kelf->symbols, list) {
|
||||
sym->index = index++;
|
||||
if (sym->sec)
|
||||
sym->sym.st_shndx = sym->sec->index;
|
||||
else if (sym->sym.st_shndx != SHN_ABS)
|
||||
sym->sym.st_shndx = SHN_UNDEF;
|
||||
}
|
||||
}
|
||||
|
||||
void kpatch_rebuild_rela_section_data(struct section *sec)
|
||||
{
|
||||
struct rela *rela;
|
||||
int nr = 0, index = 0, size;
|
||||
GElf_Rela *relas;
|
||||
|
||||
list_for_each_entry(rela, &sec->relas, list)
|
||||
nr++;
|
||||
|
||||
size = nr * sizeof(*relas);
|
||||
relas = malloc(size);
|
||||
if (!relas)
|
||||
ERROR("malloc");
|
||||
|
||||
sec->data->d_buf = relas;
|
||||
sec->data->d_size = size;
|
||||
/* d_type remains ELF_T_RELA */
|
||||
|
||||
sec->sh.sh_size = size;
|
||||
|
||||
list_for_each_entry(rela, &sec->relas, list) {
|
||||
relas[index].r_offset = rela->offset;
|
||||
relas[index].r_addend = rela->addend;
|
||||
relas[index].r_info = GELF_R_INFO(rela->sym->index, rela->type);
|
||||
index++;
|
||||
}
|
||||
|
||||
/* sanity check, index should equal nr */
|
||||
if (index != nr)
|
||||
ERROR("size mismatch in rebuilt rela section");
|
||||
}
|
||||
|
||||
void kpatch_write_output_elf(struct kpatch_elf *kelf, Elf *elf, char *outfile)
|
||||
{
|
||||
int fd;
|
||||
|
@ -150,6 +150,8 @@ void kpatch_create_strtab(struct kpatch_elf *kelf);
|
||||
void kpatch_create_symtab(struct kpatch_elf *kelf);
|
||||
struct section *create_section_pair(struct kpatch_elf *kelf, char *name,
|
||||
int entsize, int nr);
|
||||
void kpatch_reindex_elements(struct kpatch_elf *kelf);
|
||||
void kpatch_rebuild_rela_section_data(struct section *sec);
|
||||
void kpatch_write_output_elf(struct kpatch_elf *kelf, Elf *elf, char *outfile);
|
||||
void kpatch_elf_teardown(struct kpatch_elf *kelf);
|
||||
void kpatch_elf_free(struct kpatch_elf *kelf);
|
||||
|
Loading…
Reference in New Issue
Block a user