Commit e0a9349b authored by Josh Poimboeuf's avatar Josh Poimboeuf
Browse files

objtool: Allocate relocs in advance for new rela sections

Similar to read_relocs(), allocate the reloc structs all together in an
array rather than allocating them one at a time.

Link: https://lore.kernel.org/r/5332d845c5a2d6c2d052075b381bfba8bcb67ed5.1685464332.git.jpoimboe@kernel.org


Signed-off-by: default avatarJosh Poimboeuf <jpoimboe@kernel.org>
parent caa4a6b7
Loading
Loading
Loading
Loading
+13 −5
Original line number Diff line number Diff line
@@ -814,7 +814,7 @@ static struct reloc *elf_init_reloc(struct elf *elf, struct section *rsec,
				    unsigned long offset, struct symbol *sym,
				    s64 addend, unsigned int type)
{
	struct reloc *reloc;
	struct reloc *reloc, empty = { 0 };

	if (reloc_idx >= rsec->sh.sh_size / elf_rela_size(elf)) {
		WARN("%s: bad reloc_idx %u for %s with size 0x%lx",
@@ -822,12 +822,13 @@ static struct reloc *elf_init_reloc(struct elf *elf, struct section *rsec,
		return NULL;
	}

	reloc = malloc(sizeof(*reloc));
	if (!reloc) {
		perror("malloc");
	reloc = &rsec->reloc_data[reloc_idx];

	if (memcmp(reloc, &empty, sizeof(empty))) {
		WARN("%s: %s: reloc %d already initialized!",
		     __func__, rsec->name, reloc_idx);
		return NULL;
	}
	memset(reloc, 0, sizeof(*reloc));

	reloc->idx = reloc_idx;
	reloc->sec = rsec;
@@ -1185,6 +1186,13 @@ static struct section *elf_create_rela_section(struct elf *elf,
	rsec->sh.sh_info = sec->idx;
	rsec->sh.sh_flags = SHF_INFO_LINK;

	rsec->reloc_data = calloc(rsec->sh.sh_size / rsec->sh.sh_entsize,
				  sizeof(struct reloc));
	if (!rsec->reloc_data) {
		perror("calloc");
		return NULL;
	}

	sec->rsec = rsec;
	rsec->base = sec;