|
From: Petar J. <pe...@so...> - 2017-10-31 17:01:31
|
https://sourceware.org/git/gitweb.cgi?p=valgrind.git;h=0eea388934a228231843d8c13cfd99bb170074f1 commit 0eea388934a228231843d8c13cfd99bb170074f1 Author: Petar Jovanovic <mip...@gm...> Date: Tue Oct 31 17:30:14 2017 +0100 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: --- coregrind/m_debuginfo/readelf.c | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/coregrind/m_debuginfo/readelf.c b/coregrind/m_debuginfo/readelf.c index 3c8e62b..e612250 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, |