Skip to content

Commit 16192a7

Browse files
rdnaAlexei Starovoitov
authored andcommitted
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>
1 parent 1d2f44c commit 16192a7

File tree

2 files changed

+124
-1
lines changed

2 files changed

+124
-1
lines changed

tools/lib/bpf/Makefile

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,7 @@ include $(srctree)/tools/build/Makefile.include
145145

146146
BPF_IN := $(OUTPUT)libbpf-in.o
147147
LIB_FILE := $(addprefix $(OUTPUT),$(LIB_FILE))
148+
VERSION_SCRIPT := libbpf.map
148149

149150
CMD_TARGETS = $(LIB_FILE)
150151

@@ -176,7 +177,8 @@ $(BPF_IN): force elfdep bpfdep
176177
$(Q)$(MAKE) $(build)=libbpf
177178

178179
$(OUTPUT)libbpf.so: $(BPF_IN)
179-
$(QUIET_LINK)$(CC) --shared $^ -o $@
180+
$(QUIET_LINK)$(CC) --shared -Wl,--version-script=$(VERSION_SCRIPT) \
181+
$^ -o $@
180182

181183
$(OUTPUT)libbpf.a: $(BPF_IN)
182184
$(QUIET_LINK)$(RM) $@; $(AR) rcs $@ $^

tools/lib/bpf/libbpf.map

Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
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+
};

0 commit comments

Comments
 (0)