aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Baldwin <jhb@FreeBSD.org>2022-03-10 23:39:53 +0000
committerJohn Baldwin <jhb@FreeBSD.org>2022-03-10 23:39:53 +0000
commita6db407f15ab7d0dbfd83a48173343654106510e (patch)
tree69fff0021dd5f6683feee4acd09606a887af2af0
parent904a13759cf68fc2eb60bcdd2fecc1e9c3546c5c (diff)
downloadsrc-a6db407f15ab7d0dbfd83a48173343654106510e.tar.gz
src-a6db407f15ab7d0dbfd83a48173343654106510e.zip
libpmcstat: Fix a few ARM-specific issues with function symbols.
- Refine the checks for ARM mapping symbols and apply them on arm64 as well as 32-bit arm. In particular, mapping symbols can have additional characters and are not strictly limited to just "$a" but can append additional characters (e.g. "$a.1"). Add "$x" to the list of mapping symbol prefixes. - Clear the LSB of function symbol addresses. Thumb function addresses set the LSB to enable Thumb mode. However, the actual function starts at the aligned address with LSB clear. Not clearing the LSB can cause pmcannotate to pass misaligned addresses to objdump when extracting disassembly. Reviewed by: andrew Obtained from: CheriBSD Sponsored by: University of Cambridge, Google, Inc. Differential Revision: https://reviews.freebsd.org/D34416
-rw-r--r--lib/libpmcstat/libpmcstat_image.c18
1 files changed, 14 insertions, 4 deletions
diff --git a/lib/libpmcstat/libpmcstat_image.c b/lib/libpmcstat/libpmcstat_image.c
index 97109f203806..c63f00e03253 100644
--- a/lib/libpmcstat/libpmcstat_image.c
+++ b/lib/libpmcstat/libpmcstat_image.c
@@ -119,13 +119,23 @@ pmcstat_image_add_symbols(struct pmcstat_image *image, Elf *e,
if ((fnname = elf_strptr(e, sh->sh_link, sym.st_name))
== NULL)
continue;
-#ifdef __arm__
- /* Remove spurious ARM function name. */
+
+#if defined(__aarch64__) || defined(__arm__)
+ /* Ignore ARM mapping symbols. */
if (fnname[0] == '$' &&
(fnname[1] == 'a' || fnname[1] == 't' ||
- fnname[1] == 'd') &&
- fnname[2] == '\0')
+ fnname[1] == 'd' || fnname[1] == 'x'))
continue;
+
+ /*
+ * Clear LSB from starting addresses for functions
+ * which execute in Thumb mode. We should perhaps
+ * only do this for functions in a $t mapping symbol
+ * range, but parsing mapping symbols would be a lot
+ * of work and function addresses shouldn't have the
+ * LSB set otherwise.
+ */
+ sym.st_value &= ~1;
#endif
symptr->ps_name = pmcstat_string_intern(fnname);