bpftool: Provide a helper method for accessing skeleton's embedded ELF data
This adds a skeleton method X__elf_bytes() which returns the binary data of the compiled and embedded BPF object file. It additionally sets the size of the return data to the provided size_t pointer argument. The assignment to s->data is cast to void * to ensure no warning is issued if compiled with a previous version of libbpf where the bpf_object_skeleton field is void * instead of const void * Signed-off-by: Matt Smith <alastorze@fb.com> Signed-off-by: Andrii Nakryiko <andrii@kernel.org> Link: https://lore.kernel.org/bpf/20210901194439.3853238-3-alastorze@fb.com
This commit is contained in:
parent
08a6f22ef6
commit
a6cc6b34b9
|
@ -238,8 +238,8 @@ static void codegen(const char *template, ...)
|
|||
} else if (c == '\n') {
|
||||
break;
|
||||
} else {
|
||||
p_err("unrecognized character at pos %td in template '%s'",
|
||||
src - template - 1, template);
|
||||
p_err("unrecognized character at pos %td in template '%s': '%c'",
|
||||
src - template - 1, template, c);
|
||||
free(s);
|
||||
exit(-1);
|
||||
}
|
||||
|
@ -406,7 +406,7 @@ static void codegen_destroy(struct bpf_object *obj, const char *obj_name)
|
|||
}
|
||||
|
||||
bpf_object__for_each_map(map, obj) {
|
||||
const char * ident;
|
||||
const char *ident;
|
||||
|
||||
ident = get_map_ident(map);
|
||||
if (!ident)
|
||||
|
@ -862,6 +862,8 @@ static int do_skeleton(int argc, char **argv)
|
|||
codegen("\
|
||||
\n\
|
||||
\n\
|
||||
static inline const void *%1$s__elf_bytes(size_t *sz); \n\
|
||||
\n\
|
||||
static inline int \n\
|
||||
%1$s__create_skeleton(struct %1$s *obj) \n\
|
||||
{ \n\
|
||||
|
@ -943,10 +945,20 @@ static int do_skeleton(int argc, char **argv)
|
|||
codegen("\
|
||||
\n\
|
||||
\n\
|
||||
s->data_sz = %d; \n\
|
||||
s->data = (void *)\"\\ \n\
|
||||
",
|
||||
file_sz);
|
||||
s->data = (void *)%2$s__elf_bytes(&s->data_sz); \n\
|
||||
\n\
|
||||
return 0; \n\
|
||||
err: \n\
|
||||
bpf_object__destroy_skeleton(s); \n\
|
||||
return -ENOMEM; \n\
|
||||
} \n\
|
||||
\n\
|
||||
static inline const void *%2$s__elf_bytes(size_t *sz) \n\
|
||||
{ \n\
|
||||
*sz = %1$d; \n\
|
||||
return (const void *)\"\\ \n\
|
||||
"
|
||||
, file_sz, obj_name);
|
||||
|
||||
/* embed contents of BPF object file */
|
||||
print_hex(obj_data, file_sz);
|
||||
|
@ -954,11 +966,6 @@ static int do_skeleton(int argc, char **argv)
|
|||
codegen("\
|
||||
\n\
|
||||
\"; \n\
|
||||
\n\
|
||||
return 0; \n\
|
||||
err: \n\
|
||||
bpf_object__destroy_skeleton(s); \n\
|
||||
return -ENOMEM; \n\
|
||||
} \n\
|
||||
\n\
|
||||
#endif /* %s */ \n\
|
||||
|
|
Loading…
Reference in New Issue