Re: [RFC PATCH v5 07/30] bpf tools: Check endianess and make libbpf fail early

From: Arnaldo Carvalho de Melo
Date: Wed Jun 03 2015 - 17:52:56 EST


Em Mon, Jun 01, 2015 at 07:37:53AM +0000, Wang Nan escreveu:
> Check endianess according to EHDR. Code is taken from
> tools/perf/util/symbol-elf.c.
>
> Libbpf doesn't magically convert missmatched endianess. See discussion
> on https://lkml.org/lkml/2015/5/18/650 that, even if we swap

Please don't use URLs like this, I tried accessing this link and it
seems lkml.org is not accessible now :-\

Simply avoid having URLs like this, but if you insist, then follow the
Link: standard and use:

http://lkml.kernel.org/r/MESSAGE-ID

This way I can click on it to redirect me to some archive and if it
still doesn't work, then I can google for that message-id, but the way
you did I can't even google for the subject of that message :-\

BTW: this is what I get for lkml.org now:

504 Gateway Time-out
nginx/1.4.6 (Ubuntu)

- Arnaldo

> eBPF instructions to correct byte order, we are unable to deal with
> endianess in code logical generated by LLVM.
>
> Therefore, libbpf should simply reject missmatched ELF object, and let
> LLVM to create good code.
>
> Signed-off-by: Wang Nan <wangnan0@xxxxxxxxxx>
> Acked-by: Alexei Starovoitov <ast@xxxxxxxxxxxx>
> ---
> tools/lib/bpf/libbpf.c | 30 ++++++++++++++++++++++++++++++
> 1 file changed, 30 insertions(+)
>
> diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c
> index 0824822..5d56c40 100644
> --- a/tools/lib/bpf/libbpf.c
> +++ b/tools/lib/bpf/libbpf.c
> @@ -166,6 +166,34 @@ errout:
> return err;
> }
>
> +static int
> +bpf_object__check_endianess(struct bpf_object *obj)
> +{
> + static unsigned int const endian = 1;
> +
> + switch (obj->efile.ehdr.e_ident[EI_DATA]) {
> + case ELFDATA2LSB:
> + /* We are big endian, BPF obj is little endian. */
> + if (*(unsigned char const *)&endian != 1)
> + goto mismatch;
> + break;
> +
> + case ELFDATA2MSB:
> + /* We are little endian, BPF obj is big endian. */
> + if (*(unsigned char const *)&endian != 0)
> + goto mismatch;
> + break;
> + default:
> + return -EINVAL;
> + }
> +
> + return 0;
> +
> +mismatch:
> + pr_warning("Error: endianess mismatch.\n");
> + return -EINVAL;
> +}
> +
> struct bpf_object *bpf_object__open(const char *path)
> {
> struct bpf_object *obj;
> @@ -187,6 +215,8 @@ struct bpf_object *bpf_object__open(const char *path)
>
> if (bpf_object__elf_init(obj))
> goto out;
> + if (bpf_object__check_endianess(obj))
> + goto out;
>
> bpf_object__elf_finish(obj);
> return obj;
> --
> 1.8.3.4
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/