On Fri, Jul 19, 2019 at 7:35 AM Arnaldo Carvalho de Melo <acme@xxxxxxxxxx> wrote: > > From: Arnaldo Carvalho de Melo <acme@xxxxxxxxxx> > > Using endian.h and its endianness macros makes this code build in a > wider range of compilers, as some don't have those macros > (__BYTE_ORDER__, __ORDER_LITTLE_ENDIAN__, __ORDER_BIG_ENDIAN__), > so use instead endian.h's macros (__BYTE_ORDER, __LITTLE_ENDIAN, > __BIG_ENDIAN) which makes this code even shorter :-) gcc 4.6.0 starts to support __BYTE_ORDER__, __ORDER_LITTLE_ENDIAN__, etc. I guess those platforms with failing compilation have gcc < 4.6.0. Agree that for libbpf, which will be used outside kernel bpf selftest should try to compile with lower versions of gcc. > > Acked-by: Andrii Nakryiko <andriin@xxxxxx> > Cc: Adrian Hunter <adrian.hunter@xxxxxxxxx> > Cc: Alexei Starovoitov <ast@xxxxxxxxxx> > Cc: Daniel Borkmann <daniel@xxxxxxxxxxxxx> > Cc: Jiri Olsa <jolsa@xxxxxxxxxx> > Cc: Namhyung Kim <namhyung@xxxxxxxxxx> > Fixes: 12ef5634a855 ("libbpf: simplify endianness check") > Fixes: e6c64855fd7a ("libbpf: add btf__parse_elf API to load .BTF and .BTF.ext") > Link: https://lkml.kernel.org/n/tip-eep5n8vgwcdphw3uc058k03u@xxxxxxxxxxxxxx > Signed-off-by: Arnaldo Carvalho de Melo <acme@xxxxxxxxxx> > --- > tools/lib/bpf/btf.c | 5 +++-- > tools/lib/bpf/libbpf.c | 5 +++-- > 2 files changed, 6 insertions(+), 4 deletions(-) > > diff --git a/tools/lib/bpf/btf.c b/tools/lib/bpf/btf.c > index 467224feb43b..d821107f55f9 100644 > --- a/tools/lib/bpf/btf.c > +++ b/tools/lib/bpf/btf.c > @@ -1,6 +1,7 @@ > // SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) > /* Copyright (c) 2018 Facebook */ > > +#include <endian.h> > #include <stdio.h> > #include <stdlib.h> > #include <string.h> > @@ -419,9 +420,9 @@ struct btf *btf__new(__u8 *data, __u32 size) > > static bool btf_check_endianness(const GElf_Ehdr *ehdr) > { > -#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ > +#if __BYTE_ORDER == __LITTLE_ENDIAN > return ehdr->e_ident[EI_DATA] == ELFDATA2LSB; > -#elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ > +#elif __BYTE_ORDER == __BIG_ENDIAN > return ehdr->e_ident[EI_DATA] == ELFDATA2MSB; > #else > # error "Unrecognized __BYTE_ORDER__" > diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c > index 794dd5064ae8..b1dec5b1de54 100644 > --- a/tools/lib/bpf/libbpf.c > +++ b/tools/lib/bpf/libbpf.c > @@ -20,6 +20,7 @@ > #include <inttypes.h> > #include <string.h> > #include <unistd.h> > +#include <endian.h> > #include <fcntl.h> > #include <errno.h> > #include <asm/unistd.h> > @@ -612,10 +613,10 @@ static int bpf_object__elf_init(struct bpf_object *obj) > > static int bpf_object__check_endianness(struct bpf_object *obj) > { > -#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ > +#if __BYTE_ORDER == __LITTLE_ENDIAN > if (obj->efile.ehdr.e_ident[EI_DATA] == ELFDATA2LSB) > return 0; > -#elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ > +#elif __BYTE_ORDER == __BIG_ENDIAN > if (obj->efile.ehdr.e_ident[EI_DATA] == ELFDATA2MSB) > return 0; > #else > -- > 2.21.0 >