BPF List
 help / color / mirror / Atom feed
From: Arnaldo Carvalho de Melo <acme@kernel.org>
To: Alan Maguire <alan.maguire@oracle.com>
Cc: Jiri Olsa <jolsa@kernel.org>,
	Clark Williams <williams@redhat.com>,
	dwarves@vger.kernel.org, bpf@vger.kernel.org,
	Andrii Nakryiko <andrii@kernel.org>,
	Yonghong Song <yonghong.song@linux.dev>,
	Arnaldo Carvalho de Melo <acme@redhat.com>
Subject: [PATCH 21/31] btf_encoder: Fall back to objcopy when llvm-objcopy is not available
Date: Wed, 29 Jul 2026 16:07:21 -0300	[thread overview]
Message-ID: <20260729190733.72876-22-acme@kernel.org> (raw)
In-Reply-To: <20260729190733.72876-1-acme@kernel.org>

From: Arnaldo Carvalho de Melo <acme@redhat.com>

Switch btf_encoder and libctf from system() to exec_objcopy() (previous
commit).  Probe LLVM_OBJCOPY and OBJCOPY environment variables, falling
back to llvm-objcopy then objcopy path search.

Before: hard failure if llvm-objcopy not in PATH
After:  tries llvm-objcopy, falls back to objcopy, respects env vars

Reported-by: Sashiko:gemini-3-1-pro-preview # Running on a local machine
Assisted-by: Claude:claude-sonnet-4-5
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
 btf_encoder.c | 44 +++++++++++++++++++++++++++++++++-----------
 libctf.c      |  7 +++----
 2 files changed, 36 insertions(+), 15 deletions(-)

