[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <23497cb675be990627fa76eed26c1385cb0f5826.1591125127.git.mhelsley@vmware.com>
Date: Tue, 2 Jun 2020 12:50:01 -0700
From: Matt Helsley <mhelsley@...are.com>
To: <linux-kernel@...r.kernel.org>
CC: Josh Poimboeuf <jpoimboe@...hat.com>,
Peter Zijlstra <peterz@...radead.org>,
Steven Rostedt <rostedt@...dmis.org>,
Sami Tolvanen <samitolvanen@...gle.com>,
Julien Thierry <jthierry@...hat.com>,
Kamalesh Babulal <kamalesh@...ux.vnet.ibm.com>,
Matt Helsley <mhelsley@...are.com>
Subject: [RFC][PATCH v4 08/32] objtool: mcount: Walk objtool Elf structs in find_secsym_ndx
Rather than using indices into raw ELF32/64 tables mapped for the
wrapper, use the objtool functions to find the a suitable symbol
in the given text section.
Also take advantage of this commit to rename the function to
something that reads more easily.
Signed-off-by: Matt Helsley <mhelsley@...are.com>
---
tools/objtool/recordmcount.c | 2 ++
tools/objtool/recordmcount.h | 42 ++++++++++++++++--------------------
2 files changed, 21 insertions(+), 23 deletions(-)
diff --git a/tools/objtool/recordmcount.c b/tools/objtool/recordmcount.c
index f20582ac99e2..843027a46e1b 100644
--- a/tools/objtool/recordmcount.c
+++ b/tools/objtool/recordmcount.c
@@ -422,6 +422,8 @@ static int is_mcounted_section_name(char const *const txtname)
strcmp(".cpuidle.text", txtname) == 0;
}
+static const unsigned int missing_sym = (unsigned int)-1;
+
/* 32 bit and 64 bit are very similar */
#include "recordmcount.h"
#define RECORD_MCOUNT_64
diff --git a/tools/objtool/recordmcount.h b/tools/objtool/recordmcount.h
index b487308992ce..dba1c385106f 100644
--- a/tools/objtool/recordmcount.h
+++ b/tools/objtool/recordmcount.h
@@ -24,7 +24,7 @@
#undef mcount_adjust
#undef sift_rel_mcount
#undef nop_mcount
-#undef find_secsym_ndx
+#undef find_section_sym_index
#undef has_rel_mcount
#undef tot_relsize
#undef get_mcountsym
@@ -53,7 +53,7 @@
# define append_func append64
# define sift_rel_mcount sift64_rel_mcount
# define nop_mcount nop_mcount_64
-# define find_secsym_ndx find64_secsym_ndx
+# define find_section_sym_index find64_section_sym_index
# define has_rel_mcount has64_rel_mcount
# define tot_relsize tot64_relsize
# define get_sym_str_and_relp get_sym_str_and_relp_64
@@ -85,7 +85,7 @@
# define append_func append32
# define sift_rel_mcount sift32_rel_mcount
# define nop_mcount nop_mcount_32
-# define find_secsym_ndx find32_secsym_ndx
+# define find_section_sym_index find32_section_sym_index
# define has_rel_mcount has32_rel_mcount
# define tot_relsize tot32_relsize
# define get_sym_str_and_relp get_sym_str_and_relp_32
@@ -427,38 +427,36 @@ static int nop_mcount(const struct section * const rels,
* Num: Value Size Type Bind Vis Ndx Name
* 2: 00000000 0 SECTION LOCAL DEFAULT 1
*/
-static int find_secsym_ndx(unsigned const txtndx,
+static int find_section_sym_index(unsigned const txtndx,
char const *const txtname,
uint_t *const recvalp,
unsigned int *sym_index,
- Elf_Shdr const *const symhdr,
Elf_Ehdr const *const ehdr)
{
- Elf_Sym const *const sym0 = (Elf_Sym const *)(_w(symhdr->sh_offset)
- + (void *)ehdr);
- unsigned const nsym = _w(symhdr->sh_size) / _w(symhdr->sh_entsize);
- Elf_Sym const *symp;
- unsigned t;
+ struct symbol *sym;
+ struct section *txts = find_section_by_index(lf, txtndx);
- for (symp = sym0, t = nsym; t; --t, ++symp) {
- unsigned int const st_bind = ELF_ST_BIND(symp->st_info);
+ if (!txts) {
+ fprintf(stderr, "Cannot find section %u: %s.\n",
+ txtndx, txtname);
+ return missing_sym;
+ }
- if (txtndx == w2(symp->st_shndx)
- /* avoid STB_WEAK */
- && (STB_LOCAL == st_bind || STB_GLOBAL == st_bind)) {
+ list_for_each_entry(sym, &txts->symbol_list, list) {
+ if ((sym->bind == STB_LOCAL) || (sym->bind == STB_GLOBAL)) {
/* function symbols on ARM have quirks, avoid them */
if (w2(ehdr->e_machine) == EM_ARM
- && ELF_ST_TYPE(symp->st_info) == STT_FUNC)
+ && sym->type == STT_FUNC)
continue;
- *recvalp = _w(symp->st_value);
- *sym_index = symp - sym0;
+ *recvalp = sym->sym.st_value;
+ *sym_index = sym->idx;
return 0;
}
}
fprintf(stderr, "Cannot find symbol for section %u: %s.\n",
txtndx, txtname);
- return -1;
+ return missing_sym;
}
static char const *has_rel_mcount(const struct section * const rels)
@@ -540,10 +538,8 @@ static int do_func(Elf_Ehdr *const ehdr,
uint_t recval = 0;
symsec_sh_link = sec->sh.sh_link;
- result = find_secsym_ndx(sec->sh.sh_info, txtname,
- &recval, &recsym,
- &shdr0[symsec_sh_link],
- ehdr);
+ result = find_section_sym_index(sec->sh.sh_info,
+ txtname, &recval, &recsym, ehdr);
if (result)
goto out;
--
2.20.1
Powered by blists - more mailing lists