From acc3cf5f302d8db60db7d8a5e9790d29c5c6c553 Mon Sep 17 00:00:00 2001 From: naruse Date: Thu, 27 Mar 2014 03:01:59 +0000 Subject: * 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. [Bug #9654] revert r45441. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@45445 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- addr2line.c | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) (limited to 'addr2line.c') 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))); -- cgit v1.2.3