• Joe Stringer's avatar
    tools lib bpf: Fix map offsets in relocation · 94e5adec
    Joe Stringer authored
    Commit 4708bbda ("tools lib bpf: Fix maps resolution") attempted to
    fix map resolution by identifying the number of symbols that point to
    maps, and using this number to resolve each of the maps.
    
    However, during relocation the original definition of the map size was
    still in use. For up to two maps, the calculation was correct if there
    was a small difference in size between the map definition in libbpf and
    the one that the client library uses. However if the difference was
    large, particularly if more than two maps were used in the BPF program,
    the relocation would fail.
    
    For example, when using a map definition with size 28, with three maps,
    map relocation would count:
    
        (sym_offset / sizeof(struct bpf_map_def) => map_idx)
        (0 / 16 => 0), ie map_idx = 0
        (28 / 16 => 1), ie map_idx = 1
        (56 / 16 => 3), ie map_idx = 3
    
    So, libbpf reports:
    
        libbpf: bpf relocation: map_idx 3 large than 2
    
    Fix map relocation by checking the exact offset of maps when doing
    relocation.
    Signed-off-by: default avatarJoe Stringer <joe@ovn.org>
    [Allow different map size in an object]
    Signed-off-by: default avatarWang Nan <wangnan0@huawei.com>
    Cc: Alexei Starovoitov <ast@fb.com>
    Cc: Daniel Borkmann <daniel@iogearbox.net>
    Cc: netdev@vger.kernel.org
    Fixes: 4708bbda ("tools lib bpf: Fix maps resolution")
    Link: http://lkml.kernel.org/r/20170123011128.26534-2-joe@ovn.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    94e5adec
libbpf.c 33.7 KB