summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog7
-rw-r--r--addr2line.c26
2 files changed, 25 insertions, 8 deletions
diff --git a/ChangeLog b/ChangeLog
index f82506da3d..2efcd999c3 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+Thu Mar 27 11:58:55 2014 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * addr2line.c (fill_lines): check shdr[i].sh_type because even if
+ .symtab section exists, the section's type can be SHT_NOBITS and
+ actual data doesn't exist in the file.
+ revert r45441.
+
Wed Mar 26 14:57:35 2014 NAKAMURA Usaku <usa@ruby-lang.org>
* parse.y: inline must be static (for mswin).
diff --git a/addr2line.c b/addr2line.c
index 5b4c1eaf2a..97dee576f4 100644
--- a/addr2line.c
+++ b/addr2line.c
@@ -530,18 +530,28 @@ fill_lines(int num_traces, void **traces, int check_debuglink,
#ifdef __powerpc64__
kprintf("%s:: %s: flag(%lx)\n",binary_filename,section_name,shdr[i].sh_flags);
#endif
- if (!strcmp(section_name, ".debug_line")) {
- debug_line_shdr = shdr + i;
- } else if (!strcmp(section_name, ".gnu_debuglink")) {
- gnu_debuglink_shdr = shdr + i;
- } else if (!strcmp(section_name, ".symtab")) {
+ switch (shdr[i].sh_type) {
+ case SHT_STRTAB:
+ if (!strcmp(section_name, ".strtab")) {
+ strtab_shdr = shdr + i;
+ }
+ break;
+ case SHT_SYMTAB:
+ /* if (!strcmp(section_name, ".symtab")) */
symtab_shdr = shdr + i;
- } else if (!strcmp(section_name, ".strtab")) {
- strtab_shdr = shdr + i;
+ break;
+ case SHT_PROGBITS:
+ if (!strcmp(section_name, ".debug_line")) {
+ debug_line_shdr = shdr + i;
+ }
+ else if (!strcmp(section_name, ".gnu_debuglink")) {
+ gnu_debuglink_shdr = shdr + i;
+ }
+ break;
}
}
- if (check_debuglink && symtab_shdr && strtab_shdr) {
+ if (symtab_shdr && strtab_shdr) {
char *strtab = file + strtab_shdr->sh_offset;
ElfW(Sym) *symtab = (ElfW(Sym) *)(file + symtab_shdr->sh_offset);
int symtab_count = (int)(symtab_shdr->sh_size / sizeof(ElfW(Sym)));