Home | History | Annotate | Download | only in m_debuginfo
      1 
      2 /*--------------------------------------------------------------------*/
      3 /*--- Format-neutral storage of and querying of info acquired from ---*/
      4 /*--- ELF/XCOFF stabs/dwarf1/dwarf2 debug info.                    ---*/
      5 /*---                                               priv_storage.h ---*/
      6 /*--------------------------------------------------------------------*/
      7 
      8 /*
      9    This file is part of Valgrind, a dynamic binary instrumentation
     10    framework.
     11 
     12    Copyright (C) 2000-2011 Julian Seward
     13       jseward (at) acm.org
     14 
     15    This program is free software; you can redistribute it and/or
     16    modify it under the terms of the GNU General Public License as
     17    published by the Free Software Foundation; either version 2 of the
     18    License, or (at your option) any later version.
     19 
     20    This program is distributed in the hope that it will be useful, but
     21    WITHOUT ANY WARRANTY; without even the implied warranty of
     22    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     23    General Public License for more details.
     24 
     25    You should have received a copy of the GNU General Public License
     26    along with this program; if not, write to the Free Software
     27    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
     28    02111-1307, USA.
     29 
     30    The GNU General Public License is contained in the file COPYING.
     31 */
     32 /*
     33    Stabs reader greatly improved by Nick Nethercote, Apr 02.
     34    This module was also extensively hacked on by Jeremy Fitzhardinge
     35    and Tom Hughes.
     36 */
     37 /* See comment at top of debuginfo.c for explanation of
     38    the _svma / _avma / _image / _bias naming scheme.
     39 */
     40 /* Note this is not freestanding; needs pub_core_xarray.h and
     41    priv_tytypes.h to be included before it. */
     42 
     43 #ifndef __PRIV_STORAGE_H
     44 #define __PRIV_STORAGE_H
     45 
     46 /* --------------------- SYMBOLS --------------------- */
     47 
     48 /* A structure to hold an ELF/MachO symbol (very crudely).  Usually
     49    the symbol only has one name, which is stored in ::pri_name, and
     50    ::sec_names is NULL.  If there are other names, these are stored in
     51    ::sec_names, which is a NULL terminated vector holding the names.
     52    The vector is allocated in VG_AR_DINFO, the names themselves live
     53    in DebugInfo::strchunks.
     54 
     55    From the point of view of ELF, the primary vs secondary distinction
     56    is artificial: they are all just names associated with the address,
     57    none of which has higher precedence than any other.  However, from
     58    the point of view of mapping an address to a name to display to the
     59    user, we need to choose one "preferred" name, and so that might as
     60    well be installed as the pri_name, whilst all others can live in
     61    sec_names[].  This has the convenient side effect that, in the
     62    common case where there is only one name for the address,
     63    sec_names[] does not need to be allocated.
     64 */
     65 typedef
     66    struct {
     67       Addr    addr;    /* lowest address of entity */
     68       Addr    tocptr;  /* ppc64-linux only: value that R2 should have */
     69       UChar*  pri_name;  /* primary name, never NULL */
     70       UChar** sec_names; /* NULL, or a NULL term'd array of other names */
     71       // XXX: this could be shrunk (on 32-bit platforms) by using 30
     72       // bits for the size and 1 bit each for isText and isIFunc.  If you
     73       // do this, make sure that all assignments to the latter two use
     74       // 0 or 1 (or True or False), and that a positive number larger
     75       // than 1 is never used to represent True.
     76       UInt    size;    /* size in bytes */
     77       Bool    isText;
     78       Bool    isIFunc; /* symbol is an indirect function? */
     79    }
     80    DiSym;
     81 
     82 /* --------------------- SRCLOCS --------------------- */
     83 
     84 /* Line count at which overflow happens, due to line numbers being
     85    stored as shorts in `struct nlist' in a.out.h. */
     86 #define LINENO_OVERFLOW (1 << (sizeof(short) * 8))
     87 
     88 #define LINENO_BITS     20
     89 #define LOC_SIZE_BITS  (32 - LINENO_BITS)
     90 #define MAX_LINENO     ((1 << LINENO_BITS) - 1)
     91 
     92 /* Unlikely to have any lines with instruction ranges > 4096 bytes */
     93 #define MAX_LOC_SIZE   ((1 << LOC_SIZE_BITS) - 1)
     94 
     95 /* Number used to detect line number overflows; if one line is
     96    60000-odd smaller than the previous, it was probably an overflow.
     97  */
     98 #define OVERFLOW_DIFFERENCE     (LINENO_OVERFLOW - 5000)
     99 
    100 /* A structure to hold addr-to-source info for a single line.  There
    101   can be a lot of these, hence the dense packing. */
    102 typedef
    103    struct {
    104       /* Word 1 */
    105       Addr   addr;               /* lowest address for this line */
    106       /* Word 2 */
    107       UShort size:LOC_SIZE_BITS; /* # bytes; we catch overflows of this */
    108       UInt   lineno:LINENO_BITS; /* source line number, or zero */
    109       /* Word 3 */
    110       UChar*  filename;          /* source filename */
    111       /* Word 4 */
    112       UChar*  dirname;           /* source directory name */
    113    }
    114    DiLoc;
    115 
    116 /* --------------------- CF INFO --------------------- */
    117 
    118 /* DiCfSI: a structure to summarise DWARF2/3 CFA info for the code
    119    address range [base .. base+len-1].
    120 
    121    On x86 and amd64 ("IA"), if you know ({e,r}sp, {e,r}bp, {e,r}ip) at
    122    some point and {e,r}ip is in the range [base .. base+len-1], it
    123    tells you how to calculate ({e,r}sp, {e,r}bp) for the caller of the
    124    current frame and also ra, the return address of the current frame.
    125 
    126    First off, calculate CFA, the Canonical Frame Address, thusly:
    127 
    128      cfa = case cfa_how of
    129               CFIC_IA_SPREL -> {e,r}sp + cfa_off
    130               CFIC_IA_BPREL -> {e,r}bp + cfa_off
    131               CFIR_IA_EXPR  -> expr whose index is in cfa_off
    132 
    133    Once that is done, the previous frame's {e,r}sp/{e,r}bp values and
    134    this frame's {e,r}ra value can be calculated like this:
    135 
    136      old_{e,r}sp/{e,r}bp/ra
    137          = case {e,r}sp/{e,r}bp/ra_how of
    138               CFIR_UNKNOWN   -> we don't know, sorry
    139               CFIR_SAME      -> same as it was before (sp/fp only)
    140               CFIR_CFAREL    -> cfa + sp/bp/ra_off
    141               CFIR_MEMCFAREL -> *( cfa + sp/bp/ra_off )
    142               CFIR_EXPR      -> expr whose index is in sp/bp/ra_off
    143 
    144    On ARM it's pretty much the same, except we have more registers to
    145    keep track of:
    146 
    147      cfa = case cfa_how of
    148               CFIC_R13REL -> r13 + cfa_off
    149               CFIC_R12REL -> r12 + cfa_off
    150               CFIC_R11REL -> r11 + cfa_off
    151               CFIC_R7REL  -> r7  + cfa_off
    152               CFIR_EXPR   -> expr whose index is in cfa_off
    153 
    154      old_r14/r13/r12/r11/r7/ra
    155          = case r14/r13/r12/r11/r7/ra_how of
    156               CFIR_UNKNOWN   -> we don't know, sorry
    157               CFIR_SAME      -> same as it was before (r14/r13/r12/r11/r7 only)
    158               CFIR_CFAREL    -> cfa + r14/r13/r12/r11/r7/ra_off
    159               CFIR_MEMCFAREL -> *( cfa + r14/r13/r12/r11/r7/ra_off )
    160               CFIR_EXPR      -> expr whose index is in r14/r13/r12/r11/r7/ra_off
    161 
    162    On s390x we have a similar logic as x86 or amd64. We need the stack pointer
    163    (r15), the frame pointer r11 (like BP) and together with the instruction
    164    address in the PSW we can calculate the previous values:
    165      cfa = case cfa_how of
    166               CFIC_IA_SPREL -> r15 + cfa_off
    167               CFIC_IA_BPREL -> r11 + cfa_off
    168               CFIR_IA_EXPR  -> expr whose index is in cfa_off
    169 
    170      old_sp/fp/ra
    171          = case sp/fp/ra_how of
    172               CFIR_UNKNOWN   -> we don't know, sorry
    173               CFIR_SAME      -> same as it was before (sp/fp only)
    174               CFIR_CFAREL    -> cfa + sp/fp/ra_off
    175               CFIR_MEMCFAREL -> *( cfa + sp/fp/ra_off )
    176               CFIR_EXPR      -> expr whose index is in sp/fp/ra_off
    177 */
    178 
    179 #define CFIC_IA_SPREL     ((UChar)1)
    180 #define CFIC_IA_BPREL     ((UChar)2)
    181 #define CFIC_IA_EXPR      ((UChar)3)
    182 #define CFIC_ARM_R13REL   ((UChar)4)
    183 #define CFIC_ARM_R12REL   ((UChar)5)
    184 #define CFIC_ARM_R11REL   ((UChar)6)
    185 #define CFIC_ARM_R7REL    ((UChar)7)
    186 #define CFIC_EXPR         ((UChar)8)  /* all targets */
    187 
    188 #define CFIR_UNKNOWN      ((UChar)64)
    189 #define CFIR_SAME         ((UChar)65)
    190 #define CFIR_CFAREL       ((UChar)66)
    191 #define CFIR_MEMCFAREL    ((UChar)67)
    192 #define CFIR_EXPR         ((UChar)68)
    193 
    194 #if defined(VGA_x86) || defined(VGA_amd64)
    195 typedef
    196    struct {
    197       Addr  base;
    198       UInt  len;
    199       UChar cfa_how; /* a CFIC_IA value */
    200       UChar ra_how;  /* a CFIR_ value */
    201       UChar sp_how;  /* a CFIR_ value */
    202       UChar bp_how;  /* a CFIR_ value */
    203       Int   cfa_off;
    204       Int   ra_off;
    205       Int   sp_off;
    206       Int   bp_off;
    207    }
    208    DiCfSI;
    209 #elif defined(VGA_arm)
    210 typedef
    211    struct {
    212       Addr  base;
    213       UInt  len;
    214       UChar cfa_how; /* a CFIC_ value */
    215       UChar ra_how;  /* a CFIR_ value */
    216       UChar r14_how; /* a CFIR_ value */
    217       UChar r13_how; /* a CFIR_ value */
    218       UChar r12_how; /* a CFIR_ value */
    219       UChar r11_how; /* a CFIR_ value */
    220       UChar r7_how;  /* a CFIR_ value */
    221       Int   cfa_off;
    222       Int   ra_off;
    223       Int   r14_off;
    224       Int   r13_off;
    225       Int   r12_off;
    226       Int   r11_off;
    227       Int   r7_off;
    228    }
    229    DiCfSI;
    230 #elif defined(VGA_ppc32) || defined(VGA_ppc64)
    231 /* Just have a struct with the common fields in, so that code that
    232    processes the common fields doesn't have to be ifdef'd against
    233    VGP_/VGA_ symbols.  These are not used in any way on ppc32/64-linux
    234    at the moment. */
    235 typedef
    236    struct {
    237       Addr  base;
    238       UInt  len;
    239       UChar cfa_how; /* a CFIC_ value */
    240       UChar ra_how;  /* a CFIR_ value */
    241       Int   cfa_off;
    242       Int   ra_off;
    243    }
    244    DiCfSI;
    245 #elif defined(VGA_s390x)
    246 typedef
    247    struct {
    248       Addr  base;
    249       UInt  len;
    250       UChar cfa_how; /* a CFIC_ value */
    251       UChar sp_how;  /* a CFIR_ value */
    252       UChar ra_how;  /* a CFIR_ value */
    253       UChar fp_how;  /* a CFIR_ value */
    254       Int   cfa_off;
    255       Int   sp_off;
    256       Int   ra_off;
    257       Int   fp_off;
    258    }
    259    DiCfSI;
    260 #else
    261 #  error "Unknown arch"
    262 #endif
    263 
    264 
    265 typedef
    266    enum {
    267       Cop_Add=0x321,
    268       Cop_Sub,
    269       Cop_And,
    270       Cop_Mul,
    271       Cop_Shl,
    272       Cop_Shr,
    273       Cop_Eq,
    274       Cop_Ge,
    275       Cop_Gt,
    276       Cop_Le,
    277       Cop_Lt,
    278       Cop_Ne
    279    }
    280    CfiOp;
    281 
    282 typedef
    283    enum {
    284       Creg_IA_SP=0x213,
    285       Creg_IA_BP,
    286       Creg_IA_IP,
    287       Creg_ARM_R13,
    288       Creg_ARM_R12,
    289       Creg_ARM_R15,
    290       Creg_ARM_R14,
    291       Creg_S390_R14
    292    }
    293    CfiReg;
    294 
    295 typedef
    296    enum {
    297       Cex_Undef=0x123,
    298       Cex_Deref,
    299       Cex_Const,
    300       Cex_Binop,
    301       Cex_CfiReg,
    302       Cex_DwReg
    303    }
    304    CfiExprTag;
    305 
    306 typedef
    307    struct {
    308       CfiExprTag tag;
    309       union {
    310          struct {
    311          } Undef;
    312          struct {
    313             Int ixAddr;
    314          } Deref;
    315          struct {
    316             UWord con;
    317          } Const;
    318          struct {
    319             CfiOp op;
    320             Int ixL;
    321             Int ixR;
    322          } Binop;
    323          struct {
    324             CfiReg reg;
    325          } CfiReg;
    326          struct {
    327             Int reg;
    328          } DwReg;
    329       }
    330       Cex;
    331    }
    332    CfiExpr;
    333 
    334 extern Int ML_(CfiExpr_Undef) ( XArray* dst );
    335 extern Int ML_(CfiExpr_Deref) ( XArray* dst, Int ixAddr );
    336 extern Int ML_(CfiExpr_Const) ( XArray* dst, UWord con );
    337 extern Int ML_(CfiExpr_Binop) ( XArray* dst, CfiOp op, Int ixL, Int ixR );
    338 extern Int ML_(CfiExpr_CfiReg)( XArray* dst, CfiReg reg );
    339 extern Int ML_(CfiExpr_DwReg) ( XArray* dst, Int reg );
    340 
    341 extern void ML_(ppCfiExpr)( XArray* src, Int ix );
    342 
    343 /* ---------------- FPO INFO (Windows PE) -------------- */
    344 
    345 /* for apps using Wine: MSVC++ PDB FramePointerOmitted: somewhat like
    346    a primitive CFI */
    347 typedef
    348    struct _FPO_DATA {  /* 16 bytes */
    349       UInt   ulOffStart; /* offset of 1st byte of function code */
    350       UInt   cbProcSize; /* # bytes in function */
    351       UInt   cdwLocals;  /* # bytes/4 in locals */
    352       UShort cdwParams;  /* # bytes/4 in params */
    353       UChar  cbProlog;   /* # bytes in prolog */
    354       UChar  cbRegs :3;  /* # regs saved */
    355       UChar  fHasSEH:1;  /* Structured Exception Handling */
    356       UChar  fUseBP :1;  /* EBP has been used */
    357       UChar  reserved:1;
    358       UChar  cbFrame:2;  /* frame type */
    359    }
    360    FPO_DATA;
    361 
    362 #define PDB_FRAME_FPO  0
    363 #define PDB_FRAME_TRAP 1
    364 #define PDB_FRAME_TSS  2
    365 
    366 /* --------------------- VARIABLES --------------------- */
    367 
    368 typedef
    369    struct {
    370       Addr    aMin;
    371       Addr    aMax;
    372       XArray* /* of DiVariable */ vars;
    373    }
    374    DiAddrRange;
    375 
    376 typedef
    377    struct {
    378       UChar* name;  /* in DebugInfo.strchunks */
    379       UWord  typeR; /* a cuOff */
    380       GExpr* gexpr; /* on DebugInfo.gexprs list */
    381       GExpr* fbGX;  /* SHARED. */
    382       UChar* fileName; /* where declared; may be NULL. in
    383                           DebugInfo.strchunks */
    384       Int    lineNo;   /* where declared; may be zero. */
    385    }
    386    DiVariable;
    387 
    388 Word
    389 ML_(cmp_for_DiAddrRange_range) ( const void* keyV, const void* elemV );
    390 
    391 /* --------------------- DEBUGINFO --------------------- */
    392 
    393 /* This is the top-level data type.  It's a structure which contains
    394    information pertaining to one mapped ELF object.  This type is
    395    exported only abstractly - in pub_tool_debuginfo.h. */
    396 
    397 /* First though, here's an auxiliary data structure.  It is only ever
    398    used as part of a struct _DebugInfo.  We use it to record
    399    observations about mappings and permission changes to the
    400    associated file, so as to decide when to read debug info.  It's
    401    essentially an ultra-trivial finite state machine which, when it
    402    reaches an accept state, signals that we should now read debug info
    403    from the object into the associated struct _DebugInfo.  The accept
    404    state is arrived at when have_rx_map and have_rw_map both become
    405    true.  The initial state is one in which we have no observations,
    406    so have_rx_map and have_rw_map are both false.
    407 
    408    This is all rather ad-hoc; for example it has no way to record more
    409    than one rw or rx mapping for a given object, not because such
    410    events have never been observed, but because we've never needed to
    411    note more than the first one of any such in order when to decide to
    412    read debug info.  It may be that in future we need to track more
    413    state in order to make the decision, so this struct would then get
    414    expanded.
    415 
    416    The normal sequence of events is one of
    417 
    418    start  -->  r-x mapping  -->  rw- mapping  -->  accept
    419    start  -->  rw- mapping  -->  r-x mapping  -->  accept
    420 
    421    that is, take the first r-x and rw- mapping we see, and we're done.
    422 
    423    On MacOSX 10.7, 32-bit, there appears to be a new variant:
    424 
    425    start  -->  r-- mapping  -->  rw- mapping
    426           -->  upgrade r-- mapping to r-x mapping  -->  accept
    427 
    428    where the upgrade is done by a call to vm_protect.  Hence we
    429    need to also track this possibility.
    430 */
    431 struct _DebugInfoFSM
    432 {
    433    /* --- all targets --- */
    434    UChar* filename; /* in mallocville (VG_AR_DINFO) */
    435 
    436    Bool  have_rx_map; /* did we see a r?x mapping yet for the file? */
    437    Bool  have_rw_map; /* did we see a rw? mapping yet for the file? */
    438 
    439    Addr  rx_map_avma; /* these fields record the file offset, length */
    440    SizeT rx_map_size; /* and map address of the r?x mapping we believe */
    441    OffT  rx_map_foff; /* is the .text segment mapping */
    442 
    443    Addr  rw_map_avma; /* ditto, for the rw? mapping we believe is the */
    444    SizeT rw_map_size; /* .data segment mapping */
    445    OffT  rw_map_foff;
    446 
    447    /* --- OSX 10.7, 32-bit only --- */
    448    Bool  have_ro_map; /* did we see a r-- mapping yet for the file? */
    449 
    450    Addr  ro_map_avma; /* file offset, length, avma for said mapping */
    451    SizeT ro_map_size;
    452    OffT  ro_map_foff;
    453 };
    454 
    455 
    456 /* To do with the string table in struct _DebugInfo (::strchunks) */
    457 #define SEGINFO_STRCHUNKSIZE (64*1024)
    458 
    459 
    460 /* We may encounter more than one .eh_frame section in an object --
    461    unusual but apparently allowed by ELF.  See
    462    http://sourceware.org/bugzilla/show_bug.cgi?id=12675
    463 */
    464 #define N_EHFRAME_SECTS 2
    465 
    466 
    467 /* So, the main structure for holding debug info for one object. */
    468 
    469 struct _DebugInfo {
    470 
    471    /* Admin stuff */
    472 
    473    struct _DebugInfo* next;   /* list of DebugInfos */
    474    Bool               mark;   /* marked for deletion? */
    475 
    476    /* An abstract handle, which can be used by entities outside of
    477       m_debuginfo to (in an abstract datatype sense) refer to this
    478       struct _DebugInfo.  A .handle of zero is invalid; valid handles
    479       are 1 and above.  The same handle is never issued twice (in any
    480       given run of Valgrind), so a handle becomes invalid when the
    481       associated struct _DebugInfo is discarded, and remains invalid
    482       forever thereafter.  The .handle field is set as soon as this
    483       structure is allocated. */
    484    ULong handle;
    485 
    486    /* Used for debugging only - indicate what stuff to dump whilst
    487       reading stuff into the seginfo.  Are computed as early in the
    488       lifetime of the DebugInfo as possible -- at the point when it is
    489       created.  Use these when deciding what to spew out; do not use
    490       the global VG_(clo_blah) flags. */
    491 
    492    Bool trace_symtab; /* symbols, our style */
    493    Bool trace_cfi;    /* dwarf frame unwind, our style */
    494    Bool ddump_syms;   /* mimic /usr/bin/readelf --syms */
    495    Bool ddump_line;   /* mimic /usr/bin/readelf --debug-dump=line */
    496    Bool ddump_frames; /* mimic /usr/bin/readelf --debug-dump=frames */
    497 
    498    /* The "decide when it is time to read debuginfo" state machine.
    499       This structure must get filled in before we can start reading
    500       anything from the ELF/MachO file.  This structure is filled in
    501       by VG_(di_notify_mmap) and its immediate helpers. */
    502    struct _DebugInfoFSM fsm;
    503 
    504    /* Once the ::fsm has reached an accept state -- typically, when
    505       both a rw? and r?x mapping for .filename have been observed --
    506       we can go on to read the symbol tables and debug info.
    507       .have_dinfo changes from False to True when the debug info has
    508       been completely read in and postprocessed (canonicalised) and is
    509       now suitable for querying. */
    510    /* If have_dinfo is False, then all fields below this point are
    511       invalid and should not be consulted. */
    512    Bool  have_dinfo; /* initially False */
    513 
    514    /* All the rest of the fields in this structure are filled in once
    515       we have committed to reading the symbols and debug info (that
    516       is, at the point where .have_dinfo is set to True). */
    517 
    518    /* The file's soname.  FIXME: ensure this is always allocated in
    519       VG_AR_DINFO. */
    520    UChar* soname;
    521 
    522    /* Description of some important mapped segments.  The presence or
    523       absence of the mapping is denoted by the _present field, since
    524       in some obscure circumstances (to do with data/sdata/bss) it is
    525       possible for the mapping to be present but have zero size.
    526       Certainly text_ is mandatory on all platforms; not sure about
    527       the rest though.
    528 
    529       --------------------------------------------------------
    530 
    531       Comment_on_IMPORTANT_CFSI_REPRESENTATIONAL_INVARIANTS: we require that
    532 
    533       either (rx_map_size == 0 && cfsi == NULL) (the degenerate case)
    534 
    535       or the normal case, which is the AND of the following:
    536       (0) rx_map_size > 0
    537       (1) no two DebugInfos with rx_map_size > 0
    538           have overlapping [rx_map_avma,+rx_map_size)
    539       (2) [cfsi_minavma,cfsi_maxavma] does not extend
    540           beyond [rx_map_avma,+rx_map_size); that is, the former is a
    541           subrange or equal to the latter.
    542       (3) all DiCfSI in the cfsi array all have ranges that fall within
    543           [rx_map_avma,+rx_map_size).
    544       (4) all DiCfSI in the cfsi array are non-overlapping
    545 
    546       The cumulative effect of these restrictions is to ensure that
    547       all the DiCfSI records in the entire system are non overlapping.
    548       Hence any address falls into either exactly one DiCfSI record,
    549       or none.  Hence it is safe to cache the results of searches for
    550       DiCfSI records.  This is the whole point of these restrictions.
    551       The caching of DiCfSI searches is done in VG_(use_CF_info).  The
    552       cache is flushed after any change to debugInfo_list.  DiCfSI
    553       searches are cached because they are central to stack unwinding
    554       on amd64-linux.
    555 
    556       Where are these invariants imposed and checked?
    557 
    558       They are checked after a successful read of debuginfo into
    559       a DebugInfo*, in check_CFSI_related_invariants.
    560 
    561       (1) is not really imposed anywhere.  We simply assume that the
    562       kernel will not map the text segments from two different objects
    563       into the same space.  Sounds reasonable.
    564 
    565       (2) follows from (4) and (3).  It is ensured by canonicaliseCFI.
    566       (3) is ensured by ML_(addDiCfSI).
    567       (4) is ensured by canonicaliseCFI.
    568 
    569       --------------------------------------------------------
    570 
    571       Comment_on_DEBUG_SVMA_and_DEBUG_BIAS_fields:
    572 
    573       The _debug_{svma,bias} fields were added as part of a fix to
    574       #185816.  The problem encompassed in that bug report was that it
    575       wasn't correct to use apply the bias values deduced for a
    576       primary object to its associated debuginfo object, because the
    577       debuginfo object (or the primary) could have been prelinked to a
    578       different SVMA.  Hence debuginfo and primary objects need to
    579       have their own biases.
    580 
    581       ------ JRS: (referring to r9329): ------
    582       Let me see if I understand the workings correctly.  Initially
    583       the _debug_ values are set to the same values as the "normal"
    584       ones, as there's a bunch of bits of code like this (in
    585       readelf.c)
    586 
    587          di->text_svma = svma;
    588          ...
    589          di->text_bias = rx_bias;
    590          di->text_debug_svma = svma;
    591          di->text_debug_bias = rx_bias;
    592 
    593       If a debuginfo object subsequently shows up then the
    594       _debug_svma/bias are set for the debuginfo object.  Result is
    595       that if there's no debuginfo object then the values are the same
    596       as the primary-object values, and if there is a debuginfo object
    597       then they will (or at least may) be different.
    598 
    599       Then when we need to actually bias something, we'll have to
    600       decide whether to use the primary bias or the debuginfo bias.
    601       And the strategy is to use the primary bias for ELF symbols but
    602       the debuginfo bias for anything pulled out of Dwarf.
    603 
    604       ------ THH: ------
    605       Correct - the debug_svma and bias values apply to any address
    606       read from the debug data regardless of where that debug data is
    607       stored and the other values are used for addresses from other
    608       places (primarily the symbol table).
    609 
    610       ------ JRS: ------
    611       Ok; so this was my only area of concern.  Are there any
    612       corner-case scenarios where this wouldn't be right?  It sounds
    613       like we're assuming the ELF symbols come from the primary object
    614       and, if there is a debug object, then all the Dwarf comes from
    615       there.  But what if (eg) both symbols and Dwarf come from the
    616       debug object?  Is that even possible or allowable?
    617 
    618       ------ THH: ------
    619       You may have a point...
    620 
    621       The current logic is to try and take any one set of data from
    622       either the base object or the debug object. There are four sets
    623       of data we consider:
    624 
    625          - Symbol Table
    626          - Stabs
    627          - DWARF1
    628          - DWARF2
    629 
    630       If we see the primary section for a given set in the base object
    631       then we ignore all sections relating to that set in the debug
    632       object.
    633 
    634       Now in principle if we saw a secondary section (like debug_line
    635       say) in the base object, but not the main section (debug_info in
    636       this case) then we would take debug_info from the debug object
    637       but would use the debug_line from the base object unless we saw
    638       a replacement copy in the debug object. That's probably unlikely
    639       however.
    640 
    641       A bigger issue might be, as you say, the symbol table as we will
    642       pick that up from the debug object if it isn't in the base. The
    643       dynamic symbol table will always have to be in the base object
    644       though so we will have to be careful when processing symbols to
    645       know which table we are reading in that case.
    646 
    647       What we probably need to do is tell read_elf_symtab which object
    648       the symbols it is being asked to read came from.
    649 
    650       (A followup patch to deal with this was committed in r9469).
    651    */
    652    /* .text */
    653    Bool     text_present;
    654    Addr     text_avma;
    655    Addr     text_svma;
    656    SizeT    text_size;
    657    PtrdiffT text_bias;
    658    Addr     text_debug_svma;
    659    PtrdiffT text_debug_bias;
    660    /* .data */
    661    Bool     data_present;
    662    Addr     data_svma;
    663    Addr     data_avma;
    664    SizeT    data_size;
    665    PtrdiffT data_bias;
    666    Addr     data_debug_svma;
    667    PtrdiffT data_debug_bias;
    668    /* .sdata */
    669    Bool     sdata_present;
    670    Addr     sdata_svma;
    671    Addr     sdata_avma;
    672    SizeT    sdata_size;
    673    PtrdiffT sdata_bias;
    674    Addr     sdata_debug_svma;
    675    PtrdiffT sdata_debug_bias;
    676    /* .rodata */
    677    Bool     rodata_present;
    678    Addr     rodata_svma;
    679    Addr     rodata_avma;
    680    SizeT    rodata_size;
    681    PtrdiffT rodata_bias;
    682    Addr     rodata_debug_svma;
    683    PtrdiffT rodata_debug_bias;
    684    /* .bss */
    685    Bool     bss_present;
    686    Addr     bss_svma;
    687    Addr     bss_avma;
    688    SizeT    bss_size;
    689    PtrdiffT bss_bias;
    690    Addr     bss_debug_svma;
    691    PtrdiffT bss_debug_bias;
    692    /* .sbss */
    693    Bool     sbss_present;
    694    Addr     sbss_svma;
    695    Addr     sbss_avma;
    696    SizeT    sbss_size;
    697    PtrdiffT sbss_bias;
    698    Addr     sbss_debug_svma;
    699    PtrdiffT sbss_debug_bias;
    700    /* .plt */
    701    Bool   plt_present;
    702    Addr	  plt_avma;
    703    SizeT  plt_size;
    704    /* .got */
    705    Bool   got_present;
    706    Addr   got_avma;
    707    SizeT  got_size;
    708    /* .got.plt */
    709    Bool   gotplt_present;
    710    Addr   gotplt_avma;
    711    SizeT  gotplt_size;
    712    /* .opd -- needed on ppc64-linux for finding symbols */
    713    Bool   opd_present;
    714    Addr   opd_avma;
    715    SizeT  opd_size;
    716    /* .ehframe -- needed on amd64-linux for stack unwinding.  We might
    717       see more than one, hence the arrays. */
    718    UInt   n_ehframe;  /* 0 .. N_EHFRAME_SECTS */
    719    Addr   ehframe_avma[N_EHFRAME_SECTS];
    720    SizeT  ehframe_size[N_EHFRAME_SECTS];
    721 
    722    /* Sorted tables of stuff we snarfed from the file.  This is the
    723       eventual product of reading the debug info.  All this stuff
    724       lives in VG_AR_DINFO. */
    725 
    726    /* An expandable array of symbols. */
    727    DiSym*  symtab;
    728    UWord   symtab_used;
    729    UWord   symtab_size;
    730    /* An expandable array of locations. */
    731    DiLoc*  loctab;
    732    UWord   loctab_used;
    733    UWord   loctab_size;
    734    /* An expandable array of CFI summary info records.  Also includes
    735       summary address bounds, showing the min and max address covered
    736       by any of the records, as an aid to fast searching.  And, if the
    737       records require any expression nodes, they are stored in
    738       cfsi_exprs. */
    739    DiCfSI* cfsi;
    740    UWord   cfsi_used;
    741    UWord   cfsi_size;
    742    Addr    cfsi_minavma;
    743    Addr    cfsi_maxavma;
    744    XArray* cfsi_exprs; /* XArray of CfiExpr */
    745 
    746    /* Optimized code under Wine x86: MSVC++ PDB FramePointerOmitted
    747       data.  Non-expandable array, hence .size == .used. */
    748    FPO_DATA* fpo;
    749    UWord     fpo_size;
    750    Addr      fpo_minavma;
    751    Addr      fpo_maxavma;
    752 
    753    /* Expandable arrays of characters -- the string table.  Pointers
    754       into this are stable (the arrays are not reallocated). */
    755    struct strchunk {
    756       UInt   strtab_used;
    757       struct strchunk* next;
    758       UChar  strtab[SEGINFO_STRCHUNKSIZE];
    759    } *strchunks;
    760 
    761    /* Variable scope information, as harvested from Dwarf3 files.
    762 
    763       In short it's an
    764 
    765          array of (array of PC address ranges and variables)
    766 
    767       The outer array indexes over scopes, with Entry 0 containing
    768       information on variables which exist for any value of the program
    769       counter (PC) -- that is, the outermost scope.  Entries 1, 2, 3,
    770       etc contain information on increasinly deeply nested variables.
    771 
    772       Each inner array is an array of (an address range, and a set
    773       of variables that are in scope over that address range).
    774 
    775       The address ranges may not overlap.
    776 
    777       Since Entry 0 in the outer array holds information on variables
    778       that exist for any value of the PC (that is, global vars), it
    779       follows that Entry 0's inner array can only have one address
    780       range pair, one that covers the entire address space.
    781    */
    782    XArray* /* of OSet of DiAddrRange */varinfo;
    783 
    784    /* These are arrays of the relevant typed objects, held here
    785       partially for the purposes of visiting each object exactly once
    786       when we need to delete them. */
    787 
    788    /* An array of TyEnts.  These are needed to make sense of any types
    789       in the .varinfo.  Also, when deleting this DebugInfo, we must
    790       first traverse this array and throw away malloc'd stuff hanging
    791       off it -- by calling ML_(TyEnt__make_EMPTY) on each entry. */
    792    XArray* /* of TyEnt */ admin_tyents;
    793 
    794    /* An array of guarded DWARF3 expressions. */
    795    XArray* admin_gexprs;
    796 };
    797 
    798 /* --------------------- functions --------------------- */
    799 
    800 /* ------ Adding ------ */
    801 
    802 /* Add a symbol to si's symbol table.  The contents of 'sym' are
    803    copied.  It is assumed (and checked) that 'sym' only contains one
    804    name, so there is no auxiliary ::sec_names vector to duplicate.
    805    IOW, the copy is a shallow copy, and there are assertions in place
    806    to ensure that's OK. */
    807 extern void ML_(addSym) ( struct _DebugInfo* di, DiSym* sym );
    808 
    809 /* Add a line-number record to a DebugInfo. */
    810 extern
    811 void ML_(addLineInfo) ( struct _DebugInfo* di,
    812                         UChar*   filename,
    813                         UChar*   dirname,  /* NULL is allowable */
    814                         Addr this, Addr next, Int lineno, Int entry);
    815 
    816 /* Add a CFI summary record.  The supplied DiCfSI is copied. */
    817 extern void ML_(addDiCfSI) ( struct _DebugInfo* di, DiCfSI* cfsi );
    818 
    819 /* Add a string to the string table of a DebugInfo.  If len==-1,
    820    ML_(addStr) will itself measure the length of the string. */
    821 extern UChar* ML_(addStr) ( struct _DebugInfo* di, UChar* str, Int len );
    822 
    823 extern void ML_(addVar)( struct _DebugInfo* di,
    824                          Int    level,
    825                          Addr   aMin,
    826                          Addr   aMax,
    827                          UChar* name,
    828                          UWord  typeR, /* a cuOff */
    829                          GExpr* gexpr,
    830                          GExpr* fbGX, /* SHARED. */
    831                          UChar* fileName, /* where decl'd - may be NULL */
    832                          Int    lineNo, /* where decl'd - may be zero */
    833                          Bool   show );
    834 
    835 /* Canonicalise the tables held by 'di', in preparation for use.  Call
    836    this after finishing adding entries to these tables. */
    837 extern void ML_(canonicaliseTables) ( struct _DebugInfo* di );
    838 
    839 /* Canonicalise the call-frame-info table held by 'di', in preparation
    840    for use. This is called by ML_(canonicaliseTables) but can also be
    841    called on it's own to sort just this table. */
    842 extern void ML_(canonicaliseCFI) ( struct _DebugInfo* di );
    843 
    844 /* ------ Searching ------ */
    845 
    846 /* Find a symbol-table index containing the specified pointer, or -1
    847    if not found.  Binary search.  */
    848 extern Word ML_(search_one_symtab) ( struct _DebugInfo* di, Addr ptr,
    849                                      Bool match_anywhere_in_sym,
    850                                      Bool findText );
    851 
    852 /* Find a location-table index containing the specified pointer, or -1
    853    if not found.  Binary search.  */
    854 extern Word ML_(search_one_loctab) ( struct _DebugInfo* di, Addr ptr );
    855 
    856 /* Find a CFI-table index containing the specified pointer, or -1 if
    857    not found.  Binary search.  */
    858 extern Word ML_(search_one_cfitab) ( struct _DebugInfo* di, Addr ptr );
    859 
    860 /* Find a FPO-table index containing the specified pointer, or -1
    861    if not found.  Binary search.  */
    862 extern Word ML_(search_one_fpotab) ( struct _DebugInfo* di, Addr ptr );
    863 
    864 /* ------ Misc ------ */
    865 
    866 /* Show a non-fatal debug info reading error.  Use vg_panic if
    867    terminal.  'serious' errors are always shown, not 'serious' ones
    868    are shown only at verbosity level 2 and above. */
    869 extern
    870 void ML_(symerr) ( struct _DebugInfo* di, Bool serious, HChar* msg );
    871 
    872 /* Print a symbol. */
    873 extern void ML_(ppSym) ( Int idx, DiSym* sym );
    874 
    875 /* Print a call-frame-info summary. */
    876 extern void ML_(ppDiCfSI) ( XArray* /* of CfiExpr */ exprs, DiCfSI* si );
    877 
    878 
    879 #define TRACE_SYMTAB(format, args...) \
    880    if (di->trace_symtab) { VG_(printf)(format, ## args); }
    881 
    882 
    883 #endif /* ndef __PRIV_STORAGE_H */
    884 
    885 /*--------------------------------------------------------------------*/
    886 /*--- end                                                          ---*/
    887 /*--------------------------------------------------------------------*/
    888