diff options
Diffstat (limited to 'scripts')
-rw-r--r-- | scripts/recordmcount.h | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/scripts/recordmcount.h b/scripts/recordmcount.h index 3c00faba745f..4be60364a405 100644 --- a/scripts/recordmcount.h +++ b/scripts/recordmcount.h | |||
@@ -22,6 +22,7 @@ | |||
22 | #undef is_fake_mcount | 22 | #undef is_fake_mcount |
23 | #undef fn_is_fake_mcount | 23 | #undef fn_is_fake_mcount |
24 | #undef MIPS_is_fake_mcount | 24 | #undef MIPS_is_fake_mcount |
25 | #undef mcount_adjust | ||
25 | #undef sift_rel_mcount | 26 | #undef sift_rel_mcount |
26 | #undef nop_mcount | 27 | #undef nop_mcount |
27 | #undef find_secsym_ndx | 28 | #undef find_secsym_ndx |
@@ -63,6 +64,7 @@ | |||
63 | # define is_fake_mcount is_fake_mcount64 | 64 | # define is_fake_mcount is_fake_mcount64 |
64 | # define fn_is_fake_mcount fn_is_fake_mcount64 | 65 | # define fn_is_fake_mcount fn_is_fake_mcount64 |
65 | # define MIPS_is_fake_mcount MIPS64_is_fake_mcount | 66 | # define MIPS_is_fake_mcount MIPS64_is_fake_mcount |
67 | # define mcount_adjust mcount_adjust_64 | ||
66 | # define Elf_Addr Elf64_Addr | 68 | # define Elf_Addr Elf64_Addr |
67 | # define Elf_Ehdr Elf64_Ehdr | 69 | # define Elf_Ehdr Elf64_Ehdr |
68 | # define Elf_Shdr Elf64_Shdr | 70 | # define Elf_Shdr Elf64_Shdr |
@@ -94,6 +96,7 @@ | |||
94 | # define is_fake_mcount is_fake_mcount32 | 96 | # define is_fake_mcount is_fake_mcount32 |
95 | # define fn_is_fake_mcount fn_is_fake_mcount32 | 97 | # define fn_is_fake_mcount fn_is_fake_mcount32 |
96 | # define MIPS_is_fake_mcount MIPS32_is_fake_mcount | 98 | # define MIPS_is_fake_mcount MIPS32_is_fake_mcount |
99 | # define mcount_adjust mcount_adjust_32 | ||
97 | # define Elf_Addr Elf32_Addr | 100 | # define Elf_Addr Elf32_Addr |
98 | # define Elf_Ehdr Elf32_Ehdr | 101 | # define Elf_Ehdr Elf32_Ehdr |
99 | # define Elf_Shdr Elf32_Shdr | 102 | # define Elf_Shdr Elf32_Shdr |
@@ -132,6 +135,8 @@ static void fn_ELF_R_INFO(Elf_Rel *const rp, unsigned sym, unsigned type) | |||
132 | } | 135 | } |
133 | static void (*Elf_r_info)(Elf_Rel *const rp, unsigned sym, unsigned type) = fn_ELF_R_INFO; | 136 | static void (*Elf_r_info)(Elf_Rel *const rp, unsigned sym, unsigned type) = fn_ELF_R_INFO; |
134 | 137 | ||
138 | static int mcount_adjust = 0; | ||
139 | |||
135 | /* | 140 | /* |
136 | * MIPS mcount long call has 2 _mcount symbols, only the position of the 1st | 141 | * MIPS mcount long call has 2 _mcount symbols, only the position of the 1st |
137 | * _mcount symbol is needed for dynamic function tracer, with it, to disable | 142 | * _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, | |||
317 | mcountsym = get_mcountsym(sym0, relp, str0); | 322 | mcountsym = get_mcountsym(sym0, relp, str0); |
318 | 323 | ||
319 | if (mcountsym == Elf_r_sym(relp) && !is_fake_mcount(relp)) { | 324 | if (mcountsym == Elf_r_sym(relp) && !is_fake_mcount(relp)) { |
320 | uint_t const addend = _w(_w(relp->r_offset) - recval); | 325 | uint_t const addend = |
321 | 326 | _w(_w(relp->r_offset) - recval + mcount_adjust); | |
322 | mrelp->r_offset = _w(offbase | 327 | mrelp->r_offset = _w(offbase |
323 | + ((void *)mlocp - (void *)mloc0)); | 328 | + ((void *)mlocp - (void *)mloc0)); |
324 | Elf_r_info(mrelp, recsym, reltype); | 329 | Elf_r_info(mrelp, recsym, reltype); |