mirror of
https://github.com/netdata/libbpf.git
synced 2026-03-22 01:09:06 +08:00
libbpf: Add per-file linker opts
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
This commit is contained in:
committed by
Andrii Nakryiko
parent
c5389a965b
commit
6f585ab88f
10
src/libbpf.h
10
src/libbpf.h
@@ -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);
|
||||
|
||||
|
||||
16
src/linker.c
16
src/linker.c
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user