diff options
author | Alan Maguire <alan.maguire@oracle.com> | 2023-10-23 10:57:26 +0100 |
---|---|---|
committer | Arnaldo Carvalho de Melo <acme@redhat.com> | 2023-10-25 15:23:22 -0300 |
commit | c129fa7579483bba5b050ba54cc683e11d2b70f3 (patch) | |
tree | 86bde74b7a87757dc24139aa28d707264e54f976 | |
parent | 74a238a4368223c9502d2b24ff71f93039a45328 (diff) | |
download | pahole-c129fa7579483bba5b050ba54cc683e11d2b70f3.tar.gz |
pahole: Add --btf_features_strict to reject unknown BTF features
--btf_features is used to specify the list of requested features
for BTF encoding. However, it is not strict in rejecting requests
with unknown features; this allows us to use the same parameters
regardless of pahole version. --btf_features_strict carries out
the same encoding with the same feature set, but will fail if an
unrecognized feature is specified.
So
pahole -J --btf_features=enum64,foo
will succeed, while
pahole -J --btf_features_strict=enum64,foo
will not.
Suggested-by: Andrii Nakryiko <andrii@kernel.org>
Suggested-by: Eduard Zingerman <eddyz87@gmail.com>
Signed-off-by: Alan Maguire <alan.maguire@oracle.com>
Acked-by: Andrii Nakryiko <andrii@kernel.org>
Acked-by: Eduard Zingerman <eddyz87@gmail.com>
Acked-by: Jiri Olsa <jolsa@kernel.org>
Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Alexei Starovoitov <ast@kernel.org>
Cc: Andrii Nakryiko <andrii.nakryiko@gmail.com>
Cc: Daniel Borkmann <daniel@iogearbox.net>
Cc: Hao Luo <haoluo@google.com>
Cc: John Fastabend <john.fastabend@gmail.com>
Cc: KP Singh <kpsingh@kernel.org>
Cc: Martin KaFai Lau <martin.lau@linux.dev>
Cc: Mykola Lysenko <mykolal@fb.com>
Cc: Song Liu <song@kernel.org>
Cc: Stanislav Fomichev <sdf@google.com>
Cc: Yonghong Song <yhs@fb.com>
Cc: bpf@vger.kernel.org
Link: https://lore.kernel.org/r/20231023095726.1179529-6-alan.maguire@oracle.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
-rw-r--r-- | man-pages/pahole.1 | 4 | ||||
-rw-r--r-- | pahole.c | 21 |
2 files changed, 22 insertions, 3 deletions
diff --git a/man-pages/pahole.1 b/man-pages/pahole.1 index 61489157..ea9045cd 100644 --- a/man-pages/pahole.1 +++ b/man-pages/pahole.1 @@ -298,6 +298,10 @@ Encode BTF using the specified feature list, or specify 'all' for all features s So for example, specifying \-\-btf_encode=var,enum64 will result in a BTF encoding that (as well as encoding basic BTF information) will contain variables and enum64 values. .TP +.B \-\-btf_features_strict +Identical to \-\-btf_features above, but pahole will exit if it encounters an unrecognized feature. + +.TP .B \-\-supported_btf_features Show set of BTF features supported by \-\-btf_features option and exit. Useful for checking which features are supported since \-\-btf_features will not emit an error if an unrecognized feature is specified. @@ -1231,6 +1231,7 @@ ARGP_PROGRAM_VERSION_HOOK_DEF = dwarves_print_version; #define ARGP_skip_encoding_btf_inconsistent_proto 340 #define ARGP_btf_features 341 #define ARGP_supported_btf_features 342 +#define ARGP_btf_features_strict 343 /* --btf_features=feature1[,feature2,..] allows us to specify * a list of requested BTF features or "all" to enable all features. @@ -1334,7 +1335,7 @@ static void show_supported_btf_features(FILE *output) * Explicitly ignores unrecognized features to allow future specification * of new opt-in features. */ -static void parse_btf_features(const char *features) +static void parse_btf_features(const char *features, bool strict) { char *saveptr = NULL, *s, *feature_name; char f[BTF_MAX_FEATURE_STR]; @@ -1355,6 +1356,12 @@ static void parse_btf_features(const char *features) struct btf_feature *feature = find_btf_feature(feature_name); if (!feature) { + if (strict) { + fprintf(stderr, "Feature '%s' in '%s' is not supported. Supported BTF features are:\n", + feature_name, features); + show_supported_btf_features(stderr); + exit(EXIT_FAILURE); + } if (global_verbose) fprintf(stderr, "Ignoring unsupported feature '%s'\n", feature_name); @@ -1798,6 +1805,12 @@ static const struct argp_option pahole__options[] = { .doc = "Show list of btf_features supported by pahole and exit." }, { + .name = "btf_features_strict", + .key = ARGP_btf_features_strict, + .arg = "FEATURE_LIST_STRICT", + .doc = "Specify supported BTF features in FEATURE_LIST_STRICT or 'all' for all supported features. Unlike --btf_features, unrecognized features will trigger an error." + }, + { .name = NULL, } }; @@ -1942,7 +1955,7 @@ static error_t pahole__options_parser(int key, char *arg, case ARGP_btf_gen_floats: conf_load.btf_gen_floats = true; break; case ARGP_btf_gen_all: - parse_btf_features("all"); break; + parse_btf_features("all", false); break; case ARGP_with_flexible_array: show_with_flexible_array = true; break; case ARGP_prettify_input_filename: @@ -1973,9 +1986,11 @@ static error_t pahole__options_parser(int key, char *arg, case ARGP_skip_encoding_btf_inconsistent_proto: conf_load.skip_encoding_btf_inconsistent_proto = true; break; case ARGP_btf_features: - parse_btf_features(arg); break; + parse_btf_features(arg, false); break; case ARGP_supported_btf_features: show_supported_btf_features(stdout); exit(0); + case ARGP_btf_features_strict: + parse_btf_features(arg, true); break; default: return ARGP_ERR_UNKNOWN; } |