Commit f1857815 by Jakub Jelinek Committed by Jakub Jelinek

elf.c (SHN_UNDEF): Define.

	* elf.c (SHN_UNDEF): Define.
	(elf_initialize_syminfo): Add base_address argument.  Ignore symbols
	with st_shndx == SHN_UNDEF.  Add base_address to address fields.
	(elf_add): Adjust caller.

From-SVN: r204975
parent 582f5a2d
2013-11-18 Jakub Jelinek <jakub@redhat.com> 2013-11-18 Jakub Jelinek <jakub@redhat.com>
* elf.c (SHN_UNDEF): Define.
(elf_initialize_syminfo): Add base_address argument. Ignore symbols
with st_shndx == SHN_UNDEF. Add base_address to address fields.
(elf_add): Adjust caller.
* elf.c (phdr_callback): Process info->dlpi_addr == 0 normally. * elf.c (phdr_callback): Process info->dlpi_addr == 0 normally.
2013-11-16 Ian Lance Taylor <iant@google.com> 2013-11-16 Ian Lance Taylor <iant@google.com>
......
...@@ -98,6 +98,7 @@ dl_iterate_phdr (int (*callback) (struct dl_phdr_info *, ...@@ -98,6 +98,7 @@ dl_iterate_phdr (int (*callback) (struct dl_phdr_info *,
#undef EV_CURRENT #undef EV_CURRENT
#undef SHN_LORESERVE #undef SHN_LORESERVE
#undef SHN_XINDEX #undef SHN_XINDEX
#undef SHN_UNDEF
#undef SHT_SYMTAB #undef SHT_SYMTAB
#undef SHT_STRTAB #undef SHT_STRTAB
#undef SHT_DYNSYM #undef SHT_DYNSYM
...@@ -183,6 +184,7 @@ typedef struct { ...@@ -183,6 +184,7 @@ typedef struct {
b_elf_wxword sh_entsize; /* Entry size if section holds table */ b_elf_wxword sh_entsize; /* Entry size if section holds table */
} b_elf_shdr; /* Elf_Shdr. */ } b_elf_shdr; /* Elf_Shdr. */
#define SHN_UNDEF 0x0000 /* Undefined section */
#define SHN_LORESERVE 0xFF00 /* Begin range of reserved indices */ #define SHN_LORESERVE 0xFF00 /* Begin range of reserved indices */
#define SHN_XINDEX 0xFFFF /* Section index is held elsewhere */ #define SHN_XINDEX 0xFFFF /* Section index is held elsewhere */
...@@ -342,6 +344,7 @@ elf_symbol_search (const void *vkey, const void *ventry) ...@@ -342,6 +344,7 @@ elf_symbol_search (const void *vkey, const void *ventry)
static int static int
elf_initialize_syminfo (struct backtrace_state *state, elf_initialize_syminfo (struct backtrace_state *state,
uintptr_t base_address,
const unsigned char *symtab_data, size_t symtab_size, const unsigned char *symtab_data, size_t symtab_size,
const unsigned char *strtab, size_t strtab_size, const unsigned char *strtab, size_t strtab_size,
backtrace_error_callback error_callback, backtrace_error_callback error_callback,
...@@ -365,7 +368,8 @@ elf_initialize_syminfo (struct backtrace_state *state, ...@@ -365,7 +368,8 @@ elf_initialize_syminfo (struct backtrace_state *state,
int info; int info;
info = sym->st_info & 0xf; info = sym->st_info & 0xf;
if (info == STT_FUNC || info == STT_OBJECT) if ((info == STT_FUNC || info == STT_OBJECT)
&& sym->st_shndx != SHN_UNDEF)
++elf_symbol_count; ++elf_symbol_count;
} }
...@@ -385,6 +389,8 @@ elf_initialize_syminfo (struct backtrace_state *state, ...@@ -385,6 +389,8 @@ elf_initialize_syminfo (struct backtrace_state *state,
info = sym->st_info & 0xf; info = sym->st_info & 0xf;
if (info != STT_FUNC && info != STT_OBJECT) if (info != STT_FUNC && info != STT_OBJECT)
continue; continue;
if (sym->st_shndx == SHN_UNDEF)
continue;
if (sym->st_name >= strtab_size) if (sym->st_name >= strtab_size)
{ {
error_callback (data, "symbol string index out of range", 0); error_callback (data, "symbol string index out of range", 0);
...@@ -393,7 +399,7 @@ elf_initialize_syminfo (struct backtrace_state *state, ...@@ -393,7 +399,7 @@ elf_initialize_syminfo (struct backtrace_state *state,
return 0; return 0;
} }
elf_symbols[j].name = (const char *) strtab + sym->st_name; elf_symbols[j].name = (const char *) strtab + sym->st_name;
elf_symbols[j].address = sym->st_value; elf_symbols[j].address = sym->st_value + base_address;
elf_symbols[j].size = sym->st_size; elf_symbols[j].size = sym->st_size;
++j; ++j;
} }
...@@ -733,7 +739,7 @@ elf_add (struct backtrace_state *state, int descriptor, uintptr_t base_address, ...@@ -733,7 +739,7 @@ elf_add (struct backtrace_state *state, int descriptor, uintptr_t base_address,
if (sdata == NULL) if (sdata == NULL)
goto fail; goto fail;
if (!elf_initialize_syminfo (state, if (!elf_initialize_syminfo (state, base_address,
symtab_view.data, symtab_shdr->sh_size, symtab_view.data, symtab_shdr->sh_size,
strtab_view.data, strtab_shdr->sh_size, strtab_view.data, strtab_shdr->sh_size,
error_callback, data, sdata)) error_callback, data, sdata))
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment