From: Matt Helsley <mhelsley@vmware.com>
To: <linux-kernel@vger.kernel.org>
Cc: Josh Poimboeuf <jpoimboe@redhat.com>,
Peter Zijlstra <peterz@infradead.org>,
Steven Rostedt <rostedt@goodmis.org>,
Julien Thierry <jthierry@redhat.com>,
Kamalesh Babulal <kamalesh@linux.vnet.ibm.com>,
Matt Helsley <mhelsley@vmware.com>
Subject: [RFC][PATCH v5 12/51] objtool: mcount: Walk relocation lists
Date: Thu, 18 Jun 2020 13:37:58 -0700 [thread overview]
Message-ID: <b5c817aa15613c4e00cfbd3b2c0cd807015536ab.1592510545.git.mhelsley@vmware.com> (raw)
In-Reply-To: <cover.1592510545.git.mhelsley@vmware.com>
Rather than walk the section tables using the old recordmcount mapping
of the ELF file, walk the section list provided by objtool's ELF code.
This removes the last use of of the Elf_r_sym wrapper so we remove
that too.
Signed-off-by: Matt Helsley <mhelsley@vmware.com>
---
tools/objtool/recordmcount.c | 10 +---
tools/objtool/recordmcount.h | 103 +++++++++--------------------------
2 files changed, 28 insertions(+), 85 deletions(-)
diff --git a/tools/objtool/recordmcount.c b/tools/objtool/recordmcount.c
index 843027a46e1b..dafa6dd10d04 100644
--- a/tools/objtool/recordmcount.c
+++ b/tools/objtool/recordmcount.c
@@ -429,9 +429,9 @@ static const unsigned int missing_sym = (unsigned int)-1;
#define RECORD_MCOUNT_64
#include "recordmcount.h"
-static int arm_is_fake_mcount(Elf32_Rel const *rp)
+static int arm_is_fake_mcount(struct reloc const *rp)
{
- switch (ELF32_R_TYPE(w(rp->r_info))) {
+ switch (rp->type) {
case R_ARM_THM_CALL:
case R_ARM_CALL:
case R_ARM_PC24:
@@ -462,11 +462,6 @@ union mips_r_info {
} r_mips;
};
-static uint64_t MIPS64_r_sym(Elf64_Rel const *rp)
-{
- return w(((union mips_r_info){ .r_info = rp->r_info }).r_mips.r_sym);
-}
-
static void MIPS64_r_info(Elf64_Rel *const rp, unsigned sym, unsigned type)
{
rp->r_info = ((union mips_r_info){
@@ -605,7 +600,6 @@ static int do_file(char const *const fname)
}
if (w2(ghdr->e_machine) == EM_MIPS) {
reltype = R_MIPS_64;
- Elf64_r_sym = MIPS64_r_sym;
Elf64_r_info = MIPS64_r_info;
is_fake_mcount64 = MIPS64_is_fake_mcount;
}
diff --git a/tools/objtool/recordmcount.h b/tools/objtool/recordmcount.h
index 3dae878f11a8..df8384f8e9e7 100644
--- a/tools/objtool/recordmcount.h
+++ b/tools/objtool/recordmcount.h
@@ -31,21 +31,14 @@
#undef get_shnum
#undef set_shnum
#undef get_shstrndx
-#undef get_relp
#undef do_func
#undef Elf_Addr
#undef Elf_Ehdr
#undef Elf_Shdr
#undef Elf_Rel
#undef Elf_Rela
-#undef Elf_Sym
-#undef ELF_R_SYM
-#undef Elf_r_sym
#undef ELF_R_INFO
#undef Elf_r_info
-#undef ELF_ST_BIND
-#undef ELF_ST_TYPE
-#undef fn_ELF_R_SYM
#undef fn_ELF_R_INFO
#undef uint_t
#undef _w
@@ -62,7 +55,6 @@
# define get_shnum get_shnum64
# define set_shnum set_shnum64
# define get_shstrndx get_shstrndx64
-# define get_relp get_relp_64
# define do_func do64
# define get_mcountsym get_mcountsym_64
# define is_fake_mcount is_fake_mcount64
@@ -74,14 +66,8 @@
# define Elf_Shdr Elf64_Shdr
# define Elf_Rel Elf64_Rel
# define Elf_Rela Elf64_Rela
-# define Elf_Sym Elf64_Sym
-# define ELF_R_SYM ELF64_R_SYM
-# define Elf_r_sym Elf64_r_sym
# define ELF_R_INFO ELF64_R_INFO
# define Elf_r_info Elf64_r_info
-# define ELF_ST_BIND ELF64_ST_BIND
-# define ELF_ST_TYPE ELF64_ST_TYPE
-# define fn_ELF_R_SYM fn_ELF64_R_SYM
# define fn_ELF_R_INFO fn_ELF64_R_INFO
# define uint_t uint64_t
# define _w w8
@@ -97,7 +83,6 @@
# define get_shnum get_shnum32
# define set_shnum set_shnum32
# define get_shstrndx get_shstrndx32
-# define get_relp get_relp_32
# define do_func do32
# define get_mcountsym get_mcountsym_32
# define is_fake_mcount is_fake_mcount32
@@ -109,14 +94,8 @@
# define Elf_Shdr Elf32_Shdr
# define Elf_Rel Elf32_Rel
# define Elf_Rela Elf32_Rela
-# define Elf_Sym Elf32_Sym
-# define ELF_R_SYM ELF32_R_SYM
-# define Elf_r_sym Elf32_r_sym
# define ELF_R_INFO ELF32_R_INFO
# define Elf_r_info Elf32_r_info
-# define ELF_ST_BIND ELF32_ST_BIND
-# define ELF_ST_TYPE ELF32_ST_TYPE
-# define fn_ELF_R_SYM fn_ELF32_R_SYM
# define fn_ELF_R_INFO fn_ELF32_R_INFO
# define uint_t uint32_t
# define _w w
@@ -125,17 +104,11 @@
#endif
/* Functions and pointers that do_file() may override for specific e_machine. */
-static int fn_is_fake_mcount(Elf_Rel const *rp)
+static int fn_is_fake_mcount(struct reloc const *reloc)
{
return 0;
}
-static int (*is_fake_mcount)(Elf_Rel const *rp) = fn_is_fake_mcount;
-
-static uint_t fn_ELF_R_SYM(Elf_Rel const *rp)
-{
- return ELF_R_SYM(_w(rp->r_info));
-}
-static uint_t (*Elf_r_sym)(Elf_Rel const *rp) = fn_ELF_R_SYM;
+static int (*is_fake_mcount)(struct reloc const *reloc) = fn_is_fake_mcount;
static void fn_ELF_R_INFO(Elf_Rel *const rp, unsigned sym, unsigned type)
{
@@ -166,10 +139,10 @@ static int mcount_adjust = 0;
*/
#define MIPS_FAKEMCOUNT_OFFSET 4
-static int MIPS_is_fake_mcount(Elf_Rel const *rp)
+static int MIPS_is_fake_mcount(struct reloc const *reloc)
{
static Elf_Addr old_r_offset = ~(Elf_Addr)0;
- Elf_Addr current_r_offset = _w(rp->r_offset);
+ Elf_Addr current_r_offset = reloc->offset;
int is_fake;
is_fake = (old_r_offset != ~(Elf_Addr)0) &&
@@ -298,9 +271,9 @@ static int append_func(Elf_Ehdr *const ehdr,
return elf_write(lf);
}
-static unsigned get_mcountsym(Elf_Rel const *relp)
+static unsigned get_mcountsym(struct reloc *reloc)
{
- struct symbol *sym = find_symbol_by_index(lf, Elf_r_sym(relp));
+ struct symbol *sym = reloc->sym;
char const *symname = sym->name;
char const *mcount = gpfx == '_' ? "_mcount" : "mcount";
char const *fentry = "__fentry__";
@@ -310,19 +283,10 @@ static unsigned get_mcountsym(Elf_Rel const *relp)
if (strcmp(mcount, symname) == 0 ||
(altmcount && strcmp(altmcount, symname) == 0) ||
(strcmp(fentry, symname) == 0))
- return Elf_r_sym(relp);
+ return GELF_R_INFO(reloc->sym->idx, reloc->type);
return 0;
}
-static void get_relp(const struct section * const rels,
- Elf_Ehdr const *const ehdr,
- Elf_Rel const **relp)
-{
- Elf_Rel const *const rel0 = (Elf_Rel const *)(rels->sh.sh_offset
- + (void *)ehdr);
- *relp = rel0;
-}
-
/*
* Look at the relocations in order to find the calls to mcount.
* Accumulate the section offsets that are found, and their relocation info,
@@ -332,29 +296,23 @@ static uint_t *sift_rel_mcount(uint_t *mlocp,
unsigned const offbase,
Elf_Rel **const mrelpp,
const struct section * const rels,
- Elf_Ehdr const *const ehdr,
unsigned const recsym_index,
uint_t const recval,
unsigned const reltype)
{
uint_t *const mloc0 = mlocp;
Elf_Rel *mrelp = *mrelpp;
- Elf_Rel const *relp;
unsigned int rel_entsize = rels->sh.sh_entsize;
- unsigned const nrel = rels->sh.sh_size / rel_entsize;
unsigned mcountsym = 0;
- unsigned t;
-
- get_relp(rels, ehdr, &relp);
+ struct reloc *reloc;
- for (t = nrel; t; --t) {
+ list_for_each_entry(reloc, &rels->reloc_list, list) {
if (!mcountsym)
- mcountsym = get_mcountsym(relp);
+ mcountsym = get_mcountsym(reloc);
- if (mcountsym && mcountsym == Elf_r_sym(relp) &&
- !is_fake_mcount(relp)) {
+ if (mcountsym == GELF_R_INFO(reloc->sym->idx, reloc->type) && !is_fake_mcount(reloc)) {
uint_t const addend =
- _w(_w(relp->r_offset) - recval + mcount_adjust);
+ _w(reloc->offset - recval + mcount_adjust);
mrelp->r_offset = _w(offbase
+ ((void *)mlocp - (void *)mloc0));
Elf_r_info(mrelp, recsym_index, reltype);
@@ -366,7 +324,6 @@ static uint_t *sift_rel_mcount(uint_t *mlocp,
mrelp = (Elf_Rel *)(rel_entsize + (void *)mrelp);
}
- relp = (Elf_Rel const *)(rel_entsize + (void *)relp);
}
*mrelpp = mrelp;
return mlocp;
@@ -377,31 +334,29 @@ static uint_t *sift_rel_mcount(uint_t *mlocp,
* that are not going to be traced. The mcount calls here will be converted
* into nops.
*/
-static int nop_mcount(const struct section * const rels,
+static int nop_mcount(struct section * const rels,
Elf_Ehdr const *const ehdr,
const char *const txtname)
{
Elf_Shdr *const shdr0 = (Elf_Shdr *)(_w(ehdr->e_shoff)
+ (void *)ehdr);
- Elf_Rel const *relp;
+ struct reloc *reloc;
Elf_Shdr const *const shdr = &shdr0[rels->sh.sh_info];
- unsigned rel_entsize = rels->sh.sh_entsize;
- unsigned const nrel = rels->sh.sh_size / rel_entsize;
unsigned mcountsym = 0;
- unsigned t;
int once = 0;
- get_relp(rels, ehdr, &relp);
-
- for (t = nrel; t; --t) {
+ list_for_each_entry(reloc, &rels->reloc_list, list) {
int ret = -1;
if (!mcountsym)
- mcountsym = get_mcountsym(relp);
+ mcountsym = get_mcountsym(reloc);
- if (mcountsym == Elf_r_sym(relp) && !is_fake_mcount(relp)) {
- if (make_nop)
- ret = make_nop((void *)ehdr, _w(shdr->sh_offset) + _w(relp->r_offset));
+ if (mcountsym == GELF_R_INFO(reloc->sym->idx, reloc->type) && !is_fake_mcount(reloc)) {
+ if (make_nop) {
+ ret = make_nop((void *)ehdr, _w(shdr->sh_offset) + reloc->offset);
+ if (ret < 0)
+ return -1;
+ }
if (warn_on_notrace_sect && !once) {
printf("Section %s has mcount callers being ignored\n",
txtname);
@@ -417,15 +372,9 @@ static int nop_mcount(const struct section * const rels,
* as a nop (don't do anything with it).
*/
if (!ret) {
- Elf_Rel rel;
- rel = *(Elf_Rel *)relp;
- Elf_r_info(&rel, Elf_r_sym(relp), rel_type_nop);
- if (ulseek((void *)relp - (void *)ehdr, SEEK_SET) < 0)
- return -1;
- if (uwrite(&rel, sizeof(rel)) < 0)
- return -1;
+ reloc->type = rel_type_nop;
+ rels->changed = true;
}
- relp = (Elf_Rel const *)(rel_entsize + (void *)relp);
}
return 0;
}
@@ -519,7 +468,7 @@ static int do_func(Elf_Ehdr *const ehdr,
unsigned rel_entsize = 0;
unsigned symsec_sh_link = 0;
- const struct section *sec;
+ struct section *sec;
int result = 0;
@@ -559,7 +508,7 @@ static int do_func(Elf_Ehdr *const ehdr,
rel_entsize = sec->sh.sh_entsize;
mlocp = sift_rel_mcount(mlocp,
(void *)mlocp - (void *)mloc0, &mrelp,
- sec, ehdr, recsym, recval, reltype);
+ sec, recsym, recval, reltype);
} else if (txtname && (warn_on_notrace_sect || make_nop)) {
/*
* This section is ignored by ftrace, but still
--
2.20.1
next prev parent reply other threads:[~2020-06-18 20:45 UTC|newest]
Thread overview: 55+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-06-18 20:37 [RFC][PATCH v5 00/51] objtool: Make recordmcount a subcommand Matt Helsley
2020-06-18 20:37 ` [RFC][PATCH v5 01/51] objtool: Factor out reasons to build objtool Matt Helsley
2020-06-24 15:37 ` Miroslav Benes
2020-06-18 20:37 ` [RFC][PATCH v5 02/51] objtool: Prepare to merge recordmcount Matt Helsley
2020-06-18 20:37 ` [RFC][PATCH v5 03/51] objtool: Make recordmcount into mcount subcmd Matt Helsley
2020-06-25 10:39 ` Miroslav Benes
2020-06-18 20:37 ` [RFC][PATCH v5 04/51] objtool: recordmcount: Start using objtool's elf wrapper Matt Helsley
2020-06-18 20:37 ` [RFC][PATCH v5 05/51] objtool: recordmcount: Search for __mcount_loc before walking the sections Matt Helsley
2020-06-18 20:37 ` [RFC][PATCH v5 06/51] objtool: recordmcount: Convert do_func() relhdrs Matt Helsley
2020-06-18 20:37 ` [RFC][PATCH v5 07/51] objtool: mcount: Move nhdr into find_symtab() Matt Helsley
2020-06-18 20:37 ` [RFC][PATCH v5 08/51] objtool: mcount: Remove unused fname parameter Matt Helsley
2020-06-18 20:37 ` [RFC][PATCH v5 09/51] objtool: mcount: Use libelf for section header names Matt Helsley
2020-06-18 20:37 ` [RFC][PATCH v5 10/51] objtool: mcount: Walk objtool Elf structs in find_secsym_ndx Matt Helsley
2020-06-18 20:37 ` [RFC][PATCH v5 11/51] objtool: mcount: Use symbol structs to find mcount relocations Matt Helsley
2020-06-18 20:37 ` Matt Helsley [this message]
2020-06-18 20:37 ` [RFC][PATCH v5 13/51] objtool: mcount: Return symbol from mcountsym Matt Helsley
2020-06-18 20:38 ` [RFC][PATCH v5 14/51] objtool: mcount: Move get_mcountsym Matt Helsley
2020-06-18 20:38 ` [RFC][PATCH v5 15/51] objtool: mcount: Replace MIPS offset types Matt Helsley
2020-06-18 20:38 ` [RFC][PATCH v5 16/51] objtool: mcount: Move is_fake_mcount() Matt Helsley
2020-06-18 20:38 ` [RFC][PATCH v5 17/51] objtool: mcount: Stop using ehdr in find_section_sym_index Matt Helsley
2020-06-18 20:38 ` [RFC][PATCH v5 18/51] objtool: mcount: Move find_section_sym_index() Matt Helsley
2020-06-18 20:38 ` [RFC][PATCH v5 19/51] objtool: mcount: Restrict using ehdr in append_func() Matt Helsley
2020-06-18 20:38 ` [RFC][PATCH v5 20/51] objtool: mcount: Use objtool ELF to write Matt Helsley
2020-06-18 20:38 ` [RFC][PATCH v5 21/51] objtool: mcount: Move nop_mcount() Matt Helsley
2020-06-18 20:38 ` [RFC][PATCH v5 22/51] objtool: mcount: Move has_rel_mcount() and tot_relsize() Matt Helsley
2020-06-18 20:38 ` [RFC][PATCH v5 23/51] objtool: mcount: Move relocation entry size detection Matt Helsley
2020-06-18 20:38 ` [RFC][PATCH v5 24/51] objtool: mcount: Only keep ELF file size Matt Helsley
2020-06-18 20:38 ` [RFC][PATCH v5 25/51] objtool: mcount: Use ELF header from objtool Matt Helsley
2020-06-18 20:38 ` [RFC][PATCH v5 26/51] objtool: mcount: Remove unused file mapping Matt Helsley
2020-06-18 20:38 ` [RFC][PATCH v5 27/51] objtool: mcount: Reduce usage of _size wrapper Matt Helsley
2020-06-18 20:38 ` [RFC][PATCH v5 28/51] objtool: mcount: Move mcount_adjust out of wrapper Matt Helsley
2020-06-18 20:38 ` [RFC][PATCH v5 29/51] objtool: mcount: Pre-allocate new ELF sections Matt Helsley
2020-06-18 20:38 ` [RFC][PATCH v5 30/51] objtool: mcount: Generic location and relocation table types Matt Helsley
2020-06-18 20:38 ` [RFC][PATCH v5 31/51] objtool: mcount: Use objtool relocation section Matt Helsley
2020-06-18 20:38 ` [RFC][PATCH v5 32/51] objtool: mcount: Move sift_rel_mcount out of wrapper file Matt Helsley
2020-06-18 20:38 ` [RFC][PATCH v5 33/51] objtool: mcount: Remove wrapper for ELF relocation type Matt Helsley
2020-06-18 20:38 ` [RFC][PATCH v5 34/51] objtool: mcount: Remove wrapper double-include trick Matt Helsley
2020-06-18 20:38 ` [RFC][PATCH v5 35/51] objtool: mcount: Remove endian wrappers Matt Helsley
2020-06-18 20:38 ` [RFC][PATCH v5 36/51] objtool: mcount: Rename to mcount.c Matt Helsley
2020-06-18 20:38 ` [RFC][PATCH v5 37/51] objtool: mcount: Simplify mcount name matching Matt Helsley
2020-06-18 20:38 ` [RFC][PATCH v5 38/51] objtool: mcount: mcount symbol name simplification Matt Helsley
2020-06-18 20:38 ` [RFC][PATCH v5 39/51] objtool: mcount: Verify x86 instruction with memcmp() Matt Helsley
2020-06-18 20:38 ` [RFC][PATCH v5 40/51] objtool: mcount: const-ify ARM instruction patterns Matt Helsley
2020-06-18 20:38 ` [RFC][PATCH v5 41/51] objtool: mcount: Convert nop writes to elf_write_insn() Matt Helsley
2020-06-18 20:38 ` [RFC][PATCH v5 42/51] objtool: mcount: Move mcount symbol name testing Matt Helsley
2020-06-18 20:38 ` [RFC][PATCH v5 43/51] objtool: check: Use class to recognize kcov calls Matt Helsley
2020-06-18 20:38 ` [RFC][PATCH v5 44/51] objtool: mcount: Keep lists locations and relocations Matt Helsley
2020-06-18 20:38 ` [RFC][PATCH v5 45/51] objtool: mcount: Move mcount section test to objtool ELF Matt Helsley
2020-06-18 20:38 ` [RFC][PATCH v5 46/51] objtool: mcount: Flag mcount relocation sections Matt Helsley
2020-06-18 20:38 ` [RFC][PATCH v5 47/51] objtool: mcount: Merge section mcount flags Matt Helsley
2020-06-18 20:38 ` [RFC][PATCH v5 48/51] objtool: mcount: Eliminate first pass Matt Helsley
2020-06-18 20:38 ` [RFC][PATCH v5 49/51] objtool: mcount: Remove relocation size check Matt Helsley
2020-06-18 20:38 ` [RFC][PATCH v5 50/51] objtool: mcount: Remove useless lookup Matt Helsley
2020-06-18 20:38 ` [RFC][PATCH v5 51/51] objtool: mcount: Remove stale description Matt Helsley
2020-06-23 14:12 ` [RFC][PATCH v5 00/51] objtool: Make recordmcount a subcommand Matt Helsley
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=b5c817aa15613c4e00cfbd3b2c0cd807015536ab.1592510545.git.mhelsley@vmware.com \
--to=mhelsley@vmware.com \
--cc=jpoimboe@redhat.com \
--cc=jthierry@redhat.com \
--cc=kamalesh@linux.vnet.ibm.com \
--cc=linux-kernel@vger.kernel.org \
--cc=peterz@infradead.org \
--cc=rostedt@goodmis.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®