bpftool: Align output skeleton ELF code
authorIan Rogers <irogers@google.com>
Sat, 7 Oct 2023 04:44:38 +0000 (21:44 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 10 Jan 2024 16:16:54 +0000 (17:16 +0100)
[ Upstream commit 23671f4dfd10b48b4a2fee4768886f0d8ec55b7e ]

libbpf accesses the ELF data requiring at least 8 byte alignment,
however, the data is generated into a C string that doesn't guarantee
alignment. Fix this by assigning to an aligned char array. Use sizeof
on the array, less one for the \0 terminator, rather than generating a
constant.

Fixes: a6cc6b34b93e ("bpftool: Provide a helper method for accessing skeleton's embedded ELF data")
Signed-off-by: Ian Rogers <irogers@google.com>
Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
Reviewed-by: Alan Maguire <alan.maguire@oracle.com>
Acked-by: Quentin Monnet <quentin@isovalent.com>
Link: https://lore.kernel.org/bpf/20231007044439.25171-1-irogers@google.com
Signed-off-by: Sasha Levin <sashal@kernel.org>
tools/bpf/bpftool/gen.c

index 04c4774..882bf8e 100644 (file)
@@ -1209,7 +1209,7 @@ static int do_skeleton(int argc, char **argv)
        codegen("\
                \n\
                                                                            \n\
-                       s->data = %2$s__elf_bytes(&s->data_sz);             \n\
+                       s->data = %1$s__elf_bytes(&s->data_sz);             \n\
                                                                            \n\
                        obj->skeleton = s;                                  \n\
                        return 0;                                           \n\
@@ -1218,12 +1218,12 @@ static int do_skeleton(int argc, char **argv)
                        return err;                                         \n\
                }                                                           \n\
                                                                            \n\
-               static inline const void *%2$s__elf_bytes(size_t *sz)       \n\
+               static inline const void *%1$s__elf_bytes(size_t *sz)       \n\
                {                                                           \n\
-                       *sz = %1$d;                                         \n\
-                       return (const void *)\"\\                           \n\
-               "
-               , file_sz, obj_name);
+                       static const char data[] __attribute__((__aligned__(8))) = \"\\\n\
+               ",
+               obj_name
+       );
 
        /* embed contents of BPF object file */
        print_hex(obj_data, file_sz);
@@ -1231,6 +1231,9 @@ static int do_skeleton(int argc, char **argv)
        codegen("\
                \n\
                \";                                                         \n\
+                                                                           \n\
+                       *sz = sizeof(data) - 1;                             \n\
+                       return (const void *)data;                          \n\
                }                                                           \n\
                                                                            \n\
                #ifdef __cplusplus                                          \n\