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: https://github.com/libbpf/libbpf/issues/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
This commit is contained in:
committed by
Alexei Starovoitov
parent
d6be5947ef
commit
006a5099fc
@@ -90,17 +90,30 @@
|
|||||||
/* Symbol versioning is different between static and shared library.
|
/* Symbol versioning is different between static and shared library.
|
||||||
* Properly versioned symbols are needed for shared library, but
|
* Properly versioned symbols are needed for shared library, but
|
||||||
* only the symbol of the new version is needed for static library.
|
* only the symbol of the new version is needed for static library.
|
||||||
|
* Starting with GNU C 10, use symver attribute instead of .symver assembler
|
||||||
|
* directive, which works better with GCC LTO builds.
|
||||||
*/
|
*/
|
||||||
#ifdef SHARED
|
#if defined(SHARED) && defined(__GNUC__) && __GNUC__ >= 10
|
||||||
# define COMPAT_VERSION(internal_name, api_name, version) \
|
|
||||||
|
#define DEFAULT_VERSION(internal_name, api_name, version) \
|
||||||
|
__attribute__((symver(#api_name "@@" #version)))
|
||||||
|
#define COMPAT_VERSION(internal_name, api_name, version) \
|
||||||
|
__attribute__((symver(#api_name "@" #version)))
|
||||||
|
|
||||||
|
#elif defined(SHARED)
|
||||||
|
|
||||||
|
#define COMPAT_VERSION(internal_name, api_name, version) \
|
||||||
asm(".symver " #internal_name "," #api_name "@" #version);
|
asm(".symver " #internal_name "," #api_name "@" #version);
|
||||||
# define DEFAULT_VERSION(internal_name, api_name, version) \
|
#define DEFAULT_VERSION(internal_name, api_name, version) \
|
||||||
asm(".symver " #internal_name "," #api_name "@@" #version);
|
asm(".symver " #internal_name "," #api_name "@@" #version);
|
||||||
#else
|
|
||||||
# define COMPAT_VERSION(internal_name, api_name, version)
|
#else /* !SHARED */
|
||||||
# define DEFAULT_VERSION(internal_name, api_name, version) \
|
|
||||||
|
#define COMPAT_VERSION(internal_name, api_name, version)
|
||||||
|
#define DEFAULT_VERSION(internal_name, api_name, version) \
|
||||||
extern typeof(internal_name) api_name \
|
extern typeof(internal_name) api_name \
|
||||||
__attribute__((alias(#internal_name)));
|
__attribute__((alias(#internal_name)));
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
extern void libbpf_print(enum libbpf_print_level level,
|
extern void libbpf_print(enum libbpf_print_level level,
|
||||||
|
|||||||
@@ -281,6 +281,7 @@ out_mmap:
|
|||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DEFAULT_VERSION(xsk_umem__create_v0_0_4, xsk_umem__create, LIBBPF_0.0.4)
|
||||||
int xsk_umem__create_v0_0_4(struct xsk_umem **umem_ptr, void *umem_area,
|
int xsk_umem__create_v0_0_4(struct xsk_umem **umem_ptr, void *umem_area,
|
||||||
__u64 size, struct xsk_ring_prod *fill,
|
__u64 size, struct xsk_ring_prod *fill,
|
||||||
struct xsk_ring_cons *comp,
|
struct xsk_ring_cons *comp,
|
||||||
@@ -345,6 +346,7 @@ struct xsk_umem_config_v1 {
|
|||||||
__u32 frame_headroom;
|
__u32 frame_headroom;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
COMPAT_VERSION(xsk_umem__create_v0_0_2, xsk_umem__create, LIBBPF_0.0.2)
|
||||||
int xsk_umem__create_v0_0_2(struct xsk_umem **umem_ptr, void *umem_area,
|
int xsk_umem__create_v0_0_2(struct xsk_umem **umem_ptr, void *umem_area,
|
||||||
__u64 size, struct xsk_ring_prod *fill,
|
__u64 size, struct xsk_ring_prod *fill,
|
||||||
struct xsk_ring_cons *comp,
|
struct xsk_ring_cons *comp,
|
||||||
@@ -358,8 +360,6 @@ int xsk_umem__create_v0_0_2(struct xsk_umem **umem_ptr, void *umem_area,
|
|||||||
return xsk_umem__create_v0_0_4(umem_ptr, umem_area, size, fill, comp,
|
return xsk_umem__create_v0_0_4(umem_ptr, umem_area, size, fill, comp,
|
||||||
&config);
|
&config);
|
||||||
}
|
}
|
||||||
COMPAT_VERSION(xsk_umem__create_v0_0_2, xsk_umem__create, LIBBPF_0.0.2)
|
|
||||||
DEFAULT_VERSION(xsk_umem__create_v0_0_4, xsk_umem__create, LIBBPF_0.0.4)
|
|
||||||
|
|
||||||
static enum xsk_prog get_xsk_prog(void)
|
static enum xsk_prog get_xsk_prog(void)
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user