2013-07-18 23:29:44 +00:00
|
|
|
#include <endian.h>
|
2012-07-11 08:22:13 +00:00
|
|
|
|
2013-07-18 23:29:44 +00:00
|
|
|
#if __BYTE_ORDER == __LITTLE_ENDIAN
|
|
|
|
#define ENDIAN_SUFFIX "el"
|
|
|
|
#else
|
|
|
|
#define ENDIAN_SUFFIX ""
|
|
|
|
#endif
|
|
|
|
|
2014-02-24 22:16:29 +00:00
|
|
|
#ifdef __mips_soft_float
|
|
|
|
#define FP_SUFFIX "-sf"
|
|
|
|
#else
|
|
|
|
#define FP_SUFFIX ""
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#define LDSO_ARCH "mips" ENDIAN_SUFFIX FP_SUFFIX
|
2012-07-11 08:22:13 +00:00
|
|
|
|
2014-06-18 06:44:02 +00:00
|
|
|
#define TPOFF_K (-0x7000)
|
2012-07-11 08:22:13 +00:00
|
|
|
|
2015-04-13 06:56:26 +00:00
|
|
|
#define REL_SYM_OR_REL R_MIPS_REL32
|
|
|
|
#define REL_PLT R_MIPS_JUMP_SLOT
|
|
|
|
#define REL_COPY R_MIPS_COPY
|
|
|
|
#define REL_DTPMOD R_MIPS_TLS_DTPMOD32
|
|
|
|
#define REL_DTPOFF R_MIPS_TLS_DTPREL32
|
|
|
|
#define REL_TPOFF R_MIPS_TLS_TPREL32
|
2012-08-05 16:50:26 +00:00
|
|
|
|
2015-04-13 06:56:26 +00:00
|
|
|
#define NEED_MIPS_GOT_RELOCS 1
|
2016-01-30 20:14:05 +00:00
|
|
|
#define DT_DEBUG_INDIRECT DT_MIPS_RLD_MAP
|
fix regression in mips dynamic linker
this issue caused the address of functions in shared libraries to
resolve to their PLT thunks in the main program rather than their
correct addresses. it was observed causing crashes, though the
mechanism of the crash was not thoroughly investigated. since the
issue is very subtle, it calls for some explanation:
on all well-behaved archs, GOT entries that belong to the PLT use a
special relocation type, typically called JMP_SLOT, so that the
dynamic linker can avoid having the jump destinations for the PLT
resolve to PLT thunks themselves (they also provide a definition for
the symbol, which must be used whenever the address of the function is
taken so that all DSOs see the same address).
however, the traditional mips PIC ABI lacked such a JMP_SLOT
relocation type, presumably because, due to the way PIC works, the
address of the PLT thunk was never needed and could always be ignored.
prior to commit adf94c19666e687a728bbf398f9a88ea4ea19996, the mips
version of reloc.h contained a hack that caused all symbol lookups to
be treated like JMP_SLOT, inhibiting undefined symbols from ever being
used to resolve symbolic relocations. this hack goes all the way back
to commit babf820180368f00742ec65b2050a82380d7c542, when the mips
dynamic linker was first made usable.
during the recent refactoring to eliminate arch-specific relocation
processing (commit adf94c19666e687a728bbf398f9a88ea4ea19996), this
hack was overlooked and no equivalent functionality was provided in
the new code.
fixing the problem is not as simple as adding back an equivalent hack,
since there is now also a "non-PIC ABI" that can be used for the main
executable, which actually does use a PLT. the closest thing to
official documentation I could find for this ABI is nonpic.txt,
attached to Message-ID: 20080701202236.GA1534@caradoc.them.org, which
can be found in the gcc mailing list archives and elsewhere. per this
document, undefined symbols corresponding to PLT thunks have the
STO_MIPS_PLT bit set in the symbol's st_other field. thus, I have
added an arch-specific rule for mips, applied at the find_sym level
rather than the relocation level, to reject undefined symbols with the
STO_MIPS_PLT bit clear.
the previous hack of treating all mips relocations as JMP_SLOT-like,
rather than rejecting the unwanted symbols in find_sym, probably also
caused dlsym to wrongly return PLT thunks in place of the correct
address of a function under at least some conditions. this should now
be fixed, at least for global-scope symbol lookups.
2014-06-30 05:18:14 +00:00
|
|
|
#define ARCH_SYM_REJECT_UND(s) (!((s)->st_other & STO_MIPS_PLT))
|
2015-04-13 06:56:26 +00:00
|
|
|
|
|
|
|
#define CRTJMP(pc,sp) __asm__ __volatile__( \
|
|
|
|
"move $sp,%1 ; jr %0" : : "r"(pc), "r"(sp) : "memory" )
|
2015-09-17 07:20:43 +00:00
|
|
|
|
|
|
|
#define GETFUNCSYM(fp, sym, got) __asm__ ( \
|
|
|
|
".hidden " #sym "\n" \
|
|
|
|
".set push \n" \
|
|
|
|
".set noreorder \n" \
|
|
|
|
" bal 1f \n" \
|
|
|
|
" nop \n" \
|
|
|
|
" .gpword . \n" \
|
|
|
|
" .gpword " #sym " \n" \
|
|
|
|
"1: lw %0, ($ra) \n" \
|
|
|
|
" subu %0, $ra, %0 \n" \
|
|
|
|
" lw $ra, 4($ra) \n" \
|
|
|
|
" addu %0, %0, $ra \n" \
|
|
|
|
".set pop \n" \
|
|
|
|
: "=r"(*(fp)) : : "memory", "ra" )
|