• Tiezhu Yang's avatar
    objtool: Check local label in add_dead_ends() · d5ab2bc3
    Tiezhu Yang authored
    When update the latest upstream gcc and binutils, it generates more
    objtool warnings on LoongArch, like this:
    
      init/main.o: warning: objtool: unexpected relocation symbol type in .rela.discard.unreachable
    
    We can see that the reloc sym name is local label instead of section in
    relocation section '.rela.discard.unreachable', in this case, the reloc
    sym type is STT_NOTYPE instead of STT_SECTION.
    
    As suggested by Peter Zijlstra, we add a "local_label" member in struct
    symbol, then set it as true if symbol type is STT_NOTYPE and symbol name
    starts with ".L" string in classify_symbols().
    
    Let's check reloc->sym->local_label to not return -1 in add_dead_ends(),
    and also use reloc->sym->offset instead of reloc addend which is 0 to
    find the corresponding instruction. At the same time, let's replace the
    variable "addend" with "offset" to reflect the reality.
    
    Here are some detailed info:
    [fedora@linux 6.8.test]$ gcc --version
    gcc (GCC) 14.0.1 20240129 (experimental)
    [fedora@linux 6.8.test]$ as --version
    GNU assembler (GNU Binutils) 2.42.50.20240129
    [fedora@linux 6.8.test]$ readelf -r init/main.o | grep -A 2 "rela.discard.unreachable"
    Relocation section '.rela.discard.unreachable' at offset 0x6028 contains 1 entry:
      Offset          Info           Type           Sym. Value    Sym. Name + Addend
    000000000000  00d900000063 R_LARCH_32_PCREL  00000000000002c4 .L500^B1 + 0
    Signed-off-by: default avatarTiezhu Yang <yangtiezhu@loongson.cn>
    Signed-off-by: default avatarHuacai Chen <chenhuacai@loongson.cn>
    d5ab2bc3
check.c 111 KB