Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

libbpf: Add version script for DSO

More and more projects use libbpf and one day it'll likely be packaged
and distributed as DSO and that requires ABI versioning so that both
compatible and incompatible changes to ABI can be introduced in a safe
way in the future without breaking executables dynamically linked with a
previous version of the library.

Usual way to do ABI versioning is version script for the linker. Add
such a script for libbpf. All global symbols currently exported via
LIBBPF_API macro are added to the version script libbpf.map.

The version name LIBBPF_0.0.1 is constructed from the name of the
library + version specified by $(LIBBPF_VERSION) in Makefile.

Version script does not duplicate the work done by LIBBPF_API macro, it
rather complements it. The macro is used at compile time and can be used
by compiler to do optimization that can't be done at link time, it is
purely about global symbol visibility. The version script, in turn, is
used at link time and takes care of ABI versioning. Both techniques are
described in details in [1].

Whenever ABI is changed in the future, version script should be changed
appropriately.

[1] https://www.akkadia.org/drepper/dsohowto.pdf

Signed-off-by: Andrey Ignatov <rdna@fb.com>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>

authored by

Andrey Ignatov and committed by
Alexei Starovoitov
16192a77 1d2f44ca

+124 -1
+3 -1
tools/lib/bpf/Makefile
··· 145 145 146 146 BPF_IN := $(OUTPUT)libbpf-in.o 147 147 LIB_FILE := $(addprefix $(OUTPUT),$(LIB_FILE)) 148 + VERSION_SCRIPT := libbpf.map 148 149 149 150 CMD_TARGETS = $(LIB_FILE) 150 151 ··· 177 176 $(Q)$(MAKE) $(build)=libbpf 178 177 179 178 $(OUTPUT)libbpf.so: $(BPF_IN) 180 - $(QUIET_LINK)$(CC) --shared $^ -o $@ 179 + $(QUIET_LINK)$(CC) --shared -Wl,--version-script=$(VERSION_SCRIPT) \ 180 + $^ -o $@ 181 181 182 182 $(OUTPUT)libbpf.a: $(BPF_IN) 183 183 $(QUIET_LINK)$(RM) $@; $(AR) rcs $@ $^
+121
tools/lib/bpf/libbpf.map
··· 1 + LIBBPF_0.0.1 { 2 + global: 3 + bpf_btf_get_fd_by_id; 4 + bpf_create_map; 5 + bpf_create_map_in_map; 6 + bpf_create_map_in_map_node; 7 + bpf_create_map_name; 8 + bpf_create_map_node; 9 + bpf_create_map_xattr; 10 + bpf_load_btf; 11 + bpf_load_program; 12 + bpf_load_program_xattr; 13 + bpf_map__btf_key_type_id; 14 + bpf_map__btf_value_type_id; 15 + bpf_map__def; 16 + bpf_map__fd; 17 + bpf_map__is_offload_neutral; 18 + bpf_map__name; 19 + bpf_map__next; 20 + bpf_map__pin; 21 + bpf_map__prev; 22 + bpf_map__priv; 23 + bpf_map__reuse_fd; 24 + bpf_map__set_ifindex; 25 + bpf_map__set_inner_map_fd; 26 + bpf_map__set_priv; 27 + bpf_map__unpin; 28 + bpf_map_delete_elem; 29 + bpf_map_get_fd_by_id; 30 + bpf_map_get_next_id; 31 + bpf_map_get_next_key; 32 + bpf_map_lookup_and_delete_elem; 33 + bpf_map_lookup_elem; 34 + bpf_map_update_elem; 35 + bpf_obj_get; 36 + bpf_obj_get_info_by_fd; 37 + bpf_obj_pin; 38 + bpf_object__btf_fd; 39 + bpf_object__close; 40 + bpf_object__find_map_by_name; 41 + bpf_object__find_map_by_offset; 42 + bpf_object__find_program_by_title; 43 + bpf_object__kversion; 44 + bpf_object__load; 45 + bpf_object__name; 46 + bpf_object__next; 47 + bpf_object__open; 48 + bpf_object__open_buffer; 49 + bpf_object__open_xattr; 50 + bpf_object__pin; 51 + bpf_object__pin_maps; 52 + bpf_object__pin_programs; 53 + bpf_object__priv; 54 + bpf_object__set_priv; 55 + bpf_object__unload; 56 + bpf_object__unpin_maps; 57 + bpf_object__unpin_programs; 58 + bpf_perf_event_read_simple; 59 + bpf_prog_attach; 60 + bpf_prog_detach; 61 + bpf_prog_detach2; 62 + bpf_prog_get_fd_by_id; 63 + bpf_prog_get_next_id; 64 + bpf_prog_load; 65 + bpf_prog_load_xattr; 66 + bpf_prog_query; 67 + bpf_prog_test_run; 68 + bpf_program__fd; 69 + bpf_program__is_kprobe; 70 + bpf_program__is_perf_event; 71 + bpf_program__is_raw_tracepoint; 72 + bpf_program__is_sched_act; 73 + bpf_program__is_sched_cls; 74 + bpf_program__is_socket_filter; 75 + bpf_program__is_tracepoint; 76 + bpf_program__is_xdp; 77 + bpf_program__load; 78 + bpf_program__next; 79 + bpf_program__nth_fd; 80 + bpf_program__pin; 81 + bpf_program__pin_instance; 82 + bpf_program__prev; 83 + bpf_program__priv; 84 + bpf_program__set_expected_attach_type; 85 + bpf_program__set_ifindex; 86 + bpf_program__set_kprobe; 87 + bpf_program__set_perf_event; 88 + bpf_program__set_prep; 89 + bpf_program__set_priv; 90 + bpf_program__set_raw_tracepoint; 91 + bpf_program__set_sched_act; 92 + bpf_program__set_sched_cls; 93 + bpf_program__set_socket_filter; 94 + bpf_program__set_tracepoint; 95 + bpf_program__set_type; 96 + bpf_program__set_xdp; 97 + bpf_program__title; 98 + bpf_program__unload; 99 + bpf_program__unpin; 100 + bpf_program__unpin_instance; 101 + bpf_raw_tracepoint_open; 102 + bpf_set_link_xdp_fd; 103 + bpf_task_fd_query; 104 + bpf_verify_program; 105 + btf__fd; 106 + btf__find_by_name; 107 + btf__free; 108 + btf__get_from_id; 109 + btf__name_by_offset; 110 + btf__new; 111 + btf__resolve_size; 112 + btf__resolve_type; 113 + btf__type_by_id; 114 + libbpf_attach_type_by_name; 115 + libbpf_get_error; 116 + libbpf_prog_type_by_name; 117 + libbpf_set_print; 118 + libbpf_strerror; 119 + local: 120 + *; 121 + };