diff options
author | Sergei Trofimovich <slyich@gmail.com> | 2022-08-12 09:07:52 +0100 |
---|---|---|
committer | Sergei Trofimovich <slyich@gmail.com> | 2022-08-12 18:32:49 +0100 |
commit | ca07cc0c5c1fe8dfbed8b7a1d17ed2b0bd1efe19 (patch) | |
tree | 3bf4da83ac67af88992e9795554868f25f7b07d4 | |
parent | 84ee3aa55b34a5772533139edacadd1934f8a977 (diff) | |
download | nixpkgs-ca07cc0c5c1fe8dfbed8b7a1d17ed2b0bd1efe19.tar nixpkgs-ca07cc0c5c1fe8dfbed8b7a1d17ed2b0bd1efe19.tar.gz nixpkgs-ca07cc0c5c1fe8dfbed8b7a1d17ed2b0bd1efe19.tar.bz2 nixpkgs-ca07cc0c5c1fe8dfbed8b7a1d17ed2b0bd1efe19.tar.lz nixpkgs-ca07cc0c5c1fe8dfbed8b7a1d17ed2b0bd1efe19.tar.xz nixpkgs-ca07cc0c5c1fe8dfbed8b7a1d17ed2b0bd1efe19.tar.zst nixpkgs-ca07cc0c5c1fe8dfbed8b7a1d17ed2b0bd1efe19.zip |
linuxPackages_latest.perf: apply upstream patch for binutils-2.39
Without the change build fails as: perf-linux> util/annotate.c: In function 'symbol__disassemble_bpf': perf-linux> util/annotate.c:1765:9: error: too few arguments to function 'init_disassemble_info' perf-linux> 1765 | init_disassemble_info(&info, s, perf-linux> | ^~~~~~~~~~~~~~~~~~~~~
-rw-r--r-- | pkgs/os-specific/linux/kernel/5.19-binutils-2.39-support.patch | 352 | ||||
-rw-r--r-- | pkgs/os-specific/linux/kernel/perf.nix | 9 |
2 files changed, 360 insertions, 1 deletions
diff --git a/pkgs/os-specific/linux/kernel/5.19-binutils-2.39-support.patch b/pkgs/os-specific/linux/kernel/5.19-binutils-2.39-support.patch new file mode 100644 index 00000000000..5f4f2fc0b4a --- /dev/null +++ b/pkgs/os-specific/linux/kernel/5.19-binutils-2.39-support.patch @@ -0,0 +1,352 @@ +Fetched as: + $ wget 'https://github.com/torvalds/linux/compare/00b32625982e0c796f0abb8effcac9c05ef55bd3...600b7b26c07a070d0153daa76b3806c1e52c9e00.patch' + +Adds support for binutils-2.39 API change around init_disassemble_info(). +--- a/tools/build/Makefile.feature ++++ b/tools/build/Makefile.feature +@@ -70,6 +70,7 @@ FEATURE_TESTS_BASIC := \ + libaio \ + libzstd \ + disassembler-four-args \ ++ disassembler-init-styled \ + file-handle + + # FEATURE_TESTS_BASIC + FEATURE_TESTS_EXTRA is the complete list +--- a/tools/build/feature/Makefile ++++ b/tools/build/feature/Makefile +@@ -18,6 +18,7 @@ FILES= \ + test-libbfd.bin \ + test-libbfd-buildid.bin \ + test-disassembler-four-args.bin \ ++ test-disassembler-init-styled.bin \ + test-reallocarray.bin \ + test-libbfd-liberty.bin \ + test-libbfd-liberty-z.bin \ +@@ -248,6 +249,9 @@ $(OUTPUT)test-libbfd-buildid.bin: + $(OUTPUT)test-disassembler-four-args.bin: + $(BUILD) -DPACKAGE='"perf"' -lbfd -lopcodes + ++$(OUTPUT)test-disassembler-init-styled.bin: ++ $(BUILD) -DPACKAGE='"perf"' -lbfd -lopcodes ++ + $(OUTPUT)test-reallocarray.bin: + $(BUILD) + +--- a/tools/build/feature/test-all.c ++++ b/tools/build/feature/test-all.c +@@ -166,6 +166,10 @@ + # include "test-disassembler-four-args.c" + #undef main + ++#define main main_test_disassembler_init_styled ++# include "test-disassembler-init-styled.c" ++#undef main ++ + #define main main_test_libzstd + # include "test-libzstd.c" + #undef main +--- /dev/null ++++ b/tools/build/feature/test-disassembler-init-styled.c +@@ -0,0 +1,13 @@ ++// SPDX-License-Identifier: GPL-2.0 ++#include <stdio.h> ++#include <dis-asm.h> ++ ++int main(void) ++{ ++ struct disassemble_info info; ++ ++ init_disassemble_info(&info, stdout, ++ NULL, NULL); ++ ++ return 0; ++} + +--- a/tools/build/Makefile.feature ++++ b/tools/build/Makefile.feature +@@ -135,8 +135,7 @@ FEATURE_DISPLAY ?= \ + get_cpuid \ + bpf \ + libaio \ +- libzstd \ +- disassembler-four-args ++ libzstd + + # Set FEATURE_CHECK_(C|LD)FLAGS-all for all FEATURE_TESTS features. + # If in the future we need per-feature checks/flags for features not + +--- /dev/null ++++ b/tools/include/tools/dis-asm-compat.h +@@ -0,0 +1,55 @@ ++/* SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause */ ++#ifndef _TOOLS_DIS_ASM_COMPAT_H ++#define _TOOLS_DIS_ASM_COMPAT_H ++ ++#include <stdio.h> ++#include <dis-asm.h> ++ ++/* define types for older binutils version, to centralize ifdef'ery a bit */ ++#ifndef DISASM_INIT_STYLED ++enum disassembler_style {DISASSEMBLER_STYLE_NOT_EMPTY}; ++typedef int (*fprintf_styled_ftype) (void *, enum disassembler_style, const char*, ...); ++#endif ++ ++/* ++ * Trivial fprintf wrapper to be used as the fprintf_styled_func argument to ++ * init_disassemble_info_compat() when normal fprintf suffices. ++ */ ++static inline int fprintf_styled(void *out, ++ enum disassembler_style style, ++ const char *fmt, ...) ++{ ++ va_list args; ++ int r; ++ ++ (void)style; ++ ++ va_start(args, fmt); ++ r = vfprintf(out, fmt, args); ++ va_end(args); ++ ++ return r; ++} ++ ++/* ++ * Wrapper for init_disassemble_info() that hides version ++ * differences. Depending on binutils version and architecture either ++ * fprintf_func or fprintf_styled_func will be called. ++ */ ++static inline void init_disassemble_info_compat(struct disassemble_info *info, ++ void *stream, ++ fprintf_ftype unstyled_func, ++ fprintf_styled_ftype styled_func) ++{ ++#ifdef DISASM_INIT_STYLED ++ init_disassemble_info(info, stream, ++ unstyled_func, ++ styled_func); ++#else ++ (void)styled_func; ++ init_disassemble_info(info, stream, ++ unstyled_func); ++#endif ++} ++ ++#endif /* _TOOLS_DIS_ASM_COMPAT_H */ + +--- a/tools/perf/Makefile.config ++++ b/tools/perf/Makefile.config +@@ -298,6 +298,7 @@ FEATURE_CHECK_LDFLAGS-libpython := $(PYTHON_EMBED_LDOPTS) + FEATURE_CHECK_LDFLAGS-libaio = -lrt + + FEATURE_CHECK_LDFLAGS-disassembler-four-args = -lbfd -lopcodes -ldl ++FEATURE_CHECK_LDFLAGS-disassembler-init-styled = -lbfd -lopcodes -ldl + + CORE_CFLAGS += -fno-omit-frame-pointer + CORE_CFLAGS += -ggdb3 +@@ -924,13 +925,16 @@ ifndef NO_LIBBFD + ifeq ($(feature-libbfd-liberty), 1) + EXTLIBS += -lbfd -lopcodes -liberty + FEATURE_CHECK_LDFLAGS-disassembler-four-args += -liberty -ldl ++ FEATURE_CHECK_LDFLAGS-disassembler-init-styled += -liberty -ldl + else + ifeq ($(feature-libbfd-liberty-z), 1) + EXTLIBS += -lbfd -lopcodes -liberty -lz + FEATURE_CHECK_LDFLAGS-disassembler-four-args += -liberty -lz -ldl ++ FEATURE_CHECK_LDFLAGS-disassembler-init-styled += -liberty -lz -ldl + endif + endif + $(call feature_check,disassembler-four-args) ++ $(call feature_check,disassembler-init-styled) + endif + + ifeq ($(feature-libbfd-buildid), 1) +@@ -1044,6 +1048,10 @@ ifeq ($(feature-disassembler-four-args), 1) + CFLAGS += -DDISASM_FOUR_ARGS_SIGNATURE + endif + ++ifeq ($(feature-disassembler-init-styled), 1) ++ CFLAGS += -DDISASM_INIT_STYLED ++endif ++ + ifeq (${IS_64_BIT}, 1) + ifndef NO_PERF_READ_VDSO32 + $(call feature_check,compile-32) +--- a/tools/perf/util/annotate.c ++++ b/tools/perf/util/annotate.c +@@ -1720,6 +1720,7 @@ static int dso__disassemble_filename(struct dso *dso, char *filename, size_t fil + #include <bpf/btf.h> + #include <bpf/libbpf.h> + #include <linux/btf.h> ++#include <tools/dis-asm-compat.h> + + static int symbol__disassemble_bpf(struct symbol *sym, + struct annotate_args *args) +@@ -1762,9 +1763,9 @@ static int symbol__disassemble_bpf(struct symbol *sym, + ret = errno; + goto out; + } +- init_disassemble_info(&info, s, +- (fprintf_ftype) fprintf); +- ++ init_disassemble_info_compat(&info, s, ++ (fprintf_ftype) fprintf, ++ fprintf_styled); + info.arch = bfd_get_arch(bfdf); + info.mach = bfd_get_mach(bfdf); + + +--- a/tools/bpf/Makefile ++++ b/tools/bpf/Makefile +@@ -34,7 +34,7 @@ else + endif + + FEATURE_USER = .bpf +-FEATURE_TESTS = libbfd disassembler-four-args ++FEATURE_TESTS = libbfd disassembler-four-args disassembler-init-styled + FEATURE_DISPLAY = libbfd disassembler-four-args + + check_feat := 1 +@@ -56,6 +56,9 @@ endif + ifeq ($(feature-disassembler-four-args), 1) + CFLAGS += -DDISASM_FOUR_ARGS_SIGNATURE + endif ++ifeq ($(feature-disassembler-init-styled), 1) ++CFLAGS += -DDISASM_INIT_STYLED ++endif + + $(OUTPUT)%.yacc.c: $(srctree)/tools/bpf/%.y + $(QUIET_BISON)$(YACC) -o $@ -d $< +--- a/tools/bpf/bpf_jit_disasm.c ++++ b/tools/bpf/bpf_jit_disasm.c +@@ -28,6 +28,7 @@ + #include <sys/types.h> + #include <sys/stat.h> + #include <limits.h> ++#include <tools/dis-asm-compat.h> + + #define CMD_ACTION_SIZE_BUFFER 10 + #define CMD_ACTION_READ_ALL 3 +@@ -64,7 +65,9 @@ static void get_asm_insns(uint8_t *image, size_t len, int opcodes) + assert(bfdf); + assert(bfd_check_format(bfdf, bfd_object)); + +- init_disassemble_info(&info, stdout, (fprintf_ftype) fprintf); ++ init_disassemble_info_compat(&info, stdout, ++ (fprintf_ftype) fprintf, ++ fprintf_styled); + info.arch = bfd_get_arch(bfdf); + info.mach = bfd_get_mach(bfdf); + info.buffer = image; + +--- a/tools/bpf/Makefile ++++ b/tools/bpf/Makefile +@@ -35,7 +35,7 @@ endif + + FEATURE_USER = .bpf + FEATURE_TESTS = libbfd disassembler-four-args disassembler-init-styled +-FEATURE_DISPLAY = libbfd disassembler-four-args ++FEATURE_DISPLAY = libbfd + + check_feat := 1 + NON_CHECK_FEAT_TARGETS := clean bpftool_clean runqslower_clean resolve_btfids_clean + +--- a/tools/bpf/bpftool/Makefile ++++ b/tools/bpf/bpftool/Makefile +@@ -93,7 +93,7 @@ INSTALL ?= install + RM ?= rm -f + + FEATURE_USER = .bpftool +-FEATURE_TESTS = libbfd disassembler-four-args zlib libcap \ ++FEATURE_TESTS = libbfd disassembler-four-args disassembler-init-styled zlib libcap \ + clang-bpf-co-re + FEATURE_DISPLAY = libbfd disassembler-four-args zlib libcap \ + clang-bpf-co-re +@@ -117,6 +117,9 @@ endif + ifeq ($(feature-disassembler-four-args), 1) + CFLAGS += -DDISASM_FOUR_ARGS_SIGNATURE + endif ++ifeq ($(feature-disassembler-init-styled), 1) ++ CFLAGS += -DDISASM_INIT_STYLED ++endif + + LIBS = $(LIBBPF) -lelf -lz + LIBS_BOOTSTRAP = $(LIBBPF_BOOTSTRAP) -lelf -lz +--- a/tools/bpf/bpftool/jit_disasm.c ++++ b/tools/bpf/bpftool/jit_disasm.c +@@ -24,6 +24,7 @@ + #include <sys/stat.h> + #include <limits.h> + #include <bpf/libbpf.h> ++#include <tools/dis-asm-compat.h> + + #include "json_writer.h" + #include "main.h" +@@ -39,15 +40,12 @@ static void get_exec_path(char *tpath, size_t size) + } + + static int oper_count; +-static int fprintf_json(void *out, const char *fmt, ...) ++static int printf_json(void *out, const char *fmt, va_list ap) + { +- va_list ap; + char *s; + int err; + +- va_start(ap, fmt); + err = vasprintf(&s, fmt, ap); +- va_end(ap); + if (err < 0) + return -1; + +@@ -73,6 +71,32 @@ static int fprintf_json(void *out, const char *fmt, ...) + return 0; + } + ++static int fprintf_json(void *out, const char *fmt, ...) ++{ ++ va_list ap; ++ int r; ++ ++ va_start(ap, fmt); ++ r = printf_json(out, fmt, ap); ++ va_end(ap); ++ ++ return r; ++} ++ ++static int fprintf_json_styled(void *out, ++ enum disassembler_style style __maybe_unused, ++ const char *fmt, ...) ++{ ++ va_list ap; ++ int r; ++ ++ va_start(ap, fmt); ++ r = printf_json(out, fmt, ap); ++ va_end(ap); ++ ++ return r; ++} ++ + void disasm_print_insn(unsigned char *image, ssize_t len, int opcodes, + const char *arch, const char *disassembler_options, + const struct btf *btf, +@@ -99,11 +123,13 @@ void disasm_print_insn(unsigned char *image, ssize_t len, int opcodes, + assert(bfd_check_format(bfdf, bfd_object)); + + if (json_output) +- init_disassemble_info(&info, stdout, +- (fprintf_ftype) fprintf_json); ++ init_disassemble_info_compat(&info, stdout, ++ (fprintf_ftype) fprintf_json, ++ fprintf_json_styled); + else +- init_disassemble_info(&info, stdout, +- (fprintf_ftype) fprintf); ++ init_disassemble_info_compat(&info, stdout, ++ (fprintf_ftype) fprintf, ++ fprintf_styled); + + /* Update architecture info for offload. */ + if (arch) { diff --git a/pkgs/os-specific/linux/kernel/perf.nix b/pkgs/os-specific/linux/kernel/perf.nix index 0183e9ffa3f..199c12b8e24 100644 --- a/pkgs/os-specific/linux/kernel/perf.nix +++ b/pkgs/os-specific/linux/kernel/perf.nix @@ -1,4 +1,4 @@ -{ lib, stdenv, kernel, elfutils, python2, python3, perl, newt, slang, asciidoc, xmlto, makeWrapper +{ lib, stdenv, fetchpatch, kernel, elfutils, python2, python3, perl, newt, slang, asciidoc, xmlto, makeWrapper , docbook_xsl, docbook_xml_dtd_45, libxslt, flex, bison, pkg-config, libunwind, binutils-unwrapped , libiberty, audit, libbfd, libopcodes, openssl, systemtap, numactl , zlib @@ -15,6 +15,13 @@ stdenv.mkDerivation { inherit (kernel) src; + patches = optionals (versionAtLeast kernel.version "5.19" && versionOlder kernel.version "5.20") [ + # binutils-2.39 support around init_disassemble_info() + # API change. + # Will be included in 5.20. + ./5.19-binutils-2.39-support.patch + ]; + preConfigure = '' cd tools/perf |