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

objtool: Get rid of reloc->offset

Get the offset from the embedded GElf_Rel[a] struct.

With allyesconfig + CONFIG_DEBUG_INFO:

- Before: peak heap memory consumption: 43.83G
- After:  peak heap memory consumption: 42.10G

Link: https://lore.kernel.org/r/2b9ec01178baa346a99522710bf2e82159412e3a.1685464332.git.jpoimboe@kernel.org


Signed-off-by: default avatarJosh Poimboeuf <jpoimboe@kernel.org>
parent be9a4c11
Loading
Loading
Loading
Loading
+7 −7
Original line number Diff line number Diff line
@@ -511,11 +511,11 @@ static int add_pv_ops(struct objtool_file *file, const char *symname)
		if (func->type == STT_SECTION)
			func = find_symbol_by_offset(reloc->sym->sec, reloc->addend);

		idx = (reloc->offset - sym->offset) / sizeof(unsigned long);
		idx = (reloc_offset(reloc) - sym->offset) / sizeof(unsigned long);

		objtool_pv_add(file, idx, func);

		off = reloc->offset + 1;
		off = reloc_offset(reloc) + 1;
		if (off > end)
			break;
	}
@@ -1998,7 +1998,7 @@ static int add_jump_table(struct objtool_file *file, struct instruction *insn,
			break;

		/* Make sure the table entries are consecutive: */
		if (prev_offset && reloc->offset != prev_offset + 8)
		if (prev_offset && reloc_offset(reloc) != prev_offset + 8)
			break;

		/* Detect function pointers from contiguous objects: */
@@ -2023,7 +2023,7 @@ static int add_jump_table(struct objtool_file *file, struct instruction *insn,
		alt->insn = dest_insn;
		alt->next = insn->alts;
		insn->alts = alt;
		prev_offset = reloc->offset;
		prev_offset = reloc_offset(reloc);
	}

	if (!prev_offset) {
@@ -4266,8 +4266,8 @@ static int validate_ibt_insn(struct objtool_file *file, struct instruction *insn
	for (reloc = insn_reloc(file, insn);
	     reloc;
	     reloc = find_reloc_by_dest_range(file->elf, insn->sec,
					      reloc->offset + 1,
					      (insn->offset + insn->len) - (reloc->offset + 1))) {
					      reloc_offset(reloc) + 1,
					      (insn->offset + insn->len) - (reloc_offset(reloc) + 1))) {

		/*
		 * static_call_update() references the trampoline, which
@@ -4350,7 +4350,7 @@ static int validate_ibt_data_reloc(struct objtool_file *file,
		return 0;

	WARN_FUNC("data relocation to !ENDBR: %s",
		  reloc->sec->base, reloc->offset,
		  reloc->sec->base, reloc_offset(reloc),
		  offstr(dest->sec, dest->offset));

	return 1;
+5 −5
Original line number Diff line number Diff line
@@ -246,8 +246,9 @@ struct reloc *find_reloc_by_dest_range(const struct elf *elf, struct section *se
			if (reloc->sec != rsec)
				continue;

			if (reloc->offset >= offset && reloc->offset < offset + len) {
				if (!r || reloc->offset < r->offset)
			if (reloc_offset(reloc) >= offset &&
			    reloc_offset(reloc) < offset + len) {
				if (!r || reloc_offset(reloc) < reloc_offset(r))
					r = reloc;
			}
		}
@@ -830,11 +831,12 @@ static struct reloc *elf_init_reloc(struct elf *elf, struct section *rsec,
	}

	reloc->sec = rsec;
	reloc->offset = offset;
	reloc->type = type;
	reloc->sym = sym;
	reloc->addend = addend;

	reloc->rel.r_offset = offset;

	if (elf_write_reloc(elf, reloc))
		return NULL;

@@ -908,7 +910,6 @@ static int read_reloc(struct section *rsec, int i, struct reloc *reloc)
		return -1;
	}

	reloc->offset = reloc->rel.r_offset;
	reloc->type = GELF_R_TYPE(reloc->rel.r_info);
	reloc->addend = rela ? reloc->rela.r_addend : 0;

@@ -1230,7 +1231,6 @@ int elf_write_reloc(struct elf *elf, struct reloc *reloc)
	struct section *rsec = reloc->sec;
	int ret;

	reloc->rel.r_offset = reloc->offset;
	reloc->rel.r_info = GELF_R_INFO(reloc->sym->idx, reloc->type);

	if (rsec->sh.sh_type == SHT_RELA) {
+6 −2
Original line number Diff line number Diff line
@@ -75,7 +75,6 @@ struct reloc {
	struct section *sec;
	struct symbol *sym;
	struct list_head sym_reloc_entry;
	unsigned long offset;
	s64 addend;
	unsigned int type;
	bool jump_table_start;
@@ -204,6 +203,11 @@ static inline unsigned int reloc_idx(struct reloc *reloc)
	return reloc - reloc->sec->relocs;
}

static inline unsigned long reloc_offset(struct reloc *reloc)
{
	return reloc->rel.r_offset;
}

#define for_each_sec(file, sec)						\
	list_for_each_entry(sec, &file->elf->sections, list)

@@ -253,7 +257,7 @@ static inline u32 sec_offset_hash(struct section *sec, unsigned long offset)

static inline u32 reloc_hash(struct reloc *reloc)
{
	return sec_offset_hash(reloc->sec, reloc->offset);
	return sec_offset_hash(reloc->sec, reloc_offset(reloc));
}

#endif /* _OBJTOOL_ELF_H */