diff --git a/CHANGELOG.md b/CHANGELOG.md index 16a849a00c6..f1a63b6c43e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -39,6 +39,8 @@ and this project adheres to - [#2313](https://github.com/iovisor/bpftrace/pull/2313) - Fix invalid LLVM IR as detected by tests - [#2316](https://github.com/iovisor/bpftrace/pull/2316) +- Fix builds against libbfd(binutils) >=2.39 + - [#2328](https://github.com/iovisor/bpftrace/pull/2328) #### Added #### Docs diff --git a/CMakeLists.txt b/CMakeLists.txt index 8f7995afd2d..2e54eb84f8f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -249,6 +249,9 @@ if(HAVE_BFD_DISASM) if(LIBBFD_DISASM_FOUR_ARGS_SIGNATURE) set(BPFTRACE_FLAGS "${BPFTRACE_FLAGS}" LIBBFD_DISASM_FOUR_ARGS_SIGNATURE) endif(LIBBFD_DISASM_FOUR_ARGS_SIGNATURE) + if(LIBBFD_INIT_DISASM_INFO_FOUR_ARGS_SIGNATURE) + set(BPFTRACE_FLAGS "${BPFTRACE_FLAGS}" LIBBFD_INIT_DISASM_INFO_FOUR_ARGS_SIGNATURE) + endif(LIBBFD_INIT_DISASM_INFO_FOUR_ARGS_SIGNATURE) endif(HAVE_BFD_DISASM) if (LIBBPF_BTF_DUMP_FOUND) diff --git a/cmake/FindLibBfd.cmake b/cmake/FindLibBfd.cmake index 4f4b8c4e205..5d917b188c1 100644 --- a/cmake/FindLibBfd.cmake +++ b/cmake/FindLibBfd.cmake @@ -75,5 +75,15 @@ int main(void) { abfd); return 0; }" LIBBFD_DISASM_FOUR_ARGS_SIGNATURE) +CHECK_CXX_SOURCE_COMPILES(" +// See comment in bfd-disasm.cpp for why this needs to exist +#define PACKAGE \"bpftrace-test\" +#include + +int main(void) { + init_disassemble_info(NULL, NULL, NULL, NULL); + return 0; +} +" LIBBFD_INIT_DISASM_INFO_FOUR_ARGS_SIGNATURE) SET(CMAKE_REQUIRED_LIBRARIES) endif() diff --git a/src/bfd-disasm.cpp b/src/bfd-disasm.cpp index f846468cd80..d4165dfac5b 100644 --- a/src/bfd-disasm.cpp +++ b/src/bfd-disasm.cpp @@ -38,6 +38,16 @@ static int fprintf_nop(void *out __attribute__((unused)), const char *fmt __attr return 0; } +#ifdef LIBBFD_INIT_DISASM_INFO_FOUR_ARGS_SIGNATURE +static int fprintf_styled_nop(void *out __attribute__((unused)), + enum disassembler_style s __attribute__((unused)), + const char *fmt __attribute__((unused)), + ...) +{ + return 0; +} +#endif + static AlignState is_aligned_buf(void *buf, uint64_t size, uint64_t offset) { disassembler_ftype disassemble; @@ -55,7 +65,11 @@ static AlignState is_aligned_buf(void *buf, uint64_t size, uint64_t offset) return AlignState::Fail; } +#ifdef LIBBFD_INIT_DISASM_INFO_FOUR_ARGS_SIGNATURE + init_disassemble_info(&info, stdout, fprintf_nop, fprintf_styled_nop); +#else init_disassemble_info(&info, stdout, fprintf_nop); +#endif info.arch = bfd_get_arch(bfdf); info.mach = bfd_get_mach(bfdf);