[PATCH 21/31] btf_encoder: Fall back to objcopy when llvm-objcopy is not available
Arnaldo Carvalho de Melo <[email protected]> Wed, 29 Jul 2026 16:07:21 -0300
| Newsgroups | org.kernel.vger.dwarves,org.kernel.vger.bpf |
|---|---|
| Message-ID | <[email protected]> |
From: Arnaldo Carvalho de Melo <[email protected]> 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 <[email protected]> --- 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