summaryrefslogtreecommitdiffstats
path: root/usr.sbin
diff options
context:
space:
mode:
authorstas <stas@FreeBSD.org>2015-05-13 18:52:18 +0000
committerstas <stas@FreeBSD.org>2015-05-13 18:52:18 +0000
commit98b1ee5fe792de8a9d358dc8f0ab8beef0a6719f (patch)
tree49613f08687fb012a1e6df2b8c74dc1b74566410 /usr.sbin
parentcecc5885ac759cfaf1f17aefc32f32bf28b7889c (diff)
downloadFreeBSD-src-98b1ee5fe792de8a9d358dc8f0ab8beef0a6719f.zip
FreeBSD-src-98b1ee5fe792de8a9d358dc8f0ab8beef0a6719f.tar.gz
Fix pmcstat symbol resolution for userland processes.
When examining existing processes pmcstat fails to correctly determine the locations of executable sections of the process due to a miscalculated virtual load address. This does not affect the newly launched processes as the same value passed as a "start address" to the pmcstat_image_link() thus nullifying the effect of it. The issue manifests itself in processes not being reported in the pmcstat(8) output and "dubious frames" being reported. Fix it for now by ignoring all the sections except the executable one. This won't fix the issue for objects with multiple executable sections but helps in majority of real world usecases. The real solution would be to modify the MAP-IN event to include the appropriate load address so pmcstat(8) won't have to manually parse object files to try to determine it. PR: 198147, 198148 Reviewed by: jhb, rpaulo MFC after: 2 weeks
Diffstat (limited to 'usr.sbin')
-rw-r--r--usr.sbin/pmcstat/pmcstat_log.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/usr.sbin/pmcstat/pmcstat_log.c b/usr.sbin/pmcstat/pmcstat_log.c
index 8190b28..fbc358d 100644
--- a/usr.sbin/pmcstat/pmcstat_log.c
+++ b/usr.sbin/pmcstat/pmcstat_log.c
@@ -716,7 +716,8 @@ pmcstat_image_get_elf_params(struct pmcstat_image *image)
ph.p_offset);
break;
case PT_LOAD:
- if ((ph.p_offset & (-ph.p_align)) == 0)
+ if ((ph.p_flags & PF_X) != 0 &&
+ (ph.p_offset & (-ph.p_align)) == 0)
image->pi_vaddr = ph.p_vaddr & (-ph.p_align);
break;
}
OpenPOWER on IntegriCloud