Em Fri, Jul 19, 2019 at 09:25:07AM -0700, Y Song escreveu:
> On Fri, Jul 19, 2019 at 7:35 AM Arnaldo Carvalho de Melo <[email protected]> 
> wrote:
> > 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.

Yeah, I wouldn't mind at all if the answer to this patch was hey, the
minimal version for building libbpf is X.Y, no problem, its just that in
this case there is an alternative that works everywhere and the
resulting source code is even more compact :-)

- Arnaldo
 
> > Acked-by: Andrii Nakryiko <[email protected]>
> > Cc: Adrian Hunter <[email protected]>
> > Cc: Alexei Starovoitov <[email protected]>
> > Cc: Daniel Borkmann <[email protected]>
> > Cc: Jiri Olsa <[email protected]>
> > Cc: Namhyung Kim <[email protected]>
> > 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/[email protected]
> > Signed-off-by: Arnaldo Carvalho de Melo <[email protected]>
> > ---
> >  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
> >

-- 

- Arnaldo

Reply via email to