From: Petar Jovanovic Date: Tue, 31 Oct 2017 16:30:14 +0000 (+0100) Subject: android: compute possible size of a symbol of unknown size X-Git-Tag: VALGRIND_3_14_0~214 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0eea388934a228231843d8c13cfd99bb170074f1;p=thirdparty%2Fvalgrind.git android: compute possible size of a symbol of unknown size Under specific circumstances, setting 2048 as a size of symbol of unknown size causes that symbol crosses unmapped region. This further causes an assertion in Valgrind. Compute possible size by computing maximal size the symbol can have within its section. Patch by Tamara Vlahovic. --- diff --git a/coregrind/m_debuginfo/readelf.c b/coregrind/m_debuginfo/readelf.c index 3c8e62bd29..e612250502 100644 --- a/coregrind/m_debuginfo/readelf.c +++ b/coregrind/m_debuginfo/readelf.c @@ -282,6 +282,16 @@ Bool get_elf_symbol_info ( Bool in_text, in_data, in_sdata, in_rodata, in_bss, in_sbss; Addr text_svma, data_svma, sdata_svma, rodata_svma, bss_svma, sbss_svma; PtrdiffT text_bias, data_bias, sdata_bias, rodata_bias, bss_bias, sbss_bias; +# if defined(VGPV_arm_linux_android) \ + || defined(VGPV_x86_linux_android) \ + || defined(VGPV_mips32_linux_android) \ + || defined(VGPV_arm64_linux_android) + Addr available_size = 0; +#define COMPUTE_AVAILABLE_SIZE(segsvma, segsize) \ + available_size = segsvma + segsize - sym_svma +#else +#define COMPUTE_AVAILABLE_SIZE(segsvma, segsize) +#endif /* Set defaults */ *sym_name_out_ioff = sym_name_ioff; @@ -360,6 +370,7 @@ Bool get_elf_symbol_info ( && sym_svma < text_svma + di->text_size) { *is_text_out = True; (*sym_avmas_out).main += text_bias; + COMPUTE_AVAILABLE_SIZE(text_svma, di->text_size); } else if (di->data_present && di->data_size > 0 @@ -367,6 +378,7 @@ Bool get_elf_symbol_info ( && sym_svma < data_svma + di->data_size) { *is_text_out = False; (*sym_avmas_out).main += data_bias; + COMPUTE_AVAILABLE_SIZE(data_svma, di->data_size); } else if (di->sdata_present && di->sdata_size > 0 @@ -374,6 +386,7 @@ Bool get_elf_symbol_info ( && sym_svma < sdata_svma + di->sdata_size) { *is_text_out = False; (*sym_avmas_out).main += sdata_bias; + COMPUTE_AVAILABLE_SIZE(sdata_svma, di->sdata_size); } else if (di->rodata_present && di->rodata_size > 0 @@ -381,6 +394,7 @@ Bool get_elf_symbol_info ( && sym_svma < rodata_svma + di->rodata_size) { *is_text_out = False; (*sym_avmas_out).main += rodata_bias; + COMPUTE_AVAILABLE_SIZE(rodata_svma, di->rodata_size); } else if (di->bss_present && di->bss_size > 0 @@ -388,6 +402,7 @@ Bool get_elf_symbol_info ( && sym_svma < bss_svma + di->bss_size) { *is_text_out = False; (*sym_avmas_out).main += bss_bias; + COMPUTE_AVAILABLE_SIZE(bss_svma, di->bss_size); } else if (di->sbss_present && di->sbss_size > 0 @@ -395,6 +410,7 @@ Bool get_elf_symbol_info ( && sym_svma < sbss_svma + di->sbss_size) { *is_text_out = False; (*sym_avmas_out).main += sbss_bias; + COMPUTE_AVAILABLE_SIZE(sbss_svma, di->sbss_size); } else { /* Assume it's in .text. Is this a good idea? */ *is_text_out = True; @@ -463,7 +479,7 @@ Bool get_elf_symbol_info ( || defined(VGPV_x86_linux_android) \ || defined(VGPV_mips32_linux_android) \ || defined(VGPV_arm64_linux_android) - *sym_size_out = 2048; + *sym_size_out = available_size ? available_size : 2048; # else if (TRACE_SYMTAB_ENABLED) { HChar* sym_name = ML_(img_strdup)(escn_strtab->img,