• Wang Nan's avatar
    perf bpf: Check relocation target section · 666810e8
    Wang Nan authored
    Libbpf should check the target section before doing relocation to ensure
    the relocation is correct. If not, a bug in LLVM causes an error. See
    [1].  Also, if an incorrect BPF script uses both global variable and
    map, global variable whould be treated as map and be relocated without
    error.
    
    This patch saves the id of the map section into obj->efile and compare
    target section of a relocation symbol against it during relocation.
    
    Previous patch introduces a test case about this problem.  After this
    patch:
    
      # ~/perf test BPF
      37: Test BPF filter                                          :
      37.1: Test basic BPF filtering                               : Ok
      37.2: Test BPF prologue generation                           : Ok
      37.3: Test BPF relocation checker                            : Ok
    
      # perf test -v BPF
      ...
      37.3: Test BPF relocation checker                            :
      ...
      libbpf: loading object '[bpf_relocation_test]' from buffer
      libbpf: section .strtab, size 126, link 0, flags 0, type=3
      libbpf: section .text, size 0, link 0, flags 6, type=1
      libbpf: section .data, size 0, link 0, flags 3, type=1
      libbpf: section .bss, size 0, link 0, flags 3, type=8
      libbpf: section func=sys_write, size 104, link 0, flags 6, type=1
      libbpf: found program func=sys_write
      libbpf: section .relfunc=sys_write, size 16, link 10, flags 0, type=9
      libbpf: section maps, size 16, link 0, flags 3, type=1
      libbpf: maps in [bpf_relocation_test]: 16 bytes
      libbpf: section license, size 4, link 0, flags 3, type=1
      libbpf: license of [bpf_relocation_test] is GPL
      libbpf: section version, size 4, link 0, flags 3, type=1
      libbpf: kernel version of [bpf_relocation_test] is 40400
      libbpf: section .symtab, size 144, link 1, flags 0, type=2
      libbpf: map 0 is "my_table"
      libbpf: collecting relocating info for: 'func=sys_write'
      libbpf: Program 'func=sys_write' contains non-map related relo data pointing to section 65522
      bpf: failed to load buffer
      Compile BPF program failed.
      test child finished with 0
      ---- end ----
      Test BPF filter subtest 2: Ok
    
    [1] https://llvm.org/bugs/show_bug.cgi?id=26243Signed-off-by: default avatarWang Nan <wangnan0@huawei.com>
    Acked-by: default avatarAlexei Starovoitov <ast@kernel.org>
    Tested-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    Cc: "David S. Miller" <davem@davemloft.net>
    Cc: Brendan Gregg <brendan.d.gregg@gmail.com>
    Cc: Daniel Borkmann <daniel@iogearbox.net>
    Cc: He Kuang <hekuang@huawei.com>
    Cc: Jiri Olsa <jolsa@kernel.org>
    Cc: Li Zefan <lizefan@huawei.com>
    Cc: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
    Cc: Namhyung Kim <namhyung@kernel.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Will Deacon <will.deacon@arm.com>
    Cc: pi3orama@163.com
    Link: http://lkml.kernel.org/r/1453715801-7732-3-git-send-email-wangnan0@huawei.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    666810e8
libbpf.c 29.7 KB