• Wang Nan's avatar
    tools lib bpf: Fetch map names from correct strtab · 77ba9a5b
    Wang Nan authored
    Namhyung Kim pointed out a potential problem in original code that it
    fetches names of maps from section header string table, which is used
    to store section names.
    
    Original code doesn't cause error because of a LLVM behavior that, it
    combines shstrtab into strtab. For example:
    
     $ echo 'int func() {return 0;}' | x86_64-oe-linux-clang -x c -o temp.o -c -
     $ readelf -h ./temp.o
     ELF Header:
       Magic:   7f 45 4c 46 02 01 01 03 00 00 00 00 00 00 00 00
       ...
       Section header string table index: 1
     $ readelf -S ./temp.o
     There are 10 section headers, starting at offset 0x288:
    
     Section Headers:
       [Nr] Name              Type             Address           Offset
            Size              EntSize          Flags  Link  Info  Align
       [ 0]                   NULL             0000000000000000  00000000
            0000000000000000  0000000000000000           0     0     0
       [ 1] .strtab           STRTAB           0000000000000000  00000230
            0000000000000051  0000000000000000           0     0     1
            ...
     $ readelf -p .strtab ./temp.o
    
     String dump of section '.strtab':
       [     1]  .text
       [     7]  .comment
       [    10]  .bss
       [    15]  .note.GNU-stack
       [    25]  .rela.eh_frame
       [    34]  func
       [    39]  .strtab
       [    41]  .symtab
       [    49]  .data
       [    4f]  -
    
     $ readelf -p .shstrtab ./temp.o
     readelf: Warning: Section '.shstrtab' was not dumped because it does not exist!
    
    Where, 'section header string table index' points to '.strtab', and
    symbol names are also stored there.
    
    However, in case of gcc:
    
     $ echo 'int func() {return 0;}' | gcc -x c -o temp.o -c -
     $ readelf -p .shstrtab ./temp.o
    
     String dump of section '.shstrtab':
       [     1]  .symtab
       [     9]  .strtab
       [    11]  .shstrtab
       [    1b]  .text
       [    21]  .data
       [    27]  .bss
       [    2c]  .comment
       [    35]  .note.GNU-stack
       [    45]  .rela.eh_frame
     $ readelf -p .strtab ./temp.o
    
     String dump of section '.strtab':
       [     1]  func
    
    They are separated sections.
    
    Although original code doesn't cause error, we'd better use canonical
    method for fetching symbol names to avoid potential behavior changing.
    This patch learns from readelf's code, fetches string from sh_link
    of .symbol section.
    Signed-off-by: default avatarWang Nan <wangnan0@huawei.com>
    Reported-and-Acked-by: default avatarNamhyung Kim <namhyung@kernel.org>
    Cc: Zefan Li <lizefan@huawei.com>
    Cc: pi3orama@163.com
    Link: http://lkml.kernel.org/r/1449541544-67621-3-git-send-email-wangnan0@huawei.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    77ba9a5b
libbpf.c 29.4 KB