objtool: Create reloc sections implicitly
commit d0c5c4cc73da0b05b0d9e5f833f2d859e1b45f8e upstream. Have elf_add_reloc() create the relocation section implicitly. Suggested-by: Josh Poimboeuf <jpoimboe@redhat.com> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Signed-off-by: Borislav Petkov <bp@suse.de> Signed-off-by: Ingo Molnar <mingo@kernel.org> Reviewed-by: Miroslav Benes <mbenes@suse.cz> Link: https://lkml.kernel.org/r/20210326151259.880174448@infradead.org [bwh: Backported to 5.10: drop changes in create_mcount_loc_sections()] Signed-off-by: Ben Hutchings <ben@decadent.org.uk> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:

committed by
Greg Kroah-Hartman

parent
fcdb7926d3
commit
b37c439250
@@ -459,9 +459,6 @@ static int create_static_call_sections(struct objtool_file *file)
|
|||||||
if (!sec)
|
if (!sec)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if (!elf_create_reloc_section(file->elf, sec, SHT_RELA))
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
idx = 0;
|
idx = 0;
|
||||||
list_for_each_entry(insn, &file->static_call_list, static_call_node) {
|
list_for_each_entry(insn, &file->static_call_list, static_call_node) {
|
||||||
|
|
||||||
|
@@ -498,11 +498,18 @@ err:
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static struct section *elf_create_reloc_section(struct elf *elf,
|
||||||
|
struct section *base,
|
||||||
|
int reltype);
|
||||||
|
|
||||||
int elf_add_reloc(struct elf *elf, struct section *sec, unsigned long offset,
|
int elf_add_reloc(struct elf *elf, struct section *sec, unsigned long offset,
|
||||||
unsigned int type, struct symbol *sym, int addend)
|
unsigned int type, struct symbol *sym, int addend)
|
||||||
{
|
{
|
||||||
struct reloc *reloc;
|
struct reloc *reloc;
|
||||||
|
|
||||||
|
if (!sec->reloc && !elf_create_reloc_section(elf, sec, SHT_RELA))
|
||||||
|
return -1;
|
||||||
|
|
||||||
reloc = malloc(sizeof(*reloc));
|
reloc = malloc(sizeof(*reloc));
|
||||||
if (!reloc) {
|
if (!reloc) {
|
||||||
perror("malloc");
|
perror("malloc");
|
||||||
@@ -880,7 +887,7 @@ static struct section *elf_create_rela_reloc_section(struct elf *elf, struct sec
|
|||||||
return sec;
|
return sec;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct section *elf_create_reloc_section(struct elf *elf,
|
static struct section *elf_create_reloc_section(struct elf *elf,
|
||||||
struct section *base,
|
struct section *base,
|
||||||
int reltype)
|
int reltype)
|
||||||
{
|
{
|
||||||
|
@@ -122,7 +122,6 @@ static inline u32 reloc_hash(struct reloc *reloc)
|
|||||||
|
|
||||||
struct elf *elf_open_read(const char *name, int flags);
|
struct elf *elf_open_read(const char *name, int flags);
|
||||||
struct section *elf_create_section(struct elf *elf, const char *name, unsigned int sh_flags, size_t entsize, int nr);
|
struct section *elf_create_section(struct elf *elf, const char *name, unsigned int sh_flags, size_t entsize, int nr);
|
||||||
struct section *elf_create_reloc_section(struct elf *elf, struct section *base, int reltype);
|
|
||||||
|
|
||||||
int elf_add_reloc(struct elf *elf, struct section *sec, unsigned long offset,
|
int elf_add_reloc(struct elf *elf, struct section *sec, unsigned long offset,
|
||||||
unsigned int type, struct symbol *sym, int addend);
|
unsigned int type, struct symbol *sym, int addend);
|
||||||
|
@@ -222,8 +222,6 @@ int orc_create(struct objtool_file *file)
|
|||||||
sec = elf_create_section(file->elf, ".orc_unwind_ip", 0, sizeof(int), nr);
|
sec = elf_create_section(file->elf, ".orc_unwind_ip", 0, sizeof(int), nr);
|
||||||
if (!sec)
|
if (!sec)
|
||||||
return -1;
|
return -1;
|
||||||
if (!elf_create_reloc_section(file->elf, sec, SHT_RELA))
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
/* Write ORC entries to sections: */
|
/* Write ORC entries to sections: */
|
||||||
list_for_each_entry(entry, &orc_list, list) {
|
list_for_each_entry(entry, &orc_list, list) {
|
||||||
|
Reference in New Issue
Block a user