@@ -755,7 +755,13 @@ static int btf_elf__write(const char *filename, struct btf *btf)
* This actually happens in practice with vmlinux which has .strtab
* after .shstrtab, resulting in a (small) hole the size of the original
* .shstrtab.
+ *
+ * We'll align .BTF to 8 bytes to cater for all architectures. It'd be
+ * nice if we could fetch this value from somewhere. The BTF
+ * specification does not discuss alignment and its trailing string
+ * table is not currently padded to any particular alignment.
*/
+ const size_t btf_alignment = 8;
/*
* First we look if there was already a .BTF section present and
@@ -848,8 +854,8 @@ static int btf_elf__write(const char *filename, struct btf *btf)
elf_flagdata(btf_data, ELF_C_SET, ELF_F_DIRTY);
/* Update .BTF section in the SHT */
- size_t new_btf_offset = high_water_mark;
- size_t new_btf_size = raw_btf_size;
+ size_t new_btf_offset = roundup(high_water_mark, btf_alignment);
+ size_t new_btf_size = roundup(raw_btf_size, btf_alignment);
GElf_Shdr btf_shdr_mem;
GElf_Shdr *btf_shdr = gelf_getshdr(btf_scn, &btf_shdr_mem);
if (!btf_shdr) {
@@ -857,6 +863,7 @@ static int btf_elf__write(const char *filename, struct btf *btf)
__func__, elf_errmsg(elf_errno()));
goto out;
}
+ btf_shdr->sh_addralign = btf_alignment;
btf_shdr->sh_entsize = 0;
btf_shdr->sh_flags = 0;
if (dot_btf_offset)
This is to avoid misaligned access to BTF type structs when memory-mapping ELF sections. Signed-off-by: Giuliano Procida <gprocida@google.com> --- libbtf.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-)