mirror of https://gitee.com/openkylin/linux.git
tools/bpftool: Generate data section struct with conservative alignment
The comment in the code describes this in good details. Generate such a memory layout that would work both on 32-bit and 64-bit architectures for user-space. Signed-off-by: Andrii Nakryiko <andriin@fb.com> Signed-off-by: Alexei Starovoitov <ast@kernel.org> Link: https://lore.kernel.org/bpf/20200813204945.1020225-9-andriin@fb.com
This commit is contained in:
parent
5705d70583
commit
0f993845d7
|
@ -143,6 +143,20 @@ static int codegen_datasec_def(struct bpf_object *obj,
|
||||||
var_name, align);
|
var_name, align);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
/* Assume 32-bit architectures when generating data section
|
||||||
|
* struct memory layout. Given bpftool can't know which target
|
||||||
|
* host architecture it's emitting skeleton for, we need to be
|
||||||
|
* conservative and assume 32-bit one to ensure enough padding
|
||||||
|
* bytes are generated for pointer and long types. This will
|
||||||
|
* still work correctly for 64-bit architectures, because in
|
||||||
|
* the worst case we'll generate unnecessary padding field,
|
||||||
|
* which on 64-bit architectures is not strictly necessary and
|
||||||
|
* would be handled by natural 8-byte alignment. But it still
|
||||||
|
* will be a correct memory layout, based on recorded offsets
|
||||||
|
* in BTF.
|
||||||
|
*/
|
||||||
|
if (align > 4)
|
||||||
|
align = 4;
|
||||||
|
|
||||||
align_off = (off + align - 1) / align * align;
|
align_off = (off + align - 1) / align * align;
|
||||||
if (align_off != need_off) {
|
if (align_off != need_off) {
|
||||||
|
|
Loading…
Reference in New Issue