lkml.org 
[lkml]   [2020]   [Jun]   [2]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[RFC][PATCH v4 08/32] objtool: mcount: Walk objtool Elf structs in find_secsym_ndx
    Date
    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@vmware.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
    \
     
     \ /
      Last update: 2020-06-02 21:51    [W:5.946 / U:0.008 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site