• Hemant Kumar's avatar
    perf sdt: ELF support for SDT · 060fa0c7
    Hemant Kumar authored
    This patch serves the initial support to identify and list SDT events in
    binaries.  When programs containing SDT markers are compiled, gcc with
    the help of assembler directives identifies them and places them in the
    section ".note.stapsdt".
    
    To find these markers from the binaries, one needs to traverse through
    this section and parse the relevant details like the name, type and
    location of the marker. Also, the original location could be skewed due
    to the effect of prelinking. If that is the case, the locations need to
    be adjusted.
    
    The functions in this patch open a given ELF, find out the SDT section,
    parse the relevant details, adjust the location (if necessary) and
    populate them in a list.
    
    A typical note entry in ".note.stapsdt" section is as follows :
    
                                     |--nhdr.n_namesz--|
                    ------------------------------------
                    |      nhdr      |     "stapsdt"   |
            -----   |----------------------------------|
             |      |  <location>       <base_address> |
             |      |  <semaphore>                     |
    nhdr.n_descsize |  "provider_name"   "note_name"   |
             |      |   <args>                         |
            -----   |----------------------------------|
                    |      nhdr      |     "stapsdt"   |
                    |...
    
    The above shows an excerpt from the section ".note.stapsdt".  'nhdr' is
    a structure which has the note name size (n_namesz), note description
    size (n_desc_sz) and note type (n_type).
    
    So, in order to parse the note note info, we need nhdr to tell us where
    to start from.  As can be seen from <sys/sdt.h>, the name of the SDT
    notes given is "stapsdt".  But this is not the identifier of the note.
    
    After that, we go to description of the note to find out its location, the
    address of the ".stapsdt.base" section and the semaphore address.
    Then, we find the provider name and the SDT marker name and then follow the
    arguments.
    Signed-off-by: default avatarHemant Kumar <hemant@linux.vnet.ibm.com>
    Reviewed-by: default avatarMasami Hiramatsu <mhiramat@kernel.org>
    Acked-by: default avatarNamhyung Kim <namhyung@kernel.org>
    Cc: Ananth N Mavinakayanahalli <ananth@linux.vnet.ibm.com>
    Cc: Brendan Gregg <brendan.d.gregg@gmail.com>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Link: http://lkml.kernel.org/r/146736022628.27797.1201368329092908163.stgit@devboxSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    060fa0c7
symbol-elf.c 46 KB