Skip to content

Commit 006a509

Browse files
anakryikoAlexei Starovoitov
authored andcommitted
libbpf: Fix build with latest gcc/binutils with LTO
After updating to binutils 2.35, the build began to fail with an assembler error. A bug was opened on the Red Hat Bugzilla a few days later for the same issue. Work around the problem by using the new `symver` attribute (introduced in GCC 10) as needed instead of assembler directives. This addresses Red Hat ([0]) and OpenSUSE ([1]) bug reports, as well as libbpf issue ([2]). [0]: https://bugzilla.redhat.com/show_bug.cgi?id=1863059 [1]: https://bugzilla.opensuse.org/show_bug.cgi?id=1188749 [2]: Closes: libbpf/libbpf#338 Co-developed-by: Patrick McCarty <patrick.mccarty@intel.com> Co-developed-by: Michal Suchanek <msuchanek@suse.de> Signed-off-by: Patrick McCarty <patrick.mccarty@intel.com> Signed-off-by: Michal Suchanek <msuchanek@suse.de> Signed-off-by: Andrii Nakryiko <andrii@kernel.org> Signed-off-by: Alexei Starovoitov <ast@kernel.org> Link: https://lore.kernel.org/bpf/20210907221023.2660953-1-andrii@kernel.org
1 parent d6be594 commit 006a509

File tree

2 files changed

+21
-8
lines changed

2 files changed

+21
-8
lines changed

tools/lib/bpf/libbpf_internal.h

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -90,17 +90,30 @@
9090
/* Symbol versioning is different between static and shared library.
9191
* Properly versioned symbols are needed for shared library, but
9292
* only the symbol of the new version is needed for static library.
93+
* Starting with GNU C 10, use symver attribute instead of .symver assembler
94+
* directive, which works better with GCC LTO builds.
9395
*/
94-
#ifdef SHARED
95-
# define COMPAT_VERSION(internal_name, api_name, version) \
96+
#if defined(SHARED) && defined(__GNUC__) && __GNUC__ >= 10
97+
98+
#define DEFAULT_VERSION(internal_name, api_name, version) \
99+
__attribute__((symver(#api_name "@@" #version)))
100+
#define COMPAT_VERSION(internal_name, api_name, version) \
101+
__attribute__((symver(#api_name "@" #version)))
102+
103+
#elif defined(SHARED)
104+
105+
#define COMPAT_VERSION(internal_name, api_name, version) \
96106
asm(".symver " #internal_name "," #api_name "@" #version);
97-
# define DEFAULT_VERSION(internal_name, api_name, version) \
107+
#define DEFAULT_VERSION(internal_name, api_name, version) \
98108
asm(".symver " #internal_name "," #api_name "@@" #version);
99-
#else
100-
# define COMPAT_VERSION(internal_name, api_name, version)
101-
# define DEFAULT_VERSION(internal_name, api_name, version) \
109+
110+
#else /* !SHARED */
111+
112+
#define COMPAT_VERSION(internal_name, api_name, version)
113+
#define DEFAULT_VERSION(internal_name, api_name, version) \
102114
extern typeof(internal_name) api_name \
103115
__attribute__((alias(#internal_name)));
116+
104117
#endif
105118

106119
extern void libbpf_print(enum libbpf_print_level level,

tools/lib/bpf/xsk.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -281,6 +281,7 @@ static int xsk_create_umem_rings(struct xsk_umem *umem, int fd,
281281
return err;
282282
}
283283

284+
DEFAULT_VERSION(xsk_umem__create_v0_0_4, xsk_umem__create, LIBBPF_0.0.4)
284285
int xsk_umem__create_v0_0_4(struct xsk_umem **umem_ptr, void *umem_area,
285286
__u64 size, struct xsk_ring_prod *fill,
286287
struct xsk_ring_cons *comp,
@@ -345,6 +346,7 @@ struct xsk_umem_config_v1 {
345346
__u32 frame_headroom;
346347
};
347348

349+
COMPAT_VERSION(xsk_umem__create_v0_0_2, xsk_umem__create, LIBBPF_0.0.2)
348350
int xsk_umem__create_v0_0_2(struct xsk_umem **umem_ptr, void *umem_area,
349351
__u64 size, struct xsk_ring_prod *fill,
350352
struct xsk_ring_cons *comp,
@@ -358,8 +360,6 @@ int xsk_umem__create_v0_0_2(struct xsk_umem **umem_ptr, void *umem_area,
358360
return xsk_umem__create_v0_0_4(umem_ptr, umem_area, size, fill, comp,
359361
&config);
360362
}
361-
COMPAT_VERSION(xsk_umem__create_v0_0_2, xsk_umem__create, LIBBPF_0.0.2)
362-
DEFAULT_VERSION(xsk_umem__create_v0_0_4, xsk_umem__create, LIBBPF_0.0.4)
363363

364364
static enum xsk_prog get_xsk_prog(void)
365365
{

0 commit comments

Comments
 (0)