libbpf: Add per-file linker opts
authorAndrii Nakryiko <andrii@kernel.org>
Fri, 7 May 2021 05:41:14 +0000 (22:41 -0700)
committerAlexei Starovoitov <ast@kernel.org>
Tue, 11 May 2021 22:07:17 +0000 (15:07 -0700)
For better future extensibility add per-file linker options. Currently
the set of available options is empty. This changes bpf_linker__add_file()
API, but it's not a breaking change as bpf_linker APIs hasn't been released
yet.

Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Link: https://lore.kernel.org/bpf/20210507054119.270888-3-andrii@kernel.org
tools/bpf/bpftool/gen.c
tools/lib/bpf/libbpf.h
tools/lib/bpf/linker.c

index 440a2fcb6441aa78dd2e19bfa187aa2b5812e521..06fee4a2910a03c353e94c180f676c96fbacdd81 100644 (file)
@@ -638,7 +638,7 @@ static int do_object(int argc, char **argv)
        while (argc) {
                file = GET_ARG();
 
-               err = bpf_linker__add_file(linker, file);
+               err = bpf_linker__add_file(linker, file, NULL);
                if (err) {
                        p_err("failed to link '%s': %s (%d)", file, strerror(err), err);
                        goto out;
index bec4e6a6e31dd044ac1846b201675b4489324893..3f3a247634593202a9eb269e32e41bdaf6d43124 100644 (file)
@@ -768,10 +768,18 @@ struct bpf_linker_opts {
 };
 #define bpf_linker_opts__last_field sz
 
+struct bpf_linker_file_opts {
+       /* size of this struct, for forward/backward compatiblity */
+       size_t sz;
+};
+#define bpf_linker_file_opts__last_field sz
+
 struct bpf_linker;
 
 LIBBPF_API struct bpf_linker *bpf_linker__new(const char *filename, struct bpf_linker_opts *opts);
-LIBBPF_API int bpf_linker__add_file(struct bpf_linker *linker, const char *filename);
+LIBBPF_API int bpf_linker__add_file(struct bpf_linker *linker,
+                                   const char *filename,
+                                   const struct bpf_linker_file_opts *opts);
 LIBBPF_API int bpf_linker__finalize(struct bpf_linker *linker);
 LIBBPF_API void bpf_linker__free(struct bpf_linker *linker);
 
index 9de084b1c699369b49b7ed59656a8b0b344d73c5..3b1fbc27be37adbc8cc6045771a404acf6efd7b8 100644 (file)
@@ -158,7 +158,9 @@ struct bpf_linker {
 
 static int init_output_elf(struct bpf_linker *linker, const char *file);
 
-static int linker_load_obj_file(struct bpf_linker *linker, const char *filename, struct src_obj *obj);
+static int linker_load_obj_file(struct bpf_linker *linker, const char *filename,
+                               const struct bpf_linker_file_opts *opts,
+                               struct src_obj *obj);
 static int linker_sanity_check_elf(struct src_obj *obj);
 static int linker_sanity_check_elf_symtab(struct src_obj *obj, struct src_sec *sec);
 static int linker_sanity_check_elf_relos(struct src_obj *obj, struct src_sec *sec);
@@ -435,15 +437,19 @@ static int init_output_elf(struct bpf_linker *linker, const char *file)
        return 0;
 }
 
-int bpf_linker__add_file(struct bpf_linker *linker, const char *filename)
+int bpf_linker__add_file(struct bpf_linker *linker, const char *filename,
+                        const struct bpf_linker_file_opts *opts)
 {
        struct src_obj obj = {};
        int err = 0;
 
+       if (!OPTS_VALID(opts, bpf_linker_file_opts))
+               return -EINVAL;
+
        if (!linker->elf)
                return -EINVAL;
 
-       err = err ?: linker_load_obj_file(linker, filename, &obj);
+       err = err ?: linker_load_obj_file(linker, filename, opts, &obj);
        err = err ?: linker_append_sec_data(linker, &obj);
        err = err ?: linker_append_elf_syms(linker, &obj);
        err = err ?: linker_append_elf_relos(linker, &obj);
@@ -529,7 +535,9 @@ static struct src_sec *add_src_sec(struct src_obj *obj, const char *sec_name)
        return sec;
 }
 
-static int linker_load_obj_file(struct bpf_linker *linker, const char *filename, struct src_obj *obj)
+static int linker_load_obj_file(struct bpf_linker *linker, const char *filename,
+                               const struct bpf_linker_file_opts *opts,
+                               struct src_obj *obj)
 {
 #if __BYTE_ORDER == __LITTLE_ENDIAN
        const int host_endianness = ELFDATA2LSB;