History

modpost: pass r_type to addend_*_rel()

All of addend_*_rel() need the Elf_Rela pointer just for calculating ELF_R_TYPE(r->r_info). You can do it on the caller to de-duplicate the code.

Masahiro Yamada committed 3 years ago

Commit 71d965c1 parent a68914a1 file · +11 −13Browse files

Unified · Split

scripts/mod/modpost.c+11−13
@@ -1257,11 +1257,9 @@ static void check_section_mismatch(struct module *mod, struct elf_info *elf, · 1256 unmodified lines
12571257 tosec, taddr);
12581258 }
12591259
1260−static Elf_Addr addend_386_rel(uint32_t *location, Elf_Rela *r)
1260+static Elf_Addr addend_386_rel(uint32_t *location, unsigned int r_type)
12611261 {
1262− unsigned int r_typ = ELF_R_TYPE(r->r_info);
1263−
1264− switch (r_typ) {
1262+ switch (r_type) {
12651263 case R_386_32:
12661264 return TO_NATIVE(*location);
12671265 case R_386_PC32:
@@ -1312,13 +1310,12 @@ static int32_t sign_extend32(int32_t value, int index) · 44 unmodified lines
13121310 return (int32_t)(value << shift) >> shift;
13131311 }
13141312
1315−static Elf_Addr addend_arm_rel(void *loc, Elf_Sym *sym, Elf_Rela *r)
1313+static Elf_Addr addend_arm_rel(void *loc, Elf_Sym *sym, unsigned int r_type)
13161314 {
1317− unsigned int r_typ = ELF_R_TYPE(r->r_info);
13181315 uint32_t inst, upper, lower, sign, j1, j2;
13191316 int32_t offset;
13201317
1321− switch (r_typ) {
1318+ switch (r_type) {
13221319 case R_ARM_ABS32:
13231320 case R_ARM_REL32:
13241321 inst = TO_NATIVE(*(uint32_t *)loc);
@@ -1397,13 +1394,12 @@ static Elf_Addr addend_arm_rel(void *loc, Elf_Sym *sym, Elf_Rela *r) · 72 unmodified lines
13971394 return (Elf_Addr)(-1);
13981395 }
13991396
1400−static Elf_Addr addend_mips_rel(uint32_t *location, Elf_Rela *r)
1397+static Elf_Addr addend_mips_rel(uint32_t *location, unsigned int r_type)
14011398 {
1402− unsigned int r_typ = ELF_R_TYPE(r->r_info);
14031399 uint32_t inst;
14041400
14051401 inst = TO_NATIVE(*location);
1406− switch (r_typ) {
1402+ switch (r_type) {
14071403 case R_MIPS_LO16:
14081404 return inst & 0xffff;
14091405 case R_MIPS_26:
@@ -1500,6 +1496,7 @@ static void section_rel(struct module *mod, struct elf_info *elf, · 90 unmodified lines
15001496 Elf_Sym *tsym;
15011497 Elf_Addr taddr = 0;
15021498 void *loc;
1499+ unsigned int r_type;
15031500
15041501 r.r_offset = TO_NATIVE(rel->r_offset);
15051502 #if KERNEL_ELFCLASS == ELFCLASS64
@@ -1520,16 +1517,17 @@ static void section_rel(struct module *mod, struct elf_info *elf, · 14 unmodified lines
15201517
15211518 loc = sym_get_data_by_offset(elf, fsecndx, r.r_offset);
15221519 tsym = elf->symtab_start + r_sym;
1520+ r_type = ELF_R_TYPE(r.r_info);
15231521
15241522 switch (elf->hdr->e_machine) {
15251523 case EM_386:
1526− taddr = addend_386_rel(loc, &r);
1524+ taddr = addend_386_rel(loc, r_type);
15271525 break;
15281526 case EM_ARM:
1529− taddr = addend_arm_rel(loc, tsym, &r);
1527+ taddr = addend_arm_rel(loc, tsym, r_type);
15301528 break;
15311529 case EM_MIPS:
1532− taddr = addend_mips_rel(loc, &r);
1530+ taddr = addend_mips_rel(loc, r_type);
15331531 break;
15341532 default:
15351533 fatal("Please add code to calculate addend for this architecture\n");