generalize mips-specific reloc code not to hard-code sym/type encoding
authorRich Felker <dalias@aerifal.cx>
Sun, 6 Mar 2016 17:25:52 +0000 (17:25 +0000)
committerRich Felker <dalias@aerifal.cx>
Sun, 6 Mar 2016 17:25:52 +0000 (17:25 +0000)
this change is made in preparation for adding the mips64 port, which
needs a 64-bit (and mips64-specific) form of the R_INFO macro, but
it's a better abstraction anyway.

based on part of the mips64 port patch by Mahesh Bodapati and Jaydeep
Patil of Imagination Technologies.

ldso/dynlink.c
src/internal/dynlink.h

index 87f3b7f8cd47bc3bc6e358e22c7411bf281e1c08..e458f38673d761315914fa488cf2d83ed0e210e9 100644 (file)
@@ -1134,7 +1134,7 @@ static void do_mips_relocs(struct dso *p, size_t *got)
        Sym *sym = p->syms + j;
        rel[0] = (unsigned char *)got - base;
        for (i-=j; i; i--, sym++, rel[0]+=sizeof(size_t)) {
-               rel[1] = sym-p->syms << 8 | R_MIPS_JUMP_SLOT;
+               rel[1] = R_INFO(sym-p->syms, R_MIPS_JUMP_SLOT);
                do_relocs(p, rel, sizeof rel, 2);
        }
 }
index 48890b2db50ec5bc6178b506964c6eb900f6bdb4..5717627a53575f214f1246b29b7c148e41437532 100644 (file)
@@ -11,12 +11,14 @@ typedef Elf32_Phdr Phdr;
 typedef Elf32_Sym Sym;
 #define R_TYPE(x) ((x)&255)
 #define R_SYM(x) ((x)>>8)
+#define R_INFO ELF32_R_INFO
 #else
 typedef Elf64_Ehdr Ehdr;
 typedef Elf64_Phdr Phdr;
 typedef Elf64_Sym Sym;
 #define R_TYPE(x) ((x)&0x7fffffff)
 #define R_SYM(x) ((x)>>32)
+#define R_INFO ELF64_R_INFO
 #endif
 
 /* These enum constants provide unmatchable default values for