From: Ian Rogers <irogers@google.com>
To: Peter Zijlstra <peterz@infradead.org>,
Ingo Molnar <mingo@redhat.com>,
Arnaldo Carvalho de Melo <acme@kernel.org>,
Namhyung Kim <namhyung@kernel.org>,
Mark Rutland <mark.rutland@arm.com>,
Alexander Shishkin <alexander.shishkin@linux.intel.com>,
Jiri Olsa <jolsa@kernel.org>, Ian Rogers <irogers@google.com>,
Adrian Hunter <adrian.hunter@intel.com>,
Kan Liang <kan.liang@linux.intel.com>,
Nathan Chancellor <nathan@kernel.org>,
Nick Desaulniers <nick.desaulniers+lkml@gmail.com>,
Bill Wendling <morbo@google.com>,
Justin Stitt <justinstitt@google.com>,
Aditya Gupta <adityag@linux.ibm.com>,
"Steinar H. Gunderson" <sesse@google.com>,
Charlie Jenkins <charlie@rivosinc.com>,
Changbin Du <changbin.du@huawei.com>,
"Masami Hiramatsu (Google)" <mhiramat@kernel.org>,
James Clark <james.clark@linaro.org>,
Kajol Jain <kjain@linux.ibm.com>,
Athira Rajeev <atrajeev@linux.vnet.ibm.com>,
Li Huafei <lihuafei1@huawei.com>,
Dmitry Vyukov <dvyukov@google.com>,
Andi Kleen <ak@linux.intel.com>,
Chaitanya S Prakash <chaitanyas.prakash@arm.com>,
linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org,
llvm@lists.linux.dev, Song Liu <song@kernel.org>,
bpf@vger.kernel.org
Subject: [PATCH v5 08/19] perf llvm: Mangle libperf-llvm.so function names
Date: Fri, 22 Aug 2025 17:32:04 -0700 [thread overview]
Message-ID: <20250823003216.733941-9-irogers@google.com> (raw)
In-Reply-To: <20250823003216.733941-1-irogers@google.com>
For a function like llvm_addr2line having the libperf-llvm.so exported
symbol named llvm_addr2line meant that the perf llvm_addr2line could
sometimes erroneously be returned. This led to infinite recursion and
eventual stack overflow. To avoid this conflict add a new
BUILDING_PERF_LLVMSO when libperf-llvm.so is being built and use it to
alter the behavior of MANGLE_PERF_LLVM_API, a macro that prefixes the
name when libperf-llvm.so is being built. The prefixed named avoids
the name collision.
Signed-off-by: Ian Rogers <irogers@google.com>
---
tools/perf/Makefile.perf | 3 ++-
tools/perf/util/llvm-c-helpers.cpp | 29 ++++++++++++++++++-----------
tools/perf/util/llvm-c-helpers.h | 24 ++++++++++++++++--------
3 files changed, 36 insertions(+), 20 deletions(-)
diff --git a/tools/perf/Makefile.perf b/tools/perf/Makefile.perf
index bfa4ad7ea89d..116c935c06f7 100644
--- a/tools/perf/Makefile.perf
+++ b/tools/perf/Makefile.perf
@@ -1002,7 +1002,8 @@ $(LIBSYMBOL)-clean:
$(Q)$(RM) -r -- $(LIBSYMBOL_OUTPUT)
ifdef LIBLLVM_DYNAMIC
-LIBPERF_LLVM_CXXFLAGS := $(call filter-out,-DHAVE_LIBLLVM_DYNAMIC,$(CXXFLAGS)) -DHAVE_LIBLLVM_SUPPORT
+LIBPERF_LLVM_CXXFLAGS := $(call filter-out,-DHAVE_LIBLLVM_DYNAMIC,$(CXXFLAGS))
+LIBPERF_LLVM_CXXFLAGS += -DHAVE_LIBLLVM_SUPPORT -DBUILDING_PERF_LLVMSO
LIBPERF_LLVM_LIBS = -L$(shell $(LLVM_CONFIG) --libdir) $(LIBLLVM) -lstdc++
$(OUTPUT)$(LIBPERF_LLVM): util/llvm-c-helpers.cpp
diff --git a/tools/perf/util/llvm-c-helpers.cpp b/tools/perf/util/llvm-c-helpers.cpp
index 5a6f76e6b705..8cea380be5c2 100644
--- a/tools/perf/util/llvm-c-helpers.cpp
+++ b/tools/perf/util/llvm-c-helpers.cpp
@@ -99,10 +99,12 @@ static int extract_file_and_line(const DILineInfo &line_info, char **file,
#endif
extern "C"
-int llvm_addr2line(const char *dso_name __maybe_unused, u64 addr __maybe_unused,
- char **file __maybe_unused, unsigned int *line __maybe_unused,
- bool unwind_inlines __maybe_unused,
- llvm_a2l_frame **inline_frames __maybe_unused)
+int MANGLE_PERF_LLVM_API(llvm_addr2line)(const char *dso_name __maybe_unused,
+ u64 addr __maybe_unused,
+ char **file __maybe_unused,
+ unsigned int *line __maybe_unused,
+ bool unwind_inlines __maybe_unused,
+ llvm_a2l_frame **inline_frames __maybe_unused)
{
#if defined(HAVE_LIBLLVM_SUPPORT) && !defined(HAVE_LIBLLVM_DYNAMIC)
LLVMSymbolizer *symbolizer = get_symbolizer();
@@ -177,7 +179,8 @@ int llvm_addr2line(const char *dso_name __maybe_unused, u64 addr __maybe_unused,
if (!handle)
return 0;
- fn = reinterpret_cast<decltype(fn)>(dlsym(handle, "llvm_addr2line"));
+ fn = reinterpret_cast<decltype(fn)>(
+ dlsym(handle, MANGLE_PERF_LLVM_API_STR(llvm_addr2line)));
if (!fn)
pr_debug("dlsym failed for llvm_addr2line\n");
fn_init = true;
@@ -215,8 +218,9 @@ make_symbol_relative_string(struct dso *dso, const char *sym_name,
#endif
extern "C"
-char *llvm_name_for_code(struct dso *dso __maybe_unused, const char *dso_name __maybe_unused,
- u64 addr __maybe_unused)
+char *MANGLE_PERF_LLVM_API(llvm_name_for_code)(struct dso *dso __maybe_unused,
+ const char *dso_name __maybe_unused,
+ u64 addr __maybe_unused)
{
#if defined(HAVE_LIBLLVM_SUPPORT) && !defined(HAVE_LIBLLVM_DYNAMIC)
LLVMSymbolizer *symbolizer = get_symbolizer();
@@ -242,7 +246,8 @@ char *llvm_name_for_code(struct dso *dso __maybe_unused, const char *dso_name __
if (!handle)
return NULL;
- fn = reinterpret_cast<decltype(fn)>(dlsym(handle, "llvm_name_for_code"));
+ fn = reinterpret_cast<decltype(fn)>(
+ dlsym(handle, MANGLE_PERF_LLVM_API_STR(llvm_name_for_code)));
if (!fn)
pr_debug("dlsym failed for llvm_name_for_code\n");
fn_init = true;
@@ -256,8 +261,9 @@ char *llvm_name_for_code(struct dso *dso __maybe_unused, const char *dso_name __
}
extern "C"
-char *llvm_name_for_data(struct dso *dso __maybe_unused, const char *dso_name __maybe_unused,
- u64 addr __maybe_unused)
+char *MANGLE_PERF_LLVM_API(llvm_name_for_data)(struct dso *dso __maybe_unused,
+ const char *dso_name __maybe_unused,
+ u64 addr __maybe_unused)
{
#if defined(HAVE_LIBLLVM_SUPPORT) && !defined(HAVE_LIBLLVM_DYNAMIC)
LLVMSymbolizer *symbolizer = get_symbolizer();
@@ -283,7 +289,8 @@ char *llvm_name_for_data(struct dso *dso __maybe_unused, const char *dso_name __
if (!handle)
return NULL;
- fn = reinterpret_cast<decltype(fn)>(dlsym(handle, "llvm_name_for_data"));
+ fn = reinterpret_cast<decltype(fn)>(
+ dlsym(handle, MANGLE_PERF_LLVM_API_STR(llvm_name_for_data)));
if (!fn)
pr_debug("dlsym failed for llvm_name_for_data\n");
fn_init = true;
diff --git a/tools/perf/util/llvm-c-helpers.h b/tools/perf/util/llvm-c-helpers.h
index d2b99637a28a..cfcfd540cdae 100644
--- a/tools/perf/util/llvm-c-helpers.h
+++ b/tools/perf/util/llvm-c-helpers.h
@@ -13,6 +13,14 @@
extern "C" {
#endif
+/* Support name mangling so that libperf_llvm.so's names don't match those in perf. */
+#ifdef BUILDING_PERF_LLVMSO
+#define MANGLE_PERF_LLVM_API(x) PERF_LLVM_SO_ ## x
+#else
+#define MANGLE_PERF_LLVM_API(x) x
+#endif
+#define MANGLE_PERF_LLVM_API_STR(x) "PERF_LLVM_SO_" #x
+
struct dso;
struct llvm_a2l_frame {
@@ -37,12 +45,12 @@ struct llvm_a2l_frame {
* a newly allocated array with that length. The caller is then responsible
* for freeing both the strings and the array itself.
*/
-int llvm_addr2line(const char* dso_name,
- u64 addr,
- char** file,
- unsigned int* line,
- bool unwind_inlines,
- struct llvm_a2l_frame** inline_frames);
+int MANGLE_PERF_LLVM_API(llvm_addr2line)(const char *dso_name,
+ u64 addr,
+ char **file,
+ unsigned int *line,
+ bool unwind_inlines,
+ struct llvm_a2l_frame **inline_frames);
/*
* Simple symbolizers for addresses; will convert something like
@@ -50,8 +58,8 @@ int llvm_addr2line(const char* dso_name,
*
* The returned value must be freed by the caller, with free().
*/
-char *llvm_name_for_code(struct dso *dso, const char *dso_name, u64 addr);
-char *llvm_name_for_data(struct dso *dso, const char *dso_name, u64 addr);
+char *MANGLE_PERF_LLVM_API(llvm_name_for_code)(struct dso *dso, const char *dso_name, u64 addr);
+char *MANGLE_PERF_LLVM_API(llvm_name_for_data)(struct dso *dso, const char *dso_name, u64 addr);
#ifdef __cplusplus
}
--
2.51.0.rc2.233.g662b1ed5c5-goog
next prev parent reply other threads:[~2025-08-23 0:32 UTC|newest]
Thread overview: 27+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-08-23 0:31 [PATCH v5 00/19] Support dynamic opening of capstone/llvm remove BUILD_NONDISTRO Ian Rogers
2025-08-23 0:31 ` [PATCH v5 01/19] perf build: Remove libtracefs configuration Ian Rogers
2025-08-23 0:31 ` [PATCH v5 02/19] perf map: Constify objdump offset/address conversion APIs Ian Rogers
2025-08-23 0:31 ` [PATCH v5 03/19] perf capstone: Move capstone functionality into its own file Ian Rogers
2025-08-23 0:32 ` [PATCH v5 04/19] perf llvm: Move llvm " Ian Rogers
2025-08-23 0:32 ` [PATCH v5 05/19] perf capstone: Remove open_capstone_handle Ian Rogers
2025-08-23 0:32 ` [PATCH v5 06/19] perf capstone: Support for dlopen-ing libcapstone.so Ian Rogers
2025-08-23 0:32 ` [PATCH v5 07/19] perf llvm: Support for dlopen-ing libLLVM.so Ian Rogers
2025-08-23 0:32 ` Ian Rogers [this message]
2025-08-23 0:32 ` [PATCH v5 09/19] perf dso: Move read_symbol from llvm/capstone to dso Ian Rogers
2025-08-23 0:32 ` [PATCH v5 10/19] perf dso: Support BPF programs in dso__read_symbol Ian Rogers
2025-08-23 0:32 ` [PATCH v5 11/19] perf llvm: Disassemble cleanup Ian Rogers
2025-08-23 0:32 ` [PATCH v5 12/19] perf dso: Clean up read_symbol error handling Ian Rogers
2025-08-23 0:32 ` [PATCH v5 13/19] perf build: Remove libbfd support Ian Rogers
2025-08-23 0:32 ` [PATCH v5 14/19] perf build: Remove libiberty support Ian Rogers
2025-08-23 0:32 ` [PATCH v5 15/19] perf build: Remove unused defines Ian Rogers
2025-08-23 0:32 ` [PATCH v5 16/19] perf disasm: Remove disasm_bpf Ian Rogers
2025-08-23 0:32 ` [PATCH v5 17/19] perf disasm: Make ins__scnprintf and ins__is_nop static Ian Rogers
2025-08-23 0:32 ` [PATCH v5 18/19] perf srcline: Fallback between addr2line implementations Ian Rogers
2025-08-23 0:32 ` [PATCH v5 19/19] perf disasm: Remove unused evsel from annotate_args Ian Rogers
2025-08-23 6:49 ` [PATCH v5 00/19] Support dynamic opening of capstone/llvm remove BUILD_NONDISTRO Sam James
2025-08-23 6:52 ` Sam James
2025-08-23 16:49 ` Ian Rogers
2025-08-23 22:04 ` Sam James
2025-08-24 17:32 ` Ian Rogers
2025-08-23 23:34 ` Andi Kleen
2025-08-24 16:39 ` Ian Rogers
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20250823003216.733941-9-irogers@google.com \
--to=irogers@google.com \
--cc=acme@kernel.org \
--cc=adityag@linux.ibm.com \
--cc=adrian.hunter@intel.com \
--cc=ak@linux.intel.com \
--cc=alexander.shishkin@linux.intel.com \
--cc=atrajeev@linux.vnet.ibm.com \
--cc=bpf@vger.kernel.org \
--cc=chaitanyas.prakash@arm.com \
--cc=changbin.du@huawei.com \
--cc=charlie@rivosinc.com \
--cc=dvyukov@google.com \
--cc=james.clark@linaro.org \
--cc=jolsa@kernel.org \
--cc=justinstitt@google.com \
--cc=kan.liang@linux.intel.com \
--cc=kjain@linux.ibm.com \
--cc=lihuafei1@huawei.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-perf-users@vger.kernel.org \
--cc=llvm@lists.linux.dev \
--cc=mark.rutland@arm.com \
--cc=mhiramat@kernel.org \
--cc=mingo@redhat.com \
--cc=morbo@google.com \
--cc=namhyung@kernel.org \
--cc=nathan@kernel.org \
--cc=nick.desaulniers+lkml@gmail.com \
--cc=peterz@infradead.org \
--cc=sesse@google.com \
--cc=song@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).