diff --git a/btf_encoder.c b/btf_encoder.c
index c7b71b5b741bfa6f..c7ebaec4829d121a 100644
--- a/btf_encoder.c
+++ b/btf_encoder.c
@@ -2049,13 +2049,19 @@ static int btf_encoder__write_elf(struct btf_encoder *encoder, const struct btf
 		else
 			elf_error("elf_update failed");
 	} else {
-		const char *llvm_objcopy;
+		const char *objcopy;
 		char tmp_fn[PATH_MAX];
-		char cmd[PATH_MAX * 2];
+		char add_section[PATH_MAX + 64];
 
-		llvm_objcopy = getenv("LLVM_OBJCOPY");
-		if (!llvm_objcopy)
-			llvm_objcopy = "llvm-objcopy";
+		/*
+		 * The kernel build uses $(OBJCOPY) --add-section for
+		 * BTF since v5.2 (2019), supporting both GNU objcopy
+		 * and llvm-objcopy interchangeably.  Prefer
+		 * llvm-objcopy, fall back to objcopy.
+		 */
+		objcopy = getenv("LLVM_OBJCOPY");
+		if (!objcopy)
+			objcopy = getenv("OBJCOPY");
 
 		/* Use objcopy to add a .BTF section */
 		snprintf(tmp_fn, sizeof(tmp_fn), "%s.btf", filename);
@@ -2073,14 +2079,30 @@ static int btf_encoder__write_elf(struct btf_encoder *encoder, const struct btf
 			goto unlink;
 		}
 
-		snprintf(cmd, sizeof(cmd), "%s --add-section %s=%s %s",
-			 llvm_objcopy, btf_secname, tmp_fn, filename);
-		if (system(cmd)) {
-			fprintf(stderr, "%s: failed to add %s section to '%s': %d!\n",
-				__func__, btf_secname, filename, errno);
-			goto unlink;
+		snprintf(add_section, sizeof(add_section), "%s=%s",
+			 btf_secname, tmp_fn);
+
+		if (!objcopy) {
+			int rc = exec_objcopy("llvm-objcopy",
+					      add_section, filename);
+			if (rc == 0)
+				goto success;
+
+			if (rc != -ENOENT) {
+				fprintf(stderr, "%s: failed to add %s section to '%s'\n",
+					__func__, btf_secname, filename);
+				goto unlink;
+			}
+
+			objcopy = "objcopy";
 		}
 
+		if (exec_objcopy(objcopy, add_section, filename)) {
+			fprintf(stderr, "%s: failed to add %s section to '%s'\n",
+				__func__, btf_secname, filename);
+			goto unlink;
+		}
+	success:
 		err = 0;
 	unlink:
 		unlink(tmp_fn);
diff --git a/libctf.c b/libctf.c
index 72f9949a2d25b3d9..51f75fbd66463506 100644
--- a/libctf.c
+++ b/libctf.c
@@ -746,10 +746,9 @@ found_SUNW_ctf_str:
 	if (close(fd) < 0)
 		goto out_unlink;
 
-	char cmd[PATH_MAX * 2];
-	snprintf(cmd, sizeof(cmd), "objcopy --add-section .SUNW_ctf=%s %s",
-		 pathname, ctf->filename);
-	if (system(cmd) == 0)
+	char add_section[PATH_MAX + 32];
+	snprintf(add_section, sizeof(add_section), ".SUNW_ctf=%s", pathname);
+	if (exec_objcopy("objcopy", add_section, ctf->filename) == 0)
 		err = 0;
 out_unlink:
 	unlink(pathname);
-- 
2.55.0


  parent reply	other threads:[~2026-07-29 19:08 UTC|newest]

Thread overview: 32+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-07-29 19:07 [PATCHES 00/31] pahole: Bug fixes and small improvements Arnaldo Carvalho de Melo
2026-07-29 19:07 ` [PATCH 01/31] cmake: Update minimum required version from 3.5 to 3.10 Arnaldo Carvalho de Melo
2026-07-29 19:07 ` [PATCH 02/31] Fix -Wsign-compare warnings across the codebase Arnaldo Carvalho de Melo
2026-07-29 19:07 ` [PATCH 03/31] btf_encoder: Fix interior pointer free and missing NULL check Arnaldo Carvalho de Melo
2026-07-29 19:07 ` [PATCH 04/31] dwarves: Fix missing list head initialization in type__clone_members Arnaldo Carvalho de Melo
2026-07-29 19:07 ` [PATCH 05/31] pahole: Fix instance memory leak on early returns in prototype__stdio_fprintf_value Arnaldo Carvalho de Melo
2026-07-29 19:07 ` [PATCH 06/31] ctf_loader, libctf: Fix error path resource leaks Arnaldo Carvalho de Melo
2026-07-29 19:07 ` [PATCH 07/31] dwarves: Don't search for holes before member byte sizes are cached Arnaldo Carvalho de Melo
2026-07-29 19:07 ` [PATCH 08/31] dwarf_loader: Allocate type_dcu via dwarf_cu__new to fix dangling stack pointer Arnaldo Carvalho de Melo
2026-07-29 19:07 ` [PATCH 09/31] dwarf_loader: Fix annotation failure leaks in variable and typedef creation Arnaldo Carvalho de Melo
2026-07-29 19:07 ` [PATCH 10/31] btf_encoder: Use btf_encoder__tag_type() for all type ID computations Arnaldo Carvalho de Melo
2026-07-29 19:07 ` [PATCH 11/31] pahole: Fix --errno typo that decrements instead of negating Arnaldo Carvalho de Melo
2026-07-29 19:07 ` [PATCH 12/31] dwarves: Fix heap buffer overflow in languages__parse realloc Arnaldo Carvalho de Melo
2026-07-29 19:07 ` [PATCH 13/31] btf_encoder: Fix early cleanup crashes in btf_encoder__new/delete Arnaldo Carvalho de Melo
2026-07-29 19:07 ` [PATCH 14/31] btf_encoder, libctf: Add elf_strptr NULL checks and fix kfunc bounds Arnaldo Carvalho de Melo
2026-07-29 19:07 ` [PATCH 15/31] dwarf_loader: Fix --fixup_silly_bitfields condition check Arnaldo Carvalho de Melo
2026-07-29 19:07 ` [PATCH 16/31] dwarf_loader: Skip libdw__lock when elfutils is built thread-safe Arnaldo Carvalho de Melo
2026-07-29 19:07 ` [PATCH 17/31] dwarf_loader: Fix data race in tag__init() decl_file string cache Arnaldo Carvalho de Melo
2026-07-29 19:07 ` [PATCH 18/31] pahole: Fix parse_btf_features("all") being a silent no-op Arnaldo Carvalho de Melo
2026-07-29 19:07 ` [PATCH 19/31] dwarves: Fix variable shadowing in __cus__find_struct_by_name() Arnaldo Carvalho de Melo
2026-07-29 19:07 ` [PATCH 20/31] dutil: Add exec_objcopy() shell-injection-safe helper Arnaldo Carvalho de Melo
2026-07-29 19:07 ` Arnaldo Carvalho de Melo [this message]
2026-07-29 19:07 ` [PATCH 22/31] dwarf_loader, btf_loader: Replace stale FIXME/XXX comments with explanations Arnaldo Carvalho de Melo
2026-07-29 19:07 ` [PATCH 23/31] pahole: Skip inline expansions during BTF encoding Arnaldo Carvalho de Melo
2026-07-29 19:07 ` [PATCH 24/31] pahole: Use fseek for seekable files in --prettify and --seek_bytes Arnaldo Carvalho de Melo
2026-07-29 19:07 ` [PATCH 25/31] pahole: Guard pipe_seek() against negative offsets Arnaldo Carvalho de Melo
2026-07-29 19:07 ` [PATCH 26/31] gobuffer: Remove 5 dead functions found via coverage analysis Arnaldo Carvalho de Melo
2026-07-29 19:07 ` [PATCH 27/31] dwarves: Remove 6 " Arnaldo Carvalho de Melo
2026-07-29 19:07 ` [PATCH 28/31] pfunct, dwarves_fprintf: Mark file-local functions as static Arnaldo Carvalho de Melo
2026-07-29 19:07 ` [PATCH 29/31] btf_encoder: Fix multi-dimensional array encoding Arnaldo Carvalho de Melo
2026-07-29 19:07 ` [PATCH 30/31] btf_loader: Fix multi-dimensional array loading Arnaldo Carvalho de Melo
2026-07-29 19:07 ` [PATCH 31/31] btfdiff: Remove --flat_arrays now that pahole encodes multi dim arrays in BTF Arnaldo Carvalho de Melo

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=20260729190733.72876-22-acme@kernel.org \
    --to=acme@kernel.org \
    --cc=acme@redhat.com \
    --cc=alan.maguire@oracle.com \
    --cc=andrii@kernel.org \
    --cc=bpf@vger.kernel.org \
    --cc=dwarves@vger.kernel.org \
    --cc=jolsa@kernel.org \
    --cc=williams@redhat.com \
    --cc=yonghong.song@linux.dev \
    /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