Commit ab9e0848 authored by Andrey Ignatov's avatar Andrey Ignatov Committed by Alexei Starovoitov

libbpf: Per-symbol visibility for DSO

Make global symbols in libbpf DSO hidden by default with
-fvisibility=hidden and export symbols that are part of ABI explicitly
with __attribute__((visibility("default"))).

This is common practice that should prevent from accidentally exporting
a symbol, that is not supposed to be a part of ABI what, in turn,
improves both libbpf developer- and user-experiences. See [1] for more
details.

Export control becomes more important since more and more projects use
libbpf.

The patch doesn't export a bunch of netlink related functions since as
agreed in [2] they'll be reworked. That doesn't break bpftool since
bpftool links libbpf statically.

[1] https://www.akkadia.org/drepper/dsohowto.pdf (2.2 Export Control)
[2] https://www.mail-archive.com/netdev@vger.kernel.org/msg251434.htmlSigned-off-by: default avatarAndrey Ignatov <rdna@fb.com>
Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
parent 421f4292
...@@ -125,6 +125,7 @@ override CFLAGS += $(EXTRA_WARNINGS) ...@@ -125,6 +125,7 @@ override CFLAGS += $(EXTRA_WARNINGS)
override CFLAGS += -Werror -Wall override CFLAGS += -Werror -Wall
override CFLAGS += -fPIC override CFLAGS += -fPIC
override CFLAGS += $(INCLUDES) override CFLAGS += $(INCLUDES)
override CFLAGS += -fvisibility=hidden
ifeq ($(VERBOSE),1) ifeq ($(VERBOSE),1)
Q = Q =
......
...@@ -27,6 +27,10 @@ ...@@ -27,6 +27,10 @@
#include <stdbool.h> #include <stdbool.h>
#include <stddef.h> #include <stddef.h>
#ifndef LIBBPF_API
#define LIBBPF_API __attribute__((visibility("default")))
#endif
struct bpf_create_map_attr { struct bpf_create_map_attr {
const char *name; const char *name;
enum bpf_map_type map_type; enum bpf_map_type map_type;
...@@ -42,21 +46,24 @@ struct bpf_create_map_attr { ...@@ -42,21 +46,24 @@ struct bpf_create_map_attr {
__u32 inner_map_fd; __u32 inner_map_fd;
}; };
int bpf_create_map_xattr(const struct bpf_create_map_attr *create_attr); LIBBPF_API int
int bpf_create_map_node(enum bpf_map_type map_type, const char *name, bpf_create_map_xattr(const struct bpf_create_map_attr *create_attr);
int key_size, int value_size, int max_entries, LIBBPF_API int bpf_create_map_node(enum bpf_map_type map_type, const char *name,
__u32 map_flags, int node); int key_size, int value_size,
int bpf_create_map_name(enum bpf_map_type map_type, const char *name, int max_entries, __u32 map_flags, int node);
int key_size, int value_size, int max_entries, LIBBPF_API int bpf_create_map_name(enum bpf_map_type map_type, const char *name,
__u32 map_flags); int key_size, int value_size,
int bpf_create_map(enum bpf_map_type map_type, int key_size, int value_size, int max_entries, __u32 map_flags);
int max_entries, __u32 map_flags); LIBBPF_API int bpf_create_map(enum bpf_map_type map_type, int key_size,
int bpf_create_map_in_map_node(enum bpf_map_type map_type, const char *name, int value_size, int max_entries, __u32 map_flags);
int key_size, int inner_map_fd, int max_entries, LIBBPF_API int bpf_create_map_in_map_node(enum bpf_map_type map_type,
__u32 map_flags, int node); const char *name, int key_size,
int bpf_create_map_in_map(enum bpf_map_type map_type, const char *name, int inner_map_fd, int max_entries,
int key_size, int inner_map_fd, int max_entries, __u32 map_flags, int node);
__u32 map_flags); LIBBPF_API int bpf_create_map_in_map(enum bpf_map_type map_type,
const char *name, int key_size,
int inner_map_fd, int max_entries,
__u32 map_flags);
struct bpf_load_program_attr { struct bpf_load_program_attr {
enum bpf_prog_type prog_type; enum bpf_prog_type prog_type;
...@@ -74,44 +81,49 @@ struct bpf_load_program_attr { ...@@ -74,44 +81,49 @@ struct bpf_load_program_attr {
/* Recommend log buffer size */ /* Recommend log buffer size */
#define BPF_LOG_BUF_SIZE (256 * 1024) #define BPF_LOG_BUF_SIZE (256 * 1024)
int bpf_load_program_xattr(const struct bpf_load_program_attr *load_attr, LIBBPF_API int
char *log_buf, size_t log_buf_sz); bpf_load_program_xattr(const struct bpf_load_program_attr *load_attr,
int bpf_load_program(enum bpf_prog_type type, const struct bpf_insn *insns, char *log_buf, size_t log_buf_sz);
size_t insns_cnt, const char *license, LIBBPF_API int bpf_load_program(enum bpf_prog_type type,
__u32 kern_version, char *log_buf, const struct bpf_insn *insns, size_t insns_cnt,
size_t log_buf_sz); const char *license, __u32 kern_version,
int bpf_verify_program(enum bpf_prog_type type, const struct bpf_insn *insns, char *log_buf, size_t log_buf_sz);
size_t insns_cnt, int strict_alignment, LIBBPF_API int bpf_verify_program(enum bpf_prog_type type,
const char *license, __u32 kern_version, const struct bpf_insn *insns,
char *log_buf, size_t log_buf_sz, int log_level); size_t insns_cnt, int strict_alignment,
const char *license, __u32 kern_version,
char *log_buf, size_t log_buf_sz,
int log_level);
int bpf_map_update_elem(int fd, const void *key, const void *value, LIBBPF_API int bpf_map_update_elem(int fd, const void *key, const void *value,
__u64 flags); __u64 flags);
int bpf_map_lookup_elem(int fd, const void *key, void *value); LIBBPF_API int bpf_map_lookup_elem(int fd, const void *key, void *value);
int bpf_map_delete_elem(int fd, const void *key); LIBBPF_API int bpf_map_delete_elem(int fd, const void *key);
int bpf_map_get_next_key(int fd, const void *key, void *next_key); LIBBPF_API int bpf_map_get_next_key(int fd, const void *key, void *next_key);
int bpf_obj_pin(int fd, const char *pathname); LIBBPF_API int bpf_obj_pin(int fd, const char *pathname);
int bpf_obj_get(const char *pathname); LIBBPF_API int bpf_obj_get(const char *pathname);
int bpf_prog_attach(int prog_fd, int attachable_fd, enum bpf_attach_type type, LIBBPF_API int bpf_prog_attach(int prog_fd, int attachable_fd,
unsigned int flags); enum bpf_attach_type type, unsigned int flags);
int bpf_prog_detach(int attachable_fd, enum bpf_attach_type type); LIBBPF_API int bpf_prog_detach(int attachable_fd, enum bpf_attach_type type);
int bpf_prog_detach2(int prog_fd, int attachable_fd, enum bpf_attach_type type); LIBBPF_API int bpf_prog_detach2(int prog_fd, int attachable_fd,
int bpf_prog_test_run(int prog_fd, int repeat, void *data, __u32 size, enum bpf_attach_type type);
void *data_out, __u32 *size_out, __u32 *retval, LIBBPF_API int bpf_prog_test_run(int prog_fd, int repeat, void *data,
__u32 *duration); __u32 size, void *data_out, __u32 *size_out,
int bpf_prog_get_next_id(__u32 start_id, __u32 *next_id); __u32 *retval, __u32 *duration);
int bpf_map_get_next_id(__u32 start_id, __u32 *next_id); LIBBPF_API int bpf_prog_get_next_id(__u32 start_id, __u32 *next_id);
int bpf_prog_get_fd_by_id(__u32 id); LIBBPF_API int bpf_map_get_next_id(__u32 start_id, __u32 *next_id);
int bpf_map_get_fd_by_id(__u32 id); LIBBPF_API int bpf_prog_get_fd_by_id(__u32 id);
int bpf_btf_get_fd_by_id(__u32 id); LIBBPF_API int bpf_map_get_fd_by_id(__u32 id);
int bpf_obj_get_info_by_fd(int prog_fd, void *info, __u32 *info_len); LIBBPF_API int bpf_btf_get_fd_by_id(__u32 id);
int bpf_prog_query(int target_fd, enum bpf_attach_type type, __u32 query_flags, LIBBPF_API int bpf_obj_get_info_by_fd(int prog_fd, void *info, __u32 *info_len);
__u32 *attach_flags, __u32 *prog_ids, __u32 *prog_cnt); LIBBPF_API int bpf_prog_query(int target_fd, enum bpf_attach_type type,
int bpf_raw_tracepoint_open(const char *name, int prog_fd); __u32 query_flags, __u32 *attach_flags,
int bpf_load_btf(void *btf, __u32 btf_size, char *log_buf, __u32 log_buf_size, __u32 *prog_ids, __u32 *prog_cnt);
bool do_log); LIBBPF_API int bpf_raw_tracepoint_open(const char *name, int prog_fd);
int bpf_task_fd_query(int pid, int fd, __u32 flags, char *buf, __u32 *buf_len, LIBBPF_API int bpf_load_btf(void *btf, __u32 btf_size, char *log_buf,
__u32 *prog_id, __u32 *fd_type, __u64 *probe_offset, __u32 log_buf_size, bool do_log);
__u64 *probe_addr); LIBBPF_API int bpf_task_fd_query(int pid, int fd, __u32 flags, char *buf,
__u32 *buf_len, __u32 *prog_id, __u32 *fd_type,
__u64 *probe_offset, __u64 *probe_addr);
#endif /* __LIBBPF_BPF_H */ #endif /* __LIBBPF_BPF_H */
...@@ -6,6 +6,10 @@ ...@@ -6,6 +6,10 @@
#include <linux/types.h> #include <linux/types.h>
#ifndef LIBBPF_API
#define LIBBPF_API __attribute__((visibility("default")))
#endif
#define BTF_ELF_SEC ".BTF" #define BTF_ELF_SEC ".BTF"
struct btf; struct btf;
...@@ -14,13 +18,15 @@ struct btf_type; ...@@ -14,13 +18,15 @@ struct btf_type;
typedef int (*btf_print_fn_t)(const char *, ...) typedef int (*btf_print_fn_t)(const char *, ...)
__attribute__((format(printf, 1, 2))); __attribute__((format(printf, 1, 2)));
void btf__free(struct btf *btf); LIBBPF_API void btf__free(struct btf *btf);
struct btf *btf__new(__u8 *data, __u32 size, btf_print_fn_t err_log); LIBBPF_API struct btf *btf__new(__u8 *data, __u32 size, btf_print_fn_t err_log);
__s32 btf__find_by_name(const struct btf *btf, const char *type_name); LIBBPF_API __s32 btf__find_by_name(const struct btf *btf,
const struct btf_type *btf__type_by_id(const struct btf *btf, __u32 id); const char *type_name);
__s64 btf__resolve_size(const struct btf *btf, __u32 type_id); LIBBPF_API const struct btf_type *btf__type_by_id(const struct btf *btf,
int btf__resolve_type(const struct btf *btf, __u32 type_id); __u32 id);
int btf__fd(const struct btf *btf); LIBBPF_API __s64 btf__resolve_size(const struct btf *btf, __u32 type_id);
const char *btf__name_by_offset(const struct btf *btf, __u32 offset); LIBBPF_API int btf__resolve_type(const struct btf *btf, __u32 type_id);
LIBBPF_API int btf__fd(const struct btf *btf);
LIBBPF_API const char *btf__name_by_offset(const struct btf *btf, __u32 offset);
#endif /* __LIBBPF_BTF_H */ #endif /* __LIBBPF_BTF_H */
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment