mirror of
https://github.com/dynup/kpatch
synced 2025-05-03 08:27:57 +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);
|
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 bug_table_group_size(struct kpatch_elf *kelf, int offset)
|
||||||
{
|
{
|
||||||
static int size = 0;
|
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 {
|
struct arguments {
|
||||||
char *args[4];
|
char *args[4];
|
||||||
int debug;
|
int debug;
|
||||||
|
@ -671,6 +671,58 @@ struct section *create_section_pair(struct kpatch_elf *kelf, char *name,
|
|||||||
return sec;
|
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)
|
void kpatch_write_output_elf(struct kpatch_elf *kelf, Elf *elf, char *outfile)
|
||||||
{
|
{
|
||||||
int fd;
|
int fd;
|
||||||
|
@ -150,6 +150,8 @@ void kpatch_create_strtab(struct kpatch_elf *kelf);
|
|||||||
void kpatch_create_symtab(struct kpatch_elf *kelf);
|
void kpatch_create_symtab(struct kpatch_elf *kelf);
|
||||||
struct section *create_section_pair(struct kpatch_elf *kelf, char *name,
|
struct section *create_section_pair(struct kpatch_elf *kelf, char *name,
|
||||||
int entsize, int nr);
|
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_write_output_elf(struct kpatch_elf *kelf, Elf *elf, char *outfile);
|
||||||
void kpatch_elf_teardown(struct kpatch_elf *kelf);
|
void kpatch_elf_teardown(struct kpatch_elf *kelf);
|
||||||
void kpatch_elf_free(struct kpatch_elf *kelf);
|
void kpatch_elf_free(struct kpatch_elf *kelf);
|
||||||
|
Loading…
Reference in New Issue
Block a user