|
@@ -22,6 +22,7 @@
|
|
|
#undef is_fake_mcount
|
|
|
#undef fn_is_fake_mcount
|
|
|
#undef MIPS_is_fake_mcount
|
|
|
+#undef mcount_adjust
|
|
|
#undef sift_rel_mcount
|
|
|
#undef nop_mcount
|
|
|
#undef find_secsym_ndx
|
|
@@ -63,6 +64,7 @@
|
|
|
# define is_fake_mcount is_fake_mcount64
|
|
|
# define fn_is_fake_mcount fn_is_fake_mcount64
|
|
|
# define MIPS_is_fake_mcount MIPS64_is_fake_mcount
|
|
|
+# define mcount_adjust mcount_adjust_64
|
|
|
# define Elf_Addr Elf64_Addr
|
|
|
# define Elf_Ehdr Elf64_Ehdr
|
|
|
# define Elf_Shdr Elf64_Shdr
|
|
@@ -94,6 +96,7 @@
|
|
|
# define is_fake_mcount is_fake_mcount32
|
|
|
# define fn_is_fake_mcount fn_is_fake_mcount32
|
|
|
# define MIPS_is_fake_mcount MIPS32_is_fake_mcount
|
|
|
+# define mcount_adjust mcount_adjust_32
|
|
|
# define Elf_Addr Elf32_Addr
|
|
|
# define Elf_Ehdr Elf32_Ehdr
|
|
|
# define Elf_Shdr Elf32_Shdr
|
|
@@ -132,6 +135,8 @@ static void fn_ELF_R_INFO(Elf_Rel *const rp, unsigned sym, unsigned type)
|
|
|
}
|
|
|
static void (*Elf_r_info)(Elf_Rel *const rp, unsigned sym, unsigned type) = fn_ELF_R_INFO;
|
|
|
|
|
|
+static int mcount_adjust = 0;
|
|
|
+
|
|
|
/*
|
|
|
* MIPS mcount long call has 2 _mcount symbols, only the position of the 1st
|
|
|
* _mcount symbol is needed for dynamic function tracer, with it, to disable
|
|
@@ -317,8 +322,8 @@ static uint_t *sift_rel_mcount(uint_t *mlocp,
|
|
|
mcountsym = get_mcountsym(sym0, relp, str0);
|
|
|
|
|
|
if (mcountsym == Elf_r_sym(relp) && !is_fake_mcount(relp)) {
|
|
|
- uint_t const addend = _w(_w(relp->r_offset) - recval);
|
|
|
-
|
|
|
+ uint_t const addend =
|
|
|
+ _w(_w(relp->r_offset) - recval + mcount_adjust);
|
|
|
mrelp->r_offset = _w(offbase
|
|
|
+ ((void *)mlocp - (void *)mloc0));
|
|
|
Elf_r_info(mrelp, recsym, reltype);
|