2012-09-20 14:48:45 +00:00
|
|
|
--- valgrind/coregrind/m_debuginfo/readelf.c (revision 12871)
|
|
|
|
+++ valgrind/coregrind/m_debuginfo/readelf.c (working copy)
|
2012-08-19 13:37:33 +00:00
|
|
|
@@ -888,7 +888,7 @@
|
|
|
|
* http://fedoraproject.org/wiki/RolandMcGrath/BuildID
|
|
|
|
*/
|
|
|
|
static
|
|
|
|
-Char *find_buildid(Addr image, UWord n_image, Bool rel_ok)
|
|
|
|
+Char *find_buildid(Addr image, UWord n_image, Bool rel_ok, Bool search_shdrs)
|
|
|
|
{
|
|
|
|
Char* buildid = NULL;
|
|
|
|
__attribute__((unused)) /* on Android, at least */
|
|
|
|
@@ -930,7 +930,11 @@
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
- if (buildid || !rel_ok)
|
|
|
|
+ /* Normally we would only search shdrs for ET_REL files, but when
|
|
|
|
+ we search for a separate .debug file phdrs might not be there
|
|
|
|
+ (they are never loaded) or have been corrupted, so try again
|
|
|
|
+ against shdrs. */
|
|
|
|
+ if (buildid || (!rel_ok && !search_shdrs))
|
|
|
|
return buildid;
|
|
|
|
|
|
|
|
for (i = 0; i < ehdr->e_shnum; i++) {
|
|
|
|
@@ -1074,7 +1078,7 @@
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
if (buildid) {
|
|
|
|
- Char* debug_buildid = find_buildid(sr_Res(sres), *size, rel_ok);
|
|
|
|
+ Char* debug_buildid = find_buildid(sr_Res(sres), *size, rel_ok, True);
|
|
|
|
if (debug_buildid == NULL || VG_(strcmp)(buildid, debug_buildid) != 0) {
|
|
|
|
SysRes res = VG_(am_munmap_valgrind)(sr_Res(sres), *size);
|
|
|
|
vg_assert(!sr_isError(res));
|
|
|
|
@@ -2274,7 +2278,7 @@
|
|
|
|
vg_assert(dimage == 0 && n_dimage == 0);
|
|
|
|
|
|
|
|
/* Look for a build-id */
|
|
|
|
- buildid = find_buildid(oimage, n_oimage, False);
|
|
|
|
+ buildid = find_buildid(oimage, n_oimage, False, False);
|
|
|
|
|
|
|
|
/* Look for a debug image */
|
|
|
|
if (buildid != NULL || debuglink_img != NULL) {
|