Home | History | Annotate | Line # | Download | only in libbacktrace
      1   1.1     mrg /* elf.c -- Get debug data from an ELF file for backtraces.
      2  1.10     mrg    Copyright (C) 2012-2022 Free Software Foundation, Inc.
      3   1.1     mrg    Written by Ian Lance Taylor, Google.
      4   1.1     mrg 
      5   1.1     mrg Redistribution and use in source and binary forms, with or without
      6   1.1     mrg modification, are permitted provided that the following conditions are
      7   1.1     mrg met:
      8   1.1     mrg 
      9   1.1     mrg     (1) Redistributions of source code must retain the above copyright
     10   1.6     mrg     notice, this list of conditions and the following disclaimer.
     11   1.1     mrg 
     12   1.1     mrg     (2) Redistributions in binary form must reproduce the above copyright
     13   1.1     mrg     notice, this list of conditions and the following disclaimer in
     14   1.1     mrg     the documentation and/or other materials provided with the
     15   1.6     mrg     distribution.
     16   1.6     mrg 
     17   1.1     mrg     (3) The name of the author may not be used to
     18   1.1     mrg     endorse or promote products derived from this software without
     19   1.1     mrg     specific prior written permission.
     20   1.1     mrg 
     21   1.1     mrg THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
     22   1.1     mrg IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
     23   1.1     mrg WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
     24   1.1     mrg DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
     25   1.1     mrg INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
     26   1.1     mrg (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
     27   1.1     mrg SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     28   1.1     mrg HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
     29   1.1     mrg STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
     30   1.1     mrg IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     31   1.1     mrg POSSIBILITY OF SUCH DAMAGE.  */
     32   1.1     mrg 
     33   1.1     mrg #include "config.h"
     34   1.1     mrg 
     35   1.7     mrg #include <errno.h>
     36   1.1     mrg #include <stdlib.h>
     37   1.1     mrg #include <string.h>
     38   1.1     mrg #include <sys/types.h>
     39   1.7     mrg #include <sys/stat.h>
     40   1.7     mrg #include <unistd.h>
     41   1.1     mrg 
     42   1.1     mrg #ifdef HAVE_DL_ITERATE_PHDR
     43   1.1     mrg #include <link.h>
     44   1.1     mrg #endif
     45   1.1     mrg 
     46   1.1     mrg #include "backtrace.h"
     47   1.1     mrg #include "internal.h"
     48   1.1     mrg 
     49   1.7     mrg #ifndef S_ISLNK
     50   1.7     mrg  #ifndef S_IFLNK
     51   1.7     mrg   #define S_IFLNK 0120000
     52   1.7     mrg  #endif
     53   1.7     mrg  #ifndef S_IFMT
     54   1.7     mrg   #define S_IFMT 0170000
     55   1.7     mrg  #endif
     56   1.7     mrg  #define S_ISLNK(m) (((m) & S_IFMT) == S_IFLNK)
     57   1.7     mrg #endif
     58   1.7     mrg 
     59   1.7     mrg #ifndef __GNUC__
     60   1.7     mrg #define __builtin_prefetch(p, r, l)
     61   1.7     mrg #define unlikely(x) (x)
     62   1.7     mrg #else
     63   1.7     mrg #define unlikely(x) __builtin_expect(!!(x), 0)
     64   1.7     mrg #endif
     65   1.7     mrg 
     66   1.7     mrg #if !defined(HAVE_DECL_STRNLEN) || !HAVE_DECL_STRNLEN
     67   1.7     mrg 
     68   1.7     mrg /* If strnlen is not declared, provide our own version.  */
     69   1.7     mrg 
     70   1.7     mrg static size_t
     71   1.7     mrg xstrnlen (const char *s, size_t maxlen)
     72   1.7     mrg {
     73   1.7     mrg   size_t i;
     74   1.7     mrg 
     75   1.7     mrg   for (i = 0; i < maxlen; ++i)
     76   1.7     mrg     if (s[i] == '\0')
     77   1.7     mrg       break;
     78   1.7     mrg   return i;
     79   1.7     mrg }
     80   1.7     mrg 
     81   1.7     mrg #define strnlen xstrnlen
     82   1.7     mrg 
     83   1.7     mrg #endif
     84   1.7     mrg 
     85   1.7     mrg #ifndef HAVE_LSTAT
     86   1.7     mrg 
     87   1.7     mrg /* Dummy version of lstat for systems that don't have it.  */
     88   1.7     mrg 
     89   1.7     mrg static int
     90   1.7     mrg xlstat (const char *path ATTRIBUTE_UNUSED, struct stat *st ATTRIBUTE_UNUSED)
     91   1.7     mrg {
     92   1.7     mrg   return -1;
     93   1.7     mrg }
     94   1.7     mrg 
     95   1.7     mrg #define lstat xlstat
     96   1.7     mrg 
     97   1.7     mrg #endif
     98   1.7     mrg 
     99   1.7     mrg #ifndef HAVE_READLINK
    100   1.7     mrg 
    101   1.7     mrg /* Dummy version of readlink for systems that don't have it.  */
    102   1.7     mrg 
    103   1.7     mrg static ssize_t
    104   1.7     mrg xreadlink (const char *path ATTRIBUTE_UNUSED, char *buf ATTRIBUTE_UNUSED,
    105   1.7     mrg 	   size_t bufsz ATTRIBUTE_UNUSED)
    106   1.7     mrg {
    107   1.7     mrg   return -1;
    108   1.7     mrg }
    109   1.7     mrg 
    110   1.7     mrg #define readlink xreadlink
    111   1.7     mrg 
    112   1.7     mrg #endif
    113   1.7     mrg 
    114   1.1     mrg #ifndef HAVE_DL_ITERATE_PHDR
    115   1.1     mrg 
    116   1.1     mrg /* Dummy version of dl_iterate_phdr for systems that don't have it.  */
    117   1.1     mrg 
    118   1.1     mrg #define dl_phdr_info x_dl_phdr_info
    119   1.1     mrg #define dl_iterate_phdr x_dl_iterate_phdr
    120   1.1     mrg 
    121   1.1     mrg struct dl_phdr_info
    122   1.1     mrg {
    123   1.1     mrg   uintptr_t dlpi_addr;
    124   1.1     mrg   const char *dlpi_name;
    125   1.1     mrg };
    126   1.1     mrg 
    127   1.1     mrg static int
    128   1.1     mrg dl_iterate_phdr (int (*callback) (struct dl_phdr_info *,
    129   1.1     mrg 				  size_t, void *) ATTRIBUTE_UNUSED,
    130   1.1     mrg 		 void *data ATTRIBUTE_UNUSED)
    131   1.1     mrg {
    132   1.1     mrg   return 0;
    133   1.1     mrg }
    134   1.1     mrg 
    135   1.1     mrg #endif /* ! defined (HAVE_DL_ITERATE_PHDR) */
    136   1.1     mrg 
    137   1.1     mrg /* The configure script must tell us whether we are 32-bit or 64-bit
    138   1.1     mrg    ELF.  We could make this code test and support either possibility,
    139   1.1     mrg    but there is no point.  This code only works for the currently
    140   1.1     mrg    running executable, which means that we know the ELF mode at
    141   1.7     mrg    configure time.  */
    142   1.1     mrg 
    143   1.1     mrg #if BACKTRACE_ELF_SIZE != 32 && BACKTRACE_ELF_SIZE != 64
    144   1.1     mrg #error "Unknown BACKTRACE_ELF_SIZE"
    145   1.1     mrg #endif
    146   1.1     mrg 
    147   1.1     mrg /* <link.h> might #include <elf.h> which might define our constants
    148   1.1     mrg    with slightly different values.  Undefine them to be safe.  */
    149   1.1     mrg 
    150   1.1     mrg #undef EI_NIDENT
    151   1.1     mrg #undef EI_MAG0
    152   1.1     mrg #undef EI_MAG1
    153   1.1     mrg #undef EI_MAG2
    154   1.1     mrg #undef EI_MAG3
    155   1.1     mrg #undef EI_CLASS
    156   1.1     mrg #undef EI_DATA
    157   1.1     mrg #undef EI_VERSION
    158  1.11  jkoshy #undef ELFMAG0
    159  1.11  jkoshy #undef ELFMAG1
    160  1.11  jkoshy #undef ELFMAG2
    161  1.11  jkoshy #undef ELFMAG3
    162   1.1     mrg #undef ELFCLASS32
    163   1.1     mrg #undef ELFCLASS64
    164   1.1     mrg #undef ELFDATA2LSB
    165   1.1     mrg #undef ELFDATA2MSB
    166   1.1     mrg #undef EV_CURRENT
    167   1.3     mrg #undef ET_DYN
    168   1.7     mrg #undef EM_PPC64
    169   1.7     mrg #undef EF_PPC64_ABI
    170   1.1     mrg #undef SHN_LORESERVE
    171   1.1     mrg #undef SHN_XINDEX
    172   1.3     mrg #undef SHN_UNDEF
    173   1.7     mrg #undef SHT_PROGBITS
    174   1.1     mrg #undef SHT_SYMTAB
    175   1.1     mrg #undef SHT_STRTAB
    176   1.1     mrg #undef SHT_DYNSYM
    177   1.6     mrg #undef SHF_COMPRESSED
    178   1.3     mrg #undef STT_OBJECT
    179   1.1     mrg #undef STT_FUNC
    180   1.7     mrg #undef NT_GNU_BUILD_ID
    181   1.7     mrg #undef ELFCOMPRESS_ZLIB
    182   1.1     mrg 
    183   1.1     mrg /* Basic types.  */
    184   1.1     mrg 
    185   1.1     mrg typedef uint16_t b_elf_half;    /* Elf_Half.  */
    186   1.1     mrg typedef uint32_t b_elf_word;    /* Elf_Word.  */
    187   1.1     mrg typedef int32_t  b_elf_sword;   /* Elf_Sword.  */
    188   1.1     mrg 
    189   1.1     mrg #if BACKTRACE_ELF_SIZE == 32
    190   1.1     mrg 
    191   1.1     mrg typedef uint32_t b_elf_addr;    /* Elf_Addr.  */
    192   1.1     mrg typedef uint32_t b_elf_off;     /* Elf_Off.  */
    193   1.1     mrg 
    194   1.1     mrg typedef uint32_t b_elf_wxword;  /* 32-bit Elf_Word, 64-bit ELF_Xword.  */
    195   1.1     mrg 
    196   1.1     mrg #else
    197   1.1     mrg 
    198   1.1     mrg typedef uint64_t b_elf_addr;    /* Elf_Addr.  */
    199   1.1     mrg typedef uint64_t b_elf_off;     /* Elf_Off.  */
    200   1.1     mrg typedef uint64_t b_elf_xword;   /* Elf_Xword.  */
    201   1.1     mrg typedef int64_t  b_elf_sxword;  /* Elf_Sxword.  */
    202   1.1     mrg 
    203   1.1     mrg typedef uint64_t b_elf_wxword;  /* 32-bit Elf_Word, 64-bit ELF_Xword.  */
    204   1.1     mrg 
    205   1.1     mrg #endif
    206   1.1     mrg 
    207   1.1     mrg /* Data structures and associated constants.  */
    208   1.1     mrg 
    209   1.1     mrg #define EI_NIDENT 16
    210   1.1     mrg 
    211   1.1     mrg typedef struct {
    212   1.1     mrg   unsigned char	e_ident[EI_NIDENT];	/* ELF "magic number" */
    213   1.1     mrg   b_elf_half	e_type;			/* Identifies object file type */
    214   1.1     mrg   b_elf_half	e_machine;		/* Specifies required architecture */
    215   1.1     mrg   b_elf_word	e_version;		/* Identifies object file version */
    216   1.1     mrg   b_elf_addr	e_entry;		/* Entry point virtual address */
    217   1.1     mrg   b_elf_off	e_phoff;		/* Program header table file offset */
    218   1.1     mrg   b_elf_off	e_shoff;		/* Section header table file offset */
    219   1.1     mrg   b_elf_word	e_flags;		/* Processor-specific flags */
    220   1.1     mrg   b_elf_half	e_ehsize;		/* ELF header size in bytes */
    221   1.1     mrg   b_elf_half	e_phentsize;		/* Program header table entry size */
    222   1.1     mrg   b_elf_half	e_phnum;		/* Program header table entry count */
    223   1.1     mrg   b_elf_half	e_shentsize;		/* Section header table entry size */
    224   1.1     mrg   b_elf_half	e_shnum;		/* Section header table entry count */
    225   1.1     mrg   b_elf_half	e_shstrndx;		/* Section header string table index */
    226   1.1     mrg } b_elf_ehdr;  /* Elf_Ehdr.  */
    227   1.1     mrg 
    228   1.1     mrg #define EI_MAG0 0
    229   1.1     mrg #define EI_MAG1 1
    230   1.1     mrg #define EI_MAG2 2
    231   1.1     mrg #define EI_MAG3 3
    232   1.1     mrg #define EI_CLASS 4
    233   1.1     mrg #define EI_DATA 5
    234   1.1     mrg #define EI_VERSION 6
    235   1.1     mrg 
    236   1.1     mrg #define ELFMAG0 0x7f
    237   1.1     mrg #define ELFMAG1 'E'
    238   1.1     mrg #define ELFMAG2 'L'
    239   1.1     mrg #define ELFMAG3 'F'
    240   1.1     mrg 
    241   1.1     mrg #define ELFCLASS32 1
    242   1.1     mrg #define ELFCLASS64 2
    243   1.1     mrg 
    244   1.1     mrg #define ELFDATA2LSB 1
    245   1.1     mrg #define ELFDATA2MSB 2
    246   1.1     mrg 
    247   1.1     mrg #define EV_CURRENT 1
    248   1.1     mrg 
    249   1.3     mrg #define ET_DYN 3
    250   1.3     mrg 
    251   1.7     mrg #define EM_PPC64 21
    252   1.7     mrg #define EF_PPC64_ABI 3
    253   1.7     mrg 
    254   1.1     mrg typedef struct {
    255   1.1     mrg   b_elf_word	sh_name;		/* Section name, index in string tbl */
    256   1.1     mrg   b_elf_word	sh_type;		/* Type of section */
    257   1.1     mrg   b_elf_wxword	sh_flags;		/* Miscellaneous section attributes */
    258   1.1     mrg   b_elf_addr	sh_addr;		/* Section virtual addr at execution */
    259   1.1     mrg   b_elf_off	sh_offset;		/* Section file offset */
    260   1.1     mrg   b_elf_wxword	sh_size;		/* Size of section in bytes */
    261   1.1     mrg   b_elf_word	sh_link;		/* Index of another section */
    262   1.1     mrg   b_elf_word	sh_info;		/* Additional section information */
    263   1.1     mrg   b_elf_wxword	sh_addralign;		/* Section alignment */
    264   1.1     mrg   b_elf_wxword	sh_entsize;		/* Entry size if section holds table */
    265   1.1     mrg } b_elf_shdr;  /* Elf_Shdr.  */
    266   1.1     mrg 
    267   1.3     mrg #define SHN_UNDEF	0x0000		/* Undefined section */
    268   1.1     mrg #define SHN_LORESERVE	0xFF00		/* Begin range of reserved indices */
    269   1.1     mrg #define SHN_XINDEX	0xFFFF		/* Section index is held elsewhere */
    270   1.1     mrg 
    271   1.7     mrg #define SHT_PROGBITS 1
    272   1.1     mrg #define SHT_SYMTAB 2
    273   1.1     mrg #define SHT_STRTAB 3
    274   1.1     mrg #define SHT_DYNSYM 11
    275   1.1     mrg 
    276   1.6     mrg #define SHF_COMPRESSED 0x800
    277   1.6     mrg 
    278   1.1     mrg #if BACKTRACE_ELF_SIZE == 32
    279   1.1     mrg 
    280   1.1     mrg typedef struct
    281   1.1     mrg {
    282   1.1     mrg   b_elf_word	st_name;		/* Symbol name, index in string tbl */
    283   1.1     mrg   b_elf_addr	st_value;		/* Symbol value */
    284   1.1     mrg   b_elf_word	st_size;		/* Symbol size */
    285   1.1     mrg   unsigned char	st_info;		/* Symbol binding and type */
    286   1.1     mrg   unsigned char	st_other;		/* Visibility and other data */
    287   1.1     mrg   b_elf_half	st_shndx;		/* Symbol section index */
    288   1.1     mrg } b_elf_sym;  /* Elf_Sym.  */
    289   1.1     mrg 
    290   1.1     mrg #else /* BACKTRACE_ELF_SIZE != 32 */
    291   1.1     mrg 
    292   1.1     mrg typedef struct
    293   1.1     mrg {
    294   1.1     mrg   b_elf_word	st_name;		/* Symbol name, index in string tbl */
    295   1.1     mrg   unsigned char	st_info;		/* Symbol binding and type */
    296   1.1     mrg   unsigned char	st_other;		/* Visibility and other data */
    297   1.1     mrg   b_elf_half	st_shndx;		/* Symbol section index */
    298   1.1     mrg   b_elf_addr	st_value;		/* Symbol value */
    299   1.1     mrg   b_elf_xword	st_size;		/* Symbol size */
    300   1.1     mrg } b_elf_sym;  /* Elf_Sym.  */
    301   1.1     mrg 
    302   1.1     mrg #endif /* BACKTRACE_ELF_SIZE != 32 */
    303   1.1     mrg 
    304   1.3     mrg #define STT_OBJECT 1
    305   1.1     mrg #define STT_FUNC 2
    306   1.1     mrg 
    307   1.7     mrg typedef struct
    308   1.7     mrg {
    309   1.7     mrg   uint32_t namesz;
    310   1.7     mrg   uint32_t descsz;
    311   1.7     mrg   uint32_t type;
    312   1.7     mrg   char name[1];
    313   1.7     mrg } b_elf_note;
    314   1.7     mrg 
    315   1.7     mrg #define NT_GNU_BUILD_ID 3
    316   1.7     mrg 
    317   1.7     mrg #if BACKTRACE_ELF_SIZE == 32
    318   1.7     mrg 
    319   1.7     mrg typedef struct
    320   1.7     mrg {
    321   1.7     mrg   b_elf_word	ch_type;		/* Compresstion algorithm */
    322   1.7     mrg   b_elf_word	ch_size;		/* Uncompressed size */
    323   1.7     mrg   b_elf_word	ch_addralign;		/* Alignment for uncompressed data */
    324   1.7     mrg } b_elf_chdr;  /* Elf_Chdr */
    325   1.7     mrg 
    326   1.7     mrg #else /* BACKTRACE_ELF_SIZE != 32 */
    327   1.7     mrg 
    328   1.7     mrg typedef struct
    329   1.7     mrg {
    330   1.7     mrg   b_elf_word	ch_type;		/* Compression algorithm */
    331   1.7     mrg   b_elf_word	ch_reserved;		/* Reserved */
    332   1.7     mrg   b_elf_xword	ch_size;		/* Uncompressed size */
    333   1.7     mrg   b_elf_xword	ch_addralign;		/* Alignment for uncompressed data */
    334   1.7     mrg } b_elf_chdr;  /* Elf_Chdr */
    335   1.7     mrg 
    336   1.7     mrg #endif /* BACKTRACE_ELF_SIZE != 32 */
    337   1.7     mrg 
    338   1.7     mrg #define ELFCOMPRESS_ZLIB 1
    339   1.7     mrg 
    340   1.9     mrg /* Names of sections, indexed by enum dwarf_section in internal.h.  */
    341   1.1     mrg 
    342   1.9     mrg static const char * const dwarf_section_names[DEBUG_MAX] =
    343   1.1     mrg {
    344   1.1     mrg   ".debug_info",
    345   1.1     mrg   ".debug_line",
    346   1.1     mrg   ".debug_abbrev",
    347   1.1     mrg   ".debug_ranges",
    348   1.7     mrg   ".debug_str",
    349   1.9     mrg   ".debug_addr",
    350   1.9     mrg   ".debug_str_offsets",
    351   1.9     mrg   ".debug_line_str",
    352   1.9     mrg   ".debug_rnglists"
    353   1.1     mrg };
    354   1.1     mrg 
    355   1.1     mrg /* Information we gather for the sections we care about.  */
    356   1.1     mrg 
    357   1.1     mrg struct debug_section_info
    358   1.1     mrg {
    359   1.1     mrg   /* Section file offset.  */
    360   1.1     mrg   off_t offset;
    361   1.1     mrg   /* Section size.  */
    362   1.1     mrg   size_t size;
    363   1.1     mrg   /* Section contents, after read from file.  */
    364   1.1     mrg   const unsigned char *data;
    365   1.7     mrg   /* Whether the SHF_COMPRESSED flag is set for the section.  */
    366   1.7     mrg   int compressed;
    367   1.1     mrg };
    368   1.1     mrg 
    369   1.1     mrg /* Information we keep for an ELF symbol.  */
    370   1.1     mrg 
    371   1.1     mrg struct elf_symbol
    372   1.1     mrg {
    373   1.1     mrg   /* The name of the symbol.  */
    374   1.1     mrg   const char *name;
    375   1.1     mrg   /* The address of the symbol.  */
    376   1.1     mrg   uintptr_t address;
    377   1.1     mrg   /* The size of the symbol.  */
    378   1.1     mrg   size_t size;
    379   1.1     mrg };
    380   1.1     mrg 
    381   1.1     mrg /* Information to pass to elf_syminfo.  */
    382   1.1     mrg 
    383   1.1     mrg struct elf_syminfo_data
    384   1.1     mrg {
    385   1.1     mrg   /* Symbols for the next module.  */
    386   1.1     mrg   struct elf_syminfo_data *next;
    387   1.1     mrg   /* The ELF symbols, sorted by address.  */
    388   1.1     mrg   struct elf_symbol *symbols;
    389   1.1     mrg   /* The number of symbols.  */
    390   1.1     mrg   size_t count;
    391   1.1     mrg };
    392   1.1     mrg 
    393  1.10     mrg /* A view that works for either a file or memory.  */
    394  1.10     mrg 
    395  1.10     mrg struct elf_view
    396  1.10     mrg {
    397  1.10     mrg   struct backtrace_view view;
    398  1.10     mrg   int release; /* If non-zero, must call backtrace_release_view.  */
    399  1.10     mrg };
    400  1.10     mrg 
    401   1.7     mrg /* Information about PowerPC64 ELFv1 .opd section.  */
    402   1.7     mrg 
    403   1.7     mrg struct elf_ppc64_opd_data
    404   1.7     mrg {
    405   1.7     mrg   /* Address of the .opd section.  */
    406   1.7     mrg   b_elf_addr addr;
    407   1.7     mrg   /* Section data.  */
    408   1.7     mrg   const char *data;
    409   1.7     mrg   /* Size of the .opd section.  */
    410   1.7     mrg   size_t size;
    411   1.7     mrg   /* Corresponding section view.  */
    412  1.10     mrg   struct elf_view view;
    413   1.7     mrg };
    414   1.7     mrg 
    415  1.10     mrg /* Create a view of SIZE bytes from DESCRIPTOR/MEMORY at OFFSET.  */
    416  1.10     mrg 
    417  1.10     mrg static int
    418  1.10     mrg elf_get_view (struct backtrace_state *state, int descriptor,
    419  1.10     mrg 	      const unsigned char *memory, size_t memory_size, off_t offset,
    420  1.10     mrg 	      uint64_t size, backtrace_error_callback error_callback,
    421  1.10     mrg 	      void *data, struct elf_view *view)
    422  1.10     mrg {
    423  1.10     mrg   if (memory == NULL)
    424  1.10     mrg     {
    425  1.10     mrg       view->release = 1;
    426  1.10     mrg       return backtrace_get_view (state, descriptor, offset, size,
    427  1.10     mrg 				 error_callback, data, &view->view);
    428  1.10     mrg     }
    429  1.10     mrg   else
    430  1.10     mrg     {
    431  1.10     mrg       if ((uint64_t) offset + size > (uint64_t) memory_size)
    432  1.10     mrg 	{
    433  1.10     mrg 	  error_callback (data, "out of range for in-memory file", 0);
    434  1.10     mrg 	  return 0;
    435  1.10     mrg 	}
    436  1.10     mrg       view->view.data = (const void *) (memory + offset);
    437  1.10     mrg       view->view.base = NULL;
    438  1.10     mrg       view->view.len = size;
    439  1.10     mrg       view->release = 0;
    440  1.10     mrg       return 1;
    441  1.10     mrg     }
    442  1.10     mrg }
    443  1.10     mrg 
    444  1.10     mrg /* Release a view read by elf_get_view.  */
    445  1.10     mrg 
    446  1.10     mrg static void
    447  1.10     mrg elf_release_view (struct backtrace_state *state, struct elf_view *view,
    448  1.10     mrg 		  backtrace_error_callback error_callback, void *data)
    449  1.10     mrg {
    450  1.10     mrg   if (view->release)
    451  1.10     mrg     backtrace_release_view (state, &view->view, error_callback, data);
    452  1.10     mrg }
    453  1.10     mrg 
    454   1.7     mrg /* Compute the CRC-32 of BUF/LEN.  This uses the CRC used for
    455   1.7     mrg    .gnu_debuglink files.  */
    456   1.7     mrg 
    457   1.7     mrg static uint32_t
    458   1.7     mrg elf_crc32 (uint32_t crc, const unsigned char *buf, size_t len)
    459   1.7     mrg {
    460   1.7     mrg   static const uint32_t crc32_table[256] =
    461   1.7     mrg     {
    462   1.7     mrg       0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419,
    463   1.7     mrg       0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4,
    464   1.7     mrg       0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07,
    465   1.7     mrg       0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
    466   1.7     mrg       0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856,
    467   1.7     mrg       0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
    468   1.7     mrg       0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4,
    469   1.7     mrg       0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
    470   1.7     mrg       0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3,
    471   1.7     mrg       0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a,
    472   1.7     mrg       0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599,
    473   1.7     mrg       0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
    474   1.7     mrg       0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190,
    475   1.7     mrg       0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f,
    476   1.7     mrg       0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e,
    477   1.7     mrg       0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
    478   1.7     mrg       0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed,
    479   1.7     mrg       0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
    480   1.7     mrg       0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3,
    481   1.7     mrg       0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
    482   1.7     mrg       0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a,
    483   1.7     mrg       0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5,
    484   1.7     mrg       0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010,
    485   1.7     mrg       0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
    486   1.7     mrg       0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17,
    487   1.7     mrg       0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6,
    488   1.7     mrg       0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615,
    489   1.7     mrg       0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
    490   1.7     mrg       0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344,
    491   1.7     mrg       0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
    492   1.7     mrg       0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a,
    493   1.7     mrg       0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
    494   1.7     mrg       0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1,
    495   1.7     mrg       0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c,
    496   1.7     mrg       0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef,
    497   1.7     mrg       0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
    498   1.7     mrg       0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe,
    499   1.7     mrg       0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31,
    500   1.7     mrg       0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c,
    501   1.7     mrg       0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
    502   1.7     mrg       0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b,
    503   1.7     mrg       0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
    504   1.7     mrg       0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1,
    505   1.7     mrg       0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
    506   1.7     mrg       0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278,
    507   1.7     mrg       0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7,
    508   1.7     mrg       0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66,
    509   1.7     mrg       0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
    510   1.7     mrg       0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605,
    511   1.7     mrg       0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8,
    512   1.7     mrg       0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b,
    513   1.7     mrg       0x2d02ef8d
    514   1.7     mrg     };
    515   1.7     mrg   const unsigned char *end;
    516   1.7     mrg 
    517   1.7     mrg   crc = ~crc;
    518   1.7     mrg   for (end = buf + len; buf < end; ++ buf)
    519   1.7     mrg     crc = crc32_table[(crc ^ *buf) & 0xff] ^ (crc >> 8);
    520   1.7     mrg   return ~crc;
    521   1.7     mrg }
    522   1.7     mrg 
    523   1.7     mrg /* Return the CRC-32 of the entire file open at DESCRIPTOR.  */
    524   1.7     mrg 
    525   1.7     mrg static uint32_t
    526   1.7     mrg elf_crc32_file (struct backtrace_state *state, int descriptor,
    527   1.7     mrg 		backtrace_error_callback error_callback, void *data)
    528   1.7     mrg {
    529   1.7     mrg   struct stat st;
    530   1.7     mrg   struct backtrace_view file_view;
    531   1.7     mrg   uint32_t ret;
    532   1.7     mrg 
    533   1.7     mrg   if (fstat (descriptor, &st) < 0)
    534   1.7     mrg     {
    535   1.7     mrg       error_callback (data, "fstat", errno);
    536   1.7     mrg       return 0;
    537   1.7     mrg     }
    538   1.7     mrg 
    539   1.7     mrg   if (!backtrace_get_view (state, descriptor, 0, st.st_size, error_callback,
    540   1.7     mrg 			   data, &file_view))
    541   1.7     mrg     return 0;
    542   1.7     mrg 
    543   1.7     mrg   ret = elf_crc32 (0, (const unsigned char *) file_view.data, st.st_size);
    544   1.7     mrg 
    545   1.7     mrg   backtrace_release_view (state, &file_view, error_callback, data);
    546   1.7     mrg 
    547   1.7     mrg   return ret;
    548   1.7     mrg }
    549   1.7     mrg 
    550   1.1     mrg /* A dummy callback function used when we can't find a symbol
    551   1.1     mrg    table.  */
    552   1.1     mrg 
    553   1.1     mrg static void
    554   1.1     mrg elf_nosyms (struct backtrace_state *state ATTRIBUTE_UNUSED,
    555   1.3     mrg 	    uintptr_t addr ATTRIBUTE_UNUSED,
    556   1.1     mrg 	    backtrace_syminfo_callback callback ATTRIBUTE_UNUSED,
    557   1.1     mrg 	    backtrace_error_callback error_callback, void *data)
    558   1.1     mrg {
    559   1.1     mrg   error_callback (data, "no symbol table in ELF executable", -1);
    560   1.1     mrg }
    561   1.1     mrg 
    562  1.10     mrg /* A callback function used when we can't find any debug info.  */
    563  1.10     mrg 
    564  1.10     mrg static int
    565  1.10     mrg elf_nodebug (struct backtrace_state *state, uintptr_t pc,
    566  1.10     mrg 	     backtrace_full_callback callback,
    567  1.10     mrg 	     backtrace_error_callback error_callback, void *data)
    568  1.10     mrg {
    569  1.10     mrg   if (state->syminfo_fn != NULL && state->syminfo_fn != elf_nosyms)
    570  1.10     mrg     {
    571  1.10     mrg       struct backtrace_call_full bdata;
    572  1.10     mrg 
    573  1.10     mrg       /* Fetch symbol information so that we can least get the
    574  1.10     mrg 	 function name.  */
    575  1.10     mrg 
    576  1.10     mrg       bdata.full_callback = callback;
    577  1.10     mrg       bdata.full_error_callback = error_callback;
    578  1.10     mrg       bdata.full_data = data;
    579  1.10     mrg       bdata.ret = 0;
    580  1.10     mrg       state->syminfo_fn (state, pc, backtrace_syminfo_to_full_callback,
    581  1.10     mrg 			 backtrace_syminfo_to_full_error_callback, &bdata);
    582  1.10     mrg       return bdata.ret;
    583  1.10     mrg     }
    584  1.10     mrg 
    585  1.10     mrg   error_callback (data, "no debug info in ELF executable", -1);
    586  1.10     mrg   return 0;
    587  1.10     mrg }
    588  1.10     mrg 
    589   1.1     mrg /* Compare struct elf_symbol for qsort.  */
    590   1.1     mrg 
    591   1.1     mrg static int
    592   1.1     mrg elf_symbol_compare (const void *v1, const void *v2)
    593   1.1     mrg {
    594   1.1     mrg   const struct elf_symbol *e1 = (const struct elf_symbol *) v1;
    595   1.1     mrg   const struct elf_symbol *e2 = (const struct elf_symbol *) v2;
    596   1.1     mrg 
    597   1.1     mrg   if (e1->address < e2->address)
    598   1.1     mrg     return -1;
    599   1.1     mrg   else if (e1->address > e2->address)
    600   1.1     mrg     return 1;
    601   1.1     mrg   else
    602   1.1     mrg     return 0;
    603   1.1     mrg }
    604   1.1     mrg 
    605   1.3     mrg /* Compare an ADDR against an elf_symbol for bsearch.  We allocate one
    606   1.1     mrg    extra entry in the array so that this can look safely at the next
    607   1.1     mrg    entry.  */
    608   1.1     mrg 
    609   1.1     mrg static int
    610   1.1     mrg elf_symbol_search (const void *vkey, const void *ventry)
    611   1.1     mrg {
    612   1.1     mrg   const uintptr_t *key = (const uintptr_t *) vkey;
    613   1.1     mrg   const struct elf_symbol *entry = (const struct elf_symbol *) ventry;
    614   1.3     mrg   uintptr_t addr;
    615   1.1     mrg 
    616   1.3     mrg   addr = *key;
    617   1.3     mrg   if (addr < entry->address)
    618   1.1     mrg     return -1;
    619   1.3     mrg   else if (addr >= entry->address + entry->size)
    620   1.1     mrg     return 1;
    621   1.1     mrg   else
    622   1.1     mrg     return 0;
    623   1.1     mrg }
    624   1.1     mrg 
    625   1.1     mrg /* Initialize the symbol table info for elf_syminfo.  */
    626   1.1     mrg 
    627   1.1     mrg static int
    628   1.1     mrg elf_initialize_syminfo (struct backtrace_state *state,
    629   1.3     mrg 			uintptr_t base_address,
    630   1.1     mrg 			const unsigned char *symtab_data, size_t symtab_size,
    631   1.1     mrg 			const unsigned char *strtab, size_t strtab_size,
    632   1.1     mrg 			backtrace_error_callback error_callback,
    633   1.7     mrg 			void *data, struct elf_syminfo_data *sdata,
    634   1.7     mrg 			struct elf_ppc64_opd_data *opd)
    635   1.1     mrg {
    636   1.1     mrg   size_t sym_count;
    637   1.1     mrg   const b_elf_sym *sym;
    638   1.1     mrg   size_t elf_symbol_count;
    639   1.1     mrg   size_t elf_symbol_size;
    640   1.1     mrg   struct elf_symbol *elf_symbols;
    641   1.1     mrg   size_t i;
    642   1.1     mrg   unsigned int j;
    643   1.1     mrg 
    644   1.1     mrg   sym_count = symtab_size / sizeof (b_elf_sym);
    645   1.1     mrg 
    646   1.1     mrg   /* We only care about function symbols.  Count them.  */
    647   1.1     mrg   sym = (const b_elf_sym *) symtab_data;
    648   1.1     mrg   elf_symbol_count = 0;
    649   1.1     mrg   for (i = 0; i < sym_count; ++i, ++sym)
    650   1.1     mrg     {
    651   1.3     mrg       int info;
    652   1.3     mrg 
    653   1.3     mrg       info = sym->st_info & 0xf;
    654   1.3     mrg       if ((info == STT_FUNC || info == STT_OBJECT)
    655   1.3     mrg 	  && sym->st_shndx != SHN_UNDEF)
    656   1.1     mrg 	++elf_symbol_count;
    657   1.1     mrg     }
    658   1.1     mrg 
    659   1.1     mrg   elf_symbol_size = elf_symbol_count * sizeof (struct elf_symbol);
    660   1.1     mrg   elf_symbols = ((struct elf_symbol *)
    661   1.1     mrg 		 backtrace_alloc (state, elf_symbol_size, error_callback,
    662   1.1     mrg 				  data));
    663   1.1     mrg   if (elf_symbols == NULL)
    664   1.1     mrg     return 0;
    665   1.1     mrg 
    666   1.1     mrg   sym = (const b_elf_sym *) symtab_data;
    667   1.1     mrg   j = 0;
    668   1.1     mrg   for (i = 0; i < sym_count; ++i, ++sym)
    669   1.1     mrg     {
    670   1.3     mrg       int info;
    671   1.3     mrg 
    672   1.3     mrg       info = sym->st_info & 0xf;
    673   1.3     mrg       if (info != STT_FUNC && info != STT_OBJECT)
    674   1.3     mrg 	continue;
    675   1.3     mrg       if (sym->st_shndx == SHN_UNDEF)
    676   1.1     mrg 	continue;
    677   1.1     mrg       if (sym->st_name >= strtab_size)
    678   1.1     mrg 	{
    679   1.1     mrg 	  error_callback (data, "symbol string index out of range", 0);
    680   1.1     mrg 	  backtrace_free (state, elf_symbols, elf_symbol_size, error_callback,
    681   1.1     mrg 			  data);
    682   1.1     mrg 	  return 0;
    683   1.1     mrg 	}
    684   1.1     mrg       elf_symbols[j].name = (const char *) strtab + sym->st_name;
    685   1.7     mrg       /* Special case PowerPC64 ELFv1 symbols in .opd section, if the symbol
    686   1.7     mrg 	 is a function descriptor, read the actual code address from the
    687   1.7     mrg 	 descriptor.  */
    688   1.7     mrg       if (opd
    689   1.7     mrg 	  && sym->st_value >= opd->addr
    690   1.7     mrg 	  && sym->st_value < opd->addr + opd->size)
    691   1.7     mrg 	elf_symbols[j].address
    692   1.7     mrg 	  = *(const b_elf_addr *) (opd->data + (sym->st_value - opd->addr));
    693   1.7     mrg       else
    694   1.7     mrg 	elf_symbols[j].address = sym->st_value;
    695   1.7     mrg       elf_symbols[j].address += base_address;
    696   1.1     mrg       elf_symbols[j].size = sym->st_size;
    697   1.1     mrg       ++j;
    698   1.1     mrg     }
    699   1.1     mrg 
    700   1.3     mrg   backtrace_qsort (elf_symbols, elf_symbol_count, sizeof (struct elf_symbol),
    701   1.3     mrg 		   elf_symbol_compare);
    702   1.1     mrg 
    703   1.1     mrg   sdata->next = NULL;
    704   1.1     mrg   sdata->symbols = elf_symbols;
    705   1.1     mrg   sdata->count = elf_symbol_count;
    706   1.1     mrg 
    707   1.1     mrg   return 1;
    708   1.1     mrg }
    709   1.1     mrg 
    710   1.1     mrg /* Add EDATA to the list in STATE.  */
    711   1.1     mrg 
    712   1.1     mrg static void
    713   1.1     mrg elf_add_syminfo_data (struct backtrace_state *state,
    714   1.1     mrg 		      struct elf_syminfo_data *edata)
    715   1.1     mrg {
    716   1.1     mrg   if (!state->threaded)
    717   1.1     mrg     {
    718   1.1     mrg       struct elf_syminfo_data **pp;
    719   1.1     mrg 
    720   1.1     mrg       for (pp = (struct elf_syminfo_data **) (void *) &state->syminfo_data;
    721   1.1     mrg 	   *pp != NULL;
    722   1.1     mrg 	   pp = &(*pp)->next)
    723   1.1     mrg 	;
    724   1.1     mrg       *pp = edata;
    725   1.1     mrg     }
    726   1.1     mrg   else
    727   1.1     mrg     {
    728   1.1     mrg       while (1)
    729   1.1     mrg 	{
    730   1.1     mrg 	  struct elf_syminfo_data **pp;
    731   1.1     mrg 
    732   1.1     mrg 	  pp = (struct elf_syminfo_data **) (void *) &state->syminfo_data;
    733   1.1     mrg 
    734   1.1     mrg 	  while (1)
    735   1.1     mrg 	    {
    736   1.1     mrg 	      struct elf_syminfo_data *p;
    737   1.1     mrg 
    738   1.3     mrg 	      p = backtrace_atomic_load_pointer (pp);
    739   1.1     mrg 
    740   1.1     mrg 	      if (p == NULL)
    741   1.1     mrg 		break;
    742   1.1     mrg 
    743   1.1     mrg 	      pp = &p->next;
    744   1.1     mrg 	    }
    745   1.1     mrg 
    746   1.1     mrg 	  if (__sync_bool_compare_and_swap (pp, NULL, edata))
    747   1.1     mrg 	    break;
    748   1.1     mrg 	}
    749   1.1     mrg     }
    750   1.1     mrg }
    751   1.1     mrg 
    752   1.3     mrg /* Return the symbol name and value for an ADDR.  */
    753   1.1     mrg 
    754   1.1     mrg static void
    755   1.3     mrg elf_syminfo (struct backtrace_state *state, uintptr_t addr,
    756   1.1     mrg 	     backtrace_syminfo_callback callback,
    757   1.1     mrg 	     backtrace_error_callback error_callback ATTRIBUTE_UNUSED,
    758   1.1     mrg 	     void *data)
    759   1.1     mrg {
    760   1.1     mrg   struct elf_syminfo_data *edata;
    761   1.3     mrg   struct elf_symbol *sym = NULL;
    762   1.3     mrg 
    763   1.3     mrg   if (!state->threaded)
    764   1.3     mrg     {
    765   1.3     mrg       for (edata = (struct elf_syminfo_data *) state->syminfo_data;
    766   1.3     mrg 	   edata != NULL;
    767   1.3     mrg 	   edata = edata->next)
    768   1.3     mrg 	{
    769   1.3     mrg 	  sym = ((struct elf_symbol *)
    770   1.3     mrg 		 bsearch (&addr, edata->symbols, edata->count,
    771   1.3     mrg 			  sizeof (struct elf_symbol), elf_symbol_search));
    772   1.3     mrg 	  if (sym != NULL)
    773   1.3     mrg 	    break;
    774   1.3     mrg 	}
    775   1.3     mrg     }
    776   1.3     mrg   else
    777   1.3     mrg     {
    778   1.3     mrg       struct elf_syminfo_data **pp;
    779   1.3     mrg 
    780   1.3     mrg       pp = (struct elf_syminfo_data **) (void *) &state->syminfo_data;
    781   1.3     mrg       while (1)
    782   1.3     mrg 	{
    783   1.3     mrg 	  edata = backtrace_atomic_load_pointer (pp);
    784   1.3     mrg 	  if (edata == NULL)
    785   1.3     mrg 	    break;
    786   1.3     mrg 
    787   1.3     mrg 	  sym = ((struct elf_symbol *)
    788   1.3     mrg 		 bsearch (&addr, edata->symbols, edata->count,
    789   1.3     mrg 			  sizeof (struct elf_symbol), elf_symbol_search));
    790   1.3     mrg 	  if (sym != NULL)
    791   1.3     mrg 	    break;
    792   1.3     mrg 
    793   1.3     mrg 	  pp = &edata->next;
    794   1.3     mrg 	}
    795   1.3     mrg     }
    796   1.1     mrg 
    797   1.1     mrg   if (sym == NULL)
    798   1.3     mrg     callback (data, addr, NULL, 0, 0);
    799   1.1     mrg   else
    800   1.3     mrg     callback (data, addr, sym->name, sym->address, sym->size);
    801   1.1     mrg }
    802   1.1     mrg 
    803   1.7     mrg /* Return whether FILENAME is a symlink.  */
    804   1.1     mrg 
    805   1.1     mrg static int
    806   1.7     mrg elf_is_symlink (const char *filename)
    807   1.1     mrg {
    808   1.7     mrg   struct stat st;
    809   1.7     mrg 
    810   1.7     mrg   if (lstat (filename, &st) < 0)
    811   1.7     mrg     return 0;
    812   1.7     mrg   return S_ISLNK (st.st_mode);
    813   1.7     mrg }
    814   1.7     mrg 
    815   1.7     mrg /* Return the results of reading the symlink FILENAME in a buffer
    816   1.7     mrg    allocated by backtrace_alloc.  Return the length of the buffer in
    817   1.7     mrg    *LEN.  */
    818   1.7     mrg 
    819   1.7     mrg static char *
    820   1.7     mrg elf_readlink (struct backtrace_state *state, const char *filename,
    821   1.7     mrg 	      backtrace_error_callback error_callback, void *data,
    822   1.7     mrg 	      size_t *plen)
    823   1.7     mrg {
    824   1.7     mrg   size_t len;
    825   1.7     mrg   char *buf;
    826   1.7     mrg 
    827   1.7     mrg   len = 128;
    828   1.7     mrg   while (1)
    829   1.7     mrg     {
    830   1.7     mrg       ssize_t rl;
    831   1.1     mrg 
    832   1.7     mrg       buf = backtrace_alloc (state, len, error_callback, data);
    833   1.7     mrg       if (buf == NULL)
    834   1.7     mrg 	return NULL;
    835   1.7     mrg       rl = readlink (filename, buf, len);
    836   1.7     mrg       if (rl < 0)
    837   1.7     mrg 	{
    838   1.7     mrg 	  backtrace_free (state, buf, len, error_callback, data);
    839   1.7     mrg 	  return NULL;
    840   1.7     mrg 	}
    841   1.7     mrg       if ((size_t) rl < len - 1)
    842   1.7     mrg 	{
    843   1.7     mrg 	  buf[rl] = '\0';
    844   1.7     mrg 	  *plen = len;
    845   1.7     mrg 	  return buf;
    846   1.7     mrg 	}
    847   1.7     mrg       backtrace_free (state, buf, len, error_callback, data);
    848   1.7     mrg       len *= 2;
    849   1.7     mrg     }
    850   1.7     mrg }
    851   1.1     mrg 
    852   1.8     mrg #define SYSTEM_BUILD_ID_DIR "/usr/lib/debug/.build-id/"
    853   1.8     mrg 
    854   1.7     mrg /* Open a separate debug info file, using the build ID to find it.
    855   1.7     mrg    Returns an open file descriptor, or -1.
    856   1.1     mrg 
    857   1.7     mrg    The GDB manual says that the only place gdb looks for a debug file
    858   1.7     mrg    when the build ID is known is in /usr/lib/debug/.build-id.  */
    859   1.1     mrg 
    860   1.7     mrg static int
    861   1.7     mrg elf_open_debugfile_by_buildid (struct backtrace_state *state,
    862   1.7     mrg 			       const char *buildid_data, size_t buildid_size,
    863   1.7     mrg 			       backtrace_error_callback error_callback,
    864   1.7     mrg 			       void *data)
    865   1.7     mrg {
    866   1.8     mrg   const char * const prefix = SYSTEM_BUILD_ID_DIR;
    867   1.7     mrg   const size_t prefix_len = strlen (prefix);
    868   1.7     mrg   const char * const suffix = ".debug";
    869   1.7     mrg   const size_t suffix_len = strlen (suffix);
    870   1.7     mrg   size_t len;
    871   1.7     mrg   char *bd_filename;
    872   1.7     mrg   char *t;
    873   1.7     mrg   size_t i;
    874   1.7     mrg   int ret;
    875   1.7     mrg   int does_not_exist;
    876   1.1     mrg 
    877   1.7     mrg   len = prefix_len + buildid_size * 2 + suffix_len + 2;
    878   1.7     mrg   bd_filename = backtrace_alloc (state, len, error_callback, data);
    879   1.7     mrg   if (bd_filename == NULL)
    880   1.7     mrg     return -1;
    881   1.1     mrg 
    882   1.7     mrg   t = bd_filename;
    883   1.7     mrg   memcpy (t, prefix, prefix_len);
    884   1.7     mrg   t += prefix_len;
    885   1.7     mrg   for (i = 0; i < buildid_size; i++)
    886   1.7     mrg     {
    887   1.7     mrg       unsigned char b;
    888   1.7     mrg       unsigned char nib;
    889   1.7     mrg 
    890   1.7     mrg       b = (unsigned char) buildid_data[i];
    891   1.7     mrg       nib = (b & 0xf0) >> 4;
    892   1.7     mrg       *t++ = nib < 10 ? '0' + nib : 'a' + nib - 10;
    893   1.7     mrg       nib = b & 0x0f;
    894   1.7     mrg       *t++ = nib < 10 ? '0' + nib : 'a' + nib - 10;
    895   1.7     mrg       if (i == 0)
    896   1.7     mrg 	*t++ = '/';
    897   1.7     mrg     }
    898   1.7     mrg   memcpy (t, suffix, suffix_len);
    899   1.7     mrg   t[suffix_len] = '\0';
    900   1.7     mrg 
    901   1.7     mrg   ret = backtrace_open (bd_filename, error_callback, data, &does_not_exist);
    902   1.7     mrg 
    903   1.7     mrg   backtrace_free (state, bd_filename, len, error_callback, data);
    904   1.7     mrg 
    905   1.7     mrg   /* gdb checks that the debuginfo file has the same build ID note.
    906   1.7     mrg      That seems kind of pointless to me--why would it have the right
    907   1.7     mrg      name but not the right build ID?--so skipping the check.  */
    908   1.1     mrg 
    909   1.7     mrg   return ret;
    910   1.7     mrg }
    911   1.1     mrg 
    912   1.7     mrg /* Try to open a file whose name is PREFIX (length PREFIX_LEN)
    913   1.7     mrg    concatenated with PREFIX2 (length PREFIX2_LEN) concatenated with
    914   1.7     mrg    DEBUGLINK_NAME.  Returns an open file descriptor, or -1.  */
    915   1.1     mrg 
    916   1.7     mrg static int
    917   1.7     mrg elf_try_debugfile (struct backtrace_state *state, const char *prefix,
    918   1.7     mrg 		   size_t prefix_len, const char *prefix2, size_t prefix2_len,
    919   1.7     mrg 		   const char *debuglink_name,
    920   1.7     mrg 		   backtrace_error_callback error_callback, void *data)
    921   1.7     mrg {
    922   1.7     mrg   size_t debuglink_len;
    923   1.7     mrg   size_t try_len;
    924   1.7     mrg   char *try;
    925   1.7     mrg   int does_not_exist;
    926   1.7     mrg   int ret;
    927   1.1     mrg 
    928   1.7     mrg   debuglink_len = strlen (debuglink_name);
    929   1.7     mrg   try_len = prefix_len + prefix2_len + debuglink_len + 1;
    930   1.7     mrg   try = backtrace_alloc (state, try_len, error_callback, data);
    931   1.7     mrg   if (try == NULL)
    932   1.3     mrg     return -1;
    933   1.3     mrg 
    934   1.7     mrg   memcpy (try, prefix, prefix_len);
    935   1.7     mrg   memcpy (try + prefix_len, prefix2, prefix2_len);
    936   1.7     mrg   memcpy (try + prefix_len + prefix2_len, debuglink_name, debuglink_len);
    937   1.7     mrg   try[prefix_len + prefix2_len + debuglink_len] = '\0';
    938   1.7     mrg 
    939   1.7     mrg   ret = backtrace_open (try, error_callback, data, &does_not_exist);
    940   1.1     mrg 
    941   1.7     mrg   backtrace_free (state, try, try_len, error_callback, data);
    942   1.1     mrg 
    943   1.7     mrg   return ret;
    944   1.7     mrg }
    945   1.1     mrg 
    946   1.7     mrg /* Find a separate debug info file, using the debuglink section data
    947   1.7     mrg    to find it.  Returns an open file descriptor, or -1.  */
    948   1.1     mrg 
    949   1.7     mrg static int
    950   1.7     mrg elf_find_debugfile_by_debuglink (struct backtrace_state *state,
    951   1.7     mrg 				 const char *filename,
    952   1.7     mrg 				 const char *debuglink_name,
    953   1.7     mrg 				 backtrace_error_callback error_callback,
    954   1.7     mrg 				 void *data)
    955   1.7     mrg {
    956   1.7     mrg   int ret;
    957   1.7     mrg   char *alc;
    958   1.7     mrg   size_t alc_len;
    959   1.7     mrg   const char *slash;
    960   1.7     mrg   int ddescriptor;
    961   1.7     mrg   const char *prefix;
    962   1.7     mrg   size_t prefix_len;
    963   1.7     mrg 
    964   1.7     mrg   /* Resolve symlinks in FILENAME.  Since FILENAME is fairly likely to
    965   1.7     mrg      be /proc/self/exe, symlinks are common.  We don't try to resolve
    966   1.7     mrg      the whole path name, just the base name.  */
    967   1.7     mrg   ret = -1;
    968   1.7     mrg   alc = NULL;
    969   1.7     mrg   alc_len = 0;
    970   1.7     mrg   while (elf_is_symlink (filename))
    971   1.7     mrg     {
    972   1.7     mrg       char *new_buf;
    973   1.7     mrg       size_t new_len;
    974   1.7     mrg 
    975   1.7     mrg       new_buf = elf_readlink (state, filename, error_callback, data, &new_len);
    976   1.7     mrg       if (new_buf == NULL)
    977   1.7     mrg 	break;
    978   1.1     mrg 
    979   1.7     mrg       if (new_buf[0] == '/')
    980   1.7     mrg 	filename = new_buf;
    981   1.7     mrg       else
    982   1.1     mrg 	{
    983   1.7     mrg 	  slash = strrchr (filename, '/');
    984   1.7     mrg 	  if (slash == NULL)
    985   1.7     mrg 	    filename = new_buf;
    986   1.7     mrg 	  else
    987   1.7     mrg 	    {
    988   1.7     mrg 	      size_t clen;
    989   1.7     mrg 	      char *c;
    990   1.1     mrg 
    991   1.7     mrg 	      slash++;
    992   1.7     mrg 	      clen = slash - filename + strlen (new_buf) + 1;
    993   1.7     mrg 	      c = backtrace_alloc (state, clen, error_callback, data);
    994   1.7     mrg 	      if (c == NULL)
    995   1.7     mrg 		goto done;
    996   1.7     mrg 
    997   1.7     mrg 	      memcpy (c, filename, slash - filename);
    998   1.7     mrg 	      memcpy (c + (slash - filename), new_buf, strlen (new_buf));
    999   1.7     mrg 	      c[slash - filename + strlen (new_buf)] = '\0';
   1000   1.7     mrg 	      backtrace_free (state, new_buf, new_len, error_callback, data);
   1001   1.7     mrg 	      filename = c;
   1002   1.7     mrg 	      new_buf = c;
   1003   1.7     mrg 	      new_len = clen;
   1004   1.7     mrg 	    }
   1005   1.1     mrg 	}
   1006   1.1     mrg 
   1007   1.7     mrg       if (alc != NULL)
   1008   1.7     mrg 	backtrace_free (state, alc, alc_len, error_callback, data);
   1009   1.7     mrg       alc = new_buf;
   1010   1.7     mrg       alc_len = new_len;
   1011   1.7     mrg     }
   1012   1.7     mrg 
   1013   1.7     mrg   /* Look for DEBUGLINK_NAME in the same directory as FILENAME.  */
   1014   1.7     mrg 
   1015   1.7     mrg   slash = strrchr (filename, '/');
   1016   1.7     mrg   if (slash == NULL)
   1017   1.7     mrg     {
   1018   1.7     mrg       prefix = "";
   1019   1.7     mrg       prefix_len = 0;
   1020   1.7     mrg     }
   1021   1.7     mrg   else
   1022   1.7     mrg     {
   1023   1.7     mrg       slash++;
   1024   1.7     mrg       prefix = filename;
   1025   1.7     mrg       prefix_len = slash - filename;
   1026   1.7     mrg     }
   1027   1.7     mrg 
   1028   1.7     mrg   ddescriptor = elf_try_debugfile (state, prefix, prefix_len, "", 0,
   1029   1.7     mrg 				   debuglink_name, error_callback, data);
   1030   1.7     mrg   if (ddescriptor >= 0)
   1031   1.7     mrg     {
   1032   1.7     mrg       ret = ddescriptor;
   1033   1.7     mrg       goto done;
   1034   1.1     mrg     }
   1035   1.1     mrg 
   1036   1.7     mrg   /* Look for DEBUGLINK_NAME in a .debug subdirectory of FILENAME.  */
   1037   1.1     mrg 
   1038   1.7     mrg   ddescriptor = elf_try_debugfile (state, prefix, prefix_len, ".debug/",
   1039   1.7     mrg 				   strlen (".debug/"), debuglink_name,
   1040   1.7     mrg 				   error_callback, data);
   1041   1.7     mrg   if (ddescriptor >= 0)
   1042   1.7     mrg     {
   1043   1.7     mrg       ret = ddescriptor;
   1044   1.7     mrg       goto done;
   1045   1.7     mrg     }
   1046   1.1     mrg 
   1047   1.7     mrg   /* Look for DEBUGLINK_NAME in /usr/lib/debug.  */
   1048   1.1     mrg 
   1049   1.7     mrg   ddescriptor = elf_try_debugfile (state, "/usr/lib/debug/",
   1050   1.7     mrg 				   strlen ("/usr/lib/debug/"), prefix,
   1051   1.7     mrg 				   prefix_len, debuglink_name,
   1052   1.7     mrg 				   error_callback, data);
   1053   1.7     mrg   if (ddescriptor >= 0)
   1054   1.7     mrg     ret = ddescriptor;
   1055   1.1     mrg 
   1056   1.7     mrg  done:
   1057   1.7     mrg   if (alc != NULL && alc_len > 0)
   1058   1.7     mrg     backtrace_free (state, alc, alc_len, error_callback, data);
   1059   1.7     mrg   return ret;
   1060   1.7     mrg }
   1061   1.1     mrg 
   1062   1.7     mrg /* Open a separate debug info file, using the debuglink section data
   1063   1.7     mrg    to find it.  Returns an open file descriptor, or -1.  */
   1064   1.1     mrg 
   1065   1.7     mrg static int
   1066   1.7     mrg elf_open_debugfile_by_debuglink (struct backtrace_state *state,
   1067   1.7     mrg 				 const char *filename,
   1068   1.7     mrg 				 const char *debuglink_name,
   1069   1.7     mrg 				 uint32_t debuglink_crc,
   1070   1.7     mrg 				 backtrace_error_callback error_callback,
   1071   1.7     mrg 				 void *data)
   1072   1.7     mrg {
   1073   1.7     mrg   int ddescriptor;
   1074   1.1     mrg 
   1075   1.7     mrg   ddescriptor = elf_find_debugfile_by_debuglink (state, filename,
   1076   1.7     mrg 						 debuglink_name,
   1077   1.7     mrg 						 error_callback, data);
   1078   1.7     mrg   if (ddescriptor < 0)
   1079   1.7     mrg     return -1;
   1080   1.1     mrg 
   1081   1.7     mrg   if (debuglink_crc != 0)
   1082   1.1     mrg     {
   1083   1.7     mrg       uint32_t got_crc;
   1084   1.7     mrg 
   1085   1.7     mrg       got_crc = elf_crc32_file (state, ddescriptor, error_callback, data);
   1086   1.7     mrg       if (got_crc != debuglink_crc)
   1087   1.7     mrg 	{
   1088   1.7     mrg 	  backtrace_close (ddescriptor, error_callback, data);
   1089   1.7     mrg 	  return -1;
   1090   1.7     mrg 	}
   1091   1.7     mrg     }
   1092   1.7     mrg 
   1093   1.7     mrg   return ddescriptor;
   1094   1.7     mrg }
   1095   1.7     mrg 
   1096   1.7     mrg /* A function useful for setting a breakpoint for an inflation failure
   1097   1.7     mrg    when this code is compiled with -g.  */
   1098   1.7     mrg 
   1099   1.7     mrg static void
   1100  1.10     mrg elf_uncompress_failed(void)
   1101   1.7     mrg {
   1102   1.7     mrg }
   1103   1.7     mrg 
   1104   1.7     mrg /* *PVAL is the current value being read from the stream, and *PBITS
   1105   1.7     mrg    is the number of valid bits.  Ensure that *PVAL holds at least 15
   1106   1.7     mrg    bits by reading additional bits from *PPIN, up to PINEND, as
   1107   1.7     mrg    needed.  Updates *PPIN, *PVAL and *PBITS.  Returns 1 on success, 0
   1108   1.7     mrg    on error.  */
   1109   1.7     mrg 
   1110   1.7     mrg static int
   1111   1.7     mrg elf_zlib_fetch (const unsigned char **ppin, const unsigned char *pinend,
   1112   1.7     mrg 		uint64_t *pval, unsigned int *pbits)
   1113   1.7     mrg {
   1114   1.7     mrg   unsigned int bits;
   1115   1.7     mrg   const unsigned char *pin;
   1116   1.7     mrg   uint64_t val;
   1117   1.7     mrg   uint32_t next;
   1118   1.7     mrg 
   1119   1.7     mrg   bits = *pbits;
   1120   1.7     mrg   if (bits >= 15)
   1121   1.7     mrg     return 1;
   1122   1.7     mrg   pin = *ppin;
   1123   1.7     mrg   val = *pval;
   1124   1.7     mrg 
   1125   1.7     mrg   if (unlikely (pinend - pin < 4))
   1126   1.7     mrg     {
   1127  1.10     mrg       elf_uncompress_failed ();
   1128   1.7     mrg       return 0;
   1129   1.7     mrg     }
   1130   1.7     mrg 
   1131   1.7     mrg #if defined(__BYTE_ORDER__) && defined(__ORDER_LITTLE_ENDIAN__) \
   1132   1.7     mrg     && defined(__ORDER_BIG_ENDIAN__) \
   1133   1.7     mrg     && (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ \
   1134   1.7     mrg         || __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)
   1135   1.7     mrg   /* We've ensured that PIN is aligned.  */
   1136   1.7     mrg   next = *(const uint32_t *)pin;
   1137   1.7     mrg 
   1138   1.7     mrg #if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
   1139   1.7     mrg   next = __builtin_bswap32 (next);
   1140   1.7     mrg #endif
   1141   1.7     mrg #else
   1142   1.7     mrg   next = pin[0] | (pin[1] << 8) | (pin[2] << 16) | (pin[3] << 24);
   1143   1.7     mrg #endif
   1144   1.7     mrg 
   1145   1.7     mrg   val |= (uint64_t)next << bits;
   1146   1.7     mrg   bits += 32;
   1147   1.7     mrg   pin += 4;
   1148   1.7     mrg 
   1149   1.7     mrg   /* We will need the next four bytes soon.  */
   1150   1.7     mrg   __builtin_prefetch (pin, 0, 0);
   1151   1.7     mrg 
   1152   1.7     mrg   *ppin = pin;
   1153   1.7     mrg   *pval = val;
   1154   1.7     mrg   *pbits = bits;
   1155   1.7     mrg   return 1;
   1156   1.7     mrg }
   1157   1.7     mrg 
   1158   1.7     mrg /* Huffman code tables, like the rest of the zlib format, are defined
   1159   1.7     mrg    by RFC 1951.  We store a Huffman code table as a series of tables
   1160   1.7     mrg    stored sequentially in memory.  Each entry in a table is 16 bits.
   1161   1.7     mrg    The first, main, table has 256 entries.  It is followed by a set of
   1162   1.7     mrg    secondary tables of length 2 to 128 entries.  The maximum length of
   1163   1.7     mrg    a code sequence in the deflate format is 15 bits, so that is all we
   1164   1.7     mrg    need.  Each secondary table has an index, which is the offset of
   1165   1.7     mrg    the table in the overall memory storage.
   1166   1.7     mrg 
   1167   1.7     mrg    The deflate format says that all codes of a given bit length are
   1168   1.7     mrg    lexicographically consecutive.  Perhaps we could have 130 values
   1169   1.7     mrg    that require a 15-bit code, perhaps requiring three secondary
   1170   1.7     mrg    tables of size 128.  I don't know if this is actually possible, but
   1171   1.7     mrg    it suggests that the maximum size required for secondary tables is
   1172   1.7     mrg    3 * 128 + 3 * 64 ... == 768.  The zlib enough program reports 660
   1173   1.7     mrg    as the maximum.  We permit 768, since in addition to the 256 for
   1174   1.7     mrg    the primary table, with two bytes per entry, and with the two
   1175   1.7     mrg    tables we need, that gives us a page.
   1176   1.7     mrg 
   1177   1.7     mrg    A single table entry needs to store a value or (for the main table
   1178   1.7     mrg    only) the index and size of a secondary table.  Values range from 0
   1179   1.7     mrg    to 285, inclusive.  Secondary table indexes, per above, range from
   1180   1.7     mrg    0 to 510.  For a value we need to store the number of bits we need
   1181   1.7     mrg    to determine that value (one value may appear multiple times in the
   1182   1.7     mrg    table), which is 1 to 8.  For a secondary table we need to store
   1183   1.7     mrg    the number of bits used to index into the table, which is 1 to 7.
   1184   1.7     mrg    And of course we need 1 bit to decide whether we have a value or a
   1185   1.7     mrg    secondary table index.  So each entry needs 9 bits for value/table
   1186   1.7     mrg    index, 3 bits for size, 1 bit what it is.  For simplicity we use 16
   1187   1.7     mrg    bits per entry.  */
   1188   1.7     mrg 
   1189   1.7     mrg /* Number of entries we allocate to for one code table.  We get a page
   1190   1.7     mrg    for the two code tables we need.  */
   1191   1.7     mrg 
   1192   1.7     mrg #define HUFFMAN_TABLE_SIZE (1024)
   1193   1.7     mrg 
   1194   1.7     mrg /* Bit masks and shifts for the values in the table.  */
   1195   1.7     mrg 
   1196   1.7     mrg #define HUFFMAN_VALUE_MASK 0x01ff
   1197   1.7     mrg #define HUFFMAN_BITS_SHIFT 9
   1198   1.7     mrg #define HUFFMAN_BITS_MASK 0x7
   1199   1.7     mrg #define HUFFMAN_SECONDARY_SHIFT 12
   1200   1.7     mrg 
   1201   1.7     mrg /* For working memory while inflating we need two code tables, we need
   1202   1.7     mrg    an array of code lengths (max value 15, so we use unsigned char),
   1203   1.7     mrg    and an array of unsigned shorts used while building a table.  The
   1204   1.7     mrg    latter two arrays must be large enough to hold the maximum number
   1205   1.7     mrg    of code lengths, which RFC 1951 defines as 286 + 30.  */
   1206   1.7     mrg 
   1207   1.7     mrg #define ZDEBUG_TABLE_SIZE \
   1208   1.7     mrg   (2 * HUFFMAN_TABLE_SIZE * sizeof (uint16_t) \
   1209   1.7     mrg    + (286 + 30) * sizeof (uint16_t)	      \
   1210   1.7     mrg    + (286 + 30) * sizeof (unsigned char))
   1211   1.7     mrg 
   1212   1.7     mrg #define ZDEBUG_TABLE_CODELEN_OFFSET \
   1213   1.7     mrg   (2 * HUFFMAN_TABLE_SIZE * sizeof (uint16_t) \
   1214   1.7     mrg    + (286 + 30) * sizeof (uint16_t))
   1215   1.7     mrg 
   1216   1.7     mrg #define ZDEBUG_TABLE_WORK_OFFSET \
   1217   1.7     mrg   (2 * HUFFMAN_TABLE_SIZE * sizeof (uint16_t))
   1218   1.7     mrg 
   1219   1.7     mrg #ifdef BACKTRACE_GENERATE_FIXED_HUFFMAN_TABLE
   1220   1.7     mrg 
   1221   1.7     mrg /* Used by the main function that generates the fixed table to learn
   1222   1.7     mrg    the table size.  */
   1223   1.7     mrg static size_t final_next_secondary;
   1224   1.7     mrg 
   1225   1.7     mrg #endif
   1226   1.7     mrg 
   1227   1.7     mrg /* Build a Huffman code table from an array of lengths in CODES of
   1228   1.7     mrg    length CODES_LEN.  The table is stored into *TABLE.  ZDEBUG_TABLE
   1229   1.7     mrg    is the same as for elf_zlib_inflate, used to find some work space.
   1230   1.7     mrg    Returns 1 on success, 0 on error.  */
   1231   1.7     mrg 
   1232   1.7     mrg static int
   1233   1.7     mrg elf_zlib_inflate_table (unsigned char *codes, size_t codes_len,
   1234   1.7     mrg 			uint16_t *zdebug_table, uint16_t *table)
   1235   1.7     mrg {
   1236   1.7     mrg   uint16_t count[16];
   1237   1.7     mrg   uint16_t start[16];
   1238   1.7     mrg   uint16_t prev[16];
   1239   1.7     mrg   uint16_t firstcode[7];
   1240   1.7     mrg   uint16_t *next;
   1241   1.7     mrg   size_t i;
   1242   1.7     mrg   size_t j;
   1243   1.7     mrg   unsigned int code;
   1244   1.7     mrg   size_t next_secondary;
   1245   1.7     mrg 
   1246   1.7     mrg   /* Count the number of code of each length.  Set NEXT[val] to be the
   1247   1.7     mrg      next value after VAL with the same bit length.  */
   1248   1.7     mrg 
   1249   1.7     mrg   next = (uint16_t *) (((unsigned char *) zdebug_table)
   1250   1.7     mrg 		       + ZDEBUG_TABLE_WORK_OFFSET);
   1251   1.7     mrg 
   1252   1.7     mrg   memset (&count[0], 0, 16 * sizeof (uint16_t));
   1253   1.7     mrg   for (i = 0; i < codes_len; ++i)
   1254   1.7     mrg     {
   1255   1.7     mrg       if (unlikely (codes[i] >= 16))
   1256   1.7     mrg 	{
   1257  1.10     mrg 	  elf_uncompress_failed ();
   1258   1.7     mrg 	  return 0;
   1259   1.7     mrg 	}
   1260   1.7     mrg 
   1261   1.7     mrg       if (count[codes[i]] == 0)
   1262   1.7     mrg 	{
   1263   1.7     mrg 	  start[codes[i]] = i;
   1264   1.7     mrg 	  prev[codes[i]] = i;
   1265   1.7     mrg 	}
   1266   1.7     mrg       else
   1267   1.7     mrg 	{
   1268   1.7     mrg 	  next[prev[codes[i]]] = i;
   1269   1.7     mrg 	  prev[codes[i]] = i;
   1270   1.7     mrg 	}
   1271   1.7     mrg 
   1272   1.7     mrg       ++count[codes[i]];
   1273   1.7     mrg     }
   1274   1.7     mrg 
   1275   1.7     mrg   /* For each length, fill in the table for the codes of that
   1276   1.7     mrg      length.  */
   1277   1.7     mrg 
   1278   1.7     mrg   memset (table, 0, HUFFMAN_TABLE_SIZE * sizeof (uint16_t));
   1279   1.7     mrg 
   1280   1.7     mrg   /* Handle the values that do not require a secondary table.  */
   1281   1.7     mrg 
   1282   1.7     mrg   code = 0;
   1283   1.7     mrg   for (j = 1; j <= 8; ++j)
   1284   1.7     mrg     {
   1285   1.7     mrg       unsigned int jcnt;
   1286   1.7     mrg       unsigned int val;
   1287   1.7     mrg 
   1288   1.7     mrg       jcnt = count[j];
   1289   1.7     mrg       if (jcnt == 0)
   1290   1.7     mrg 	continue;
   1291   1.7     mrg 
   1292   1.7     mrg       if (unlikely (jcnt > (1U << j)))
   1293   1.7     mrg 	{
   1294  1.10     mrg 	  elf_uncompress_failed ();
   1295   1.7     mrg 	  return 0;
   1296   1.7     mrg 	}
   1297   1.7     mrg 
   1298   1.7     mrg       /* There are JCNT values that have this length, the values
   1299   1.7     mrg 	 starting from START[j] continuing through NEXT[VAL].  Those
   1300   1.7     mrg 	 values are assigned consecutive values starting at CODE.  */
   1301   1.7     mrg 
   1302   1.7     mrg       val = start[j];
   1303   1.7     mrg       for (i = 0; i < jcnt; ++i)
   1304   1.7     mrg 	{
   1305   1.7     mrg 	  uint16_t tval;
   1306   1.7     mrg 	  size_t ind;
   1307   1.7     mrg 	  unsigned int incr;
   1308   1.7     mrg 
   1309   1.7     mrg 	  /* In the compressed bit stream, the value VAL is encoded as
   1310   1.7     mrg 	     J bits with the value C.  */
   1311   1.7     mrg 
   1312   1.7     mrg 	  if (unlikely ((val & ~HUFFMAN_VALUE_MASK) != 0))
   1313   1.7     mrg 	    {
   1314  1.10     mrg 	      elf_uncompress_failed ();
   1315   1.7     mrg 	      return 0;
   1316   1.7     mrg 	    }
   1317   1.7     mrg 
   1318   1.7     mrg 	  tval = val | ((j - 1) << HUFFMAN_BITS_SHIFT);
   1319   1.7     mrg 
   1320   1.7     mrg 	  /* The table lookup uses 8 bits.  If J is less than 8, we
   1321   1.7     mrg 	     don't know what the other bits will be.  We need to fill
   1322   1.7     mrg 	     in all possibilities in the table.  Since the Huffman
   1323   1.7     mrg 	     code is unambiguous, those entries can't be used for any
   1324   1.7     mrg 	     other code.  */
   1325   1.7     mrg 
   1326   1.7     mrg 	  for (ind = code; ind < 0x100; ind += 1 << j)
   1327   1.7     mrg 	    {
   1328   1.7     mrg 	      if (unlikely (table[ind] != 0))
   1329   1.7     mrg 		{
   1330  1.10     mrg 		  elf_uncompress_failed ();
   1331   1.7     mrg 		  return 0;
   1332   1.7     mrg 		}
   1333   1.7     mrg 	      table[ind] = tval;
   1334   1.7     mrg 	    }
   1335   1.7     mrg 
   1336   1.7     mrg 	  /* Advance to the next value with this length.  */
   1337   1.7     mrg 	  if (i + 1 < jcnt)
   1338   1.7     mrg 	    val = next[val];
   1339   1.7     mrg 
   1340   1.7     mrg 	  /* The Huffman codes are stored in the bitstream with the
   1341   1.7     mrg 	     most significant bit first, as is required to make them
   1342   1.7     mrg 	     unambiguous.  The effect is that when we read them from
   1343   1.7     mrg 	     the bitstream we see the bit sequence in reverse order:
   1344   1.7     mrg 	     the most significant bit of the Huffman code is the least
   1345   1.7     mrg 	     significant bit of the value we read from the bitstream.
   1346   1.7     mrg 	     That means that to make our table lookups work, we need
   1347   1.7     mrg 	     to reverse the bits of CODE.  Since reversing bits is
   1348   1.7     mrg 	     tedious and in general requires using a table, we instead
   1349   1.7     mrg 	     increment CODE in reverse order.  That is, if the number
   1350   1.7     mrg 	     of bits we are currently using, here named J, is 3, we
   1351   1.7     mrg 	     count as 000, 100, 010, 110, 001, 101, 011, 111, which is
   1352   1.7     mrg 	     to say the numbers from 0 to 7 but with the bits
   1353   1.7     mrg 	     reversed.  Going to more bits, aka incrementing J,
   1354   1.7     mrg 	     effectively just adds more zero bits as the beginning,
   1355   1.7     mrg 	     and as such does not change the numeric value of CODE.
   1356   1.7     mrg 
   1357   1.7     mrg 	     To increment CODE of length J in reverse order, find the
   1358   1.7     mrg 	     most significant zero bit and set it to one while
   1359   1.7     mrg 	     clearing all higher bits.  In other words, add 1 modulo
   1360   1.7     mrg 	     2^J, only reversed.  */
   1361   1.7     mrg 
   1362   1.7     mrg 	  incr = 1U << (j - 1);
   1363   1.7     mrg 	  while ((code & incr) != 0)
   1364   1.7     mrg 	    incr >>= 1;
   1365   1.7     mrg 	  if (incr == 0)
   1366   1.7     mrg 	    code = 0;
   1367   1.7     mrg 	  else
   1368   1.7     mrg 	    {
   1369   1.7     mrg 	      code &= incr - 1;
   1370   1.7     mrg 	      code += incr;
   1371   1.7     mrg 	    }
   1372   1.7     mrg 	}
   1373   1.7     mrg     }
   1374   1.7     mrg 
   1375   1.7     mrg   /* Handle the values that require a secondary table.  */
   1376   1.7     mrg 
   1377   1.7     mrg   /* Set FIRSTCODE, the number at which the codes start, for each
   1378   1.7     mrg      length.  */
   1379   1.7     mrg 
   1380   1.7     mrg   for (j = 9; j < 16; j++)
   1381   1.7     mrg     {
   1382   1.7     mrg       unsigned int jcnt;
   1383   1.7     mrg       unsigned int k;
   1384   1.7     mrg 
   1385   1.7     mrg       jcnt = count[j];
   1386   1.7     mrg       if (jcnt == 0)
   1387   1.7     mrg 	continue;
   1388   1.7     mrg 
   1389   1.7     mrg       /* There are JCNT values that have this length, the values
   1390   1.7     mrg 	 starting from START[j].  Those values are assigned
   1391   1.7     mrg 	 consecutive values starting at CODE.  */
   1392   1.7     mrg 
   1393   1.7     mrg       firstcode[j - 9] = code;
   1394   1.7     mrg 
   1395   1.7     mrg       /* Reverse add JCNT to CODE modulo 2^J.  */
   1396   1.7     mrg       for (k = 0; k < j; ++k)
   1397   1.7     mrg 	{
   1398   1.7     mrg 	  if ((jcnt & (1U << k)) != 0)
   1399   1.7     mrg 	    {
   1400   1.7     mrg 	      unsigned int m;
   1401   1.7     mrg 	      unsigned int bit;
   1402   1.7     mrg 
   1403   1.7     mrg 	      bit = 1U << (j - k - 1);
   1404   1.7     mrg 	      for (m = 0; m < j - k; ++m, bit >>= 1)
   1405   1.7     mrg 		{
   1406   1.7     mrg 		  if ((code & bit) == 0)
   1407   1.7     mrg 		    {
   1408   1.7     mrg 		      code += bit;
   1409   1.7     mrg 		      break;
   1410   1.7     mrg 		    }
   1411   1.7     mrg 		  code &= ~bit;
   1412   1.7     mrg 		}
   1413   1.7     mrg 	      jcnt &= ~(1U << k);
   1414   1.7     mrg 	    }
   1415   1.7     mrg 	}
   1416   1.7     mrg       if (unlikely (jcnt != 0))
   1417   1.7     mrg 	{
   1418  1.10     mrg 	  elf_uncompress_failed ();
   1419   1.7     mrg 	  return 0;
   1420   1.7     mrg 	}
   1421   1.7     mrg     }
   1422   1.7     mrg 
   1423   1.7     mrg   /* For J from 9 to 15, inclusive, we store COUNT[J] consecutive
   1424   1.7     mrg      values starting at START[J] with consecutive codes starting at
   1425   1.7     mrg      FIRSTCODE[J - 9].  In the primary table we need to point to the
   1426   1.7     mrg      secondary table, and the secondary table will be indexed by J - 9
   1427   1.7     mrg      bits.  We count down from 15 so that we install the larger
   1428   1.7     mrg      secondary tables first, as the smaller ones may be embedded in
   1429   1.7     mrg      the larger ones.  */
   1430   1.7     mrg 
   1431   1.7     mrg   next_secondary = 0; /* Index of next secondary table (after primary).  */
   1432   1.7     mrg   for (j = 15; j >= 9; j--)
   1433   1.7     mrg     {
   1434   1.7     mrg       unsigned int jcnt;
   1435   1.7     mrg       unsigned int val;
   1436   1.7     mrg       size_t primary; /* Current primary index.  */
   1437   1.7     mrg       size_t secondary; /* Offset to current secondary table.  */
   1438   1.7     mrg       size_t secondary_bits; /* Bit size of current secondary table.  */
   1439   1.7     mrg 
   1440   1.7     mrg       jcnt = count[j];
   1441   1.7     mrg       if (jcnt == 0)
   1442   1.7     mrg 	continue;
   1443   1.7     mrg 
   1444   1.7     mrg       val = start[j];
   1445   1.7     mrg       code = firstcode[j - 9];
   1446   1.7     mrg       primary = 0x100;
   1447   1.7     mrg       secondary = 0;
   1448   1.7     mrg       secondary_bits = 0;
   1449   1.7     mrg       for (i = 0; i < jcnt; ++i)
   1450   1.7     mrg 	{
   1451   1.7     mrg 	  uint16_t tval;
   1452   1.7     mrg 	  size_t ind;
   1453   1.7     mrg 	  unsigned int incr;
   1454   1.7     mrg 
   1455   1.7     mrg 	  if ((code & 0xff) != primary)
   1456   1.7     mrg 	    {
   1457   1.7     mrg 	      uint16_t tprimary;
   1458   1.7     mrg 
   1459   1.7     mrg 	      /* Fill in a new primary table entry.  */
   1460   1.7     mrg 
   1461   1.7     mrg 	      primary = code & 0xff;
   1462   1.7     mrg 
   1463   1.7     mrg 	      tprimary = table[primary];
   1464   1.7     mrg 	      if (tprimary == 0)
   1465   1.7     mrg 		{
   1466   1.7     mrg 		  /* Start a new secondary table.  */
   1467   1.7     mrg 
   1468   1.7     mrg 		  if (unlikely ((next_secondary & HUFFMAN_VALUE_MASK)
   1469   1.7     mrg 				!= next_secondary))
   1470   1.7     mrg 		    {
   1471  1.10     mrg 		      elf_uncompress_failed ();
   1472   1.7     mrg 		      return 0;
   1473   1.7     mrg 		    }
   1474   1.7     mrg 
   1475   1.7     mrg 		  secondary = next_secondary;
   1476   1.7     mrg 		  secondary_bits = j - 8;
   1477   1.7     mrg 		  next_secondary += 1 << secondary_bits;
   1478   1.7     mrg 		  table[primary] = (secondary
   1479   1.7     mrg 				    + ((j - 8) << HUFFMAN_BITS_SHIFT)
   1480   1.7     mrg 				    + (1U << HUFFMAN_SECONDARY_SHIFT));
   1481   1.7     mrg 		}
   1482   1.7     mrg 	      else
   1483   1.7     mrg 		{
   1484   1.7     mrg 		  /* There is an existing entry.  It had better be a
   1485   1.7     mrg 		     secondary table with enough bits.  */
   1486   1.7     mrg 		  if (unlikely ((tprimary & (1U << HUFFMAN_SECONDARY_SHIFT))
   1487   1.7     mrg 				== 0))
   1488   1.7     mrg 		    {
   1489  1.10     mrg 		      elf_uncompress_failed ();
   1490   1.7     mrg 		      return 0;
   1491   1.7     mrg 		    }
   1492   1.7     mrg 		  secondary = tprimary & HUFFMAN_VALUE_MASK;
   1493   1.7     mrg 		  secondary_bits = ((tprimary >> HUFFMAN_BITS_SHIFT)
   1494   1.7     mrg 				    & HUFFMAN_BITS_MASK);
   1495   1.7     mrg 		  if (unlikely (secondary_bits < j - 8))
   1496   1.7     mrg 		    {
   1497  1.10     mrg 		      elf_uncompress_failed ();
   1498   1.7     mrg 		      return 0;
   1499   1.7     mrg 		    }
   1500   1.7     mrg 		}
   1501   1.7     mrg 	    }
   1502   1.7     mrg 
   1503   1.7     mrg 	  /* Fill in secondary table entries.  */
   1504   1.7     mrg 
   1505   1.7     mrg 	  tval = val | ((j - 8) << HUFFMAN_BITS_SHIFT);
   1506   1.7     mrg 
   1507   1.7     mrg 	  for (ind = code >> 8;
   1508   1.7     mrg 	       ind < (1U << secondary_bits);
   1509   1.7     mrg 	       ind += 1U << (j - 8))
   1510   1.7     mrg 	    {
   1511   1.7     mrg 	      if (unlikely (table[secondary + 0x100 + ind] != 0))
   1512   1.7     mrg 		{
   1513  1.10     mrg 		  elf_uncompress_failed ();
   1514   1.7     mrg 		  return 0;
   1515   1.7     mrg 		}
   1516   1.7     mrg 	      table[secondary + 0x100 + ind] = tval;
   1517   1.7     mrg 	    }
   1518   1.7     mrg 
   1519   1.7     mrg 	  if (i + 1 < jcnt)
   1520   1.7     mrg 	    val = next[val];
   1521   1.7     mrg 
   1522   1.7     mrg 	  incr = 1U << (j - 1);
   1523   1.7     mrg 	  while ((code & incr) != 0)
   1524   1.7     mrg 	    incr >>= 1;
   1525   1.7     mrg 	  if (incr == 0)
   1526   1.7     mrg 	    code = 0;
   1527   1.7     mrg 	  else
   1528   1.7     mrg 	    {
   1529   1.7     mrg 	      code &= incr - 1;
   1530   1.7     mrg 	      code += incr;
   1531   1.7     mrg 	    }
   1532   1.7     mrg 	}
   1533   1.7     mrg     }
   1534   1.7     mrg 
   1535   1.7     mrg #ifdef BACKTRACE_GENERATE_FIXED_HUFFMAN_TABLE
   1536   1.7     mrg   final_next_secondary = next_secondary;
   1537   1.7     mrg #endif
   1538   1.7     mrg 
   1539   1.7     mrg   return 1;
   1540   1.7     mrg }
   1541   1.7     mrg 
   1542   1.7     mrg #ifdef BACKTRACE_GENERATE_FIXED_HUFFMAN_TABLE
   1543   1.7     mrg 
   1544   1.7     mrg /* Used to generate the fixed Huffman table for block type 1.  */
   1545   1.7     mrg 
   1546   1.7     mrg #include <stdio.h>
   1547   1.7     mrg 
   1548   1.7     mrg static uint16_t table[ZDEBUG_TABLE_SIZE];
   1549   1.7     mrg static unsigned char codes[288];
   1550   1.7     mrg 
   1551   1.7     mrg int
   1552   1.7     mrg main ()
   1553   1.7     mrg {
   1554   1.7     mrg   size_t i;
   1555   1.7     mrg 
   1556   1.7     mrg   for (i = 0; i <= 143; ++i)
   1557   1.7     mrg     codes[i] = 8;
   1558   1.7     mrg   for (i = 144; i <= 255; ++i)
   1559   1.7     mrg     codes[i] = 9;
   1560   1.7     mrg   for (i = 256; i <= 279; ++i)
   1561   1.7     mrg     codes[i] = 7;
   1562   1.7     mrg   for (i = 280; i <= 287; ++i)
   1563   1.7     mrg     codes[i] = 8;
   1564   1.7     mrg   if (!elf_zlib_inflate_table (&codes[0], 288, &table[0], &table[0]))
   1565   1.7     mrg     {
   1566   1.7     mrg       fprintf (stderr, "elf_zlib_inflate_table failed\n");
   1567   1.7     mrg       exit (EXIT_FAILURE);
   1568   1.7     mrg     }
   1569   1.7     mrg 
   1570   1.7     mrg   printf ("static const uint16_t elf_zlib_default_table[%#zx] =\n",
   1571   1.7     mrg 	  final_next_secondary + 0x100);
   1572   1.7     mrg   printf ("{\n");
   1573   1.7     mrg   for (i = 0; i < final_next_secondary + 0x100; i += 8)
   1574   1.7     mrg     {
   1575   1.7     mrg       size_t j;
   1576   1.7     mrg 
   1577   1.7     mrg       printf (" ");
   1578   1.7     mrg       for (j = i; j < final_next_secondary + 0x100 && j < i + 8; ++j)
   1579   1.7     mrg 	printf (" %#x,", table[j]);
   1580   1.7     mrg       printf ("\n");
   1581   1.7     mrg     }
   1582   1.7     mrg   printf ("};\n");
   1583   1.7     mrg   printf ("\n");
   1584   1.7     mrg 
   1585   1.7     mrg   for (i = 0; i < 32; ++i)
   1586   1.7     mrg     codes[i] = 5;
   1587   1.7     mrg   if (!elf_zlib_inflate_table (&codes[0], 32, &table[0], &table[0]))
   1588   1.7     mrg     {
   1589   1.7     mrg       fprintf (stderr, "elf_zlib_inflate_table failed\n");
   1590   1.7     mrg       exit (EXIT_FAILURE);
   1591   1.7     mrg     }
   1592   1.7     mrg 
   1593   1.7     mrg   printf ("static const uint16_t elf_zlib_default_dist_table[%#zx] =\n",
   1594   1.7     mrg 	  final_next_secondary + 0x100);
   1595   1.7     mrg   printf ("{\n");
   1596   1.7     mrg   for (i = 0; i < final_next_secondary + 0x100; i += 8)
   1597   1.7     mrg     {
   1598   1.7     mrg       size_t j;
   1599   1.7     mrg 
   1600   1.7     mrg       printf (" ");
   1601   1.7     mrg       for (j = i; j < final_next_secondary + 0x100 && j < i + 8; ++j)
   1602   1.7     mrg 	printf (" %#x,", table[j]);
   1603   1.7     mrg       printf ("\n");
   1604   1.7     mrg     }
   1605   1.7     mrg   printf ("};\n");
   1606   1.7     mrg 
   1607   1.7     mrg   return 0;
   1608   1.7     mrg }
   1609   1.7     mrg 
   1610   1.7     mrg #endif
   1611   1.7     mrg 
   1612   1.7     mrg /* The fixed tables generated by the #ifdef'ed out main function
   1613   1.7     mrg    above.  */
   1614   1.7     mrg 
   1615   1.7     mrg static const uint16_t elf_zlib_default_table[0x170] =
   1616   1.7     mrg {
   1617   1.7     mrg   0xd00, 0xe50, 0xe10, 0xf18, 0xd10, 0xe70, 0xe30, 0x1230,
   1618   1.7     mrg   0xd08, 0xe60, 0xe20, 0x1210, 0xe00, 0xe80, 0xe40, 0x1250,
   1619   1.7     mrg   0xd04, 0xe58, 0xe18, 0x1200, 0xd14, 0xe78, 0xe38, 0x1240,
   1620   1.7     mrg   0xd0c, 0xe68, 0xe28, 0x1220, 0xe08, 0xe88, 0xe48, 0x1260,
   1621   1.7     mrg   0xd02, 0xe54, 0xe14, 0xf1c, 0xd12, 0xe74, 0xe34, 0x1238,
   1622   1.7     mrg   0xd0a, 0xe64, 0xe24, 0x1218, 0xe04, 0xe84, 0xe44, 0x1258,
   1623   1.7     mrg   0xd06, 0xe5c, 0xe1c, 0x1208, 0xd16, 0xe7c, 0xe3c, 0x1248,
   1624   1.7     mrg   0xd0e, 0xe6c, 0xe2c, 0x1228, 0xe0c, 0xe8c, 0xe4c, 0x1268,
   1625   1.7     mrg   0xd01, 0xe52, 0xe12, 0xf1a, 0xd11, 0xe72, 0xe32, 0x1234,
   1626   1.7     mrg   0xd09, 0xe62, 0xe22, 0x1214, 0xe02, 0xe82, 0xe42, 0x1254,
   1627   1.7     mrg   0xd05, 0xe5a, 0xe1a, 0x1204, 0xd15, 0xe7a, 0xe3a, 0x1244,
   1628   1.7     mrg   0xd0d, 0xe6a, 0xe2a, 0x1224, 0xe0a, 0xe8a, 0xe4a, 0x1264,
   1629   1.7     mrg   0xd03, 0xe56, 0xe16, 0xf1e, 0xd13, 0xe76, 0xe36, 0x123c,
   1630   1.7     mrg   0xd0b, 0xe66, 0xe26, 0x121c, 0xe06, 0xe86, 0xe46, 0x125c,
   1631   1.7     mrg   0xd07, 0xe5e, 0xe1e, 0x120c, 0xd17, 0xe7e, 0xe3e, 0x124c,
   1632   1.7     mrg   0xd0f, 0xe6e, 0xe2e, 0x122c, 0xe0e, 0xe8e, 0xe4e, 0x126c,
   1633   1.7     mrg   0xd00, 0xe51, 0xe11, 0xf19, 0xd10, 0xe71, 0xe31, 0x1232,
   1634   1.7     mrg   0xd08, 0xe61, 0xe21, 0x1212, 0xe01, 0xe81, 0xe41, 0x1252,
   1635   1.7     mrg   0xd04, 0xe59, 0xe19, 0x1202, 0xd14, 0xe79, 0xe39, 0x1242,
   1636   1.7     mrg   0xd0c, 0xe69, 0xe29, 0x1222, 0xe09, 0xe89, 0xe49, 0x1262,
   1637   1.7     mrg   0xd02, 0xe55, 0xe15, 0xf1d, 0xd12, 0xe75, 0xe35, 0x123a,
   1638   1.7     mrg   0xd0a, 0xe65, 0xe25, 0x121a, 0xe05, 0xe85, 0xe45, 0x125a,
   1639   1.7     mrg   0xd06, 0xe5d, 0xe1d, 0x120a, 0xd16, 0xe7d, 0xe3d, 0x124a,
   1640   1.7     mrg   0xd0e, 0xe6d, 0xe2d, 0x122a, 0xe0d, 0xe8d, 0xe4d, 0x126a,
   1641   1.7     mrg   0xd01, 0xe53, 0xe13, 0xf1b, 0xd11, 0xe73, 0xe33, 0x1236,
   1642   1.7     mrg   0xd09, 0xe63, 0xe23, 0x1216, 0xe03, 0xe83, 0xe43, 0x1256,
   1643   1.7     mrg   0xd05, 0xe5b, 0xe1b, 0x1206, 0xd15, 0xe7b, 0xe3b, 0x1246,
   1644   1.7     mrg   0xd0d, 0xe6b, 0xe2b, 0x1226, 0xe0b, 0xe8b, 0xe4b, 0x1266,
   1645   1.7     mrg   0xd03, 0xe57, 0xe17, 0xf1f, 0xd13, 0xe77, 0xe37, 0x123e,
   1646   1.7     mrg   0xd0b, 0xe67, 0xe27, 0x121e, 0xe07, 0xe87, 0xe47, 0x125e,
   1647   1.7     mrg   0xd07, 0xe5f, 0xe1f, 0x120e, 0xd17, 0xe7f, 0xe3f, 0x124e,
   1648   1.7     mrg   0xd0f, 0xe6f, 0xe2f, 0x122e, 0xe0f, 0xe8f, 0xe4f, 0x126e,
   1649   1.7     mrg   0x290, 0x291, 0x292, 0x293, 0x294, 0x295, 0x296, 0x297,
   1650   1.7     mrg   0x298, 0x299, 0x29a, 0x29b, 0x29c, 0x29d, 0x29e, 0x29f,
   1651   1.7     mrg   0x2a0, 0x2a1, 0x2a2, 0x2a3, 0x2a4, 0x2a5, 0x2a6, 0x2a7,
   1652   1.7     mrg   0x2a8, 0x2a9, 0x2aa, 0x2ab, 0x2ac, 0x2ad, 0x2ae, 0x2af,
   1653   1.7     mrg   0x2b0, 0x2b1, 0x2b2, 0x2b3, 0x2b4, 0x2b5, 0x2b6, 0x2b7,
   1654   1.7     mrg   0x2b8, 0x2b9, 0x2ba, 0x2bb, 0x2bc, 0x2bd, 0x2be, 0x2bf,
   1655   1.7     mrg   0x2c0, 0x2c1, 0x2c2, 0x2c3, 0x2c4, 0x2c5, 0x2c6, 0x2c7,
   1656   1.7     mrg   0x2c8, 0x2c9, 0x2ca, 0x2cb, 0x2cc, 0x2cd, 0x2ce, 0x2cf,
   1657   1.7     mrg   0x2d0, 0x2d1, 0x2d2, 0x2d3, 0x2d4, 0x2d5, 0x2d6, 0x2d7,
   1658   1.7     mrg   0x2d8, 0x2d9, 0x2da, 0x2db, 0x2dc, 0x2dd, 0x2de, 0x2df,
   1659   1.7     mrg   0x2e0, 0x2e1, 0x2e2, 0x2e3, 0x2e4, 0x2e5, 0x2e6, 0x2e7,
   1660   1.7     mrg   0x2e8, 0x2e9, 0x2ea, 0x2eb, 0x2ec, 0x2ed, 0x2ee, 0x2ef,
   1661   1.7     mrg   0x2f0, 0x2f1, 0x2f2, 0x2f3, 0x2f4, 0x2f5, 0x2f6, 0x2f7,
   1662   1.7     mrg   0x2f8, 0x2f9, 0x2fa, 0x2fb, 0x2fc, 0x2fd, 0x2fe, 0x2ff,
   1663   1.7     mrg };
   1664   1.7     mrg 
   1665   1.7     mrg static const uint16_t elf_zlib_default_dist_table[0x100] =
   1666   1.7     mrg {
   1667   1.7     mrg   0x800, 0x810, 0x808, 0x818, 0x804, 0x814, 0x80c, 0x81c,
   1668   1.7     mrg   0x802, 0x812, 0x80a, 0x81a, 0x806, 0x816, 0x80e, 0x81e,
   1669   1.7     mrg   0x801, 0x811, 0x809, 0x819, 0x805, 0x815, 0x80d, 0x81d,
   1670   1.7     mrg   0x803, 0x813, 0x80b, 0x81b, 0x807, 0x817, 0x80f, 0x81f,
   1671   1.7     mrg   0x800, 0x810, 0x808, 0x818, 0x804, 0x814, 0x80c, 0x81c,
   1672   1.7     mrg   0x802, 0x812, 0x80a, 0x81a, 0x806, 0x816, 0x80e, 0x81e,
   1673   1.7     mrg   0x801, 0x811, 0x809, 0x819, 0x805, 0x815, 0x80d, 0x81d,
   1674   1.7     mrg   0x803, 0x813, 0x80b, 0x81b, 0x807, 0x817, 0x80f, 0x81f,
   1675   1.7     mrg   0x800, 0x810, 0x808, 0x818, 0x804, 0x814, 0x80c, 0x81c,
   1676   1.7     mrg   0x802, 0x812, 0x80a, 0x81a, 0x806, 0x816, 0x80e, 0x81e,
   1677   1.7     mrg   0x801, 0x811, 0x809, 0x819, 0x805, 0x815, 0x80d, 0x81d,
   1678   1.7     mrg   0x803, 0x813, 0x80b, 0x81b, 0x807, 0x817, 0x80f, 0x81f,
   1679   1.7     mrg   0x800, 0x810, 0x808, 0x818, 0x804, 0x814, 0x80c, 0x81c,
   1680   1.7     mrg   0x802, 0x812, 0x80a, 0x81a, 0x806, 0x816, 0x80e, 0x81e,
   1681   1.7     mrg   0x801, 0x811, 0x809, 0x819, 0x805, 0x815, 0x80d, 0x81d,
   1682   1.7     mrg   0x803, 0x813, 0x80b, 0x81b, 0x807, 0x817, 0x80f, 0x81f,
   1683   1.7     mrg   0x800, 0x810, 0x808, 0x818, 0x804, 0x814, 0x80c, 0x81c,
   1684   1.7     mrg   0x802, 0x812, 0x80a, 0x81a, 0x806, 0x816, 0x80e, 0x81e,
   1685   1.7     mrg   0x801, 0x811, 0x809, 0x819, 0x805, 0x815, 0x80d, 0x81d,
   1686   1.7     mrg   0x803, 0x813, 0x80b, 0x81b, 0x807, 0x817, 0x80f, 0x81f,
   1687   1.7     mrg   0x800, 0x810, 0x808, 0x818, 0x804, 0x814, 0x80c, 0x81c,
   1688   1.7     mrg   0x802, 0x812, 0x80a, 0x81a, 0x806, 0x816, 0x80e, 0x81e,
   1689   1.7     mrg   0x801, 0x811, 0x809, 0x819, 0x805, 0x815, 0x80d, 0x81d,
   1690   1.7     mrg   0x803, 0x813, 0x80b, 0x81b, 0x807, 0x817, 0x80f, 0x81f,
   1691   1.7     mrg   0x800, 0x810, 0x808, 0x818, 0x804, 0x814, 0x80c, 0x81c,
   1692   1.7     mrg   0x802, 0x812, 0x80a, 0x81a, 0x806, 0x816, 0x80e, 0x81e,
   1693   1.7     mrg   0x801, 0x811, 0x809, 0x819, 0x805, 0x815, 0x80d, 0x81d,
   1694   1.7     mrg   0x803, 0x813, 0x80b, 0x81b, 0x807, 0x817, 0x80f, 0x81f,
   1695   1.7     mrg   0x800, 0x810, 0x808, 0x818, 0x804, 0x814, 0x80c, 0x81c,
   1696   1.7     mrg   0x802, 0x812, 0x80a, 0x81a, 0x806, 0x816, 0x80e, 0x81e,
   1697   1.7     mrg   0x801, 0x811, 0x809, 0x819, 0x805, 0x815, 0x80d, 0x81d,
   1698   1.7     mrg   0x803, 0x813, 0x80b, 0x81b, 0x807, 0x817, 0x80f, 0x81f,
   1699   1.7     mrg };
   1700   1.7     mrg 
   1701   1.7     mrg /* Inflate a zlib stream from PIN/SIN to POUT/SOUT.  Return 1 on
   1702   1.7     mrg    success, 0 on some error parsing the stream.  */
   1703   1.7     mrg 
   1704   1.7     mrg static int
   1705   1.7     mrg elf_zlib_inflate (const unsigned char *pin, size_t sin, uint16_t *zdebug_table,
   1706   1.7     mrg 		  unsigned char *pout, size_t sout)
   1707   1.7     mrg {
   1708   1.7     mrg   unsigned char *porigout;
   1709   1.7     mrg   const unsigned char *pinend;
   1710   1.7     mrg   unsigned char *poutend;
   1711   1.7     mrg 
   1712   1.7     mrg   /* We can apparently see multiple zlib streams concatenated
   1713   1.7     mrg      together, so keep going as long as there is something to read.
   1714   1.7     mrg      The last 4 bytes are the checksum.  */
   1715   1.7     mrg   porigout = pout;
   1716   1.7     mrg   pinend = pin + sin;
   1717   1.7     mrg   poutend = pout + sout;
   1718   1.7     mrg   while ((pinend - pin) > 4)
   1719   1.7     mrg     {
   1720   1.7     mrg       uint64_t val;
   1721   1.7     mrg       unsigned int bits;
   1722   1.7     mrg       int last;
   1723   1.7     mrg 
   1724   1.7     mrg       /* Read the two byte zlib header.  */
   1725   1.7     mrg 
   1726   1.7     mrg       if (unlikely ((pin[0] & 0xf) != 8)) /* 8 is zlib encoding.  */
   1727   1.7     mrg 	{
   1728   1.7     mrg 	  /* Unknown compression method.  */
   1729  1.10     mrg 	  elf_uncompress_failed ();
   1730   1.7     mrg 	  return 0;
   1731   1.7     mrg 	}
   1732   1.7     mrg       if (unlikely ((pin[0] >> 4) > 7))
   1733   1.7     mrg 	{
   1734   1.7     mrg 	  /* Window size too large.  Other than this check, we don't
   1735   1.7     mrg 	     care about the window size.  */
   1736  1.10     mrg 	  elf_uncompress_failed ();
   1737   1.7     mrg 	  return 0;
   1738   1.7     mrg 	}
   1739   1.7     mrg       if (unlikely ((pin[1] & 0x20) != 0))
   1740   1.7     mrg 	{
   1741   1.7     mrg 	  /* Stream expects a predefined dictionary, but we have no
   1742   1.7     mrg 	     dictionary.  */
   1743  1.10     mrg 	  elf_uncompress_failed ();
   1744   1.7     mrg 	  return 0;
   1745   1.7     mrg 	}
   1746   1.7     mrg       val = (pin[0] << 8) | pin[1];
   1747   1.7     mrg       if (unlikely (val % 31 != 0))
   1748   1.7     mrg 	{
   1749   1.7     mrg 	  /* Header check failure.  */
   1750  1.10     mrg 	  elf_uncompress_failed ();
   1751   1.7     mrg 	  return 0;
   1752   1.7     mrg 	}
   1753   1.7     mrg       pin += 2;
   1754   1.7     mrg 
   1755   1.7     mrg       /* Align PIN to a 32-bit boundary.  */
   1756   1.7     mrg 
   1757   1.7     mrg       val = 0;
   1758   1.7     mrg       bits = 0;
   1759   1.7     mrg       while ((((uintptr_t) pin) & 3) != 0)
   1760   1.7     mrg 	{
   1761   1.7     mrg 	  val |= (uint64_t)*pin << bits;
   1762   1.7     mrg 	  bits += 8;
   1763   1.7     mrg 	  ++pin;
   1764   1.7     mrg 	}
   1765   1.7     mrg 
   1766   1.7     mrg       /* Read blocks until one is marked last.  */
   1767   1.7     mrg 
   1768   1.7     mrg       last = 0;
   1769   1.7     mrg 
   1770   1.7     mrg       while (!last)
   1771   1.7     mrg 	{
   1772   1.7     mrg 	  unsigned int type;
   1773   1.7     mrg 	  const uint16_t *tlit;
   1774   1.7     mrg 	  const uint16_t *tdist;
   1775   1.7     mrg 
   1776   1.7     mrg 	  if (!elf_zlib_fetch (&pin, pinend, &val, &bits))
   1777   1.7     mrg 	    return 0;
   1778   1.7     mrg 
   1779   1.7     mrg 	  last = val & 1;
   1780   1.7     mrg 	  type = (val >> 1) & 3;
   1781   1.7     mrg 	  val >>= 3;
   1782   1.7     mrg 	  bits -= 3;
   1783   1.7     mrg 
   1784   1.7     mrg 	  if (unlikely (type == 3))
   1785   1.7     mrg 	    {
   1786   1.7     mrg 	      /* Invalid block type.  */
   1787  1.10     mrg 	      elf_uncompress_failed ();
   1788   1.7     mrg 	      return 0;
   1789   1.7     mrg 	    }
   1790   1.7     mrg 
   1791   1.7     mrg 	  if (type == 0)
   1792   1.7     mrg 	    {
   1793   1.7     mrg 	      uint16_t len;
   1794   1.7     mrg 	      uint16_t lenc;
   1795   1.7     mrg 
   1796   1.7     mrg 	      /* An uncompressed block.  */
   1797   1.7     mrg 
   1798   1.7     mrg 	      /* If we've read ahead more than a byte, back up.  */
   1799  1.10     mrg 	      while (bits >= 8)
   1800   1.7     mrg 		{
   1801   1.7     mrg 		  --pin;
   1802   1.7     mrg 		  bits -= 8;
   1803   1.7     mrg 		}
   1804   1.7     mrg 
   1805   1.7     mrg 	      val = 0;
   1806   1.7     mrg 	      bits = 0;
   1807   1.7     mrg 	      if (unlikely ((pinend - pin) < 4))
   1808   1.7     mrg 		{
   1809   1.7     mrg 		  /* Missing length.  */
   1810  1.10     mrg 		  elf_uncompress_failed ();
   1811   1.7     mrg 		  return 0;
   1812   1.7     mrg 		}
   1813   1.7     mrg 	      len = pin[0] | (pin[1] << 8);
   1814   1.7     mrg 	      lenc = pin[2] | (pin[3] << 8);
   1815   1.7     mrg 	      pin += 4;
   1816   1.7     mrg 	      lenc = ~lenc;
   1817   1.7     mrg 	      if (unlikely (len != lenc))
   1818   1.7     mrg 		{
   1819   1.7     mrg 		  /* Corrupt data.  */
   1820  1.10     mrg 		  elf_uncompress_failed ();
   1821   1.7     mrg 		  return 0;
   1822   1.7     mrg 		}
   1823   1.7     mrg 	      if (unlikely (len > (unsigned int) (pinend - pin)
   1824   1.7     mrg 			    || len > (unsigned int) (poutend - pout)))
   1825   1.7     mrg 		{
   1826   1.7     mrg 		  /* Not enough space in buffers.  */
   1827  1.10     mrg 		  elf_uncompress_failed ();
   1828   1.7     mrg 		  return 0;
   1829   1.7     mrg 		}
   1830   1.7     mrg 	      memcpy (pout, pin, len);
   1831   1.7     mrg 	      pout += len;
   1832   1.7     mrg 	      pin += len;
   1833   1.7     mrg 
   1834   1.7     mrg 	      /* Align PIN.  */
   1835   1.7     mrg 	      while ((((uintptr_t) pin) & 3) != 0)
   1836   1.7     mrg 		{
   1837   1.7     mrg 		  val |= (uint64_t)*pin << bits;
   1838   1.7     mrg 		  bits += 8;
   1839   1.7     mrg 		  ++pin;
   1840   1.7     mrg 		}
   1841   1.7     mrg 
   1842   1.7     mrg 	      /* Go around to read the next block.  */
   1843   1.7     mrg 	      continue;
   1844   1.7     mrg 	    }
   1845   1.7     mrg 
   1846   1.7     mrg 	  if (type == 1)
   1847   1.7     mrg 	    {
   1848   1.7     mrg 	      tlit = elf_zlib_default_table;
   1849   1.7     mrg 	      tdist = elf_zlib_default_dist_table;
   1850   1.7     mrg 	    }
   1851   1.7     mrg 	  else
   1852   1.7     mrg 	    {
   1853   1.7     mrg 	      unsigned int nlit;
   1854   1.7     mrg 	      unsigned int ndist;
   1855   1.7     mrg 	      unsigned int nclen;
   1856   1.7     mrg 	      unsigned char codebits[19];
   1857   1.7     mrg 	      unsigned char *plenbase;
   1858   1.7     mrg 	      unsigned char *plen;
   1859   1.7     mrg 	      unsigned char *plenend;
   1860   1.7     mrg 
   1861   1.7     mrg 	      /* Read a Huffman encoding table.  The various magic
   1862   1.7     mrg 		 numbers here are from RFC 1951.  */
   1863   1.7     mrg 
   1864   1.7     mrg 	      if (!elf_zlib_fetch (&pin, pinend, &val, &bits))
   1865   1.7     mrg 		return 0;
   1866   1.7     mrg 
   1867   1.7     mrg 	      nlit = (val & 0x1f) + 257;
   1868   1.7     mrg 	      val >>= 5;
   1869   1.7     mrg 	      ndist = (val & 0x1f) + 1;
   1870   1.7     mrg 	      val >>= 5;
   1871   1.7     mrg 	      nclen = (val & 0xf) + 4;
   1872   1.7     mrg 	      val >>= 4;
   1873   1.7     mrg 	      bits -= 14;
   1874   1.7     mrg 	      if (unlikely (nlit > 286 || ndist > 30))
   1875   1.7     mrg 		{
   1876   1.7     mrg 		  /* Values out of range.  */
   1877  1.10     mrg 		  elf_uncompress_failed ();
   1878   1.7     mrg 		  return 0;
   1879   1.7     mrg 		}
   1880   1.7     mrg 
   1881   1.7     mrg 	      /* Read and build the table used to compress the
   1882   1.7     mrg 		 literal, length, and distance codes.  */
   1883   1.7     mrg 
   1884   1.7     mrg 	      memset(&codebits[0], 0, 19);
   1885   1.7     mrg 
   1886   1.7     mrg 	      /* There are always at least 4 elements in the
   1887   1.7     mrg 		 table.  */
   1888   1.7     mrg 
   1889   1.7     mrg 	      if (!elf_zlib_fetch (&pin, pinend, &val, &bits))
   1890   1.7     mrg 		return 0;
   1891   1.7     mrg 
   1892   1.7     mrg 	      codebits[16] = val & 7;
   1893   1.7     mrg 	      codebits[17] = (val >> 3) & 7;
   1894   1.7     mrg 	      codebits[18] = (val >> 6) & 7;
   1895   1.7     mrg 	      codebits[0] = (val >> 9) & 7;
   1896   1.7     mrg 	      val >>= 12;
   1897   1.7     mrg 	      bits -= 12;
   1898   1.7     mrg 
   1899   1.7     mrg 	      if (nclen == 4)
   1900   1.7     mrg 		goto codebitsdone;
   1901   1.7     mrg 
   1902   1.7     mrg 	      codebits[8] = val & 7;
   1903   1.7     mrg 	      val >>= 3;
   1904   1.7     mrg 	      bits -= 3;
   1905   1.7     mrg 
   1906   1.7     mrg 	      if (nclen == 5)
   1907   1.7     mrg 		goto codebitsdone;
   1908   1.7     mrg 
   1909   1.7     mrg 	      if (!elf_zlib_fetch (&pin, pinend, &val, &bits))
   1910   1.7     mrg 		return 0;
   1911   1.7     mrg 
   1912   1.7     mrg 	      codebits[7] = val & 7;
   1913   1.7     mrg 	      val >>= 3;
   1914   1.7     mrg 	      bits -= 3;
   1915   1.7     mrg 
   1916   1.7     mrg 	      if (nclen == 6)
   1917   1.7     mrg 		goto codebitsdone;
   1918   1.7     mrg 
   1919   1.7     mrg 	      codebits[9] = val & 7;
   1920   1.7     mrg 	      val >>= 3;
   1921   1.7     mrg 	      bits -= 3;
   1922   1.7     mrg 
   1923   1.7     mrg 	      if (nclen == 7)
   1924   1.7     mrg 		goto codebitsdone;
   1925   1.7     mrg 
   1926   1.7     mrg 	      codebits[6] = val & 7;
   1927   1.7     mrg 	      val >>= 3;
   1928   1.7     mrg 	      bits -= 3;
   1929   1.7     mrg 
   1930   1.7     mrg 	      if (nclen == 8)
   1931   1.7     mrg 		goto codebitsdone;
   1932   1.7     mrg 
   1933   1.7     mrg 	      codebits[10] = val & 7;
   1934   1.7     mrg 	      val >>= 3;
   1935   1.7     mrg 	      bits -= 3;
   1936   1.7     mrg 
   1937   1.7     mrg 	      if (nclen == 9)
   1938   1.7     mrg 		goto codebitsdone;
   1939   1.7     mrg 
   1940   1.7     mrg 	      codebits[5] = val & 7;
   1941   1.7     mrg 	      val >>= 3;
   1942   1.7     mrg 	      bits -= 3;
   1943   1.7     mrg 
   1944   1.7     mrg 	      if (nclen == 10)
   1945   1.7     mrg 		goto codebitsdone;
   1946   1.7     mrg 
   1947   1.7     mrg 	      if (!elf_zlib_fetch (&pin, pinend, &val, &bits))
   1948   1.7     mrg 		return 0;
   1949   1.7     mrg 
   1950   1.7     mrg 	      codebits[11] = val & 7;
   1951   1.7     mrg 	      val >>= 3;
   1952   1.7     mrg 	      bits -= 3;
   1953   1.7     mrg 
   1954   1.7     mrg 	      if (nclen == 11)
   1955   1.7     mrg 		goto codebitsdone;
   1956   1.7     mrg 
   1957   1.7     mrg 	      codebits[4] = val & 7;
   1958   1.7     mrg 	      val >>= 3;
   1959   1.7     mrg 	      bits -= 3;
   1960   1.7     mrg 
   1961   1.7     mrg 	      if (nclen == 12)
   1962   1.7     mrg 		goto codebitsdone;
   1963   1.7     mrg 
   1964   1.7     mrg 	      codebits[12] = val & 7;
   1965   1.7     mrg 	      val >>= 3;
   1966   1.7     mrg 	      bits -= 3;
   1967   1.7     mrg 
   1968   1.7     mrg 	      if (nclen == 13)
   1969   1.7     mrg 		goto codebitsdone;
   1970   1.7     mrg 
   1971   1.7     mrg 	      codebits[3] = val & 7;
   1972   1.7     mrg 	      val >>= 3;
   1973   1.7     mrg 	      bits -= 3;
   1974   1.7     mrg 
   1975   1.7     mrg 	      if (nclen == 14)
   1976   1.7     mrg 		goto codebitsdone;
   1977   1.7     mrg 
   1978   1.7     mrg 	      codebits[13] = val & 7;
   1979   1.7     mrg 	      val >>= 3;
   1980   1.7     mrg 	      bits -= 3;
   1981   1.7     mrg 
   1982   1.7     mrg 	      if (nclen == 15)
   1983   1.7     mrg 		goto codebitsdone;
   1984   1.7     mrg 
   1985   1.7     mrg 	      if (!elf_zlib_fetch (&pin, pinend, &val, &bits))
   1986   1.7     mrg 		return 0;
   1987   1.7     mrg 
   1988   1.7     mrg 	      codebits[2] = val & 7;
   1989   1.7     mrg 	      val >>= 3;
   1990   1.7     mrg 	      bits -= 3;
   1991   1.7     mrg 
   1992   1.7     mrg 	      if (nclen == 16)
   1993   1.7     mrg 		goto codebitsdone;
   1994   1.7     mrg 
   1995   1.7     mrg 	      codebits[14] = val & 7;
   1996   1.7     mrg 	      val >>= 3;
   1997   1.7     mrg 	      bits -= 3;
   1998   1.7     mrg 
   1999   1.7     mrg 	      if (nclen == 17)
   2000   1.7     mrg 		goto codebitsdone;
   2001   1.7     mrg 
   2002   1.7     mrg 	      codebits[1] = val & 7;
   2003   1.7     mrg 	      val >>= 3;
   2004   1.7     mrg 	      bits -= 3;
   2005   1.7     mrg 
   2006   1.7     mrg 	      if (nclen == 18)
   2007   1.7     mrg 		goto codebitsdone;
   2008   1.7     mrg 
   2009   1.7     mrg 	      codebits[15] = val & 7;
   2010   1.7     mrg 	      val >>= 3;
   2011   1.7     mrg 	      bits -= 3;
   2012   1.7     mrg 
   2013   1.7     mrg 	    codebitsdone:
   2014   1.7     mrg 
   2015   1.7     mrg 	      if (!elf_zlib_inflate_table (codebits, 19, zdebug_table,
   2016   1.7     mrg 					   zdebug_table))
   2017   1.7     mrg 		return 0;
   2018   1.7     mrg 
   2019   1.7     mrg 	      /* Read the compressed bit lengths of the literal,
   2020   1.7     mrg 		 length, and distance codes.  We have allocated space
   2021   1.7     mrg 		 at the end of zdebug_table to hold them.  */
   2022   1.7     mrg 
   2023   1.7     mrg 	      plenbase = (((unsigned char *) zdebug_table)
   2024   1.7     mrg 			  + ZDEBUG_TABLE_CODELEN_OFFSET);
   2025   1.7     mrg 	      plen = plenbase;
   2026   1.7     mrg 	      plenend = plen + nlit + ndist;
   2027   1.7     mrg 	      while (plen < plenend)
   2028   1.7     mrg 		{
   2029   1.7     mrg 		  uint16_t t;
   2030   1.7     mrg 		  unsigned int b;
   2031   1.7     mrg 		  uint16_t v;
   2032   1.7     mrg 
   2033   1.7     mrg 		  if (!elf_zlib_fetch (&pin, pinend, &val, &bits))
   2034   1.7     mrg 		    return 0;
   2035   1.7     mrg 
   2036   1.7     mrg 		  t = zdebug_table[val & 0xff];
   2037   1.7     mrg 
   2038   1.7     mrg 		  /* The compression here uses bit lengths up to 7, so
   2039   1.7     mrg 		     a secondary table is never necessary.  */
   2040   1.7     mrg 		  if (unlikely ((t & (1U << HUFFMAN_SECONDARY_SHIFT)) != 0))
   2041   1.7     mrg 		    {
   2042  1.10     mrg 		      elf_uncompress_failed ();
   2043   1.7     mrg 		      return 0;
   2044   1.7     mrg 		    }
   2045   1.7     mrg 
   2046   1.7     mrg 		  b = (t >> HUFFMAN_BITS_SHIFT) & HUFFMAN_BITS_MASK;
   2047   1.7     mrg 		  val >>= b + 1;
   2048   1.7     mrg 		  bits -= b + 1;
   2049   1.7     mrg 
   2050   1.7     mrg 		  v = t & HUFFMAN_VALUE_MASK;
   2051   1.7     mrg 		  if (v < 16)
   2052   1.7     mrg 		    *plen++ = v;
   2053   1.7     mrg 		  else if (v == 16)
   2054   1.7     mrg 		    {
   2055   1.7     mrg 		      unsigned int c;
   2056   1.7     mrg 		      unsigned int prev;
   2057   1.7     mrg 
   2058   1.7     mrg 		      /* Copy previous entry 3 to 6 times.  */
   2059   1.7     mrg 
   2060   1.7     mrg 		      if (unlikely (plen == plenbase))
   2061   1.7     mrg 			{
   2062  1.10     mrg 			  elf_uncompress_failed ();
   2063   1.7     mrg 			  return 0;
   2064   1.7     mrg 			}
   2065   1.7     mrg 
   2066   1.7     mrg 		      /* We used up to 7 bits since the last
   2067   1.7     mrg 			 elf_zlib_fetch, so we have at least 8 bits
   2068   1.7     mrg 			 available here.  */
   2069   1.7     mrg 
   2070   1.7     mrg 		      c = 3 + (val & 0x3);
   2071   1.7     mrg 		      val >>= 2;
   2072   1.7     mrg 		      bits -= 2;
   2073   1.7     mrg 		      if (unlikely ((unsigned int) (plenend - plen) < c))
   2074   1.7     mrg 			{
   2075  1.10     mrg 			  elf_uncompress_failed ();
   2076   1.7     mrg 			  return 0;
   2077   1.7     mrg 			}
   2078   1.7     mrg 
   2079   1.7     mrg 		      prev = plen[-1];
   2080   1.7     mrg 		      switch (c)
   2081   1.7     mrg 			{
   2082   1.7     mrg 			case 6:
   2083   1.7     mrg 			  *plen++ = prev;
   2084  1.10     mrg 			  ATTRIBUTE_FALLTHROUGH;
   2085   1.7     mrg 			case 5:
   2086   1.7     mrg 			  *plen++ = prev;
   2087  1.10     mrg 			  ATTRIBUTE_FALLTHROUGH;
   2088   1.7     mrg 			case 4:
   2089   1.7     mrg 			  *plen++ = prev;
   2090   1.7     mrg 			}
   2091   1.7     mrg 		      *plen++ = prev;
   2092   1.7     mrg 		      *plen++ = prev;
   2093   1.7     mrg 		      *plen++ = prev;
   2094   1.7     mrg 		    }
   2095   1.7     mrg 		  else if (v == 17)
   2096   1.7     mrg 		    {
   2097   1.7     mrg 		      unsigned int c;
   2098   1.7     mrg 
   2099   1.7     mrg 		      /* Store zero 3 to 10 times.  */
   2100   1.7     mrg 
   2101   1.7     mrg 		      /* We used up to 7 bits since the last
   2102   1.7     mrg 			 elf_zlib_fetch, so we have at least 8 bits
   2103   1.7     mrg 			 available here.  */
   2104   1.7     mrg 
   2105   1.7     mrg 		      c = 3 + (val & 0x7);
   2106   1.7     mrg 		      val >>= 3;
   2107   1.7     mrg 		      bits -= 3;
   2108   1.7     mrg 		      if (unlikely ((unsigned int) (plenend - plen) < c))
   2109   1.7     mrg 			{
   2110  1.10     mrg 			  elf_uncompress_failed ();
   2111   1.7     mrg 			  return 0;
   2112   1.7     mrg 			}
   2113   1.7     mrg 
   2114   1.7     mrg 		      switch (c)
   2115   1.7     mrg 			{
   2116   1.7     mrg 			case 10:
   2117   1.7     mrg 			  *plen++ = 0;
   2118  1.10     mrg 			  ATTRIBUTE_FALLTHROUGH;
   2119   1.7     mrg 			case 9:
   2120   1.7     mrg 			  *plen++ = 0;
   2121  1.10     mrg 			  ATTRIBUTE_FALLTHROUGH;
   2122   1.7     mrg 			case 8:
   2123   1.7     mrg 			  *plen++ = 0;
   2124  1.10     mrg 			  ATTRIBUTE_FALLTHROUGH;
   2125   1.7     mrg 			case 7:
   2126   1.7     mrg 			  *plen++ = 0;
   2127  1.10     mrg 			  ATTRIBUTE_FALLTHROUGH;
   2128   1.7     mrg 			case 6:
   2129   1.7     mrg 			  *plen++ = 0;
   2130  1.10     mrg 			  ATTRIBUTE_FALLTHROUGH;
   2131   1.7     mrg 			case 5:
   2132   1.7     mrg 			  *plen++ = 0;
   2133  1.10     mrg 			  ATTRIBUTE_FALLTHROUGH;
   2134   1.7     mrg 			case 4:
   2135   1.7     mrg 			  *plen++ = 0;
   2136   1.7     mrg 			}
   2137   1.7     mrg 		      *plen++ = 0;
   2138   1.7     mrg 		      *plen++ = 0;
   2139   1.7     mrg 		      *plen++ = 0;
   2140   1.7     mrg 		    }
   2141   1.7     mrg 		  else if (v == 18)
   2142   1.7     mrg 		    {
   2143   1.7     mrg 		      unsigned int c;
   2144   1.7     mrg 
   2145   1.7     mrg 		      /* Store zero 11 to 138 times.  */
   2146   1.7     mrg 
   2147   1.7     mrg 		      /* We used up to 7 bits since the last
   2148   1.7     mrg 			 elf_zlib_fetch, so we have at least 8 bits
   2149   1.7     mrg 			 available here.  */
   2150   1.7     mrg 
   2151   1.7     mrg 		      c = 11 + (val & 0x7f);
   2152   1.7     mrg 		      val >>= 7;
   2153   1.7     mrg 		      bits -= 7;
   2154   1.7     mrg 		      if (unlikely ((unsigned int) (plenend - plen) < c))
   2155   1.7     mrg 			{
   2156  1.10     mrg 			  elf_uncompress_failed ();
   2157   1.7     mrg 			  return 0;
   2158   1.7     mrg 			}
   2159   1.7     mrg 
   2160   1.7     mrg 		      memset (plen, 0, c);
   2161   1.7     mrg 		      plen += c;
   2162   1.7     mrg 		    }
   2163   1.7     mrg 		  else
   2164   1.7     mrg 		    {
   2165  1.10     mrg 		      elf_uncompress_failed ();
   2166   1.7     mrg 		      return 0;
   2167   1.7     mrg 		    }
   2168   1.7     mrg 		}
   2169   1.7     mrg 
   2170   1.7     mrg 	      /* Make sure that the stop code can appear.  */
   2171   1.7     mrg 
   2172   1.7     mrg 	      plen = plenbase;
   2173   1.7     mrg 	      if (unlikely (plen[256] == 0))
   2174   1.7     mrg 		{
   2175  1.10     mrg 		  elf_uncompress_failed ();
   2176   1.7     mrg 		  return 0;
   2177   1.7     mrg 		}
   2178   1.7     mrg 
   2179   1.7     mrg 	      /* Build the decompression tables.  */
   2180   1.7     mrg 
   2181   1.7     mrg 	      if (!elf_zlib_inflate_table (plen, nlit, zdebug_table,
   2182   1.7     mrg 					   zdebug_table))
   2183   1.7     mrg 		return 0;
   2184   1.7     mrg 	      if (!elf_zlib_inflate_table (plen + nlit, ndist, zdebug_table,
   2185   1.7     mrg 					   zdebug_table + HUFFMAN_TABLE_SIZE))
   2186   1.7     mrg 		return 0;
   2187   1.7     mrg 	      tlit = zdebug_table;
   2188   1.7     mrg 	      tdist = zdebug_table + HUFFMAN_TABLE_SIZE;
   2189   1.7     mrg 	    }
   2190   1.7     mrg 
   2191   1.7     mrg 	  /* Inflate values until the end of the block.  This is the
   2192   1.7     mrg 	     main loop of the inflation code.  */
   2193   1.7     mrg 
   2194   1.7     mrg 	  while (1)
   2195   1.7     mrg 	    {
   2196   1.7     mrg 	      uint16_t t;
   2197   1.7     mrg 	      unsigned int b;
   2198   1.7     mrg 	      uint16_t v;
   2199   1.7     mrg 	      unsigned int lit;
   2200   1.7     mrg 
   2201   1.7     mrg 	      if (!elf_zlib_fetch (&pin, pinend, &val, &bits))
   2202   1.7     mrg 		return 0;
   2203   1.7     mrg 
   2204   1.7     mrg 	      t = tlit[val & 0xff];
   2205   1.7     mrg 	      b = (t >> HUFFMAN_BITS_SHIFT) & HUFFMAN_BITS_MASK;
   2206   1.7     mrg 	      v = t & HUFFMAN_VALUE_MASK;
   2207   1.7     mrg 
   2208   1.7     mrg 	      if ((t & (1U << HUFFMAN_SECONDARY_SHIFT)) == 0)
   2209   1.7     mrg 		{
   2210   1.7     mrg 		  lit = v;
   2211   1.7     mrg 		  val >>= b + 1;
   2212   1.7     mrg 		  bits -= b + 1;
   2213   1.7     mrg 		}
   2214   1.7     mrg 	      else
   2215   1.7     mrg 		{
   2216   1.7     mrg 		  t = tlit[v + 0x100 + ((val >> 8) & ((1U << b) - 1))];
   2217   1.7     mrg 		  b = (t >> HUFFMAN_BITS_SHIFT) & HUFFMAN_BITS_MASK;
   2218   1.7     mrg 		  lit = t & HUFFMAN_VALUE_MASK;
   2219   1.7     mrg 		  val >>= b + 8;
   2220   1.7     mrg 		  bits -= b + 8;
   2221   1.7     mrg 		}
   2222   1.7     mrg 
   2223   1.7     mrg 	      if (lit < 256)
   2224   1.7     mrg 		{
   2225   1.7     mrg 		  if (unlikely (pout == poutend))
   2226   1.7     mrg 		    {
   2227  1.10     mrg 		      elf_uncompress_failed ();
   2228   1.7     mrg 		      return 0;
   2229   1.7     mrg 		    }
   2230   1.7     mrg 
   2231   1.7     mrg 		  *pout++ = lit;
   2232   1.7     mrg 
   2233   1.7     mrg 		  /* We will need to write the next byte soon.  We ask
   2234   1.7     mrg 		     for high temporal locality because we will write
   2235   1.7     mrg 		     to the whole cache line soon.  */
   2236   1.7     mrg 		  __builtin_prefetch (pout, 1, 3);
   2237   1.7     mrg 		}
   2238   1.7     mrg 	      else if (lit == 256)
   2239   1.7     mrg 		{
   2240   1.7     mrg 		  /* The end of the block.  */
   2241   1.7     mrg 		  break;
   2242   1.7     mrg 		}
   2243   1.7     mrg 	      else
   2244   1.7     mrg 		{
   2245   1.7     mrg 		  unsigned int dist;
   2246   1.7     mrg 		  unsigned int len;
   2247   1.7     mrg 
   2248   1.7     mrg 		  /* Convert lit into a length.  */
   2249   1.7     mrg 
   2250   1.7     mrg 		  if (lit < 265)
   2251   1.7     mrg 		    len = lit - 257 + 3;
   2252   1.7     mrg 		  else if (lit == 285)
   2253   1.7     mrg 		    len = 258;
   2254   1.7     mrg 		  else if (unlikely (lit > 285))
   2255   1.7     mrg 		    {
   2256  1.10     mrg 		      elf_uncompress_failed ();
   2257   1.7     mrg 		      return 0;
   2258   1.7     mrg 		    }
   2259   1.7     mrg 		  else
   2260   1.7     mrg 		    {
   2261   1.7     mrg 		      unsigned int extra;
   2262   1.7     mrg 
   2263   1.7     mrg 		      if (!elf_zlib_fetch (&pin, pinend, &val, &bits))
   2264   1.7     mrg 			return 0;
   2265   1.7     mrg 
   2266   1.7     mrg 		      /* This is an expression for the table of length
   2267   1.7     mrg 			 codes in RFC 1951 3.2.5.  */
   2268   1.7     mrg 		      lit -= 265;
   2269   1.7     mrg 		      extra = (lit >> 2) + 1;
   2270   1.7     mrg 		      len = (lit & 3) << extra;
   2271   1.7     mrg 		      len += 11;
   2272   1.7     mrg 		      len += ((1U << (extra - 1)) - 1) << 3;
   2273   1.7     mrg 		      len += val & ((1U << extra) - 1);
   2274   1.7     mrg 		      val >>= extra;
   2275   1.7     mrg 		      bits -= extra;
   2276   1.7     mrg 		    }
   2277   1.7     mrg 
   2278   1.7     mrg 		  if (!elf_zlib_fetch (&pin, pinend, &val, &bits))
   2279   1.7     mrg 		    return 0;
   2280   1.7     mrg 
   2281   1.7     mrg 		  t = tdist[val & 0xff];
   2282   1.7     mrg 		  b = (t >> HUFFMAN_BITS_SHIFT) & HUFFMAN_BITS_MASK;
   2283   1.7     mrg 		  v = t & HUFFMAN_VALUE_MASK;
   2284   1.7     mrg 
   2285   1.7     mrg 		  if ((t & (1U << HUFFMAN_SECONDARY_SHIFT)) == 0)
   2286   1.7     mrg 		    {
   2287   1.7     mrg 		      dist = v;
   2288   1.7     mrg 		      val >>= b + 1;
   2289   1.7     mrg 		      bits -= b + 1;
   2290   1.7     mrg 		    }
   2291   1.7     mrg 		  else
   2292   1.7     mrg 		    {
   2293   1.7     mrg 		      t = tdist[v + 0x100 + ((val >> 8) & ((1U << b) - 1))];
   2294   1.7     mrg 		      b = (t >> HUFFMAN_BITS_SHIFT) & HUFFMAN_BITS_MASK;
   2295   1.7     mrg 		      dist = t & HUFFMAN_VALUE_MASK;
   2296   1.7     mrg 		      val >>= b + 8;
   2297   1.7     mrg 		      bits -= b + 8;
   2298   1.7     mrg 		    }
   2299   1.7     mrg 
   2300   1.7     mrg 		  /* Convert dist to a distance.  */
   2301   1.7     mrg 
   2302   1.7     mrg 		  if (dist == 0)
   2303   1.7     mrg 		    {
   2304   1.7     mrg 		      /* A distance of 1.  A common case, meaning
   2305   1.7     mrg 			 repeat the last character LEN times.  */
   2306   1.7     mrg 
   2307   1.7     mrg 		      if (unlikely (pout == porigout))
   2308   1.7     mrg 			{
   2309  1.10     mrg 			  elf_uncompress_failed ();
   2310   1.7     mrg 			  return 0;
   2311   1.7     mrg 			}
   2312   1.7     mrg 
   2313   1.7     mrg 		      if (unlikely ((unsigned int) (poutend - pout) < len))
   2314   1.7     mrg 			{
   2315  1.10     mrg 			  elf_uncompress_failed ();
   2316   1.7     mrg 			  return 0;
   2317   1.7     mrg 			}
   2318   1.7     mrg 
   2319   1.7     mrg 		      memset (pout, pout[-1], len);
   2320   1.7     mrg 		      pout += len;
   2321   1.7     mrg 		    }
   2322   1.7     mrg 		  else if (unlikely (dist > 29))
   2323   1.7     mrg 		    {
   2324  1.10     mrg 		      elf_uncompress_failed ();
   2325   1.7     mrg 		      return 0;
   2326   1.7     mrg 		    }
   2327   1.7     mrg 		  else
   2328   1.7     mrg 		    {
   2329   1.7     mrg 		      if (dist < 4)
   2330   1.7     mrg 			dist = dist + 1;
   2331   1.7     mrg 		      else
   2332   1.7     mrg 			{
   2333   1.7     mrg 			  unsigned int extra;
   2334   1.7     mrg 
   2335   1.7     mrg 			  if (!elf_zlib_fetch (&pin, pinend, &val, &bits))
   2336   1.7     mrg 			    return 0;
   2337   1.7     mrg 
   2338   1.7     mrg 			  /* This is an expression for the table of
   2339   1.7     mrg 			     distance codes in RFC 1951 3.2.5.  */
   2340   1.7     mrg 			  dist -= 4;
   2341   1.7     mrg 			  extra = (dist >> 1) + 1;
   2342   1.7     mrg 			  dist = (dist & 1) << extra;
   2343   1.7     mrg 			  dist += 5;
   2344   1.7     mrg 			  dist += ((1U << (extra - 1)) - 1) << 2;
   2345   1.7     mrg 			  dist += val & ((1U << extra) - 1);
   2346   1.7     mrg 			  val >>= extra;
   2347   1.7     mrg 			  bits -= extra;
   2348   1.7     mrg 			}
   2349   1.7     mrg 
   2350   1.7     mrg 		      /* Go back dist bytes, and copy len bytes from
   2351   1.7     mrg 			 there.  */
   2352   1.7     mrg 
   2353   1.7     mrg 		      if (unlikely ((unsigned int) (pout - porigout) < dist))
   2354   1.7     mrg 			{
   2355  1.10     mrg 			  elf_uncompress_failed ();
   2356   1.7     mrg 			  return 0;
   2357   1.7     mrg 			}
   2358   1.7     mrg 
   2359   1.7     mrg 		      if (unlikely ((unsigned int) (poutend - pout) < len))
   2360   1.7     mrg 			{
   2361  1.10     mrg 			  elf_uncompress_failed ();
   2362   1.7     mrg 			  return 0;
   2363   1.7     mrg 			}
   2364   1.7     mrg 
   2365   1.7     mrg 		      if (dist >= len)
   2366   1.7     mrg 			{
   2367   1.7     mrg 			  memcpy (pout, pout - dist, len);
   2368   1.7     mrg 			  pout += len;
   2369   1.7     mrg 			}
   2370   1.7     mrg 		      else
   2371   1.7     mrg 			{
   2372   1.7     mrg 			  while (len > 0)
   2373   1.7     mrg 			    {
   2374   1.7     mrg 			      unsigned int copy;
   2375   1.7     mrg 
   2376   1.7     mrg 			      copy = len < dist ? len : dist;
   2377   1.7     mrg 			      memcpy (pout, pout - dist, copy);
   2378   1.7     mrg 			      len -= copy;
   2379   1.7     mrg 			      pout += copy;
   2380   1.7     mrg 			    }
   2381   1.7     mrg 			}
   2382   1.7     mrg 		    }
   2383   1.7     mrg 		}
   2384   1.7     mrg 	    }
   2385   1.7     mrg 	}
   2386   1.7     mrg     }
   2387   1.7     mrg 
   2388   1.7     mrg   /* We should have filled the output buffer.  */
   2389   1.7     mrg   if (unlikely (pout != poutend))
   2390   1.7     mrg     {
   2391  1.10     mrg       elf_uncompress_failed ();
   2392   1.7     mrg       return 0;
   2393   1.7     mrg     }
   2394   1.7     mrg 
   2395   1.7     mrg   return 1;
   2396   1.7     mrg }
   2397   1.7     mrg 
   2398   1.7     mrg /* Verify the zlib checksum.  The checksum is in the 4 bytes at
   2399   1.7     mrg    CHECKBYTES, and the uncompressed data is at UNCOMPRESSED /
   2400   1.7     mrg    UNCOMPRESSED_SIZE.  Returns 1 on success, 0 on failure.  */
   2401   1.7     mrg 
   2402   1.7     mrg static int
   2403   1.7     mrg elf_zlib_verify_checksum (const unsigned char *checkbytes,
   2404   1.7     mrg 			  const unsigned char *uncompressed,
   2405   1.7     mrg 			  size_t uncompressed_size)
   2406   1.7     mrg {
   2407   1.7     mrg   unsigned int i;
   2408   1.7     mrg   unsigned int cksum;
   2409   1.7     mrg   const unsigned char *p;
   2410   1.7     mrg   uint32_t s1;
   2411   1.7     mrg   uint32_t s2;
   2412   1.7     mrg   size_t hsz;
   2413   1.7     mrg 
   2414   1.7     mrg   cksum = 0;
   2415   1.7     mrg   for (i = 0; i < 4; i++)
   2416   1.7     mrg     cksum = (cksum << 8) | checkbytes[i];
   2417   1.7     mrg 
   2418   1.7     mrg   s1 = 1;
   2419   1.7     mrg   s2 = 0;
   2420   1.7     mrg 
   2421   1.7     mrg   /* Minimize modulo operations.  */
   2422   1.7     mrg 
   2423   1.7     mrg   p = uncompressed;
   2424   1.7     mrg   hsz = uncompressed_size;
   2425   1.7     mrg   while (hsz >= 5552)
   2426   1.7     mrg     {
   2427   1.7     mrg       for (i = 0; i < 5552; i += 16)
   2428   1.7     mrg 	{
   2429   1.7     mrg 	  /* Manually unroll loop 16 times.  */
   2430   1.7     mrg 	  s1 = s1 + *p++;
   2431   1.7     mrg 	  s2 = s2 + s1;
   2432   1.7     mrg 	  s1 = s1 + *p++;
   2433   1.7     mrg 	  s2 = s2 + s1;
   2434   1.7     mrg 	  s1 = s1 + *p++;
   2435   1.7     mrg 	  s2 = s2 + s1;
   2436   1.7     mrg 	  s1 = s1 + *p++;
   2437   1.7     mrg 	  s2 = s2 + s1;
   2438   1.7     mrg 	  s1 = s1 + *p++;
   2439   1.7     mrg 	  s2 = s2 + s1;
   2440   1.7     mrg 	  s1 = s1 + *p++;
   2441   1.7     mrg 	  s2 = s2 + s1;
   2442   1.7     mrg 	  s1 = s1 + *p++;
   2443   1.7     mrg 	  s2 = s2 + s1;
   2444   1.7     mrg 	  s1 = s1 + *p++;
   2445   1.7     mrg 	  s2 = s2 + s1;
   2446   1.7     mrg 	  s1 = s1 + *p++;
   2447   1.7     mrg 	  s2 = s2 + s1;
   2448   1.7     mrg 	  s1 = s1 + *p++;
   2449   1.7     mrg 	  s2 = s2 + s1;
   2450   1.7     mrg 	  s1 = s1 + *p++;
   2451   1.7     mrg 	  s2 = s2 + s1;
   2452   1.7     mrg 	  s1 = s1 + *p++;
   2453   1.7     mrg 	  s2 = s2 + s1;
   2454   1.7     mrg 	  s1 = s1 + *p++;
   2455   1.7     mrg 	  s2 = s2 + s1;
   2456   1.7     mrg 	  s1 = s1 + *p++;
   2457   1.7     mrg 	  s2 = s2 + s1;
   2458   1.7     mrg 	  s1 = s1 + *p++;
   2459   1.7     mrg 	  s2 = s2 + s1;
   2460   1.7     mrg 	  s1 = s1 + *p++;
   2461   1.7     mrg 	  s2 = s2 + s1;
   2462   1.7     mrg 	}
   2463   1.7     mrg       hsz -= 5552;
   2464   1.7     mrg       s1 %= 65521;
   2465   1.7     mrg       s2 %= 65521;
   2466   1.7     mrg     }
   2467   1.7     mrg 
   2468   1.7     mrg   while (hsz >= 16)
   2469   1.7     mrg     {
   2470   1.7     mrg       /* Manually unroll loop 16 times.  */
   2471   1.7     mrg       s1 = s1 + *p++;
   2472   1.7     mrg       s2 = s2 + s1;
   2473   1.7     mrg       s1 = s1 + *p++;
   2474   1.7     mrg       s2 = s2 + s1;
   2475   1.7     mrg       s1 = s1 + *p++;
   2476   1.7     mrg       s2 = s2 + s1;
   2477   1.7     mrg       s1 = s1 + *p++;
   2478   1.7     mrg       s2 = s2 + s1;
   2479   1.7     mrg       s1 = s1 + *p++;
   2480   1.7     mrg       s2 = s2 + s1;
   2481   1.7     mrg       s1 = s1 + *p++;
   2482   1.7     mrg       s2 = s2 + s1;
   2483   1.7     mrg       s1 = s1 + *p++;
   2484   1.7     mrg       s2 = s2 + s1;
   2485   1.7     mrg       s1 = s1 + *p++;
   2486   1.7     mrg       s2 = s2 + s1;
   2487   1.7     mrg       s1 = s1 + *p++;
   2488   1.7     mrg       s2 = s2 + s1;
   2489   1.7     mrg       s1 = s1 + *p++;
   2490   1.7     mrg       s2 = s2 + s1;
   2491   1.7     mrg       s1 = s1 + *p++;
   2492   1.7     mrg       s2 = s2 + s1;
   2493   1.7     mrg       s1 = s1 + *p++;
   2494   1.7     mrg       s2 = s2 + s1;
   2495   1.7     mrg       s1 = s1 + *p++;
   2496   1.7     mrg       s2 = s2 + s1;
   2497   1.7     mrg       s1 = s1 + *p++;
   2498   1.7     mrg       s2 = s2 + s1;
   2499   1.7     mrg       s1 = s1 + *p++;
   2500   1.7     mrg       s2 = s2 + s1;
   2501   1.7     mrg       s1 = s1 + *p++;
   2502   1.7     mrg       s2 = s2 + s1;
   2503   1.7     mrg 
   2504   1.7     mrg       hsz -= 16;
   2505   1.7     mrg     }
   2506   1.7     mrg 
   2507   1.7     mrg   for (i = 0; i < hsz; ++i)
   2508   1.7     mrg     {
   2509   1.7     mrg       s1 = s1 + *p++;
   2510   1.7     mrg       s2 = s2 + s1;
   2511   1.7     mrg     }
   2512   1.7     mrg 
   2513   1.7     mrg   s1 %= 65521;
   2514   1.7     mrg   s2 %= 65521;
   2515   1.7     mrg 
   2516   1.7     mrg   if (unlikely ((s2 << 16) + s1 != cksum))
   2517   1.7     mrg     {
   2518  1.10     mrg       elf_uncompress_failed ();
   2519   1.7     mrg       return 0;
   2520   1.7     mrg     }
   2521   1.7     mrg 
   2522   1.7     mrg   return 1;
   2523   1.7     mrg }
   2524   1.7     mrg 
   2525   1.7     mrg /* Inflate a zlib stream from PIN/SIN to POUT/SOUT, and verify the
   2526   1.7     mrg    checksum.  Return 1 on success, 0 on error.  */
   2527   1.7     mrg 
   2528   1.7     mrg static int
   2529   1.7     mrg elf_zlib_inflate_and_verify (const unsigned char *pin, size_t sin,
   2530   1.7     mrg 			     uint16_t *zdebug_table, unsigned char *pout,
   2531   1.7     mrg 			     size_t sout)
   2532   1.7     mrg {
   2533   1.7     mrg   if (!elf_zlib_inflate (pin, sin, zdebug_table, pout, sout))
   2534   1.7     mrg     return 0;
   2535   1.7     mrg   if (!elf_zlib_verify_checksum (pin + sin - 4, pout, sout))
   2536   1.7     mrg     return 0;
   2537   1.7     mrg   return 1;
   2538   1.7     mrg }
   2539   1.7     mrg 
   2540   1.7     mrg /* Uncompress the old compressed debug format, the one emitted by
   2541   1.7     mrg    --compress-debug-sections=zlib-gnu.  The compressed data is in
   2542   1.7     mrg    COMPRESSED / COMPRESSED_SIZE, and the function writes to
   2543   1.7     mrg    *UNCOMPRESSED / *UNCOMPRESSED_SIZE.  ZDEBUG_TABLE is work space to
   2544   1.7     mrg    hold Huffman tables.  Returns 0 on error, 1 on successful
   2545   1.7     mrg    decompression or if something goes wrong.  In general we try to
   2546   1.7     mrg    carry on, by returning 1, even if we can't decompress.  */
   2547   1.7     mrg 
   2548   1.7     mrg static int
   2549   1.7     mrg elf_uncompress_zdebug (struct backtrace_state *state,
   2550   1.7     mrg 		       const unsigned char *compressed, size_t compressed_size,
   2551   1.7     mrg 		       uint16_t *zdebug_table,
   2552   1.7     mrg 		       backtrace_error_callback error_callback, void *data,
   2553   1.7     mrg 		       unsigned char **uncompressed, size_t *uncompressed_size)
   2554   1.7     mrg {
   2555   1.7     mrg   size_t sz;
   2556   1.7     mrg   size_t i;
   2557   1.7     mrg   unsigned char *po;
   2558   1.7     mrg 
   2559   1.7     mrg   *uncompressed = NULL;
   2560   1.7     mrg   *uncompressed_size = 0;
   2561   1.7     mrg 
   2562   1.7     mrg   /* The format starts with the four bytes ZLIB, followed by the 8
   2563   1.7     mrg      byte length of the uncompressed data in big-endian order,
   2564   1.7     mrg      followed by a zlib stream.  */
   2565   1.7     mrg 
   2566   1.7     mrg   if (compressed_size < 12 || memcmp (compressed, "ZLIB", 4) != 0)
   2567   1.7     mrg     return 1;
   2568   1.7     mrg 
   2569   1.7     mrg   sz = 0;
   2570   1.7     mrg   for (i = 0; i < 8; i++)
   2571   1.7     mrg     sz = (sz << 8) | compressed[i + 4];
   2572   1.7     mrg 
   2573   1.7     mrg   if (*uncompressed != NULL && *uncompressed_size >= sz)
   2574   1.7     mrg     po = *uncompressed;
   2575   1.7     mrg   else
   2576   1.7     mrg     {
   2577   1.7     mrg       po = (unsigned char *) backtrace_alloc (state, sz, error_callback, data);
   2578   1.7     mrg       if (po == NULL)
   2579   1.7     mrg 	return 0;
   2580   1.7     mrg     }
   2581   1.7     mrg 
   2582   1.7     mrg   if (!elf_zlib_inflate_and_verify (compressed + 12, compressed_size - 12,
   2583   1.7     mrg 				    zdebug_table, po, sz))
   2584   1.7     mrg     return 1;
   2585   1.7     mrg 
   2586   1.7     mrg   *uncompressed = po;
   2587   1.7     mrg   *uncompressed_size = sz;
   2588   1.7     mrg 
   2589   1.7     mrg   return 1;
   2590   1.7     mrg }
   2591   1.7     mrg 
   2592   1.7     mrg /* Uncompress the new compressed debug format, the official standard
   2593   1.7     mrg    ELF approach emitted by --compress-debug-sections=zlib-gabi.  The
   2594   1.7     mrg    compressed data is in COMPRESSED / COMPRESSED_SIZE, and the
   2595   1.7     mrg    function writes to *UNCOMPRESSED / *UNCOMPRESSED_SIZE.
   2596   1.7     mrg    ZDEBUG_TABLE is work space as for elf_uncompress_zdebug.  Returns 0
   2597   1.7     mrg    on error, 1 on successful decompression or if something goes wrong.
   2598   1.7     mrg    In general we try to carry on, by returning 1, even if we can't
   2599   1.7     mrg    decompress.  */
   2600   1.7     mrg 
   2601   1.7     mrg static int
   2602   1.7     mrg elf_uncompress_chdr (struct backtrace_state *state,
   2603   1.7     mrg 		     const unsigned char *compressed, size_t compressed_size,
   2604   1.7     mrg 		     uint16_t *zdebug_table,
   2605   1.7     mrg 		     backtrace_error_callback error_callback, void *data,
   2606   1.7     mrg 		     unsigned char **uncompressed, size_t *uncompressed_size)
   2607   1.7     mrg {
   2608   1.7     mrg   const b_elf_chdr *chdr;
   2609   1.7     mrg   unsigned char *po;
   2610   1.7     mrg 
   2611   1.7     mrg   *uncompressed = NULL;
   2612   1.7     mrg   *uncompressed_size = 0;
   2613   1.7     mrg 
   2614   1.7     mrg   /* The format starts with an ELF compression header.  */
   2615   1.7     mrg   if (compressed_size < sizeof (b_elf_chdr))
   2616   1.7     mrg     return 1;
   2617   1.7     mrg 
   2618   1.7     mrg   chdr = (const b_elf_chdr *) compressed;
   2619   1.7     mrg 
   2620   1.7     mrg   if (chdr->ch_type != ELFCOMPRESS_ZLIB)
   2621   1.7     mrg     {
   2622   1.7     mrg       /* Unsupported compression algorithm.  */
   2623   1.7     mrg       return 1;
   2624   1.7     mrg     }
   2625   1.7     mrg 
   2626   1.7     mrg   if (*uncompressed != NULL && *uncompressed_size >= chdr->ch_size)
   2627   1.7     mrg     po = *uncompressed;
   2628   1.7     mrg   else
   2629   1.7     mrg     {
   2630   1.7     mrg       po = (unsigned char *) backtrace_alloc (state, chdr->ch_size,
   2631   1.7     mrg 					      error_callback, data);
   2632   1.7     mrg       if (po == NULL)
   2633   1.7     mrg 	return 0;
   2634   1.7     mrg     }
   2635   1.7     mrg 
   2636   1.7     mrg   if (!elf_zlib_inflate_and_verify (compressed + sizeof (b_elf_chdr),
   2637   1.7     mrg 				    compressed_size - sizeof (b_elf_chdr),
   2638   1.7     mrg 				    zdebug_table, po, chdr->ch_size))
   2639   1.7     mrg     return 1;
   2640   1.7     mrg 
   2641   1.7     mrg   *uncompressed = po;
   2642   1.7     mrg   *uncompressed_size = chdr->ch_size;
   2643   1.7     mrg 
   2644   1.7     mrg   return 1;
   2645   1.7     mrg }
   2646   1.7     mrg 
   2647   1.7     mrg /* This function is a hook for testing the zlib support.  It is only
   2648   1.7     mrg    used by tests.  */
   2649   1.7     mrg 
   2650   1.7     mrg int
   2651   1.7     mrg backtrace_uncompress_zdebug (struct backtrace_state *state,
   2652   1.7     mrg 			     const unsigned char *compressed,
   2653   1.7     mrg 			     size_t compressed_size,
   2654   1.7     mrg 			     backtrace_error_callback error_callback,
   2655   1.7     mrg 			     void *data, unsigned char **uncompressed,
   2656   1.7     mrg 			     size_t *uncompressed_size)
   2657   1.7     mrg {
   2658   1.7     mrg   uint16_t *zdebug_table;
   2659   1.7     mrg   int ret;
   2660   1.7     mrg 
   2661   1.7     mrg   zdebug_table = ((uint16_t *) backtrace_alloc (state, ZDEBUG_TABLE_SIZE,
   2662   1.7     mrg 						error_callback, data));
   2663   1.7     mrg   if (zdebug_table == NULL)
   2664   1.7     mrg     return 0;
   2665   1.7     mrg   ret = elf_uncompress_zdebug (state, compressed, compressed_size,
   2666   1.7     mrg 			       zdebug_table, error_callback, data,
   2667   1.7     mrg 			       uncompressed, uncompressed_size);
   2668   1.7     mrg   backtrace_free (state, zdebug_table, ZDEBUG_TABLE_SIZE,
   2669   1.7     mrg 		  error_callback, data);
   2670   1.7     mrg   return ret;
   2671   1.7     mrg }
   2672   1.7     mrg 
   2673  1.10     mrg /* Number of LZMA states.  */
   2674  1.10     mrg #define LZMA_STATES (12)
   2675  1.10     mrg 
   2676  1.10     mrg /* Number of LZMA position states.  The pb value of the property byte
   2677  1.10     mrg    is the number of bits to include in these states, and the maximum
   2678  1.10     mrg    value of pb is 4.  */
   2679  1.10     mrg #define LZMA_POS_STATES (16)
   2680  1.10     mrg 
   2681  1.10     mrg /* Number of LZMA distance states.  These are used match distances
   2682  1.10     mrg    with a short match length: up to 4 bytes.  */
   2683  1.10     mrg #define LZMA_DIST_STATES (4)
   2684  1.10     mrg 
   2685  1.10     mrg /* Number of LZMA distance slots.  LZMA uses six bits to encode larger
   2686  1.10     mrg    match lengths, so 1 << 6 possible probabilities.  */
   2687  1.10     mrg #define LZMA_DIST_SLOTS (64)
   2688  1.10     mrg 
   2689  1.10     mrg /* LZMA distances 0 to 3 are encoded directly, larger values use a
   2690  1.10     mrg    probability model.  */
   2691  1.10     mrg #define LZMA_DIST_MODEL_START (4)
   2692  1.10     mrg 
   2693  1.10     mrg /* The LZMA probability model ends at 14.  */
   2694  1.10     mrg #define LZMA_DIST_MODEL_END (14)
   2695  1.10     mrg 
   2696  1.10     mrg /* LZMA distance slots for distances less than 127.  */
   2697  1.10     mrg #define LZMA_FULL_DISTANCES (128)
   2698  1.10     mrg 
   2699  1.10     mrg /* LZMA uses four alignment bits.  */
   2700  1.10     mrg #define LZMA_ALIGN_SIZE (16)
   2701  1.10     mrg 
   2702  1.10     mrg /* LZMA match length is encoded with 4, 5, or 10 bits, some of which
   2703  1.10     mrg    are already known.  */
   2704  1.10     mrg #define LZMA_LEN_LOW_SYMBOLS (8)
   2705  1.10     mrg #define LZMA_LEN_MID_SYMBOLS (8)
   2706  1.10     mrg #define LZMA_LEN_HIGH_SYMBOLS (256)
   2707  1.10     mrg 
   2708  1.10     mrg /* LZMA literal encoding.  */
   2709  1.10     mrg #define LZMA_LITERAL_CODERS_MAX (16)
   2710  1.10     mrg #define LZMA_LITERAL_CODER_SIZE (0x300)
   2711  1.10     mrg 
   2712  1.10     mrg /* LZMA is based on a large set of probabilities, each managed
   2713  1.10     mrg    independently.  Each probability is an 11 bit number that we store
   2714  1.10     mrg    in a uint16_t.  We use a single large array of probabilities.  */
   2715  1.10     mrg 
   2716  1.10     mrg /* Lengths of entries in the LZMA probabilities array.  The names used
   2717  1.10     mrg    here are copied from the Linux kernel implementation.  */
   2718  1.10     mrg 
   2719  1.10     mrg #define LZMA_PROB_IS_MATCH_LEN (LZMA_STATES * LZMA_POS_STATES)
   2720  1.10     mrg #define LZMA_PROB_IS_REP_LEN LZMA_STATES
   2721  1.10     mrg #define LZMA_PROB_IS_REP0_LEN LZMA_STATES
   2722  1.10     mrg #define LZMA_PROB_IS_REP1_LEN LZMA_STATES
   2723  1.10     mrg #define LZMA_PROB_IS_REP2_LEN LZMA_STATES
   2724  1.10     mrg #define LZMA_PROB_IS_REP0_LONG_LEN (LZMA_STATES * LZMA_POS_STATES)
   2725  1.10     mrg #define LZMA_PROB_DIST_SLOT_LEN (LZMA_DIST_STATES * LZMA_DIST_SLOTS)
   2726  1.10     mrg #define LZMA_PROB_DIST_SPECIAL_LEN (LZMA_FULL_DISTANCES - LZMA_DIST_MODEL_END)
   2727  1.10     mrg #define LZMA_PROB_DIST_ALIGN_LEN LZMA_ALIGN_SIZE
   2728  1.10     mrg #define LZMA_PROB_MATCH_LEN_CHOICE_LEN 1
   2729  1.10     mrg #define LZMA_PROB_MATCH_LEN_CHOICE2_LEN 1
   2730  1.10     mrg #define LZMA_PROB_MATCH_LEN_LOW_LEN (LZMA_POS_STATES * LZMA_LEN_LOW_SYMBOLS)
   2731  1.10     mrg #define LZMA_PROB_MATCH_LEN_MID_LEN (LZMA_POS_STATES * LZMA_LEN_MID_SYMBOLS)
   2732  1.10     mrg #define LZMA_PROB_MATCH_LEN_HIGH_LEN LZMA_LEN_HIGH_SYMBOLS
   2733  1.10     mrg #define LZMA_PROB_REP_LEN_CHOICE_LEN 1
   2734  1.10     mrg #define LZMA_PROB_REP_LEN_CHOICE2_LEN 1
   2735  1.10     mrg #define LZMA_PROB_REP_LEN_LOW_LEN (LZMA_POS_STATES * LZMA_LEN_LOW_SYMBOLS)
   2736  1.10     mrg #define LZMA_PROB_REP_LEN_MID_LEN (LZMA_POS_STATES * LZMA_LEN_MID_SYMBOLS)
   2737  1.10     mrg #define LZMA_PROB_REP_LEN_HIGH_LEN LZMA_LEN_HIGH_SYMBOLS
   2738  1.10     mrg #define LZMA_PROB_LITERAL_LEN \
   2739  1.10     mrg   (LZMA_LITERAL_CODERS_MAX * LZMA_LITERAL_CODER_SIZE)
   2740  1.10     mrg 
   2741  1.10     mrg /* Offsets into the LZMA probabilities array.  This is mechanically
   2742  1.10     mrg    generated from the above lengths.  */
   2743  1.10     mrg 
   2744  1.10     mrg #define LZMA_PROB_IS_MATCH_OFFSET 0
   2745  1.10     mrg #define LZMA_PROB_IS_REP_OFFSET \
   2746  1.10     mrg   (LZMA_PROB_IS_MATCH_OFFSET + LZMA_PROB_IS_MATCH_LEN)
   2747  1.10     mrg #define LZMA_PROB_IS_REP0_OFFSET \
   2748  1.10     mrg   (LZMA_PROB_IS_REP_OFFSET + LZMA_PROB_IS_REP_LEN)
   2749  1.10     mrg #define LZMA_PROB_IS_REP1_OFFSET \
   2750  1.10     mrg   (LZMA_PROB_IS_REP0_OFFSET + LZMA_PROB_IS_REP0_LEN)
   2751  1.10     mrg #define LZMA_PROB_IS_REP2_OFFSET \
   2752  1.10     mrg   (LZMA_PROB_IS_REP1_OFFSET + LZMA_PROB_IS_REP1_LEN)
   2753  1.10     mrg #define LZMA_PROB_IS_REP0_LONG_OFFSET \
   2754  1.10     mrg   (LZMA_PROB_IS_REP2_OFFSET + LZMA_PROB_IS_REP2_LEN)
   2755  1.10     mrg #define LZMA_PROB_DIST_SLOT_OFFSET \
   2756  1.10     mrg   (LZMA_PROB_IS_REP0_LONG_OFFSET + LZMA_PROB_IS_REP0_LONG_LEN)
   2757  1.10     mrg #define LZMA_PROB_DIST_SPECIAL_OFFSET \
   2758  1.10     mrg   (LZMA_PROB_DIST_SLOT_OFFSET + LZMA_PROB_DIST_SLOT_LEN)
   2759  1.10     mrg #define LZMA_PROB_DIST_ALIGN_OFFSET \
   2760  1.10     mrg   (LZMA_PROB_DIST_SPECIAL_OFFSET + LZMA_PROB_DIST_SPECIAL_LEN)
   2761  1.10     mrg #define LZMA_PROB_MATCH_LEN_CHOICE_OFFSET \
   2762  1.10     mrg   (LZMA_PROB_DIST_ALIGN_OFFSET + LZMA_PROB_DIST_ALIGN_LEN)
   2763  1.10     mrg #define LZMA_PROB_MATCH_LEN_CHOICE2_OFFSET \
   2764  1.10     mrg   (LZMA_PROB_MATCH_LEN_CHOICE_OFFSET + LZMA_PROB_MATCH_LEN_CHOICE_LEN)
   2765  1.10     mrg #define LZMA_PROB_MATCH_LEN_LOW_OFFSET \
   2766  1.10     mrg   (LZMA_PROB_MATCH_LEN_CHOICE2_OFFSET + LZMA_PROB_MATCH_LEN_CHOICE2_LEN)
   2767  1.10     mrg #define LZMA_PROB_MATCH_LEN_MID_OFFSET \
   2768  1.10     mrg   (LZMA_PROB_MATCH_LEN_LOW_OFFSET + LZMA_PROB_MATCH_LEN_LOW_LEN)
   2769  1.10     mrg #define LZMA_PROB_MATCH_LEN_HIGH_OFFSET \
   2770  1.10     mrg   (LZMA_PROB_MATCH_LEN_MID_OFFSET + LZMA_PROB_MATCH_LEN_MID_LEN)
   2771  1.10     mrg #define LZMA_PROB_REP_LEN_CHOICE_OFFSET \
   2772  1.10     mrg   (LZMA_PROB_MATCH_LEN_HIGH_OFFSET + LZMA_PROB_MATCH_LEN_HIGH_LEN)
   2773  1.10     mrg #define LZMA_PROB_REP_LEN_CHOICE2_OFFSET \
   2774  1.10     mrg   (LZMA_PROB_REP_LEN_CHOICE_OFFSET + LZMA_PROB_REP_LEN_CHOICE_LEN)
   2775  1.10     mrg #define LZMA_PROB_REP_LEN_LOW_OFFSET \
   2776  1.10     mrg   (LZMA_PROB_REP_LEN_CHOICE2_OFFSET + LZMA_PROB_REP_LEN_CHOICE2_LEN)
   2777  1.10     mrg #define LZMA_PROB_REP_LEN_MID_OFFSET \
   2778  1.10     mrg   (LZMA_PROB_REP_LEN_LOW_OFFSET + LZMA_PROB_REP_LEN_LOW_LEN)
   2779  1.10     mrg #define LZMA_PROB_REP_LEN_HIGH_OFFSET \
   2780  1.10     mrg   (LZMA_PROB_REP_LEN_MID_OFFSET + LZMA_PROB_REP_LEN_MID_LEN)
   2781  1.10     mrg #define LZMA_PROB_LITERAL_OFFSET \
   2782  1.10     mrg   (LZMA_PROB_REP_LEN_HIGH_OFFSET + LZMA_PROB_REP_LEN_HIGH_LEN)
   2783   1.7     mrg 
   2784  1.10     mrg #define LZMA_PROB_TOTAL_COUNT \
   2785  1.10     mrg   (LZMA_PROB_LITERAL_OFFSET + LZMA_PROB_LITERAL_LEN)
   2786   1.7     mrg 
   2787  1.10     mrg /* Check that the number of LZMA probabilities is the same as the
   2788  1.10     mrg    Linux kernel implementation.  */
   2789   1.7     mrg 
   2790  1.10     mrg #if LZMA_PROB_TOTAL_COUNT != 1846 + (1 << 4) * 0x300
   2791  1.10     mrg  #error Wrong number of LZMA probabilities
   2792  1.10     mrg #endif
   2793   1.7     mrg 
   2794  1.10     mrg /* Expressions for the offset in the LZMA probabilities array of a
   2795  1.10     mrg    specific probability.  */
   2796   1.7     mrg 
   2797  1.10     mrg #define LZMA_IS_MATCH(state, pos) \
   2798  1.10     mrg   (LZMA_PROB_IS_MATCH_OFFSET + (state) * LZMA_POS_STATES + (pos))
   2799  1.10     mrg #define LZMA_IS_REP(state) \
   2800  1.10     mrg   (LZMA_PROB_IS_REP_OFFSET + (state))
   2801  1.10     mrg #define LZMA_IS_REP0(state) \
   2802  1.10     mrg   (LZMA_PROB_IS_REP0_OFFSET + (state))
   2803  1.10     mrg #define LZMA_IS_REP1(state) \
   2804  1.10     mrg   (LZMA_PROB_IS_REP1_OFFSET + (state))
   2805  1.10     mrg #define LZMA_IS_REP2(state) \
   2806  1.10     mrg   (LZMA_PROB_IS_REP2_OFFSET + (state))
   2807  1.10     mrg #define LZMA_IS_REP0_LONG(state, pos) \
   2808  1.10     mrg   (LZMA_PROB_IS_REP0_LONG_OFFSET + (state) * LZMA_POS_STATES + (pos))
   2809  1.10     mrg #define LZMA_DIST_SLOT(dist, slot) \
   2810  1.10     mrg   (LZMA_PROB_DIST_SLOT_OFFSET + (dist) * LZMA_DIST_SLOTS + (slot))
   2811  1.10     mrg #define LZMA_DIST_SPECIAL(dist) \
   2812  1.10     mrg   (LZMA_PROB_DIST_SPECIAL_OFFSET + (dist))
   2813  1.10     mrg #define LZMA_DIST_ALIGN(dist) \
   2814  1.10     mrg   (LZMA_PROB_DIST_ALIGN_OFFSET + (dist))
   2815  1.10     mrg #define LZMA_MATCH_LEN_CHOICE \
   2816  1.10     mrg   LZMA_PROB_MATCH_LEN_CHOICE_OFFSET
   2817  1.10     mrg #define LZMA_MATCH_LEN_CHOICE2 \
   2818  1.10     mrg   LZMA_PROB_MATCH_LEN_CHOICE2_OFFSET
   2819  1.10     mrg #define LZMA_MATCH_LEN_LOW(pos, sym) \
   2820  1.10     mrg   (LZMA_PROB_MATCH_LEN_LOW_OFFSET + (pos) * LZMA_LEN_LOW_SYMBOLS + (sym))
   2821  1.10     mrg #define LZMA_MATCH_LEN_MID(pos, sym) \
   2822  1.10     mrg   (LZMA_PROB_MATCH_LEN_MID_OFFSET + (pos) * LZMA_LEN_MID_SYMBOLS + (sym))
   2823  1.10     mrg #define LZMA_MATCH_LEN_HIGH(sym) \
   2824  1.10     mrg   (LZMA_PROB_MATCH_LEN_HIGH_OFFSET + (sym))
   2825  1.10     mrg #define LZMA_REP_LEN_CHOICE \
   2826  1.10     mrg   LZMA_PROB_REP_LEN_CHOICE_OFFSET
   2827  1.10     mrg #define LZMA_REP_LEN_CHOICE2 \
   2828  1.10     mrg   LZMA_PROB_REP_LEN_CHOICE2_OFFSET
   2829  1.10     mrg #define LZMA_REP_LEN_LOW(pos, sym) \
   2830  1.10     mrg   (LZMA_PROB_REP_LEN_LOW_OFFSET + (pos) * LZMA_LEN_LOW_SYMBOLS + (sym))
   2831  1.10     mrg #define LZMA_REP_LEN_MID(pos, sym) \
   2832  1.10     mrg   (LZMA_PROB_REP_LEN_MID_OFFSET + (pos) * LZMA_LEN_MID_SYMBOLS + (sym))
   2833  1.10     mrg #define LZMA_REP_LEN_HIGH(sym) \
   2834  1.10     mrg   (LZMA_PROB_REP_LEN_HIGH_OFFSET + (sym))
   2835  1.10     mrg #define LZMA_LITERAL(code, size) \
   2836  1.10     mrg   (LZMA_PROB_LITERAL_OFFSET + (code) * LZMA_LITERAL_CODER_SIZE + (size))
   2837   1.7     mrg 
   2838  1.10     mrg /* Read an LZMA varint from BUF, reading and updating *POFFSET,
   2839  1.10     mrg    setting *VAL.  Returns 0 on error, 1 on success.  */
   2840   1.7     mrg 
   2841  1.10     mrg static int
   2842  1.10     mrg elf_lzma_varint (const unsigned char *compressed, size_t compressed_size,
   2843  1.10     mrg 		 size_t *poffset, uint64_t *val)
   2844  1.10     mrg {
   2845  1.10     mrg   size_t off;
   2846  1.10     mrg   int i;
   2847  1.10     mrg   uint64_t v;
   2848  1.10     mrg   unsigned char b;
   2849  1.10     mrg 
   2850  1.10     mrg   off = *poffset;
   2851  1.10     mrg   i = 0;
   2852  1.10     mrg   v = 0;
   2853  1.10     mrg   while (1)
   2854   1.7     mrg     {
   2855  1.10     mrg       if (unlikely (off >= compressed_size))
   2856  1.10     mrg 	{
   2857  1.10     mrg 	  elf_uncompress_failed ();
   2858  1.10     mrg 	  return 0;
   2859  1.10     mrg 	}
   2860  1.10     mrg       b = compressed[off];
   2861  1.10     mrg       v |= (b & 0x7f) << (i * 7);
   2862  1.10     mrg       ++off;
   2863  1.10     mrg       if ((b & 0x80) == 0)
   2864  1.10     mrg 	{
   2865  1.10     mrg 	  *poffset = off;
   2866  1.10     mrg 	  *val = v;
   2867  1.10     mrg 	  return 1;
   2868  1.10     mrg 	}
   2869  1.10     mrg       ++i;
   2870  1.10     mrg       if (unlikely (i >= 9))
   2871  1.10     mrg 	{
   2872  1.10     mrg 	  elf_uncompress_failed ();
   2873  1.10     mrg 	  return 0;
   2874  1.10     mrg 	}
   2875   1.7     mrg     }
   2876  1.10     mrg }
   2877  1.10     mrg 
   2878  1.10     mrg /* Normalize the LZMA range decoder, pulling in an extra input byte if
   2879  1.10     mrg    needed.  */
   2880  1.10     mrg 
   2881  1.10     mrg static void
   2882  1.10     mrg elf_lzma_range_normalize (const unsigned char *compressed,
   2883  1.10     mrg 			  size_t compressed_size, size_t *poffset,
   2884  1.10     mrg 			  uint32_t *prange, uint32_t *pcode)
   2885  1.10     mrg {
   2886  1.10     mrg   if (*prange < (1U << 24))
   2887  1.10     mrg     {
   2888  1.10     mrg       if (unlikely (*poffset >= compressed_size))
   2889  1.10     mrg 	{
   2890  1.10     mrg 	  /* We assume this will be caught elsewhere.  */
   2891  1.10     mrg 	  elf_uncompress_failed ();
   2892  1.10     mrg 	  return;
   2893  1.10     mrg 	}
   2894  1.10     mrg       *prange <<= 8;
   2895  1.10     mrg       *pcode <<= 8;
   2896  1.10     mrg       *pcode += compressed[*poffset];
   2897  1.10     mrg       ++*poffset;
   2898   1.7     mrg     }
   2899  1.10     mrg }
   2900   1.7     mrg 
   2901  1.10     mrg /* Read and return a single bit from the LZMA stream, reading and
   2902  1.10     mrg    updating *PROB.  Each bit comes from the range coder.  */
   2903   1.7     mrg 
   2904  1.10     mrg static int
   2905  1.10     mrg elf_lzma_bit (const unsigned char *compressed, size_t compressed_size,
   2906  1.10     mrg 	      uint16_t *prob, size_t *poffset, uint32_t *prange,
   2907  1.10     mrg 	      uint32_t *pcode)
   2908  1.10     mrg {
   2909  1.10     mrg   uint32_t bound;
   2910  1.10     mrg 
   2911  1.10     mrg   elf_lzma_range_normalize (compressed, compressed_size, poffset,
   2912  1.10     mrg 			    prange, pcode);
   2913  1.10     mrg   bound = (*prange >> 11) * (uint32_t) *prob;
   2914  1.10     mrg   if (*pcode < bound)
   2915   1.7     mrg     {
   2916  1.10     mrg       *prange = bound;
   2917  1.10     mrg       *prob += ((1U << 11) - *prob) >> 5;
   2918  1.10     mrg       return 0;
   2919   1.7     mrg     }
   2920  1.10     mrg   else
   2921   1.7     mrg     {
   2922  1.10     mrg       *prange -= bound;
   2923  1.10     mrg       *pcode -= bound;
   2924  1.10     mrg       *prob -= *prob >> 5;
   2925  1.10     mrg       return 1;
   2926   1.7     mrg     }
   2927  1.10     mrg }
   2928   1.7     mrg 
   2929  1.10     mrg /* Read an integer of size BITS from the LZMA stream, most significant
   2930  1.10     mrg    bit first.  The bits are predicted using PROBS.  */
   2931   1.7     mrg 
   2932  1.10     mrg static uint32_t
   2933  1.10     mrg elf_lzma_integer (const unsigned char *compressed, size_t compressed_size,
   2934  1.10     mrg 		  uint16_t *probs, uint32_t bits, size_t *poffset,
   2935  1.10     mrg 		  uint32_t *prange, uint32_t *pcode)
   2936  1.10     mrg {
   2937  1.10     mrg   uint32_t sym;
   2938  1.10     mrg   uint32_t i;
   2939   1.7     mrg 
   2940  1.10     mrg   sym = 1;
   2941  1.10     mrg   for (i = 0; i < bits; i++)
   2942   1.7     mrg     {
   2943  1.10     mrg       int bit;
   2944  1.10     mrg 
   2945  1.10     mrg       bit = elf_lzma_bit (compressed, compressed_size, probs + sym, poffset,
   2946  1.10     mrg 			  prange, pcode);
   2947  1.10     mrg       sym <<= 1;
   2948  1.10     mrg       sym += bit;
   2949  1.10     mrg     }
   2950  1.10     mrg   return sym - (1 << bits);
   2951  1.10     mrg }
   2952   1.7     mrg 
   2953  1.10     mrg /* Read an integer of size BITS from the LZMA stream, least
   2954  1.10     mrg    significant bit first.  The bits are predicted using PROBS.  */
   2955   1.7     mrg 
   2956  1.10     mrg static uint32_t
   2957  1.10     mrg elf_lzma_reverse_integer (const unsigned char *compressed,
   2958  1.10     mrg 			  size_t compressed_size, uint16_t *probs,
   2959  1.10     mrg 			  uint32_t bits, size_t *poffset, uint32_t *prange,
   2960  1.10     mrg 			  uint32_t *pcode)
   2961  1.10     mrg {
   2962  1.10     mrg   uint32_t sym;
   2963  1.10     mrg   uint32_t val;
   2964  1.10     mrg   uint32_t i;
   2965  1.10     mrg 
   2966  1.10     mrg   sym = 1;
   2967  1.10     mrg   val = 0;
   2968  1.10     mrg   for (i = 0; i < bits; i++)
   2969  1.10     mrg     {
   2970  1.10     mrg       int bit;
   2971  1.10     mrg 
   2972  1.10     mrg       bit = elf_lzma_bit (compressed, compressed_size, probs + sym, poffset,
   2973  1.10     mrg 			  prange, pcode);
   2974  1.10     mrg       sym <<= 1;
   2975  1.10     mrg       sym += bit;
   2976  1.10     mrg       val += bit << i;
   2977  1.10     mrg     }
   2978  1.10     mrg   return val;
   2979  1.10     mrg }
   2980   1.7     mrg 
   2981  1.10     mrg /* Read a length from the LZMA stream.  IS_REP picks either LZMA_MATCH
   2982  1.10     mrg    or LZMA_REP probabilities.  */
   2983   1.7     mrg 
   2984  1.10     mrg static uint32_t
   2985  1.10     mrg elf_lzma_len (const unsigned char *compressed, size_t compressed_size,
   2986  1.10     mrg 	      uint16_t *probs, int is_rep, unsigned int pos_state,
   2987  1.10     mrg 	      size_t *poffset, uint32_t *prange, uint32_t *pcode)
   2988  1.10     mrg {
   2989  1.10     mrg   uint16_t *probs_choice;
   2990  1.10     mrg   uint16_t *probs_sym;
   2991  1.10     mrg   uint32_t bits;
   2992  1.10     mrg   uint32_t len;
   2993  1.10     mrg 
   2994  1.10     mrg   probs_choice = probs + (is_rep
   2995  1.10     mrg 			  ? LZMA_REP_LEN_CHOICE
   2996  1.10     mrg 			  : LZMA_MATCH_LEN_CHOICE);
   2997  1.10     mrg   if (elf_lzma_bit (compressed, compressed_size, probs_choice, poffset,
   2998  1.10     mrg 		    prange, pcode))
   2999  1.10     mrg     {
   3000  1.10     mrg       probs_choice = probs + (is_rep
   3001  1.10     mrg 			      ? LZMA_REP_LEN_CHOICE2
   3002  1.10     mrg 			      : LZMA_MATCH_LEN_CHOICE2);
   3003  1.10     mrg       if (elf_lzma_bit (compressed, compressed_size, probs_choice,
   3004  1.10     mrg 			poffset, prange, pcode))
   3005  1.10     mrg 	{
   3006  1.10     mrg 	  probs_sym = probs + (is_rep
   3007  1.10     mrg 			       ? LZMA_REP_LEN_HIGH (0)
   3008  1.10     mrg 			       : LZMA_MATCH_LEN_HIGH (0));
   3009  1.10     mrg 	  bits = 8;
   3010  1.10     mrg 	  len = 2 + 8 + 8;
   3011  1.10     mrg 	}
   3012  1.10     mrg       else
   3013   1.7     mrg 	{
   3014  1.10     mrg 	  probs_sym = probs + (is_rep
   3015  1.10     mrg 			       ? LZMA_REP_LEN_MID (pos_state, 0)
   3016  1.10     mrg 			       : LZMA_MATCH_LEN_MID (pos_state, 0));
   3017  1.10     mrg 	  bits = 3;
   3018  1.10     mrg 	  len = 2 + 8;
   3019   1.7     mrg 	}
   3020  1.10     mrg     }
   3021  1.10     mrg   else
   3022  1.10     mrg     {
   3023  1.10     mrg       probs_sym = probs + (is_rep
   3024  1.10     mrg 			   ? LZMA_REP_LEN_LOW (pos_state, 0)
   3025  1.10     mrg 			   : LZMA_MATCH_LEN_LOW (pos_state, 0));
   3026  1.10     mrg       bits = 3;
   3027  1.10     mrg       len = 2;
   3028   1.7     mrg     }
   3029   1.7     mrg 
   3030  1.10     mrg   len += elf_lzma_integer (compressed, compressed_size, probs_sym, bits,
   3031  1.10     mrg 			   poffset, prange, pcode);
   3032  1.10     mrg   return len;
   3033  1.10     mrg }
   3034   1.7     mrg 
   3035  1.10     mrg /* Uncompress one LZMA block from a minidebug file.  The compressed
   3036  1.10     mrg    data is at COMPRESSED + *POFFSET.  Update *POFFSET.  Store the data
   3037  1.10     mrg    into the memory at UNCOMPRESSED, size UNCOMPRESSED_SIZE.  CHECK is
   3038  1.10     mrg    the stream flag from the xz header.  Return 1 on successful
   3039  1.10     mrg    decompression.  */
   3040   1.7     mrg 
   3041  1.10     mrg static int
   3042  1.10     mrg elf_uncompress_lzma_block (const unsigned char *compressed,
   3043  1.10     mrg 			   size_t compressed_size, unsigned char check,
   3044  1.10     mrg 			   uint16_t *probs, unsigned char *uncompressed,
   3045  1.10     mrg 			   size_t uncompressed_size, size_t *poffset)
   3046  1.10     mrg {
   3047  1.10     mrg   size_t off;
   3048  1.10     mrg   size_t block_header_offset;
   3049  1.10     mrg   size_t block_header_size;
   3050  1.10     mrg   unsigned char block_flags;
   3051  1.10     mrg   uint64_t header_compressed_size;
   3052  1.10     mrg   uint64_t header_uncompressed_size;
   3053  1.10     mrg   unsigned char lzma2_properties;
   3054  1.10     mrg   uint32_t computed_crc;
   3055  1.10     mrg   uint32_t stream_crc;
   3056  1.10     mrg   size_t uncompressed_offset;
   3057  1.10     mrg   size_t dict_start_offset;
   3058  1.10     mrg   unsigned int lc;
   3059  1.10     mrg   unsigned int lp;
   3060  1.10     mrg   unsigned int pb;
   3061  1.10     mrg   uint32_t range;
   3062  1.10     mrg   uint32_t code;
   3063  1.10     mrg   uint32_t lstate;
   3064  1.10     mrg   uint32_t dist[4];
   3065   1.7     mrg 
   3066  1.10     mrg   off = *poffset;
   3067  1.10     mrg   block_header_offset = off;
   3068   1.7     mrg 
   3069  1.10     mrg   /* Block header size is a single byte.  */
   3070  1.10     mrg   if (unlikely (off >= compressed_size))
   3071  1.10     mrg     {
   3072  1.10     mrg       elf_uncompress_failed ();
   3073  1.10     mrg       return 0;
   3074  1.10     mrg     }
   3075  1.10     mrg   block_header_size = (compressed[off] + 1) * 4;
   3076  1.10     mrg   if (unlikely (off + block_header_size > compressed_size))
   3077  1.10     mrg     {
   3078  1.10     mrg       elf_uncompress_failed ();
   3079  1.10     mrg       return 0;
   3080  1.10     mrg     }
   3081   1.7     mrg 
   3082  1.10     mrg   /* Block flags.  */
   3083  1.10     mrg   block_flags = compressed[off + 1];
   3084  1.10     mrg   if (unlikely ((block_flags & 0x3c) != 0))
   3085  1.10     mrg     {
   3086  1.10     mrg       elf_uncompress_failed ();
   3087  1.10     mrg       return 0;
   3088  1.10     mrg     }
   3089   1.7     mrg 
   3090  1.10     mrg   off += 2;
   3091   1.7     mrg 
   3092  1.10     mrg   /* Optional compressed size.  */
   3093  1.10     mrg   header_compressed_size = 0;
   3094  1.10     mrg   if ((block_flags & 0x40) != 0)
   3095  1.10     mrg     {
   3096  1.10     mrg       *poffset = off;
   3097  1.10     mrg       if (!elf_lzma_varint (compressed, compressed_size, poffset,
   3098  1.10     mrg 			    &header_compressed_size))
   3099  1.10     mrg 	return 0;
   3100  1.10     mrg       off = *poffset;
   3101  1.10     mrg     }
   3102   1.7     mrg 
   3103  1.10     mrg   /* Optional uncompressed size.  */
   3104  1.10     mrg   header_uncompressed_size = 0;
   3105  1.10     mrg   if ((block_flags & 0x80) != 0)
   3106   1.7     mrg     {
   3107  1.10     mrg       *poffset = off;
   3108  1.10     mrg       if (!elf_lzma_varint (compressed, compressed_size, poffset,
   3109  1.10     mrg 			    &header_uncompressed_size))
   3110  1.10     mrg 	return 0;
   3111  1.10     mrg       off = *poffset;
   3112  1.10     mrg     }
   3113   1.1     mrg 
   3114  1.10     mrg   /* The recipe for creating a minidebug file is to run the xz program
   3115  1.10     mrg      with no arguments, so we expect exactly one filter: lzma2.  */
   3116   1.1     mrg 
   3117  1.10     mrg   if (unlikely ((block_flags & 0x3) != 0))
   3118  1.10     mrg     {
   3119  1.10     mrg       elf_uncompress_failed ();
   3120  1.10     mrg       return 0;
   3121  1.10     mrg     }
   3122   1.1     mrg 
   3123  1.10     mrg   if (unlikely (off + 2 >= block_header_offset + block_header_size))
   3124  1.10     mrg     {
   3125  1.10     mrg       elf_uncompress_failed ();
   3126  1.10     mrg       return 0;
   3127  1.10     mrg     }
   3128  1.10     mrg 
   3129  1.10     mrg   /* The filter ID for LZMA2 is 0x21.  */
   3130  1.10     mrg   if (unlikely (compressed[off] != 0x21))
   3131  1.10     mrg     {
   3132  1.10     mrg       elf_uncompress_failed ();
   3133  1.10     mrg       return 0;
   3134  1.10     mrg     }
   3135  1.10     mrg   ++off;
   3136  1.10     mrg 
   3137  1.10     mrg   /* The size of the filter properties for LZMA2 is 1.  */
   3138  1.10     mrg   if (unlikely (compressed[off] != 1))
   3139  1.10     mrg     {
   3140  1.10     mrg       elf_uncompress_failed ();
   3141  1.10     mrg       return 0;
   3142  1.10     mrg     }
   3143  1.10     mrg   ++off;
   3144  1.10     mrg 
   3145  1.10     mrg   lzma2_properties = compressed[off];
   3146  1.10     mrg   ++off;
   3147  1.10     mrg 
   3148  1.10     mrg   if (unlikely (lzma2_properties > 40))
   3149  1.10     mrg     {
   3150  1.10     mrg       elf_uncompress_failed ();
   3151  1.10     mrg       return 0;
   3152  1.10     mrg     }
   3153  1.10     mrg 
   3154  1.10     mrg   /* The properties describe the dictionary size, but we don't care
   3155  1.10     mrg      what that is.  */
   3156  1.10     mrg 
   3157  1.10     mrg   /* Block header padding.  */
   3158  1.10     mrg   if (unlikely (off + 4 > compressed_size))
   3159  1.10     mrg     {
   3160  1.10     mrg       elf_uncompress_failed ();
   3161  1.10     mrg       return 0;
   3162  1.10     mrg     }
   3163  1.10     mrg 
   3164  1.10     mrg   off = (off + 3) &~ (size_t) 3;
   3165  1.10     mrg 
   3166  1.10     mrg   if (unlikely (off + 4 > compressed_size))
   3167  1.10     mrg     {
   3168  1.10     mrg       elf_uncompress_failed ();
   3169  1.10     mrg       return 0;
   3170  1.10     mrg     }
   3171  1.10     mrg 
   3172  1.10     mrg   /* Block header CRC.  */
   3173  1.10     mrg   computed_crc = elf_crc32 (0, compressed + block_header_offset,
   3174  1.10     mrg 			    block_header_size - 4);
   3175  1.10     mrg   stream_crc = ((uint32_t)compressed[off]
   3176  1.10     mrg 		| ((uint32_t)compressed[off + 1] << 8)
   3177  1.10     mrg 		| ((uint32_t)compressed[off + 2] << 16)
   3178  1.10     mrg 		| ((uint32_t)compressed[off + 3] << 24));
   3179  1.10     mrg   if (unlikely (computed_crc != stream_crc))
   3180  1.10     mrg     {
   3181  1.10     mrg       elf_uncompress_failed ();
   3182  1.10     mrg       return 0;
   3183  1.10     mrg     }
   3184  1.10     mrg   off += 4;
   3185  1.10     mrg 
   3186  1.10     mrg   /* Read a sequence of LZMA2 packets.  */
   3187  1.10     mrg 
   3188  1.10     mrg   uncompressed_offset = 0;
   3189  1.10     mrg   dict_start_offset = 0;
   3190  1.10     mrg   lc = 0;
   3191  1.10     mrg   lp = 0;
   3192  1.10     mrg   pb = 0;
   3193  1.10     mrg   lstate = 0;
   3194  1.10     mrg   while (off < compressed_size)
   3195  1.10     mrg     {
   3196  1.10     mrg       unsigned char control;
   3197  1.10     mrg 
   3198  1.10     mrg       range = 0xffffffff;
   3199  1.10     mrg       code = 0;
   3200  1.10     mrg 
   3201  1.10     mrg       control = compressed[off];
   3202  1.10     mrg       ++off;
   3203  1.10     mrg       if (unlikely (control == 0))
   3204  1.10     mrg 	{
   3205  1.10     mrg 	  /* End of packets.  */
   3206  1.10     mrg 	  break;
   3207  1.10     mrg 	}
   3208  1.10     mrg 
   3209  1.10     mrg       if (control == 1 || control >= 0xe0)
   3210  1.10     mrg 	{
   3211  1.10     mrg 	  /* Reset dictionary to empty.  */
   3212  1.10     mrg 	  dict_start_offset = uncompressed_offset;
   3213  1.10     mrg 	}
   3214  1.10     mrg 
   3215  1.10     mrg       if (control < 0x80)
   3216  1.10     mrg 	{
   3217  1.10     mrg 	  size_t chunk_size;
   3218  1.10     mrg 
   3219  1.10     mrg 	  /* The only valid values here are 1 or 2.  A 1 means to
   3220  1.10     mrg 	     reset the dictionary (done above).  Then we see an
   3221  1.10     mrg 	     uncompressed chunk.  */
   3222  1.10     mrg 
   3223  1.10     mrg 	  if (unlikely (control > 2))
   3224  1.10     mrg 	    {
   3225  1.10     mrg 	      elf_uncompress_failed ();
   3226  1.10     mrg 	      return 0;
   3227  1.10     mrg 	    }
   3228  1.10     mrg 
   3229  1.10     mrg 	  /* An uncompressed chunk is a two byte size followed by
   3230  1.10     mrg 	     data.  */
   3231  1.10     mrg 
   3232  1.10     mrg 	  if (unlikely (off + 2 > compressed_size))
   3233  1.10     mrg 	    {
   3234  1.10     mrg 	      elf_uncompress_failed ();
   3235  1.10     mrg 	      return 0;
   3236  1.10     mrg 	    }
   3237  1.10     mrg 
   3238  1.10     mrg 	  chunk_size = compressed[off] << 8;
   3239  1.10     mrg 	  chunk_size += compressed[off + 1];
   3240  1.10     mrg 	  ++chunk_size;
   3241  1.10     mrg 
   3242  1.10     mrg 	  off += 2;
   3243  1.10     mrg 
   3244  1.10     mrg 	  if (unlikely (off + chunk_size > compressed_size))
   3245  1.10     mrg 	    {
   3246  1.10     mrg 	      elf_uncompress_failed ();
   3247  1.10     mrg 	      return 0;
   3248  1.10     mrg 	    }
   3249  1.10     mrg 	  if (unlikely (uncompressed_offset + chunk_size > uncompressed_size))
   3250  1.10     mrg 	    {
   3251  1.10     mrg 	      elf_uncompress_failed ();
   3252  1.10     mrg 	      return 0;
   3253  1.10     mrg 	    }
   3254  1.10     mrg 
   3255  1.10     mrg 	  memcpy (uncompressed + uncompressed_offset, compressed + off,
   3256  1.10     mrg 		  chunk_size);
   3257  1.10     mrg 	  uncompressed_offset += chunk_size;
   3258  1.10     mrg 	  off += chunk_size;
   3259  1.10     mrg 	}
   3260  1.10     mrg       else
   3261  1.10     mrg 	{
   3262  1.10     mrg 	  size_t uncompressed_chunk_start;
   3263  1.10     mrg 	  size_t uncompressed_chunk_size;
   3264  1.10     mrg 	  size_t compressed_chunk_size;
   3265  1.10     mrg 	  size_t limit;
   3266  1.10     mrg 
   3267  1.10     mrg 	  /* An LZMA chunk.  This starts with an uncompressed size and
   3268  1.10     mrg 	     a compressed size.  */
   3269  1.10     mrg 
   3270  1.10     mrg 	  if (unlikely (off + 4 >= compressed_size))
   3271  1.10     mrg 	    {
   3272  1.10     mrg 	      elf_uncompress_failed ();
   3273  1.10     mrg 	      return 0;
   3274  1.10     mrg 	    }
   3275  1.10     mrg 
   3276  1.10     mrg 	  uncompressed_chunk_start = uncompressed_offset;
   3277  1.10     mrg 
   3278  1.10     mrg 	  uncompressed_chunk_size = (control & 0x1f) << 16;
   3279  1.10     mrg 	  uncompressed_chunk_size += compressed[off] << 8;
   3280  1.10     mrg 	  uncompressed_chunk_size += compressed[off + 1];
   3281  1.10     mrg 	  ++uncompressed_chunk_size;
   3282  1.10     mrg 
   3283  1.10     mrg 	  compressed_chunk_size = compressed[off + 2] << 8;
   3284  1.10     mrg 	  compressed_chunk_size += compressed[off + 3];
   3285  1.10     mrg 	  ++compressed_chunk_size;
   3286  1.10     mrg 
   3287  1.10     mrg 	  off += 4;
   3288  1.10     mrg 
   3289  1.10     mrg 	  /* Bit 7 (0x80) is set.
   3290  1.10     mrg 	     Bits 6 and 5 (0x40 and 0x20) are as follows:
   3291  1.10     mrg 	     0: don't reset anything
   3292  1.10     mrg 	     1: reset state
   3293  1.10     mrg 	     2: reset state, read properties
   3294  1.10     mrg 	     3: reset state, read properties, reset dictionary (done above) */
   3295  1.10     mrg 
   3296  1.10     mrg 	  if (control >= 0xc0)
   3297  1.10     mrg 	    {
   3298  1.10     mrg 	      unsigned char props;
   3299  1.10     mrg 
   3300  1.10     mrg 	      /* Bit 6 is set, read properties.  */
   3301  1.10     mrg 
   3302  1.10     mrg 	      if (unlikely (off >= compressed_size))
   3303  1.10     mrg 		{
   3304  1.10     mrg 		  elf_uncompress_failed ();
   3305  1.10     mrg 		  return 0;
   3306  1.10     mrg 		}
   3307  1.10     mrg 	      props = compressed[off];
   3308  1.10     mrg 	      ++off;
   3309  1.10     mrg 	      if (unlikely (props > (4 * 5 + 4) * 9 + 8))
   3310  1.10     mrg 		{
   3311  1.10     mrg 		  elf_uncompress_failed ();
   3312  1.10     mrg 		  return 0;
   3313  1.10     mrg 		}
   3314  1.10     mrg 	      pb = 0;
   3315  1.10     mrg 	      while (props >= 9 * 5)
   3316  1.10     mrg 		{
   3317  1.10     mrg 		  props -= 9 * 5;
   3318  1.10     mrg 		  ++pb;
   3319  1.10     mrg 		}
   3320  1.10     mrg 	      lp = 0;
   3321  1.10     mrg 	      while (props > 9)
   3322  1.10     mrg 		{
   3323  1.10     mrg 		  props -= 9;
   3324  1.10     mrg 		  ++lp;
   3325  1.10     mrg 		}
   3326  1.10     mrg 	      lc = props;
   3327  1.10     mrg 	      if (unlikely (lc + lp > 4))
   3328  1.10     mrg 		{
   3329  1.10     mrg 		  elf_uncompress_failed ();
   3330  1.10     mrg 		  return 0;
   3331  1.10     mrg 		}
   3332  1.10     mrg 	    }
   3333  1.10     mrg 
   3334  1.10     mrg 	  if (control >= 0xa0)
   3335  1.10     mrg 	    {
   3336  1.10     mrg 	      size_t i;
   3337  1.10     mrg 
   3338  1.10     mrg 	      /* Bit 5 or 6 is set, reset LZMA state.  */
   3339  1.10     mrg 
   3340  1.10     mrg 	      lstate = 0;
   3341  1.10     mrg 	      memset (&dist, 0, sizeof dist);
   3342  1.10     mrg 	      for (i = 0; i < LZMA_PROB_TOTAL_COUNT; i++)
   3343  1.10     mrg 		probs[i] = 1 << 10;
   3344  1.10     mrg 	      range = 0xffffffff;
   3345  1.10     mrg 	      code = 0;
   3346  1.10     mrg 	    }
   3347  1.10     mrg 
   3348  1.10     mrg 	  /* Read the range code.  */
   3349  1.10     mrg 
   3350  1.10     mrg 	  if (unlikely (off + 5 > compressed_size))
   3351  1.10     mrg 	    {
   3352  1.10     mrg 	      elf_uncompress_failed ();
   3353  1.10     mrg 	      return 0;
   3354  1.10     mrg 	    }
   3355  1.10     mrg 
   3356  1.10     mrg 	  /* The byte at compressed[off] is ignored for some
   3357  1.10     mrg 	     reason.  */
   3358  1.10     mrg 
   3359  1.10     mrg 	  code = ((compressed[off + 1] << 24)
   3360  1.10     mrg 		  + (compressed[off + 2] << 16)
   3361  1.10     mrg 		  + (compressed[off + 3] << 8)
   3362  1.10     mrg 		  + compressed[off + 4]);
   3363  1.10     mrg 	  off += 5;
   3364  1.10     mrg 
   3365  1.10     mrg 	  /* This is the main LZMA decode loop.  */
   3366  1.10     mrg 
   3367  1.10     mrg 	  limit = off + compressed_chunk_size;
   3368  1.10     mrg 	  *poffset = off;
   3369  1.10     mrg 	  while (*poffset < limit)
   3370  1.10     mrg 	    {
   3371  1.10     mrg 	      unsigned int pos_state;
   3372  1.10     mrg 
   3373  1.10     mrg 	      if (unlikely (uncompressed_offset
   3374  1.10     mrg 			    == (uncompressed_chunk_start
   3375  1.10     mrg 				+ uncompressed_chunk_size)))
   3376  1.10     mrg 		{
   3377  1.10     mrg 		  /* We've decompressed all the expected bytes.  */
   3378  1.10     mrg 		  break;
   3379  1.10     mrg 		}
   3380  1.10     mrg 
   3381  1.10     mrg 	      pos_state = ((uncompressed_offset - dict_start_offset)
   3382  1.10     mrg 			   & ((1 << pb) - 1));
   3383  1.10     mrg 
   3384  1.10     mrg 	      if (elf_lzma_bit (compressed, compressed_size,
   3385  1.10     mrg 				probs + LZMA_IS_MATCH (lstate, pos_state),
   3386  1.10     mrg 				poffset, &range, &code))
   3387  1.10     mrg 		{
   3388  1.10     mrg 		  uint32_t len;
   3389  1.10     mrg 
   3390  1.10     mrg 		  if (elf_lzma_bit (compressed, compressed_size,
   3391  1.10     mrg 				    probs + LZMA_IS_REP (lstate),
   3392  1.10     mrg 				    poffset, &range, &code))
   3393  1.10     mrg 		    {
   3394  1.10     mrg 		      int short_rep;
   3395  1.10     mrg 		      uint32_t next_dist;
   3396  1.10     mrg 
   3397  1.10     mrg 		      /* Repeated match.  */
   3398  1.10     mrg 
   3399  1.10     mrg 		      short_rep = 0;
   3400  1.10     mrg 		      if (elf_lzma_bit (compressed, compressed_size,
   3401  1.10     mrg 					probs + LZMA_IS_REP0 (lstate),
   3402  1.10     mrg 					poffset, &range, &code))
   3403  1.10     mrg 			{
   3404  1.10     mrg 			  if (elf_lzma_bit (compressed, compressed_size,
   3405  1.10     mrg 					    probs + LZMA_IS_REP1 (lstate),
   3406  1.10     mrg 					    poffset, &range, &code))
   3407  1.10     mrg 			    {
   3408  1.10     mrg 			      if (elf_lzma_bit (compressed, compressed_size,
   3409  1.10     mrg 						probs + LZMA_IS_REP2 (lstate),
   3410  1.10     mrg 						poffset, &range, &code))
   3411  1.10     mrg 				{
   3412  1.10     mrg 				  next_dist = dist[3];
   3413  1.10     mrg 				  dist[3] = dist[2];
   3414  1.10     mrg 				}
   3415  1.10     mrg 			      else
   3416  1.10     mrg 				{
   3417  1.10     mrg 				  next_dist = dist[2];
   3418  1.10     mrg 				}
   3419  1.10     mrg 			      dist[2] = dist[1];
   3420  1.10     mrg 			    }
   3421  1.10     mrg 			  else
   3422  1.10     mrg 			    {
   3423  1.10     mrg 			      next_dist = dist[1];
   3424  1.10     mrg 			    }
   3425  1.10     mrg 
   3426  1.10     mrg 			  dist[1] = dist[0];
   3427  1.10     mrg 			  dist[0] = next_dist;
   3428  1.10     mrg 			}
   3429  1.10     mrg 		      else
   3430  1.10     mrg 			{
   3431  1.10     mrg 			  if (!elf_lzma_bit (compressed, compressed_size,
   3432  1.10     mrg 					    (probs
   3433  1.10     mrg 					     + LZMA_IS_REP0_LONG (lstate,
   3434  1.10     mrg 								  pos_state)),
   3435  1.10     mrg 					    poffset, &range, &code))
   3436  1.10     mrg 			    short_rep = 1;
   3437  1.10     mrg 			}
   3438  1.10     mrg 
   3439  1.10     mrg 		      if (lstate < 7)
   3440  1.10     mrg 			lstate = short_rep ? 9 : 8;
   3441  1.10     mrg 		      else
   3442  1.10     mrg 			lstate = 11;
   3443  1.10     mrg 
   3444  1.10     mrg 		      if (short_rep)
   3445  1.10     mrg 			len = 1;
   3446  1.10     mrg 		      else
   3447  1.10     mrg 			len = elf_lzma_len (compressed, compressed_size,
   3448  1.10     mrg 					    probs, 1, pos_state, poffset,
   3449  1.10     mrg 					    &range, &code);
   3450  1.10     mrg 		    }
   3451  1.10     mrg 		  else
   3452  1.10     mrg 		    {
   3453  1.10     mrg 		      uint32_t dist_state;
   3454  1.10     mrg 		      uint32_t dist_slot;
   3455  1.10     mrg 		      uint16_t *probs_dist;
   3456  1.10     mrg 
   3457  1.10     mrg 		      /* Match.  */
   3458  1.10     mrg 
   3459  1.10     mrg 		      if (lstate < 7)
   3460  1.10     mrg 			lstate = 7;
   3461  1.10     mrg 		      else
   3462  1.10     mrg 			lstate = 10;
   3463  1.10     mrg 		      dist[3] = dist[2];
   3464  1.10     mrg 		      dist[2] = dist[1];
   3465  1.10     mrg 		      dist[1] = dist[0];
   3466  1.10     mrg 		      len = elf_lzma_len (compressed, compressed_size,
   3467  1.10     mrg 					  probs, 0, pos_state, poffset,
   3468  1.10     mrg 					  &range, &code);
   3469  1.10     mrg 
   3470  1.10     mrg 		      if (len < 4 + 2)
   3471  1.10     mrg 			dist_state = len - 2;
   3472  1.10     mrg 		      else
   3473  1.10     mrg 			dist_state = 3;
   3474  1.10     mrg 		      probs_dist = probs + LZMA_DIST_SLOT (dist_state, 0);
   3475  1.10     mrg 		      dist_slot = elf_lzma_integer (compressed,
   3476  1.10     mrg 						    compressed_size,
   3477  1.10     mrg 						    probs_dist, 6,
   3478  1.10     mrg 						    poffset, &range,
   3479  1.10     mrg 						    &code);
   3480  1.10     mrg 		      if (dist_slot < LZMA_DIST_MODEL_START)
   3481  1.10     mrg 			dist[0] = dist_slot;
   3482  1.10     mrg 		      else
   3483  1.10     mrg 			{
   3484  1.10     mrg 			  uint32_t limit;
   3485  1.10     mrg 
   3486  1.10     mrg 			  limit = (dist_slot >> 1) - 1;
   3487  1.10     mrg 			  dist[0] = 2 + (dist_slot & 1);
   3488  1.10     mrg 			  if (dist_slot < LZMA_DIST_MODEL_END)
   3489  1.10     mrg 			    {
   3490  1.10     mrg 			      dist[0] <<= limit;
   3491  1.10     mrg 			      probs_dist = (probs
   3492  1.10     mrg 					    + LZMA_DIST_SPECIAL(dist[0]
   3493  1.10     mrg 								- dist_slot
   3494  1.10     mrg 								- 1));
   3495  1.10     mrg 			      dist[0] +=
   3496  1.10     mrg 				elf_lzma_reverse_integer (compressed,
   3497  1.10     mrg 							  compressed_size,
   3498  1.10     mrg 							  probs_dist,
   3499  1.10     mrg 							  limit, poffset,
   3500  1.10     mrg 							  &range, &code);
   3501  1.10     mrg 			    }
   3502  1.10     mrg 			  else
   3503  1.10     mrg 			    {
   3504  1.10     mrg 			      uint32_t dist0;
   3505  1.10     mrg 			      uint32_t i;
   3506  1.10     mrg 
   3507  1.10     mrg 			      dist0 = dist[0];
   3508  1.10     mrg 			      for (i = 0; i < limit - 4; i++)
   3509  1.10     mrg 				{
   3510  1.10     mrg 				  uint32_t mask;
   3511  1.10     mrg 
   3512  1.10     mrg 				  elf_lzma_range_normalize (compressed,
   3513  1.10     mrg 							    compressed_size,
   3514  1.10     mrg 							    poffset,
   3515  1.10     mrg 							    &range, &code);
   3516  1.10     mrg 				  range >>= 1;
   3517  1.10     mrg 				  code -= range;
   3518  1.10     mrg 				  mask = -(code >> 31);
   3519  1.10     mrg 				  code += range & mask;
   3520  1.10     mrg 				  dist0 <<= 1;
   3521  1.10     mrg 				  dist0 += mask + 1;
   3522  1.10     mrg 				}
   3523  1.10     mrg 			      dist0 <<= 4;
   3524  1.10     mrg 			      probs_dist = probs + LZMA_DIST_ALIGN (0);
   3525  1.10     mrg 			      dist0 +=
   3526  1.10     mrg 				elf_lzma_reverse_integer (compressed,
   3527  1.10     mrg 							  compressed_size,
   3528  1.10     mrg 							  probs_dist, 4,
   3529  1.10     mrg 							  poffset,
   3530  1.10     mrg 							  &range, &code);
   3531  1.10     mrg 			      dist[0] = dist0;
   3532  1.10     mrg 			    }
   3533  1.10     mrg 			}
   3534  1.10     mrg 		    }
   3535  1.10     mrg 
   3536  1.10     mrg 		  if (unlikely (uncompressed_offset
   3537  1.10     mrg 				- dict_start_offset < dist[0] + 1))
   3538  1.10     mrg 		    {
   3539  1.10     mrg 		      elf_uncompress_failed ();
   3540  1.10     mrg 		      return 0;
   3541  1.10     mrg 		    }
   3542  1.10     mrg 		  if (unlikely (uncompressed_offset + len > uncompressed_size))
   3543  1.10     mrg 		    {
   3544  1.10     mrg 		      elf_uncompress_failed ();
   3545  1.10     mrg 		      return 0;
   3546  1.10     mrg 		    }
   3547  1.10     mrg 
   3548  1.10     mrg 		  if (dist[0] == 0)
   3549  1.10     mrg 		    {
   3550  1.10     mrg 		      /* A common case, meaning repeat the last
   3551  1.10     mrg 			 character LEN times.  */
   3552  1.10     mrg 		      memset (uncompressed + uncompressed_offset,
   3553  1.10     mrg 			      uncompressed[uncompressed_offset - 1],
   3554  1.10     mrg 			      len);
   3555  1.10     mrg 		      uncompressed_offset += len;
   3556  1.10     mrg 		    }
   3557  1.10     mrg 		  else if (dist[0] + 1 >= len)
   3558  1.10     mrg 		    {
   3559  1.10     mrg 		      memcpy (uncompressed + uncompressed_offset,
   3560  1.10     mrg 			      uncompressed + uncompressed_offset - dist[0] - 1,
   3561  1.10     mrg 			      len);
   3562  1.10     mrg 		      uncompressed_offset += len;
   3563  1.10     mrg 		    }
   3564  1.10     mrg 		  else
   3565  1.10     mrg 		    {
   3566  1.10     mrg 		      while (len > 0)
   3567  1.10     mrg 			{
   3568  1.10     mrg 			  uint32_t copy;
   3569  1.10     mrg 
   3570  1.10     mrg 			  copy = len < dist[0] + 1 ? len : dist[0] + 1;
   3571  1.10     mrg 			  memcpy (uncompressed + uncompressed_offset,
   3572  1.10     mrg 				  (uncompressed + uncompressed_offset
   3573  1.10     mrg 				   - dist[0] - 1),
   3574  1.10     mrg 				  copy);
   3575  1.10     mrg 			  len -= copy;
   3576  1.10     mrg 			  uncompressed_offset += copy;
   3577  1.10     mrg 			}
   3578  1.10     mrg 		    }
   3579  1.10     mrg 		}
   3580  1.10     mrg 	      else
   3581  1.10     mrg 		{
   3582  1.10     mrg 		  unsigned char prev;
   3583  1.10     mrg 		  unsigned char low;
   3584  1.10     mrg 		  size_t high;
   3585  1.10     mrg 		  uint16_t *lit_probs;
   3586  1.10     mrg 		  unsigned int sym;
   3587  1.10     mrg 
   3588  1.10     mrg 		  /* Literal value.  */
   3589  1.10     mrg 
   3590  1.10     mrg 		  if (uncompressed_offset > 0)
   3591  1.10     mrg 		    prev = uncompressed[uncompressed_offset - 1];
   3592  1.10     mrg 		  else
   3593  1.10     mrg 		    prev = 0;
   3594  1.10     mrg 		  low = prev >> (8 - lc);
   3595  1.10     mrg 		  high = (((uncompressed_offset - dict_start_offset)
   3596  1.10     mrg 			   & ((1 << lp) - 1))
   3597  1.10     mrg 			  << lc);
   3598  1.10     mrg 		  lit_probs = probs + LZMA_LITERAL (low + high, 0);
   3599  1.10     mrg 		  if (lstate < 7)
   3600  1.10     mrg 		    sym = elf_lzma_integer (compressed, compressed_size,
   3601  1.10     mrg 					    lit_probs, 8, poffset, &range,
   3602  1.10     mrg 					    &code);
   3603  1.10     mrg 		  else
   3604  1.10     mrg 		    {
   3605  1.10     mrg 		      unsigned int match;
   3606  1.10     mrg 		      unsigned int bit;
   3607  1.10     mrg 		      unsigned int match_bit;
   3608  1.10     mrg 		      unsigned int idx;
   3609  1.10     mrg 
   3610  1.10     mrg 		      sym = 1;
   3611  1.10     mrg 		      if (uncompressed_offset >= dist[0] + 1)
   3612  1.10     mrg 			match = uncompressed[uncompressed_offset - dist[0] - 1];
   3613  1.10     mrg 		      else
   3614  1.10     mrg 			match = 0;
   3615  1.10     mrg 		      match <<= 1;
   3616  1.10     mrg 		      bit = 0x100;
   3617  1.10     mrg 		      do
   3618  1.10     mrg 			{
   3619  1.10     mrg 			  match_bit = match & bit;
   3620  1.10     mrg 			  match <<= 1;
   3621  1.10     mrg 			  idx = bit + match_bit + sym;
   3622  1.10     mrg 			  sym <<= 1;
   3623  1.10     mrg 			  if (elf_lzma_bit (compressed, compressed_size,
   3624  1.10     mrg 					    lit_probs + idx, poffset,
   3625  1.10     mrg 					    &range, &code))
   3626  1.10     mrg 			    {
   3627  1.10     mrg 			      ++sym;
   3628  1.10     mrg 			      bit &= match_bit;
   3629  1.10     mrg 			    }
   3630  1.10     mrg 			  else
   3631  1.10     mrg 			    {
   3632  1.10     mrg 			      bit &= ~ match_bit;
   3633  1.10     mrg 			    }
   3634  1.10     mrg 			}
   3635  1.10     mrg 		      while (sym < 0x100);
   3636  1.10     mrg 		    }
   3637  1.10     mrg 
   3638  1.10     mrg 		  if (unlikely (uncompressed_offset >= uncompressed_size))
   3639  1.10     mrg 		    {
   3640  1.10     mrg 		      elf_uncompress_failed ();
   3641  1.10     mrg 		      return 0;
   3642  1.10     mrg 		    }
   3643  1.10     mrg 
   3644  1.10     mrg 		  uncompressed[uncompressed_offset] = (unsigned char) sym;
   3645  1.10     mrg 		  ++uncompressed_offset;
   3646  1.10     mrg 		  if (lstate <= 3)
   3647  1.10     mrg 		    lstate = 0;
   3648  1.10     mrg 		  else if (lstate <= 9)
   3649  1.10     mrg 		    lstate -= 3;
   3650  1.10     mrg 		  else
   3651  1.10     mrg 		    lstate -= 6;
   3652  1.10     mrg 		}
   3653  1.10     mrg 	    }
   3654  1.10     mrg 
   3655  1.10     mrg 	  elf_lzma_range_normalize (compressed, compressed_size, poffset,
   3656  1.10     mrg 				    &range, &code);
   3657  1.10     mrg 
   3658  1.10     mrg 	  off = *poffset;
   3659  1.10     mrg 	}
   3660  1.10     mrg     }
   3661  1.10     mrg 
   3662  1.10     mrg   /* We have reached the end of the block.  Pad to four byte
   3663  1.10     mrg      boundary.  */
   3664  1.10     mrg   off = (off + 3) &~ (size_t) 3;
   3665  1.10     mrg   if (unlikely (off > compressed_size))
   3666  1.10     mrg     {
   3667  1.10     mrg       elf_uncompress_failed ();
   3668  1.10     mrg       return 0;
   3669  1.10     mrg     }
   3670  1.10     mrg 
   3671  1.10     mrg   switch (check)
   3672  1.10     mrg     {
   3673  1.10     mrg     case 0:
   3674  1.10     mrg       /* No check.  */
   3675  1.10     mrg       break;
   3676  1.10     mrg 
   3677  1.10     mrg     case 1:
   3678  1.10     mrg       /* CRC32 */
   3679  1.10     mrg       if (unlikely (off + 4 > compressed_size))
   3680  1.10     mrg 	{
   3681  1.10     mrg 	  elf_uncompress_failed ();
   3682  1.10     mrg 	  return 0;
   3683  1.10     mrg 	}
   3684  1.10     mrg       computed_crc = elf_crc32 (0, uncompressed, uncompressed_offset);
   3685  1.10     mrg       stream_crc = (compressed[off]
   3686  1.10     mrg 		    | (compressed[off + 1] << 8)
   3687  1.10     mrg 		    | (compressed[off + 2] << 16)
   3688  1.10     mrg 		    | (compressed[off + 3] << 24));
   3689  1.10     mrg       if (computed_crc != stream_crc)
   3690  1.10     mrg 	{
   3691  1.10     mrg 	  elf_uncompress_failed ();
   3692  1.10     mrg 	  return 0;
   3693  1.10     mrg 	}
   3694  1.10     mrg       off += 4;
   3695  1.10     mrg       break;
   3696  1.10     mrg 
   3697  1.10     mrg     case 4:
   3698  1.10     mrg       /* CRC64.  We don't bother computing a CRC64 checksum.  */
   3699  1.10     mrg       if (unlikely (off + 8 > compressed_size))
   3700  1.10     mrg 	{
   3701  1.10     mrg 	  elf_uncompress_failed ();
   3702  1.10     mrg 	  return 0;
   3703  1.10     mrg 	}
   3704  1.10     mrg       off += 8;
   3705  1.10     mrg       break;
   3706  1.10     mrg 
   3707  1.10     mrg     case 10:
   3708  1.10     mrg       /* SHA.  We don't bother computing a SHA checksum.  */
   3709  1.10     mrg       if (unlikely (off + 32 > compressed_size))
   3710  1.10     mrg 	{
   3711  1.10     mrg 	  elf_uncompress_failed ();
   3712  1.10     mrg 	  return 0;
   3713  1.10     mrg 	}
   3714  1.10     mrg       off += 32;
   3715  1.10     mrg       break;
   3716  1.10     mrg 
   3717  1.10     mrg     default:
   3718  1.10     mrg       elf_uncompress_failed ();
   3719  1.10     mrg       return 0;
   3720  1.10     mrg     }
   3721  1.10     mrg 
   3722  1.10     mrg   *poffset = off;
   3723  1.10     mrg 
   3724  1.10     mrg   return 1;
   3725  1.10     mrg }
   3726  1.10     mrg 
   3727  1.10     mrg /* Uncompress LZMA data found in a minidebug file.  The minidebug
   3728  1.10     mrg    format is described at
   3729  1.10     mrg    https://sourceware.org/gdb/current/onlinedocs/gdb/MiniDebugInfo.html.
   3730  1.10     mrg    Returns 0 on error, 1 on successful decompression.  For this
   3731  1.10     mrg    function we return 0 on failure to decompress, as the calling code
   3732  1.10     mrg    will carry on in that case.  */
   3733  1.10     mrg 
   3734  1.10     mrg static int
   3735  1.10     mrg elf_uncompress_lzma (struct backtrace_state *state,
   3736  1.10     mrg 		     const unsigned char *compressed, size_t compressed_size,
   3737  1.10     mrg 		     backtrace_error_callback error_callback, void *data,
   3738  1.10     mrg 		     unsigned char **uncompressed, size_t *uncompressed_size)
   3739  1.10     mrg {
   3740  1.10     mrg   size_t header_size;
   3741  1.10     mrg   size_t footer_size;
   3742  1.10     mrg   unsigned char check;
   3743  1.10     mrg   uint32_t computed_crc;
   3744  1.10     mrg   uint32_t stream_crc;
   3745  1.10     mrg   size_t offset;
   3746  1.10     mrg   size_t index_size;
   3747  1.10     mrg   size_t footer_offset;
   3748  1.10     mrg   size_t index_offset;
   3749  1.10     mrg   uint64_t index_compressed_size;
   3750  1.10     mrg   uint64_t index_uncompressed_size;
   3751  1.10     mrg   unsigned char *mem;
   3752  1.10     mrg   uint16_t *probs;
   3753  1.10     mrg   size_t compressed_block_size;
   3754  1.10     mrg 
   3755  1.10     mrg   /* The format starts with a stream header and ends with a stream
   3756  1.10     mrg      footer.  */
   3757  1.10     mrg   header_size = 12;
   3758  1.10     mrg   footer_size = 12;
   3759  1.10     mrg   if (unlikely (compressed_size < header_size + footer_size))
   3760  1.10     mrg     {
   3761  1.10     mrg       elf_uncompress_failed ();
   3762  1.10     mrg       return 0;
   3763  1.10     mrg     }
   3764  1.10     mrg 
   3765  1.10     mrg   /* The stream header starts with a magic string.  */
   3766  1.10     mrg   if (unlikely (memcmp (compressed, "\375" "7zXZ\0", 6) != 0))
   3767  1.10     mrg     {
   3768  1.10     mrg       elf_uncompress_failed ();
   3769  1.10     mrg       return 0;
   3770  1.10     mrg     }
   3771  1.10     mrg 
   3772  1.10     mrg   /* Next come stream flags.  The first byte is zero, the second byte
   3773  1.10     mrg      is the check.  */
   3774  1.10     mrg   if (unlikely (compressed[6] != 0))
   3775  1.10     mrg     {
   3776  1.10     mrg       elf_uncompress_failed ();
   3777  1.10     mrg       return 0;
   3778  1.10     mrg     }
   3779  1.10     mrg   check = compressed[7];
   3780  1.10     mrg   if (unlikely ((check & 0xf8) != 0))
   3781  1.10     mrg     {
   3782  1.10     mrg       elf_uncompress_failed ();
   3783  1.10     mrg       return 0;
   3784  1.10     mrg     }
   3785  1.10     mrg 
   3786  1.10     mrg   /* Next comes a CRC of the stream flags.  */
   3787  1.10     mrg   computed_crc = elf_crc32 (0, compressed + 6, 2);
   3788  1.10     mrg   stream_crc = ((uint32_t)compressed[8]
   3789  1.10     mrg 		| ((uint32_t)compressed[9] << 8)
   3790  1.10     mrg 		| ((uint32_t)compressed[10] << 16)
   3791  1.10     mrg 		| ((uint32_t)compressed[11] << 24));
   3792  1.10     mrg   if (unlikely (computed_crc != stream_crc))
   3793  1.10     mrg     {
   3794  1.10     mrg       elf_uncompress_failed ();
   3795  1.10     mrg       return 0;
   3796  1.10     mrg     }
   3797  1.10     mrg 
   3798  1.10     mrg   /* Now that we've parsed the header, parse the footer, so that we
   3799  1.10     mrg      can get the uncompressed size.  */
   3800  1.10     mrg 
   3801  1.10     mrg   /* The footer ends with two magic bytes.  */
   3802  1.10     mrg 
   3803  1.10     mrg   offset = compressed_size;
   3804  1.10     mrg   if (unlikely (memcmp (compressed + offset - 2, "YZ", 2) != 0))
   3805  1.10     mrg     {
   3806  1.10     mrg       elf_uncompress_failed ();
   3807  1.10     mrg       return 0;
   3808  1.10     mrg     }
   3809  1.10     mrg   offset -= 2;
   3810  1.10     mrg 
   3811  1.10     mrg   /* Before that are the stream flags, which should be the same as the
   3812  1.10     mrg      flags in the header.  */
   3813  1.10     mrg   if (unlikely (compressed[offset - 2] != 0
   3814  1.10     mrg 		|| compressed[offset - 1] != check))
   3815  1.10     mrg     {
   3816  1.10     mrg       elf_uncompress_failed ();
   3817  1.10     mrg       return 0;
   3818  1.10     mrg     }
   3819  1.10     mrg   offset -= 2;
   3820  1.10     mrg 
   3821  1.10     mrg   /* Before that is the size of the index field, which precedes the
   3822  1.10     mrg      footer.  */
   3823  1.10     mrg   index_size = (compressed[offset - 4]
   3824  1.10     mrg 		| (compressed[offset - 3] << 8)
   3825  1.10     mrg 		| (compressed[offset - 2] << 16)
   3826  1.10     mrg 		| (compressed[offset - 1] << 24));
   3827  1.10     mrg   index_size = (index_size + 1) * 4;
   3828  1.10     mrg   offset -= 4;
   3829  1.10     mrg 
   3830  1.10     mrg   /* Before that is a footer CRC.  */
   3831  1.10     mrg   computed_crc = elf_crc32 (0, compressed + offset, 6);
   3832  1.10     mrg   stream_crc = ((uint32_t)compressed[offset - 4]
   3833  1.10     mrg 		| ((uint32_t)compressed[offset - 3] << 8)
   3834  1.10     mrg 		| ((uint32_t)compressed[offset - 2] << 16)
   3835  1.10     mrg 		| ((uint32_t)compressed[offset - 1] << 24));
   3836  1.10     mrg   if (unlikely (computed_crc != stream_crc))
   3837  1.10     mrg     {
   3838  1.10     mrg       elf_uncompress_failed ();
   3839  1.10     mrg       return 0;
   3840  1.10     mrg     }
   3841  1.10     mrg   offset -= 4;
   3842  1.10     mrg 
   3843  1.10     mrg   /* The index comes just before the footer.  */
   3844  1.10     mrg   if (unlikely (offset < index_size + header_size))
   3845  1.10     mrg     {
   3846  1.10     mrg       elf_uncompress_failed ();
   3847  1.10     mrg       return 0;
   3848  1.10     mrg     }
   3849  1.10     mrg 
   3850  1.10     mrg   footer_offset = offset;
   3851  1.10     mrg   offset -= index_size;
   3852  1.10     mrg   index_offset = offset;
   3853  1.10     mrg 
   3854  1.10     mrg   /* The index starts with a zero byte.  */
   3855  1.10     mrg   if (unlikely (compressed[offset] != 0))
   3856  1.10     mrg     {
   3857  1.10     mrg       elf_uncompress_failed ();
   3858  1.10     mrg       return 0;
   3859  1.10     mrg     }
   3860  1.10     mrg   ++offset;
   3861  1.10     mrg 
   3862  1.10     mrg   /* Next is the number of blocks.  We expect zero blocks for an empty
   3863  1.10     mrg      stream, and otherwise a single block.  */
   3864  1.10     mrg   if (unlikely (compressed[offset] == 0))
   3865  1.10     mrg     {
   3866  1.10     mrg       *uncompressed = NULL;
   3867  1.10     mrg       *uncompressed_size = 0;
   3868  1.10     mrg       return 1;
   3869  1.10     mrg     }
   3870  1.10     mrg   if (unlikely (compressed[offset] != 1))
   3871  1.10     mrg     {
   3872  1.10     mrg       elf_uncompress_failed ();
   3873  1.10     mrg       return 0;
   3874  1.10     mrg     }
   3875  1.10     mrg   ++offset;
   3876  1.10     mrg 
   3877  1.10     mrg   /* Next is the compressed size and the uncompressed size.  */
   3878  1.10     mrg   if (!elf_lzma_varint (compressed, compressed_size, &offset,
   3879  1.10     mrg 			&index_compressed_size))
   3880  1.10     mrg     return 0;
   3881  1.10     mrg   if (!elf_lzma_varint (compressed, compressed_size, &offset,
   3882  1.10     mrg 			&index_uncompressed_size))
   3883  1.10     mrg     return 0;
   3884  1.10     mrg 
   3885  1.10     mrg   /* Pad to a four byte boundary.  */
   3886  1.10     mrg   offset = (offset + 3) &~ (size_t) 3;
   3887  1.10     mrg 
   3888  1.10     mrg   /* Next is a CRC of the index.  */
   3889  1.10     mrg   computed_crc = elf_crc32 (0, compressed + index_offset,
   3890  1.10     mrg 			    offset - index_offset);
   3891  1.10     mrg   stream_crc = ((uint32_t)compressed[offset]
   3892  1.10     mrg 		| ((uint32_t)compressed[offset + 1] << 8)
   3893  1.10     mrg 		| ((uint32_t)compressed[offset + 2] << 16)
   3894  1.10     mrg 		| ((uint32_t)compressed[offset + 3] << 24));
   3895  1.10     mrg   if (unlikely (computed_crc != stream_crc))
   3896  1.10     mrg     {
   3897  1.10     mrg       elf_uncompress_failed ();
   3898  1.10     mrg       return 0;
   3899  1.10     mrg     }
   3900  1.10     mrg   offset += 4;
   3901  1.10     mrg 
   3902  1.10     mrg   /* We should now be back at the footer.  */
   3903  1.10     mrg   if (unlikely (offset != footer_offset))
   3904  1.10     mrg     {
   3905  1.10     mrg       elf_uncompress_failed ();
   3906  1.10     mrg       return 0;
   3907  1.10     mrg     }
   3908  1.10     mrg 
   3909  1.10     mrg   /* Allocate space to hold the uncompressed data.  If we succeed in
   3910  1.10     mrg      uncompressing the LZMA data, we never free this memory.  */
   3911  1.10     mrg   mem = (unsigned char *) backtrace_alloc (state, index_uncompressed_size,
   3912  1.10     mrg 					   error_callback, data);
   3913  1.10     mrg   if (unlikely (mem == NULL))
   3914  1.10     mrg     return 0;
   3915  1.10     mrg   *uncompressed = mem;
   3916  1.10     mrg   *uncompressed_size = index_uncompressed_size;
   3917  1.10     mrg 
   3918  1.10     mrg   /* Allocate space for probabilities.  */
   3919  1.10     mrg   probs = ((uint16_t *)
   3920  1.10     mrg 	   backtrace_alloc (state,
   3921  1.10     mrg 			    LZMA_PROB_TOTAL_COUNT * sizeof (uint16_t),
   3922  1.10     mrg 			    error_callback, data));
   3923  1.10     mrg   if (unlikely (probs == NULL))
   3924  1.10     mrg     {
   3925  1.10     mrg       backtrace_free (state, mem, index_uncompressed_size, error_callback,
   3926  1.10     mrg 		      data);
   3927  1.10     mrg       return 0;
   3928  1.10     mrg     }
   3929  1.10     mrg 
   3930  1.10     mrg   /* Uncompress the block, which follows the header.  */
   3931  1.10     mrg   offset = 12;
   3932  1.10     mrg   if (!elf_uncompress_lzma_block (compressed, compressed_size, check, probs,
   3933  1.10     mrg 				  mem, index_uncompressed_size, &offset))
   3934  1.10     mrg     {
   3935  1.10     mrg       backtrace_free (state, mem, index_uncompressed_size, error_callback,
   3936  1.10     mrg 		      data);
   3937  1.10     mrg       return 0;
   3938  1.10     mrg     }
   3939  1.10     mrg 
   3940  1.10     mrg   compressed_block_size = offset - 12;
   3941  1.10     mrg   if (unlikely (compressed_block_size
   3942  1.10     mrg 		!= ((index_compressed_size + 3) &~ (size_t) 3)))
   3943  1.10     mrg     {
   3944  1.10     mrg       elf_uncompress_failed ();
   3945  1.10     mrg       backtrace_free (state, mem, index_uncompressed_size, error_callback,
   3946  1.10     mrg 		      data);
   3947  1.10     mrg       return 0;
   3948  1.10     mrg     }
   3949  1.10     mrg 
   3950  1.10     mrg   offset = (offset + 3) &~ (size_t) 3;
   3951  1.10     mrg   if (unlikely (offset != index_offset))
   3952  1.10     mrg     {
   3953  1.10     mrg       elf_uncompress_failed ();
   3954  1.10     mrg       backtrace_free (state, mem, index_uncompressed_size, error_callback,
   3955  1.10     mrg 		      data);
   3956  1.10     mrg       return 0;
   3957  1.10     mrg     }
   3958  1.10     mrg 
   3959  1.10     mrg   return 1;
   3960  1.10     mrg }
   3961  1.10     mrg 
   3962  1.10     mrg /* This function is a hook for testing the LZMA support.  It is only
   3963  1.10     mrg    used by tests.  */
   3964  1.10     mrg 
   3965  1.10     mrg int
   3966  1.10     mrg backtrace_uncompress_lzma (struct backtrace_state *state,
   3967  1.10     mrg 			   const unsigned char *compressed,
   3968  1.10     mrg 			   size_t compressed_size,
   3969  1.10     mrg 			   backtrace_error_callback error_callback,
   3970  1.10     mrg 			   void *data, unsigned char **uncompressed,
   3971  1.10     mrg 			   size_t *uncompressed_size)
   3972  1.10     mrg {
   3973  1.10     mrg   return elf_uncompress_lzma (state, compressed, compressed_size,
   3974  1.10     mrg 			      error_callback, data, uncompressed,
   3975  1.10     mrg 			      uncompressed_size);
   3976  1.10     mrg }
   3977  1.10     mrg 
   3978  1.10     mrg /* Add the backtrace data for one ELF file.  Returns 1 on success,
   3979  1.10     mrg    0 on failure (in both cases descriptor is closed) or -1 if exe
   3980  1.10     mrg    is non-zero and the ELF file is ET_DYN, which tells the caller that
   3981  1.10     mrg    elf_add will need to be called on the descriptor again after
   3982  1.10     mrg    base_address is determined.  */
   3983  1.10     mrg 
   3984  1.10     mrg static int
   3985  1.10     mrg elf_add (struct backtrace_state *state, const char *filename, int descriptor,
   3986  1.10     mrg 	 const unsigned char *memory, size_t memory_size,
   3987  1.10     mrg 	 uintptr_t base_address, backtrace_error_callback error_callback,
   3988  1.10     mrg 	 void *data, fileline *fileline_fn, int *found_sym, int *found_dwarf,
   3989  1.10     mrg 	 struct dwarf_data **fileline_entry, int exe, int debuginfo,
   3990  1.10     mrg 	 const char *with_buildid_data, uint32_t with_buildid_size)
   3991  1.10     mrg {
   3992  1.10     mrg   struct elf_view ehdr_view;
   3993  1.10     mrg   b_elf_ehdr ehdr;
   3994  1.10     mrg   off_t shoff;
   3995  1.10     mrg   unsigned int shnum;
   3996  1.10     mrg   unsigned int shstrndx;
   3997  1.10     mrg   struct elf_view shdrs_view;
   3998  1.10     mrg   int shdrs_view_valid;
   3999  1.10     mrg   const b_elf_shdr *shdrs;
   4000  1.10     mrg   const b_elf_shdr *shstrhdr;
   4001  1.10     mrg   size_t shstr_size;
   4002  1.10     mrg   off_t shstr_off;
   4003  1.10     mrg   struct elf_view names_view;
   4004  1.10     mrg   int names_view_valid;
   4005  1.10     mrg   const char *names;
   4006  1.10     mrg   unsigned int symtab_shndx;
   4007  1.10     mrg   unsigned int dynsym_shndx;
   4008  1.10     mrg   unsigned int i;
   4009  1.10     mrg   struct debug_section_info sections[DEBUG_MAX];
   4010  1.10     mrg   struct debug_section_info zsections[DEBUG_MAX];
   4011  1.10     mrg   struct elf_view symtab_view;
   4012  1.10     mrg   int symtab_view_valid;
   4013  1.10     mrg   struct elf_view strtab_view;
   4014  1.10     mrg   int strtab_view_valid;
   4015  1.10     mrg   struct elf_view buildid_view;
   4016  1.10     mrg   int buildid_view_valid;
   4017  1.10     mrg   const char *buildid_data;
   4018  1.10     mrg   uint32_t buildid_size;
   4019  1.10     mrg   struct elf_view debuglink_view;
   4020  1.10     mrg   int debuglink_view_valid;
   4021  1.10     mrg   const char *debuglink_name;
   4022  1.10     mrg   uint32_t debuglink_crc;
   4023  1.10     mrg   struct elf_view debugaltlink_view;
   4024  1.10     mrg   int debugaltlink_view_valid;
   4025  1.10     mrg   const char *debugaltlink_name;
   4026  1.10     mrg   const char *debugaltlink_buildid_data;
   4027  1.10     mrg   uint32_t debugaltlink_buildid_size;
   4028  1.10     mrg   struct elf_view gnu_debugdata_view;
   4029  1.10     mrg   int gnu_debugdata_view_valid;
   4030  1.10     mrg   size_t gnu_debugdata_size;
   4031  1.10     mrg   unsigned char *gnu_debugdata_uncompressed;
   4032  1.10     mrg   size_t gnu_debugdata_uncompressed_size;
   4033  1.10     mrg   off_t min_offset;
   4034  1.10     mrg   off_t max_offset;
   4035  1.10     mrg   off_t debug_size;
   4036  1.10     mrg   struct elf_view debug_view;
   4037  1.10     mrg   int debug_view_valid;
   4038  1.10     mrg   unsigned int using_debug_view;
   4039  1.10     mrg   uint16_t *zdebug_table;
   4040  1.10     mrg   struct elf_view split_debug_view[DEBUG_MAX];
   4041  1.10     mrg   unsigned char split_debug_view_valid[DEBUG_MAX];
   4042  1.10     mrg   struct elf_ppc64_opd_data opd_data, *opd;
   4043  1.10     mrg   struct dwarf_sections dwarf_sections;
   4044  1.10     mrg 
   4045  1.10     mrg   if (!debuginfo)
   4046  1.10     mrg     {
   4047  1.10     mrg       *found_sym = 0;
   4048  1.10     mrg       *found_dwarf = 0;
   4049  1.10     mrg     }
   4050  1.10     mrg 
   4051  1.10     mrg   shdrs_view_valid = 0;
   4052  1.10     mrg   names_view_valid = 0;
   4053  1.10     mrg   symtab_view_valid = 0;
   4054  1.10     mrg   strtab_view_valid = 0;
   4055  1.10     mrg   buildid_view_valid = 0;
   4056  1.10     mrg   buildid_data = NULL;
   4057  1.10     mrg   buildid_size = 0;
   4058  1.10     mrg   debuglink_view_valid = 0;
   4059  1.10     mrg   debuglink_name = NULL;
   4060  1.10     mrg   debuglink_crc = 0;
   4061  1.10     mrg   debugaltlink_view_valid = 0;
   4062  1.10     mrg   debugaltlink_name = NULL;
   4063  1.10     mrg   debugaltlink_buildid_data = NULL;
   4064  1.10     mrg   debugaltlink_buildid_size = 0;
   4065  1.10     mrg   gnu_debugdata_view_valid = 0;
   4066  1.10     mrg   gnu_debugdata_size = 0;
   4067  1.10     mrg   debug_view_valid = 0;
   4068  1.10     mrg   memset (&split_debug_view_valid[0], 0, sizeof split_debug_view_valid);
   4069  1.10     mrg   opd = NULL;
   4070  1.10     mrg 
   4071  1.10     mrg   if (!elf_get_view (state, descriptor, memory, memory_size, 0, sizeof ehdr,
   4072  1.10     mrg 		     error_callback, data, &ehdr_view))
   4073  1.10     mrg     goto fail;
   4074  1.10     mrg 
   4075  1.10     mrg   memcpy (&ehdr, ehdr_view.view.data, sizeof ehdr);
   4076  1.10     mrg 
   4077  1.10     mrg   elf_release_view (state, &ehdr_view, error_callback, data);
   4078  1.10     mrg 
   4079  1.10     mrg   if (ehdr.e_ident[EI_MAG0] != ELFMAG0
   4080  1.10     mrg       || ehdr.e_ident[EI_MAG1] != ELFMAG1
   4081  1.10     mrg       || ehdr.e_ident[EI_MAG2] != ELFMAG2
   4082  1.10     mrg       || ehdr.e_ident[EI_MAG3] != ELFMAG3)
   4083  1.10     mrg     {
   4084  1.10     mrg       error_callback (data, "executable file is not ELF", 0);
   4085  1.10     mrg       goto fail;
   4086  1.10     mrg     }
   4087  1.10     mrg   if (ehdr.e_ident[EI_VERSION] != EV_CURRENT)
   4088  1.10     mrg     {
   4089  1.10     mrg       error_callback (data, "executable file is unrecognized ELF version", 0);
   4090  1.10     mrg       goto fail;
   4091  1.10     mrg     }
   4092  1.10     mrg 
   4093  1.10     mrg #if BACKTRACE_ELF_SIZE == 32
   4094  1.10     mrg #define BACKTRACE_ELFCLASS ELFCLASS32
   4095  1.10     mrg #else
   4096  1.10     mrg #define BACKTRACE_ELFCLASS ELFCLASS64
   4097  1.10     mrg #endif
   4098  1.10     mrg 
   4099  1.10     mrg   if (ehdr.e_ident[EI_CLASS] != BACKTRACE_ELFCLASS)
   4100  1.10     mrg     {
   4101  1.10     mrg       error_callback (data, "executable file is unexpected ELF class", 0);
   4102  1.10     mrg       goto fail;
   4103  1.10     mrg     }
   4104  1.10     mrg 
   4105  1.10     mrg   if (ehdr.e_ident[EI_DATA] != ELFDATA2LSB
   4106  1.10     mrg       && ehdr.e_ident[EI_DATA] != ELFDATA2MSB)
   4107  1.10     mrg     {
   4108  1.10     mrg       error_callback (data, "executable file has unknown endianness", 0);
   4109  1.10     mrg       goto fail;
   4110  1.10     mrg     }
   4111  1.10     mrg 
   4112  1.10     mrg   /* If the executable is ET_DYN, it is either a PIE, or we are running
   4113  1.10     mrg      directly a shared library with .interp.  We need to wait for
   4114  1.10     mrg      dl_iterate_phdr in that case to determine the actual base_address.  */
   4115  1.10     mrg   if (exe && ehdr.e_type == ET_DYN)
   4116  1.10     mrg     return -1;
   4117  1.10     mrg 
   4118  1.10     mrg   shoff = ehdr.e_shoff;
   4119  1.10     mrg   shnum = ehdr.e_shnum;
   4120  1.10     mrg   shstrndx = ehdr.e_shstrndx;
   4121  1.10     mrg 
   4122  1.10     mrg   if ((shnum == 0 || shstrndx == SHN_XINDEX)
   4123  1.10     mrg       && shoff != 0)
   4124  1.10     mrg     {
   4125  1.10     mrg       struct elf_view shdr_view;
   4126  1.10     mrg       const b_elf_shdr *shdr;
   4127  1.10     mrg 
   4128  1.10     mrg       if (!elf_get_view (state, descriptor, memory, memory_size, shoff,
   4129  1.10     mrg 			 sizeof shdr, error_callback, data, &shdr_view))
   4130  1.10     mrg 	goto fail;
   4131  1.10     mrg 
   4132  1.10     mrg       shdr = (const b_elf_shdr *) shdr_view.view.data;
   4133  1.10     mrg 
   4134  1.10     mrg       if (shnum == 0)
   4135  1.10     mrg 	shnum = shdr->sh_size;
   4136  1.10     mrg 
   4137  1.10     mrg       if (shstrndx == SHN_XINDEX)
   4138  1.10     mrg 	{
   4139  1.10     mrg 	  shstrndx = shdr->sh_link;
   4140  1.10     mrg 
   4141  1.10     mrg 	  /* Versions of the GNU binutils between 2.12 and 2.18 did
   4142  1.10     mrg 	     not handle objects with more than SHN_LORESERVE sections
   4143  1.10     mrg 	     correctly.  All large section indexes were offset by
   4144  1.10     mrg 	     0x100.  There is more information at
   4145  1.10     mrg 	     http://sourceware.org/bugzilla/show_bug.cgi?id-5900 .
   4146  1.10     mrg 	     Fortunately these object files are easy to detect, as the
   4147  1.10     mrg 	     GNU binutils always put the section header string table
   4148  1.10     mrg 	     near the end of the list of sections.  Thus if the
   4149  1.10     mrg 	     section header string table index is larger than the
   4150  1.10     mrg 	     number of sections, then we know we have to subtract
   4151  1.10     mrg 	     0x100 to get the real section index.  */
   4152  1.10     mrg 	  if (shstrndx >= shnum && shstrndx >= SHN_LORESERVE + 0x100)
   4153  1.10     mrg 	    shstrndx -= 0x100;
   4154  1.10     mrg 	}
   4155  1.10     mrg 
   4156  1.10     mrg       elf_release_view (state, &shdr_view, error_callback, data);
   4157  1.10     mrg     }
   4158  1.10     mrg 
   4159  1.10     mrg   if (shnum == 0 || shstrndx == 0)
   4160  1.10     mrg     goto fail;
   4161  1.10     mrg 
   4162  1.10     mrg   /* To translate PC to file/line when using DWARF, we need to find
   4163  1.10     mrg      the .debug_info and .debug_line sections.  */
   4164  1.10     mrg 
   4165  1.10     mrg   /* Read the section headers, skipping the first one.  */
   4166  1.10     mrg 
   4167  1.10     mrg   if (!elf_get_view (state, descriptor, memory, memory_size,
   4168  1.10     mrg 		     shoff + sizeof (b_elf_shdr),
   4169  1.10     mrg 		     (shnum - 1) * sizeof (b_elf_shdr),
   4170  1.10     mrg 		     error_callback, data, &shdrs_view))
   4171  1.10     mrg     goto fail;
   4172  1.10     mrg   shdrs_view_valid = 1;
   4173  1.10     mrg   shdrs = (const b_elf_shdr *) shdrs_view.view.data;
   4174  1.10     mrg 
   4175  1.10     mrg   /* Read the section names.  */
   4176  1.10     mrg 
   4177  1.10     mrg   shstrhdr = &shdrs[shstrndx - 1];
   4178  1.10     mrg   shstr_size = shstrhdr->sh_size;
   4179  1.10     mrg   shstr_off = shstrhdr->sh_offset;
   4180  1.10     mrg 
   4181  1.10     mrg   if (!elf_get_view (state, descriptor, memory, memory_size, shstr_off,
   4182  1.10     mrg 		     shstrhdr->sh_size, error_callback, data, &names_view))
   4183  1.10     mrg     goto fail;
   4184  1.10     mrg   names_view_valid = 1;
   4185  1.10     mrg   names = (const char *) names_view.view.data;
   4186  1.10     mrg 
   4187  1.10     mrg   symtab_shndx = 0;
   4188  1.10     mrg   dynsym_shndx = 0;
   4189  1.10     mrg 
   4190  1.10     mrg   memset (sections, 0, sizeof sections);
   4191  1.10     mrg   memset (zsections, 0, sizeof zsections);
   4192  1.10     mrg 
   4193  1.10     mrg   /* Look for the symbol table.  */
   4194  1.10     mrg   for (i = 1; i < shnum; ++i)
   4195  1.10     mrg     {
   4196  1.10     mrg       const b_elf_shdr *shdr;
   4197  1.10     mrg       unsigned int sh_name;
   4198  1.10     mrg       const char *name;
   4199  1.10     mrg       int j;
   4200  1.10     mrg 
   4201  1.10     mrg       shdr = &shdrs[i - 1];
   4202  1.10     mrg 
   4203  1.10     mrg       if (shdr->sh_type == SHT_SYMTAB)
   4204  1.10     mrg 	symtab_shndx = i;
   4205  1.10     mrg       else if (shdr->sh_type == SHT_DYNSYM)
   4206  1.10     mrg 	dynsym_shndx = i;
   4207  1.10     mrg 
   4208  1.10     mrg       sh_name = shdr->sh_name;
   4209  1.10     mrg       if (sh_name >= shstr_size)
   4210  1.10     mrg 	{
   4211  1.10     mrg 	  error_callback (data, "ELF section name out of range", 0);
   4212  1.10     mrg 	  goto fail;
   4213  1.10     mrg 	}
   4214   1.1     mrg 
   4215   1.1     mrg       name = names + sh_name;
   4216   1.1     mrg 
   4217   1.1     mrg       for (j = 0; j < (int) DEBUG_MAX; ++j)
   4218   1.1     mrg 	{
   4219   1.9     mrg 	  if (strcmp (name, dwarf_section_names[j]) == 0)
   4220   1.1     mrg 	    {
   4221   1.1     mrg 	      sections[j].offset = shdr->sh_offset;
   4222   1.1     mrg 	      sections[j].size = shdr->sh_size;
   4223   1.7     mrg 	      sections[j].compressed = (shdr->sh_flags & SHF_COMPRESSED) != 0;
   4224   1.1     mrg 	      break;
   4225   1.1     mrg 	    }
   4226   1.1     mrg 	}
   4227   1.7     mrg 
   4228   1.9     mrg       if (name[0] == '.' && name[1] == 'z')
   4229   1.9     mrg 	{
   4230   1.9     mrg 	  for (j = 0; j < (int) DEBUG_MAX; ++j)
   4231   1.9     mrg 	    {
   4232   1.9     mrg 	      if (strcmp (name + 2, dwarf_section_names[j] + 1) == 0)
   4233   1.9     mrg 		{
   4234   1.9     mrg 		  zsections[j].offset = shdr->sh_offset;
   4235   1.9     mrg 		  zsections[j].size = shdr->sh_size;
   4236   1.9     mrg 		  break;
   4237   1.9     mrg 		}
   4238   1.9     mrg 	    }
   4239   1.9     mrg 	}
   4240   1.9     mrg 
   4241   1.7     mrg       /* Read the build ID if present.  This could check for any
   4242   1.7     mrg 	 SHT_NOTE section with the right note name and type, but gdb
   4243   1.7     mrg 	 looks for a specific section name.  */
   4244   1.8     mrg       if ((!debuginfo || with_buildid_data != NULL)
   4245   1.7     mrg 	  && !buildid_view_valid
   4246   1.7     mrg 	  && strcmp (name, ".note.gnu.build-id") == 0)
   4247   1.7     mrg 	{
   4248   1.7     mrg 	  const b_elf_note *note;
   4249   1.7     mrg 
   4250  1.10     mrg 	  if (!elf_get_view (state, descriptor, memory, memory_size,
   4251  1.10     mrg 			     shdr->sh_offset, shdr->sh_size, error_callback,
   4252  1.10     mrg 			     data, &buildid_view))
   4253   1.7     mrg 	    goto fail;
   4254   1.7     mrg 
   4255   1.7     mrg 	  buildid_view_valid = 1;
   4256  1.10     mrg 	  note = (const b_elf_note *) buildid_view.view.data;
   4257   1.7     mrg 	  if (note->type == NT_GNU_BUILD_ID
   4258   1.7     mrg 	      && note->namesz == 4
   4259   1.7     mrg 	      && strncmp (note->name, "GNU", 4) == 0
   4260   1.7     mrg 	      && shdr->sh_size <= 12 + ((note->namesz + 3) & ~ 3) + note->descsz)
   4261   1.7     mrg 	    {
   4262   1.7     mrg 	      buildid_data = &note->name[0] + ((note->namesz + 3) & ~ 3);
   4263   1.7     mrg 	      buildid_size = note->descsz;
   4264   1.7     mrg 	    }
   4265   1.8     mrg 
   4266   1.8     mrg 	  if (with_buildid_size != 0)
   4267   1.8     mrg 	    {
   4268   1.8     mrg 	      if (buildid_size != with_buildid_size)
   4269   1.8     mrg 		goto fail;
   4270   1.8     mrg 
   4271   1.8     mrg 	      if (memcmp (buildid_data, with_buildid_data, buildid_size) != 0)
   4272   1.8     mrg 		goto fail;
   4273   1.8     mrg 	    }
   4274   1.7     mrg 	}
   4275   1.7     mrg 
   4276   1.7     mrg       /* Read the debuglink file if present.  */
   4277   1.7     mrg       if (!debuginfo
   4278   1.7     mrg 	  && !debuglink_view_valid
   4279   1.7     mrg 	  && strcmp (name, ".gnu_debuglink") == 0)
   4280   1.7     mrg 	{
   4281   1.7     mrg 	  const char *debuglink_data;
   4282   1.7     mrg 	  size_t crc_offset;
   4283   1.7     mrg 
   4284  1.10     mrg 	  if (!elf_get_view (state, descriptor, memory, memory_size,
   4285  1.10     mrg 			     shdr->sh_offset, shdr->sh_size, error_callback,
   4286  1.10     mrg 			     data, &debuglink_view))
   4287   1.7     mrg 	    goto fail;
   4288   1.7     mrg 
   4289   1.7     mrg 	  debuglink_view_valid = 1;
   4290  1.10     mrg 	  debuglink_data = (const char *) debuglink_view.view.data;
   4291   1.7     mrg 	  crc_offset = strnlen (debuglink_data, shdr->sh_size);
   4292   1.7     mrg 	  crc_offset = (crc_offset + 3) & ~3;
   4293   1.7     mrg 	  if (crc_offset + 4 <= shdr->sh_size)
   4294   1.7     mrg 	    {
   4295   1.7     mrg 	      debuglink_name = debuglink_data;
   4296   1.7     mrg 	      debuglink_crc = *(const uint32_t*)(debuglink_data + crc_offset);
   4297   1.7     mrg 	    }
   4298   1.7     mrg 	}
   4299   1.7     mrg 
   4300   1.8     mrg       if (!debugaltlink_view_valid
   4301   1.8     mrg 	  && strcmp (name, ".gnu_debugaltlink") == 0)
   4302   1.8     mrg 	{
   4303   1.8     mrg 	  const char *debugaltlink_data;
   4304   1.8     mrg 	  size_t debugaltlink_name_len;
   4305   1.8     mrg 
   4306  1.10     mrg 	  if (!elf_get_view (state, descriptor, memory, memory_size,
   4307  1.10     mrg 			     shdr->sh_offset, shdr->sh_size, error_callback,
   4308  1.10     mrg 			     data, &debugaltlink_view))
   4309   1.8     mrg 	    goto fail;
   4310   1.8     mrg 
   4311   1.8     mrg 	  debugaltlink_view_valid = 1;
   4312  1.10     mrg 	  debugaltlink_data = (const char *) debugaltlink_view.view.data;
   4313   1.8     mrg 	  debugaltlink_name = debugaltlink_data;
   4314   1.8     mrg 	  debugaltlink_name_len = strnlen (debugaltlink_data, shdr->sh_size);
   4315   1.8     mrg 	  if (debugaltlink_name_len < shdr->sh_size)
   4316   1.8     mrg 	    {
   4317   1.8     mrg 	      /* Include terminating zero.  */
   4318   1.8     mrg 	      debugaltlink_name_len += 1;
   4319   1.8     mrg 
   4320   1.8     mrg 	      debugaltlink_buildid_data
   4321   1.8     mrg 		= debugaltlink_data + debugaltlink_name_len;
   4322   1.8     mrg 	      debugaltlink_buildid_size = shdr->sh_size - debugaltlink_name_len;
   4323   1.8     mrg 	    }
   4324   1.8     mrg 	}
   4325   1.8     mrg 
   4326  1.10     mrg       if (!gnu_debugdata_view_valid
   4327  1.10     mrg 	  && strcmp (name, ".gnu_debugdata") == 0)
   4328  1.10     mrg 	{
   4329  1.10     mrg 	  if (!elf_get_view (state, descriptor, memory, memory_size,
   4330  1.10     mrg 			     shdr->sh_offset, shdr->sh_size, error_callback,
   4331  1.10     mrg 			     data, &gnu_debugdata_view))
   4332  1.10     mrg 	    goto fail;
   4333  1.10     mrg 
   4334  1.10     mrg 	  gnu_debugdata_size = shdr->sh_size;
   4335  1.10     mrg 	  gnu_debugdata_view_valid = 1;
   4336  1.10     mrg 	}
   4337  1.10     mrg 
   4338   1.7     mrg       /* Read the .opd section on PowerPC64 ELFv1.  */
   4339   1.7     mrg       if (ehdr.e_machine == EM_PPC64
   4340   1.7     mrg 	  && (ehdr.e_flags & EF_PPC64_ABI) < 2
   4341   1.7     mrg 	  && shdr->sh_type == SHT_PROGBITS
   4342   1.7     mrg 	  && strcmp (name, ".opd") == 0)
   4343   1.7     mrg 	{
   4344  1.10     mrg 	  if (!elf_get_view (state, descriptor, memory, memory_size,
   4345  1.10     mrg 			     shdr->sh_offset, shdr->sh_size, error_callback,
   4346  1.10     mrg 			     data, &opd_data.view))
   4347   1.7     mrg 	    goto fail;
   4348   1.7     mrg 
   4349   1.7     mrg 	  opd = &opd_data;
   4350   1.7     mrg 	  opd->addr = shdr->sh_addr;
   4351  1.10     mrg 	  opd->data = (const char *) opd_data.view.view.data;
   4352   1.7     mrg 	  opd->size = shdr->sh_size;
   4353   1.7     mrg 	}
   4354   1.1     mrg     }
   4355   1.1     mrg 
   4356   1.1     mrg   if (symtab_shndx == 0)
   4357   1.1     mrg     symtab_shndx = dynsym_shndx;
   4358   1.7     mrg   if (symtab_shndx != 0 && !debuginfo)
   4359   1.1     mrg     {
   4360   1.1     mrg       const b_elf_shdr *symtab_shdr;
   4361   1.1     mrg       unsigned int strtab_shndx;
   4362   1.1     mrg       const b_elf_shdr *strtab_shdr;
   4363   1.1     mrg       struct elf_syminfo_data *sdata;
   4364   1.1     mrg 
   4365   1.1     mrg       symtab_shdr = &shdrs[symtab_shndx - 1];
   4366   1.1     mrg       strtab_shndx = symtab_shdr->sh_link;
   4367   1.1     mrg       if (strtab_shndx >= shnum)
   4368   1.1     mrg 	{
   4369   1.1     mrg 	  error_callback (data,
   4370   1.1     mrg 			  "ELF symbol table strtab link out of range", 0);
   4371   1.1     mrg 	  goto fail;
   4372   1.1     mrg 	}
   4373   1.1     mrg       strtab_shdr = &shdrs[strtab_shndx - 1];
   4374   1.1     mrg 
   4375  1.10     mrg       if (!elf_get_view (state, descriptor, memory, memory_size,
   4376  1.10     mrg 			 symtab_shdr->sh_offset, symtab_shdr->sh_size,
   4377  1.10     mrg 			 error_callback, data, &symtab_view))
   4378   1.1     mrg 	goto fail;
   4379   1.1     mrg       symtab_view_valid = 1;
   4380   1.1     mrg 
   4381  1.10     mrg       if (!elf_get_view (state, descriptor, memory, memory_size,
   4382  1.10     mrg 			 strtab_shdr->sh_offset, strtab_shdr->sh_size,
   4383  1.10     mrg 			 error_callback, data, &strtab_view))
   4384   1.1     mrg 	goto fail;
   4385   1.1     mrg       strtab_view_valid = 1;
   4386   1.1     mrg 
   4387   1.1     mrg       sdata = ((struct elf_syminfo_data *)
   4388   1.1     mrg 	       backtrace_alloc (state, sizeof *sdata, error_callback, data));
   4389   1.1     mrg       if (sdata == NULL)
   4390   1.1     mrg 	goto fail;
   4391   1.1     mrg 
   4392   1.3     mrg       if (!elf_initialize_syminfo (state, base_address,
   4393  1.10     mrg 				   symtab_view.view.data, symtab_shdr->sh_size,
   4394  1.10     mrg 				   strtab_view.view.data, strtab_shdr->sh_size,
   4395   1.7     mrg 				   error_callback, data, sdata, opd))
   4396   1.1     mrg 	{
   4397   1.1     mrg 	  backtrace_free (state, sdata, sizeof *sdata, error_callback, data);
   4398   1.1     mrg 	  goto fail;
   4399   1.1     mrg 	}
   4400   1.1     mrg 
   4401   1.1     mrg       /* We no longer need the symbol table, but we hold on to the
   4402   1.1     mrg 	 string table permanently.  */
   4403  1.10     mrg       elf_release_view (state, &symtab_view, error_callback, data);
   4404   1.7     mrg       symtab_view_valid = 0;
   4405  1.10     mrg       strtab_view_valid = 0;
   4406   1.1     mrg 
   4407   1.1     mrg       *found_sym = 1;
   4408   1.1     mrg 
   4409   1.1     mrg       elf_add_syminfo_data (state, sdata);
   4410   1.1     mrg     }
   4411   1.1     mrg 
   4412  1.10     mrg   elf_release_view (state, &shdrs_view, error_callback, data);
   4413   1.1     mrg   shdrs_view_valid = 0;
   4414  1.10     mrg   elf_release_view (state, &names_view, error_callback, data);
   4415   1.1     mrg   names_view_valid = 0;
   4416   1.1     mrg 
   4417   1.7     mrg   /* If the debug info is in a separate file, read that one instead.  */
   4418   1.7     mrg 
   4419   1.7     mrg   if (buildid_data != NULL)
   4420   1.7     mrg     {
   4421   1.7     mrg       int d;
   4422   1.7     mrg 
   4423   1.7     mrg       d = elf_open_debugfile_by_buildid (state, buildid_data, buildid_size,
   4424   1.7     mrg 					 error_callback, data);
   4425   1.7     mrg       if (d >= 0)
   4426   1.7     mrg 	{
   4427   1.7     mrg 	  int ret;
   4428   1.7     mrg 
   4429  1.10     mrg 	  elf_release_view (state, &buildid_view, error_callback, data);
   4430   1.7     mrg 	  if (debuglink_view_valid)
   4431  1.10     mrg 	    elf_release_view (state, &debuglink_view, error_callback, data);
   4432   1.8     mrg 	  if (debugaltlink_view_valid)
   4433  1.10     mrg 	    elf_release_view (state, &debugaltlink_view, error_callback, data);
   4434  1.10     mrg 	  ret = elf_add (state, "", d, NULL, 0, base_address, error_callback,
   4435  1.10     mrg 			 data, fileline_fn, found_sym, found_dwarf, NULL, 0,
   4436  1.10     mrg 			 1, NULL, 0);
   4437   1.7     mrg 	  if (ret < 0)
   4438   1.7     mrg 	    backtrace_close (d, error_callback, data);
   4439  1.10     mrg 	  else if (descriptor >= 0)
   4440   1.7     mrg 	    backtrace_close (descriptor, error_callback, data);
   4441   1.7     mrg 	  return ret;
   4442   1.7     mrg 	}
   4443   1.7     mrg     }
   4444   1.7     mrg 
   4445   1.7     mrg   if (buildid_view_valid)
   4446   1.7     mrg     {
   4447  1.10     mrg       elf_release_view (state, &buildid_view, error_callback, data);
   4448   1.7     mrg       buildid_view_valid = 0;
   4449   1.7     mrg     }
   4450   1.7     mrg 
   4451   1.7     mrg   if (opd)
   4452   1.7     mrg     {
   4453  1.10     mrg       elf_release_view (state, &opd->view, error_callback, data);
   4454   1.7     mrg       opd = NULL;
   4455   1.7     mrg     }
   4456   1.7     mrg 
   4457   1.7     mrg   if (debuglink_name != NULL)
   4458   1.7     mrg     {
   4459   1.7     mrg       int d;
   4460   1.7     mrg 
   4461   1.7     mrg       d = elf_open_debugfile_by_debuglink (state, filename, debuglink_name,
   4462   1.7     mrg 					   debuglink_crc, error_callback,
   4463   1.7     mrg 					   data);
   4464   1.7     mrg       if (d >= 0)
   4465   1.7     mrg 	{
   4466   1.7     mrg 	  int ret;
   4467   1.7     mrg 
   4468  1.10     mrg 	  elf_release_view (state, &debuglink_view, error_callback, data);
   4469   1.8     mrg 	  if (debugaltlink_view_valid)
   4470  1.10     mrg 	    elf_release_view (state, &debugaltlink_view, error_callback, data);
   4471  1.10     mrg 	  ret = elf_add (state, "", d, NULL, 0, base_address, error_callback,
   4472  1.10     mrg 			 data, fileline_fn, found_sym, found_dwarf, NULL, 0,
   4473  1.10     mrg 			 1, NULL, 0);
   4474   1.7     mrg 	  if (ret < 0)
   4475   1.7     mrg 	    backtrace_close (d, error_callback, data);
   4476  1.10     mrg 	  else if (descriptor >= 0)
   4477   1.7     mrg 	    backtrace_close(descriptor, error_callback, data);
   4478   1.7     mrg 	  return ret;
   4479   1.7     mrg 	}
   4480   1.7     mrg     }
   4481   1.7     mrg 
   4482   1.7     mrg   if (debuglink_view_valid)
   4483   1.7     mrg     {
   4484  1.10     mrg       elf_release_view (state, &debuglink_view, error_callback, data);
   4485   1.7     mrg       debuglink_view_valid = 0;
   4486   1.7     mrg     }
   4487   1.7     mrg 
   4488   1.8     mrg   struct dwarf_data *fileline_altlink = NULL;
   4489   1.8     mrg   if (debugaltlink_name != NULL)
   4490   1.8     mrg     {
   4491   1.8     mrg       int d;
   4492   1.8     mrg 
   4493   1.8     mrg       d = elf_open_debugfile_by_debuglink (state, filename, debugaltlink_name,
   4494   1.8     mrg 					   0, error_callback, data);
   4495   1.8     mrg       if (d >= 0)
   4496   1.8     mrg 	{
   4497   1.8     mrg 	  int ret;
   4498   1.8     mrg 
   4499  1.10     mrg 	  ret = elf_add (state, filename, d, NULL, 0, base_address,
   4500  1.10     mrg 			 error_callback, data, fileline_fn, found_sym,
   4501  1.10     mrg 			 found_dwarf, &fileline_altlink, 0, 1,
   4502  1.10     mrg 			 debugaltlink_buildid_data, debugaltlink_buildid_size);
   4503  1.10     mrg 	  elf_release_view (state, &debugaltlink_view, error_callback, data);
   4504   1.8     mrg 	  debugaltlink_view_valid = 0;
   4505   1.8     mrg 	  if (ret < 0)
   4506   1.8     mrg 	    {
   4507   1.8     mrg 	      backtrace_close (d, error_callback, data);
   4508   1.8     mrg 	      return ret;
   4509   1.8     mrg 	    }
   4510   1.8     mrg 	}
   4511   1.8     mrg     }
   4512   1.8     mrg 
   4513   1.8     mrg   if (debugaltlink_view_valid)
   4514   1.8     mrg     {
   4515  1.10     mrg       elf_release_view (state, &debugaltlink_view, error_callback, data);
   4516   1.8     mrg       debugaltlink_view_valid = 0;
   4517   1.8     mrg     }
   4518   1.8     mrg 
   4519  1.10     mrg   if (gnu_debugdata_view_valid)
   4520  1.10     mrg     {
   4521  1.10     mrg       int ret;
   4522  1.10     mrg 
   4523  1.10     mrg       ret = elf_uncompress_lzma (state,
   4524  1.10     mrg 				 ((const unsigned char *)
   4525  1.10     mrg 				  gnu_debugdata_view.view.data),
   4526  1.10     mrg 				 gnu_debugdata_size, error_callback, data,
   4527  1.10     mrg 				 &gnu_debugdata_uncompressed,
   4528  1.10     mrg 				 &gnu_debugdata_uncompressed_size);
   4529  1.10     mrg 
   4530  1.10     mrg       elf_release_view (state, &gnu_debugdata_view, error_callback, data);
   4531  1.10     mrg       gnu_debugdata_view_valid = 0;
   4532  1.10     mrg 
   4533  1.10     mrg       if (ret)
   4534  1.10     mrg 	{
   4535  1.10     mrg 	  ret = elf_add (state, filename, -1, gnu_debugdata_uncompressed,
   4536  1.10     mrg 			 gnu_debugdata_uncompressed_size, base_address,
   4537  1.10     mrg 			 error_callback, data, fileline_fn, found_sym,
   4538  1.10     mrg 			 found_dwarf, NULL, 0, 0, NULL, 0);
   4539  1.10     mrg 	  if (ret >= 0 && descriptor >= 0)
   4540  1.10     mrg 	    backtrace_close(descriptor, error_callback, data);
   4541  1.10     mrg 	  return ret;
   4542  1.10     mrg 	}
   4543  1.10     mrg     }
   4544  1.10     mrg 
   4545   1.1     mrg   /* Read all the debug sections in a single view, since they are
   4546   1.9     mrg      probably adjacent in the file.  If any of sections are
   4547   1.9     mrg      uncompressed, we never release this view.  */
   4548   1.1     mrg 
   4549   1.1     mrg   min_offset = 0;
   4550   1.1     mrg   max_offset = 0;
   4551  1.10     mrg   debug_size = 0;
   4552   1.1     mrg   for (i = 0; i < (int) DEBUG_MAX; ++i)
   4553   1.1     mrg     {
   4554   1.1     mrg       off_t end;
   4555   1.1     mrg 
   4556   1.9     mrg       if (sections[i].size != 0)
   4557   1.9     mrg 	{
   4558   1.9     mrg 	  if (min_offset == 0 || sections[i].offset < min_offset)
   4559   1.9     mrg 	    min_offset = sections[i].offset;
   4560   1.9     mrg 	  end = sections[i].offset + sections[i].size;
   4561   1.9     mrg 	  if (end > max_offset)
   4562   1.9     mrg 	    max_offset = end;
   4563  1.10     mrg 	  debug_size += sections[i].size;
   4564   1.9     mrg 	}
   4565   1.9     mrg       if (zsections[i].size != 0)
   4566   1.9     mrg 	{
   4567   1.9     mrg 	  if (min_offset == 0 || zsections[i].offset < min_offset)
   4568   1.9     mrg 	    min_offset = zsections[i].offset;
   4569   1.9     mrg 	  end = zsections[i].offset + zsections[i].size;
   4570   1.9     mrg 	  if (end > max_offset)
   4571   1.9     mrg 	    max_offset = end;
   4572  1.10     mrg 	  debug_size += zsections[i].size;
   4573   1.9     mrg 	}
   4574   1.1     mrg     }
   4575   1.1     mrg   if (min_offset == 0 || max_offset == 0)
   4576   1.1     mrg     {
   4577  1.10     mrg       if (descriptor >= 0)
   4578  1.10     mrg 	{
   4579  1.10     mrg 	  if (!backtrace_close (descriptor, error_callback, data))
   4580  1.10     mrg 	    goto fail;
   4581  1.10     mrg 	}
   4582  1.10     mrg       return 1;
   4583  1.10     mrg     }
   4584  1.10     mrg 
   4585  1.10     mrg   /* If the total debug section size is large, assume that there are
   4586  1.10     mrg      gaps between the sections, and read them individually.  */
   4587  1.10     mrg 
   4588  1.10     mrg   if (max_offset - min_offset < 0x20000000
   4589  1.10     mrg       || max_offset - min_offset < debug_size + 0x10000)
   4590  1.10     mrg     {
   4591  1.10     mrg       if (!elf_get_view (state, descriptor, memory, memory_size, min_offset,
   4592  1.10     mrg 			 max_offset - min_offset, error_callback, data,
   4593  1.10     mrg 			 &debug_view))
   4594   1.1     mrg 	goto fail;
   4595  1.10     mrg       debug_view_valid = 1;
   4596   1.1     mrg     }
   4597  1.10     mrg   else
   4598  1.10     mrg     {
   4599  1.10     mrg       memset (&split_debug_view[0], 0, sizeof split_debug_view);
   4600  1.10     mrg       for (i = 0; i < (int) DEBUG_MAX; ++i)
   4601  1.10     mrg 	{
   4602  1.10     mrg 	  struct debug_section_info *dsec;
   4603  1.10     mrg 
   4604  1.10     mrg 	  if (sections[i].size != 0)
   4605  1.10     mrg 	    dsec = &sections[i];
   4606  1.10     mrg 	  else if (zsections[i].size != 0)
   4607  1.10     mrg 	    dsec = &zsections[i];
   4608  1.10     mrg 	  else
   4609  1.10     mrg 	    continue;
   4610  1.10     mrg 
   4611  1.10     mrg 	  if (!elf_get_view (state, descriptor, memory, memory_size,
   4612  1.10     mrg 			     dsec->offset, dsec->size, error_callback, data,
   4613  1.10     mrg 			     &split_debug_view[i]))
   4614  1.10     mrg 	    goto fail;
   4615  1.10     mrg 	  split_debug_view_valid[i] = 1;
   4616   1.1     mrg 
   4617  1.10     mrg 	  if (sections[i].size != 0)
   4618  1.10     mrg 	    sections[i].data = ((const unsigned char *)
   4619  1.10     mrg 				split_debug_view[i].view.data);
   4620  1.10     mrg 	  else
   4621  1.10     mrg 	    zsections[i].data = ((const unsigned char *)
   4622  1.10     mrg 				 split_debug_view[i].view.data);
   4623  1.10     mrg 	}
   4624  1.10     mrg     }
   4625   1.1     mrg 
   4626   1.1     mrg   /* We've read all we need from the executable.  */
   4627  1.10     mrg   if (descriptor >= 0)
   4628  1.10     mrg     {
   4629  1.10     mrg       if (!backtrace_close (descriptor, error_callback, data))
   4630  1.10     mrg 	goto fail;
   4631  1.10     mrg       descriptor = -1;
   4632  1.10     mrg     }
   4633   1.1     mrg 
   4634   1.7     mrg   using_debug_view = 0;
   4635  1.10     mrg   if (debug_view_valid)
   4636   1.1     mrg     {
   4637  1.10     mrg       for (i = 0; i < (int) DEBUG_MAX; ++i)
   4638   1.7     mrg 	{
   4639  1.10     mrg 	  if (sections[i].size == 0)
   4640  1.10     mrg 	    sections[i].data = NULL;
   4641  1.10     mrg 	  else
   4642  1.10     mrg 	    {
   4643  1.10     mrg 	      sections[i].data = ((const unsigned char *) debug_view.view.data
   4644  1.10     mrg 				  + (sections[i].offset - min_offset));
   4645  1.10     mrg 	      ++using_debug_view;
   4646  1.10     mrg 	    }
   4647  1.10     mrg 
   4648  1.10     mrg 	  if (zsections[i].size == 0)
   4649  1.10     mrg 	    zsections[i].data = NULL;
   4650  1.10     mrg 	  else
   4651  1.10     mrg 	    zsections[i].data = ((const unsigned char *) debug_view.view.data
   4652  1.10     mrg 				 + (zsections[i].offset - min_offset));
   4653   1.7     mrg 	}
   4654   1.7     mrg     }
   4655   1.7     mrg 
   4656   1.7     mrg   /* Uncompress the old format (--compress-debug-sections=zlib-gnu).  */
   4657   1.7     mrg 
   4658   1.7     mrg   zdebug_table = NULL;
   4659   1.9     mrg   for (i = 0; i < (int) DEBUG_MAX; ++i)
   4660   1.7     mrg     {
   4661   1.9     mrg       if (sections[i].size == 0 && zsections[i].size > 0)
   4662   1.7     mrg 	{
   4663   1.7     mrg 	  unsigned char *uncompressed_data;
   4664   1.7     mrg 	  size_t uncompressed_size;
   4665   1.7     mrg 
   4666   1.7     mrg 	  if (zdebug_table == NULL)
   4667   1.7     mrg 	    {
   4668   1.7     mrg 	      zdebug_table = ((uint16_t *)
   4669   1.7     mrg 			      backtrace_alloc (state, ZDEBUG_TABLE_SIZE,
   4670   1.7     mrg 					       error_callback, data));
   4671   1.7     mrg 	      if (zdebug_table == NULL)
   4672   1.7     mrg 		goto fail;
   4673   1.7     mrg 	    }
   4674   1.7     mrg 
   4675   1.7     mrg 	  uncompressed_data = NULL;
   4676   1.7     mrg 	  uncompressed_size = 0;
   4677   1.9     mrg 	  if (!elf_uncompress_zdebug (state, zsections[i].data,
   4678   1.9     mrg 				      zsections[i].size, zdebug_table,
   4679   1.7     mrg 				      error_callback, data,
   4680   1.7     mrg 				      &uncompressed_data, &uncompressed_size))
   4681   1.7     mrg 	    goto fail;
   4682   1.7     mrg 	  sections[i].data = uncompressed_data;
   4683   1.7     mrg 	  sections[i].size = uncompressed_size;
   4684   1.7     mrg 	  sections[i].compressed = 0;
   4685  1.10     mrg 
   4686  1.10     mrg 	  if (split_debug_view_valid[i])
   4687  1.10     mrg 	    {
   4688  1.10     mrg 	      elf_release_view (state, &split_debug_view[i],
   4689  1.10     mrg 				error_callback, data);
   4690  1.10     mrg 	      split_debug_view_valid[i] = 0;
   4691  1.10     mrg 	    }
   4692   1.7     mrg 	}
   4693   1.7     mrg     }
   4694   1.7     mrg 
   4695   1.7     mrg   /* Uncompress the official ELF format
   4696   1.7     mrg      (--compress-debug-sections=zlib-gabi).  */
   4697   1.9     mrg   for (i = 0; i < (int) DEBUG_MAX; ++i)
   4698   1.7     mrg     {
   4699   1.7     mrg       unsigned char *uncompressed_data;
   4700   1.7     mrg       size_t uncompressed_size;
   4701   1.7     mrg 
   4702   1.7     mrg       if (sections[i].size == 0 || !sections[i].compressed)
   4703   1.7     mrg 	continue;
   4704   1.7     mrg 
   4705   1.7     mrg       if (zdebug_table == NULL)
   4706   1.7     mrg 	{
   4707   1.7     mrg 	  zdebug_table = ((uint16_t *)
   4708   1.7     mrg 			  backtrace_alloc (state, ZDEBUG_TABLE_SIZE,
   4709   1.7     mrg 					   error_callback, data));
   4710   1.7     mrg 	  if (zdebug_table == NULL)
   4711   1.7     mrg 	    goto fail;
   4712   1.7     mrg 	}
   4713   1.7     mrg 
   4714   1.7     mrg       uncompressed_data = NULL;
   4715   1.7     mrg       uncompressed_size = 0;
   4716   1.7     mrg       if (!elf_uncompress_chdr (state, sections[i].data, sections[i].size,
   4717   1.7     mrg 				zdebug_table, error_callback, data,
   4718   1.7     mrg 				&uncompressed_data, &uncompressed_size))
   4719   1.7     mrg 	goto fail;
   4720   1.7     mrg       sections[i].data = uncompressed_data;
   4721   1.7     mrg       sections[i].size = uncompressed_size;
   4722   1.7     mrg       sections[i].compressed = 0;
   4723   1.7     mrg 
   4724  1.10     mrg       if (debug_view_valid)
   4725  1.10     mrg 	--using_debug_view;
   4726  1.10     mrg       else if (split_debug_view_valid[i])
   4727  1.10     mrg 	{
   4728  1.10     mrg 	  elf_release_view (state, &split_debug_view[i], error_callback, data);
   4729  1.10     mrg 	  split_debug_view_valid[i] = 0;
   4730  1.10     mrg 	}
   4731   1.7     mrg     }
   4732   1.7     mrg 
   4733   1.7     mrg   if (zdebug_table != NULL)
   4734   1.7     mrg     backtrace_free (state, zdebug_table, ZDEBUG_TABLE_SIZE,
   4735   1.7     mrg 		    error_callback, data);
   4736   1.7     mrg 
   4737   1.7     mrg   if (debug_view_valid && using_debug_view == 0)
   4738   1.7     mrg     {
   4739  1.10     mrg       elf_release_view (state, &debug_view, error_callback, data);
   4740   1.7     mrg       debug_view_valid = 0;
   4741   1.1     mrg     }
   4742   1.1     mrg 
   4743   1.9     mrg   for (i = 0; i < (int) DEBUG_MAX; ++i)
   4744   1.9     mrg     {
   4745   1.9     mrg       dwarf_sections.data[i] = sections[i].data;
   4746   1.9     mrg       dwarf_sections.size[i] = sections[i].size;
   4747   1.9     mrg     }
   4748   1.9     mrg 
   4749   1.9     mrg   if (!backtrace_dwarf_add (state, base_address, &dwarf_sections,
   4750   1.1     mrg 			    ehdr.e_ident[EI_DATA] == ELFDATA2MSB,
   4751   1.8     mrg 			    fileline_altlink,
   4752   1.8     mrg 			    error_callback, data, fileline_fn,
   4753   1.8     mrg 			    fileline_entry))
   4754   1.1     mrg     goto fail;
   4755   1.1     mrg 
   4756   1.1     mrg   *found_dwarf = 1;
   4757   1.1     mrg 
   4758   1.1     mrg   return 1;
   4759   1.1     mrg 
   4760   1.1     mrg  fail:
   4761   1.1     mrg   if (shdrs_view_valid)
   4762  1.10     mrg     elf_release_view (state, &shdrs_view, error_callback, data);
   4763   1.1     mrg   if (names_view_valid)
   4764  1.10     mrg     elf_release_view (state, &names_view, error_callback, data);
   4765   1.1     mrg   if (symtab_view_valid)
   4766  1.10     mrg     elf_release_view (state, &symtab_view, error_callback, data);
   4767   1.1     mrg   if (strtab_view_valid)
   4768  1.10     mrg     elf_release_view (state, &strtab_view, error_callback, data);
   4769   1.7     mrg   if (debuglink_view_valid)
   4770  1.10     mrg     elf_release_view (state, &debuglink_view, error_callback, data);
   4771   1.8     mrg   if (debugaltlink_view_valid)
   4772  1.10     mrg     elf_release_view (state, &debugaltlink_view, error_callback, data);
   4773  1.10     mrg   if (gnu_debugdata_view_valid)
   4774  1.10     mrg     elf_release_view (state, &gnu_debugdata_view, error_callback, data);
   4775   1.7     mrg   if (buildid_view_valid)
   4776  1.10     mrg     elf_release_view (state, &buildid_view, error_callback, data);
   4777   1.1     mrg   if (debug_view_valid)
   4778  1.10     mrg     elf_release_view (state, &debug_view, error_callback, data);
   4779  1.10     mrg   for (i = 0; i < (int) DEBUG_MAX; ++i)
   4780  1.10     mrg     {
   4781  1.10     mrg       if (split_debug_view_valid[i])
   4782  1.10     mrg 	elf_release_view (state, &split_debug_view[i], error_callback, data);
   4783  1.10     mrg     }
   4784   1.7     mrg   if (opd)
   4785  1.10     mrg     elf_release_view (state, &opd->view, error_callback, data);
   4786  1.10     mrg   if (descriptor >= 0)
   4787   1.1     mrg     backtrace_close (descriptor, error_callback, data);
   4788   1.1     mrg   return 0;
   4789   1.1     mrg }
   4790   1.1     mrg 
   4791   1.1     mrg /* Data passed to phdr_callback.  */
   4792   1.1     mrg 
   4793   1.1     mrg struct phdr_data
   4794   1.1     mrg {
   4795   1.1     mrg   struct backtrace_state *state;
   4796   1.1     mrg   backtrace_error_callback error_callback;
   4797   1.1     mrg   void *data;
   4798   1.1     mrg   fileline *fileline_fn;
   4799   1.1     mrg   int *found_sym;
   4800   1.1     mrg   int *found_dwarf;
   4801   1.7     mrg   const char *exe_filename;
   4802   1.3     mrg   int exe_descriptor;
   4803   1.1     mrg };
   4804   1.1     mrg 
   4805   1.1     mrg /* Callback passed to dl_iterate_phdr.  Load debug info from shared
   4806   1.1     mrg    libraries.  */
   4807   1.1     mrg 
   4808   1.1     mrg static int
   4809   1.3     mrg #ifdef __i386__
   4810   1.3     mrg __attribute__ ((__force_align_arg_pointer__))
   4811   1.3     mrg #endif
   4812   1.1     mrg phdr_callback (struct dl_phdr_info *info, size_t size ATTRIBUTE_UNUSED,
   4813   1.1     mrg 	       void *pdata)
   4814   1.1     mrg {
   4815   1.1     mrg   struct phdr_data *pd = (struct phdr_data *) pdata;
   4816   1.7     mrg   const char *filename;
   4817   1.1     mrg   int descriptor;
   4818   1.1     mrg   int does_not_exist;
   4819   1.1     mrg   fileline elf_fileline_fn;
   4820   1.1     mrg   int found_dwarf;
   4821   1.1     mrg 
   4822   1.3     mrg   /* There is not much we can do if we don't have the module name,
   4823   1.3     mrg      unless executable is ET_DYN, where we expect the very first
   4824   1.3     mrg      phdr_callback to be for the PIE.  */
   4825   1.3     mrg   if (info->dlpi_name == NULL || info->dlpi_name[0] == '\0')
   4826   1.3     mrg     {
   4827   1.3     mrg       if (pd->exe_descriptor == -1)
   4828   1.3     mrg 	return 0;
   4829   1.7     mrg       filename = pd->exe_filename;
   4830   1.3     mrg       descriptor = pd->exe_descriptor;
   4831   1.3     mrg       pd->exe_descriptor = -1;
   4832   1.3     mrg     }
   4833   1.3     mrg   else
   4834   1.3     mrg     {
   4835   1.3     mrg       if (pd->exe_descriptor != -1)
   4836   1.3     mrg 	{
   4837   1.3     mrg 	  backtrace_close (pd->exe_descriptor, pd->error_callback, pd->data);
   4838   1.3     mrg 	  pd->exe_descriptor = -1;
   4839   1.3     mrg 	}
   4840   1.1     mrg 
   4841   1.7     mrg       filename = info->dlpi_name;
   4842   1.3     mrg       descriptor = backtrace_open (info->dlpi_name, pd->error_callback,
   4843   1.3     mrg 				   pd->data, &does_not_exist);
   4844   1.3     mrg       if (descriptor < 0)
   4845   1.3     mrg 	return 0;
   4846   1.3     mrg     }
   4847   1.1     mrg 
   4848  1.10     mrg   if (elf_add (pd->state, filename, descriptor, NULL, 0, info->dlpi_addr,
   4849   1.7     mrg 	       pd->error_callback, pd->data, &elf_fileline_fn, pd->found_sym,
   4850   1.8     mrg 	       &found_dwarf, NULL, 0, 0, NULL, 0))
   4851   1.1     mrg     {
   4852   1.1     mrg       if (found_dwarf)
   4853   1.1     mrg 	{
   4854   1.1     mrg 	  *pd->found_dwarf = 1;
   4855   1.1     mrg 	  *pd->fileline_fn = elf_fileline_fn;
   4856   1.1     mrg 	}
   4857   1.1     mrg     }
   4858   1.1     mrg 
   4859   1.1     mrg   return 0;
   4860   1.1     mrg }
   4861   1.1     mrg 
   4862   1.1     mrg /* Initialize the backtrace data we need from an ELF executable.  At
   4863   1.1     mrg    the ELF level, all we need to do is find the debug info
   4864   1.1     mrg    sections.  */
   4865   1.1     mrg 
   4866   1.1     mrg int
   4867   1.7     mrg backtrace_initialize (struct backtrace_state *state, const char *filename,
   4868   1.7     mrg 		      int descriptor, backtrace_error_callback error_callback,
   4869   1.1     mrg 		      void *data, fileline *fileline_fn)
   4870   1.1     mrg {
   4871   1.3     mrg   int ret;
   4872   1.1     mrg   int found_sym;
   4873   1.1     mrg   int found_dwarf;
   4874   1.4     mrg   fileline elf_fileline_fn = elf_nodebug;
   4875   1.1     mrg   struct phdr_data pd;
   4876   1.1     mrg 
   4877  1.10     mrg   ret = elf_add (state, filename, descriptor, NULL, 0, 0, error_callback, data,
   4878   1.8     mrg 		 &elf_fileline_fn, &found_sym, &found_dwarf, NULL, 1, 0, NULL,
   4879   1.8     mrg 		 0);
   4880   1.3     mrg   if (!ret)
   4881   1.1     mrg     return 0;
   4882   1.1     mrg 
   4883   1.1     mrg   pd.state = state;
   4884   1.1     mrg   pd.error_callback = error_callback;
   4885   1.1     mrg   pd.data = data;
   4886   1.3     mrg   pd.fileline_fn = &elf_fileline_fn;
   4887   1.1     mrg   pd.found_sym = &found_sym;
   4888   1.1     mrg   pd.found_dwarf = &found_dwarf;
   4889   1.7     mrg   pd.exe_filename = filename;
   4890   1.3     mrg   pd.exe_descriptor = ret < 0 ? descriptor : -1;
   4891   1.1     mrg 
   4892   1.1     mrg   dl_iterate_phdr (phdr_callback, (void *) &pd);
   4893   1.1     mrg 
   4894   1.1     mrg   if (!state->threaded)
   4895   1.1     mrg     {
   4896   1.3     mrg       if (found_sym)
   4897   1.3     mrg 	state->syminfo_fn = elf_syminfo;
   4898   1.3     mrg       else if (state->syminfo_fn == NULL)
   4899   1.3     mrg 	state->syminfo_fn = elf_nosyms;
   4900   1.1     mrg     }
   4901   1.1     mrg   else
   4902   1.1     mrg     {
   4903   1.1     mrg       if (found_sym)
   4904   1.3     mrg 	backtrace_atomic_store_pointer (&state->syminfo_fn, elf_syminfo);
   4905   1.3     mrg       else
   4906   1.4     mrg 	(void) __sync_bool_compare_and_swap (&state->syminfo_fn, NULL,
   4907   1.4     mrg 					     elf_nosyms);
   4908   1.1     mrg     }
   4909   1.1     mrg 
   4910   1.1     mrg   if (!state->threaded)
   4911   1.7     mrg     *fileline_fn = state->fileline_fn;
   4912   1.1     mrg   else
   4913   1.7     mrg     *fileline_fn = backtrace_atomic_load_pointer (&state->fileline_fn);
   4914   1.1     mrg 
   4915   1.7     mrg   if (*fileline_fn == NULL || *fileline_fn == elf_nodebug)
   4916   1.7     mrg     *fileline_fn = elf_fileline_fn;
   4917   1.1     mrg 
   4918   1.1     mrg   return 1;
   4919   1.1     mrg }
   4920