/* libunwind - a platform-independent unwind library
Copyright (C) 2003-2005 Hewlett-Packard Co
Copyright (C) 2007 David Mosberger-Tang
- Contributed by David Mosberger-Tang <dmosberger@gmail.com>
+ Contributed by David Mosberger-Tang <dmosberger@gmail.com>
This file is part of libunwind.
if (soff + ehdr->e_shnum * ehdr->e_shentsize > ei->size)
{
Debug (1, "section table outside of image? (%lu > %lu)\n",
- (unsigned long) (soff + ehdr->e_shnum * ehdr->e_shentsize),
- (unsigned long) ei->size);
+ (unsigned long) (soff + ehdr->e_shnum * ehdr->e_shentsize),
+ (unsigned long) ei->size);
return NULL;
}
if (str_soff + ehdr->e_shentsize > ei->size)
{
Debug (1, "string shdr table outside of image? (%lu > %lu)\n",
- (unsigned long) (str_soff + ehdr->e_shentsize),
- (unsigned long) ei->size);
+ (unsigned long) (str_soff + ehdr->e_shentsize),
+ (unsigned long) ei->size);
return NULL;
}
str_shdr = (Elf_W (Shdr) *) ((char *) ei->image + str_soff);
if (str_shdr->sh_offset + str_shdr->sh_size > ei->size)
{
Debug (1, "string table outside of image? (%lu > %lu)\n",
- (unsigned long) (str_shdr->sh_offset + str_shdr->sh_size),
- (unsigned long) ei->size);
+ (unsigned long) (str_shdr->sh_offset + str_shdr->sh_size),
+ (unsigned long) ei->size);
return NULL;
}
static int
elf_w (lookup_symbol) (unw_addr_space_t as,
- unw_word_t ip, struct elf_image *ei,
- Elf_W (Addr) load_offset,
- char *buf, size_t buf_len, Elf_W (Addr) *min_dist)
+ unw_word_t ip, struct elf_image *ei,
+ Elf_W (Addr) load_offset,
+ char *buf, size_t buf_len, Elf_W (Addr) *min_dist)
{
size_t syment_size;
Elf_W (Ehdr) *ehdr = ei->image;
for (i = 0; i < ehdr->e_shnum; ++i)
{
switch (shdr->sh_type)
- {
- case SHT_SYMTAB:
- case SHT_DYNSYM:
- symtab = (Elf_W (Sym) *) ((char *) ei->image + shdr->sh_offset);
- symtab_end = (Elf_W (Sym) *) ((char *) symtab + shdr->sh_size);
- syment_size = shdr->sh_entsize;
-
- strtab = elf_w (string_table) (ei, shdr->sh_link);
- if (!strtab)
- break;
-
- Debug (16, "symtab=0x%lx[%d]\n",
- (long) shdr->sh_offset, shdr->sh_type);
-
- for (sym = symtab;
- sym < symtab_end;
- sym = (Elf_W (Sym) *) ((char *) sym + syment_size))
- {
- if (ELF_W (ST_TYPE) (sym->st_info) == STT_FUNC
- && sym->st_shndx != SHN_UNDEF)
- {
- if (tdep_get_func_addr (as, sym->st_value, &val) < 0)
- continue;
- if (sym->st_shndx != SHN_ABS)
- val += load_offset;
- Debug (16, "0x%016lx info=0x%02x %s\n",
- (long) val, sym->st_info, strtab + sym->st_name);
-
- if ((Elf_W (Addr)) (ip - val) < *min_dist)
- {
- *min_dist = (Elf_W (Addr)) (ip - val);
- strncpy (buf, strtab + sym->st_name, buf_len);
- buf[buf_len - 1] = '\0';
- ret = (strlen (strtab + sym->st_name) >= buf_len
- ? -UNW_ENOMEM : 0);
- }
- }
- }
- break;
-
- default:
- break;
- }
+ {
+ case SHT_SYMTAB:
+ case SHT_DYNSYM:
+ symtab = (Elf_W (Sym) *) ((char *) ei->image + shdr->sh_offset);
+ symtab_end = (Elf_W (Sym) *) ((char *) symtab + shdr->sh_size);
+ syment_size = shdr->sh_entsize;
+
+ strtab = elf_w (string_table) (ei, shdr->sh_link);
+ if (!strtab)
+ break;
+
+ Debug (16, "symtab=0x%lx[%d]\n",
+ (long) shdr->sh_offset, shdr->sh_type);
+
+ for (sym = symtab;
+ sym < symtab_end;
+ sym = (Elf_W (Sym) *) ((char *) sym + syment_size))
+ {
+ if (ELF_W (ST_TYPE) (sym->st_info) == STT_FUNC
+ && sym->st_shndx != SHN_UNDEF)
+ {
+ val = sym->st_value;
+ if (sym->st_shndx != SHN_ABS)
+ val += load_offset;
+ if (tdep_get_func_addr (as, val, &val) < 0)
+ continue;
+ Debug (16, "0x%016lx info=0x%02x %s\n",
+ (long) val, sym->st_info, strtab + sym->st_name);
+
+ if ((Elf_W (Addr)) (ip - val) < *min_dist)
+ {
+ *min_dist = (Elf_W (Addr)) (ip - val);
+ strncpy (buf, strtab + sym->st_name, buf_len);
+ buf[buf_len - 1] = '\0';
+ ret = (strlen (strtab + sym->st_name) >= buf_len
+ ? -UNW_ENOMEM : 0);
+ }
+ }
+ }
+ break;
+
+ default:
+ break;
+ }
shdr = (Elf_W (Shdr) *) (((char *) shdr) + ehdr->e_shentsize);
}
return ret;
static Elf_W (Addr)
elf_w (get_load_offset) (struct elf_image *ei, unsigned long segbase,
- unsigned long mapoff)
+ unsigned long mapoff)
{
Elf_W (Addr) offset = 0;
Elf_W (Ehdr) *ehdr;
for (i = 0; i < ehdr->e_phnum; ++i)
if (phdr[i].p_type == PT_LOAD && phdr[i].p_offset == mapoff)
{
- offset = segbase - phdr[i].p_vaddr;
- break;
+ offset = segbase - phdr[i].p_vaddr;
+ break;
}
return offset;
uint8_t *indexdata = footer - options.backward_size;
if (lzma_index_buffer_decode (&index, &memlimit, NULL, indexdata,
- &pos, options.backward_size) != LZMA_OK)
+ &pos, options.backward_size) != LZMA_OK)
return 0;
if (lzma_index_size (index) == options.backward_size)
for (i = 0; i < ehdr->e_shnum; ++i)
{
if (strcmp (strtab + shdr->sh_name, ".gnu_debugdata") == 0)
- {
- if (shdr->sh_offset + shdr->sh_size > ei->size)
- {
- Debug (1, ".gnu_debugdata outside image? (0x%lu > 0x%lu)\n",
- (unsigned long) shdr->sh_offset + shdr->sh_size,
- (unsigned long) ei->size);
- return 0;
- }
-
- Debug (16, "found .gnu_debugdata at 0x%lx\n",
- (unsigned long) shdr->sh_offset);
- compressed = ((uint8_t *) ei->image) + shdr->sh_offset;
- compressed_len = shdr->sh_size;
- break;
- }
+ {
+ if (shdr->sh_offset + shdr->sh_size > ei->size)
+ {
+ Debug (1, ".gnu_debugdata outside image? (0x%lu > 0x%lu)\n",
+ (unsigned long) shdr->sh_offset + shdr->sh_size,
+ (unsigned long) ei->size);
+ return 0;
+ }
+
+ Debug (16, "found .gnu_debugdata at 0x%lx\n",
+ (unsigned long) shdr->sh_offset);
+ compressed = ((uint8_t *) ei->image) + shdr->sh_offset;
+ compressed_len = shdr->sh_size;
+ break;
+ }
shdr = (Elf_W (Shdr) *) (((char *) shdr) + ehdr->e_shentsize);
}
mdi->size = uncompressed_len;
mdi->image = mmap (NULL, uncompressed_len, PROT_READ|PROT_WRITE,
- MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
+ MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
if (mdi->image == MAP_FAILED)
return 0;
size_t in_pos = 0, out_pos = 0;
lzma_ret lret;
lret = lzma_stream_buffer_decode (&memlimit, 0, NULL,
- compressed, &in_pos, compressed_len,
- mdi->image, &out_pos, mdi->size);
+ compressed, &in_pos, compressed_len,
+ mdi->image, &out_pos, mdi->size);
if (lret != LZMA_OK)
{
Debug (1, "LZMA decompression failed: %d\n", lret);
HIDDEN int
elf_w (get_proc_name_in_image) (unw_addr_space_t as, struct elf_image *ei,
- unsigned long segbase,
- unsigned long mapoff,
- unw_word_t ip,
- char *buf, size_t buf_len, unw_word_t *offp)
+ unsigned long segbase,
+ unsigned long mapoff,
+ unw_word_t ip,
+ char *buf, size_t buf_len, unw_word_t *offp)
{
Elf_W (Addr) load_offset;
Elf_W (Addr) min_dist = ~(Elf_W (Addr))0;
struct elf_image mdi;
if (elf_w (extract_minidebuginfo) (ei, &mdi))
{
- int ret_mdi;
-
- load_offset = elf_w (get_load_offset) (&mdi, segbase, mapoff);
- ret_mdi = elf_w (lookup_symbol) (as, ip, &mdi, load_offset, buf,
- buf_len, &min_dist);
+ int ret_mdi = elf_w (lookup_symbol) (as, ip, &mdi, load_offset, buf,
+ buf_len, &min_dist);
/* Closer symbol was found (possibly truncated). */
if (ret_mdi == 0 || ret_mdi == -UNW_ENOMEM)
- {
- ret = ret_mdi;
- }
+ {
+ ret = ret_mdi;
+ }
munmap (mdi.image, mdi.size);
}
if (min_dist >= ei->size)
- return -UNW_ENOINFO; /* not found */
+ return -UNW_ENOINFO; /* not found */
if (offp)
*offp = min_dist;
return ret;
HIDDEN int
elf_w (get_proc_name) (unw_addr_space_t as, pid_t pid, unw_word_t ip,
- char *buf, size_t buf_len, unw_word_t *offp)
+ char *buf, size_t buf_len, unw_word_t *offp)
{
unsigned long segbase, mapoff;
struct elf_image ei;