[llvm] r359311 - [llvm-nm] Fix handling of symbol types 't' 'd' 'r'

Fāng-ruì Sòng via llvm-commits llvm-commits at lists.llvm.org
Thu May 2 17:48:52 PDT 2019


This is actually a GNU nm bug and the bug was introduced in
https://reviews.llvm.org/D26937

https://sourceware.org/git/?p=binutils-gdb.git;a=blob;hb=41f61c65a2e1cfdb4aca3bccf6e11025495ba02e;f=bfd/syms.c#l582
checks ".init" but fails to check ".init_array". ".init_array" contains
pointers just like ".pre_init_array". You may notice that GNU nm prints:

t __init_array_start
d __preinit_array_start



On Fri, May 3, 2019 at 5:27 AM Jordan Rupprecht <rupprecht at google.com>
wrote:

> This change is actually a regression, __init_array_start/__init_array_end
> show up as 'd' now instead of 't'. (nm <large file> used to be identical to
> llvm-nm, modulo sorting).
>
> Can you send changes like this for review first, and reserve post-commit
> review for NFCs or other minor changes?
>
> On Fri, Apr 26, 2019 at 8:59 AM Fangrui Song via llvm-commits <
> llvm-commits at lists.llvm.org> wrote:
>
>> Author: maskray
>> Date: Fri Apr 26 09:01:48 2019
>> New Revision: 359311
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=359311&view=rev
>> Log:
>> [llvm-nm] Fix handling of symbol types 't' 'd' 'r'
>>
>> In addition, fix and convert the two tests to yaml2obj based. This
>> allows us to delete two executables.
>>
>> X86/weak.test: 'v' was not tested
>> X86/init-fini.test: symbol types of __bss_start _edata _end were wrong
>>   GNU nm reports __init_array_start as 't', and __preinit_array_start as
>> 'd'.
>>   __init_array_start is 't' just because its section ".init_array" starts
>> with ".init"
>>
>>   'd' makes more sense and allows us to drop the weird SHT_INIT_ARRAY
>> rule.
>>   So, change __init_array_start to 'd' instead.
>>
>> Removed:
>>     llvm/trunk/test/tools/llvm-nm/X86/Inputs/init-fini.out.elf-x86_64
>>     llvm/trunk/test/tools/llvm-nm/X86/Inputs/weak.obj.elf-x86_64
>> Modified:
>>     llvm/trunk/test/tools/llvm-nm/X86/init-fini.test
>>     llvm/trunk/test/tools/llvm-nm/X86/weak.test
>>     llvm/trunk/tools/llvm-nm/llvm-nm.cpp
>>
>> Removed: llvm/trunk/test/tools/llvm-nm/X86/Inputs/init-fini.out.elf-x86_64
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-nm/X86/Inputs/init-fini.out.elf-x86_64?rev=359310&view=auto
>>
>> ==============================================================================
>> Binary files
>> llvm/trunk/test/tools/llvm-nm/X86/Inputs/init-fini.out.elf-x86_64
>> (original) and
>> llvm/trunk/test/tools/llvm-nm/X86/Inputs/init-fini.out.elf-x86_64 (removed)
>> differ
>>
>> Removed: llvm/trunk/test/tools/llvm-nm/X86/Inputs/weak.obj.elf-x86_64
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-nm/X86/Inputs/weak.obj.elf-x86_64?rev=359310&view=auto
>>
>> ==============================================================================
>> Binary files llvm/trunk/test/tools/llvm-nm/X86/Inputs/weak.obj.elf-x86_64
>> (original) and llvm/trunk/test/tools/llvm-nm/X86/Inputs/weak.obj.elf-x86_64
>> (removed) differ
>>
>> Modified: llvm/trunk/test/tools/llvm-nm/X86/init-fini.test
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-nm/X86/init-fini.test?rev=359311&r1=359310&r2=359311&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/test/tools/llvm-nm/X86/init-fini.test (original)
>> +++ llvm/trunk/test/tools/llvm-nm/X86/init-fini.test Fri Apr 26 09:01:48
>> 2019
>> @@ -1,8 +1,50 @@
>> -# RUN: llvm-nm -B -S %p/Inputs/init-fini.out.elf-x86_64 | FileCheck
>> --match-full-lines %s
>> +# RUN: yaml2obj %s -o %t
>> +# RUN: llvm-nm -B -S %t | FileCheck %s
>> +!ELF
>> +FileHeader:
>> +  Class:           ELFCLASS64
>> +  Data:            ELFDATA2LSB
>> +  Type:            ET_EXEC
>> +  Machine:         EM_X86_64
>> +Sections:
>> +  - Name: .text
>> +    Type: SHT_PROGBITS
>> +    Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
>> +  - Name: .init_array
>> +    Type: SHT_INIT_ARRAY
>> +    Flags: [ SHF_ALLOC, SHF_WRITE ]
>> +  - Name: .preinit_array
>> +    Type: SHT_PREINIT_ARRAY
>> +    Flags: [ SHF_ALLOC, SHF_WRITE ]
>> +  - Name: .fini_array
>> +    Type: SHT_FINI_ARRAY
>> +    Flags: [ SHF_ALLOC, SHF_WRITE ]
>> +  - Name: .data
>> +    Type: SHT_PROGBITS
>> +    Flags: [ SHF_ALLOC, SHF_WRITE ]
>> +  - Name: .bss
>> +    Type: SHT_NOBITS
>> +    Flags: [ SHF_ALLOC, SHF_WRITE ]
>> +Symbols:
>> +  - Name:    __init_array_start
>> +    Section: .init_array
>> +  - Name:    __preinit_array_start
>> +    Section: .preinit_array
>> +  - Name:    __fini_array_start
>> +    Section: .fini_array
>> +  - Name:    __bss_start
>> +    Section: .bss
>> +    Binding: STB_GLOBAL
>> +  - Name:    _edata
>> +    Section: .data
>> +    Binding: STB_GLOBAL
>> +  - Name:    _end
>> +    Section: .bss
>> +    Binding: STB_GLOBAL
>>
>> -CHECK: 00000000006000c2 0000000000000000 T __bss_start
>> -CHECK: 00000000006000c2 0000000000000000 t __init_array_end
>> -CHECK: 00000000006000ba 0000000000000000 t __init_array_start
>> -CHECK: 00000000006000c2 0000000000000000 T _edata
>> -CHECK: 00000000006000c8 0000000000000000 T _end
>> -CHECK: 00000000004000b0 0000000000000000 T _start
>> +# CHECK: B __bss_start
>> +# CHECK: d __fini_array_start
>> +# CHECK: d __init_array_start
>> +# CHECK: d __preinit_array_start
>> +# CHECK: D _edata
>> +# CHECK: B _end
>>
>> Modified: llvm/trunk/test/tools/llvm-nm/X86/weak.test
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-nm/X86/weak.test?rev=359311&r1=359310&r2=359311&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/test/tools/llvm-nm/X86/weak.test (original)
>> +++ llvm/trunk/test/tools/llvm-nm/X86/weak.test Fri Apr 26 09:01:48 2019
>> @@ -1,7 +1,36 @@
>> -# RUN: llvm-nm -B -S %p/Inputs/weak.obj.elf-x86_64 | FileCheck
>> --match-full-lines %s
>> -# RUN: llvm-nm -W -B -S %p/Inputs/weak.obj.elf-x86_64 | count 0
>> +# RUN: yaml2obj %s -o %t
>> +# RUN: llvm-nm -B -S %t | FileCheck --match-full-lines %s
>> +# RUN: llvm-nm -W -B -S %t | count 0
>> +!ELF
>> +FileHeader:
>> +  Class:           ELFCLASS64
>> +  Data:            ELFDATA2LSB
>> +  Type:            ET_REL
>> +  Machine:         EM_X86_64
>> +Sections:
>> +  - Name: .text
>> +    Type: SHT_PROGBITS
>> +  - Name: .data
>> +    Type: SHT_PROGBITS
>> +Symbols:
>> +  - Name:    weak_func
>> +    Type:    STT_FUNC
>> +    Section: .text
>> +    Binding: STB_WEAK
>> +    Size:    17
>> +  - Name:    weak_var
>> +    Type:    STT_OBJECT
>> +    Section: .data
>> +    Binding: STB_WEAK
>> +    Size:    4
>> +  - Name:    weak_extern_func
>> +    Type:    STT_FUNC
>> +    Binding: STB_WEAK
>> +  - Name:    weak_extern_var
>> +    Type:    STT_OBJECT
>> +    Binding: STB_WEAK
>>
>> -CHECK:                  w weak_extern_func
>> -CHECK:                  w weak_extern_var
>> -CHECK: 0000000000000000 0000000000000011 W weak_func
>> -CHECK: 0000000000000000 0000000000000004 V weak_var
>> +# CHECK:                  w weak_extern_func
>> +# CHECK:                  v weak_extern_var
>> +# CHECK: 0000000000000000 0000000000000011 W weak_func
>> +# CHECK: 0000000000000000 0000000000000004 V weak_var
>>
>> Modified: llvm/trunk/tools/llvm-nm/llvm-nm.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-nm/llvm-nm.cpp?rev=359311&r1=359310&r2=359311&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/tools/llvm-nm/llvm-nm.cpp (original)
>> +++ llvm/trunk/tools/llvm-nm/llvm-nm.cpp Fri Apr 26 09:01:48 2019
>> @@ -936,27 +936,14 @@ static char getSymbolNMTypeChar(ELFObjec
>>
>>    elf_section_iterator SecI = *SecIOrErr;
>>    if (SecI != Obj.section_end()) {
>> -    switch (SecI->getType()) {
>> -    case ELF::SHT_PROGBITS:
>> -    case ELF::SHT_DYNAMIC:
>> -      switch (SecI->getFlags()) {
>> -      case (ELF::SHF_ALLOC | ELF::SHF_EXECINSTR):
>> -        return 't';
>> -      case (ELF::SHF_TLS | ELF::SHF_ALLOC | ELF::SHF_WRITE):
>> -      case (ELF::SHF_ALLOC | ELF::SHF_WRITE):
>> -        return 'd';
>> -      case ELF::SHF_ALLOC:
>> -      case (ELF::SHF_ALLOC | ELF::SHF_MERGE):
>> -      case (ELF::SHF_ALLOC | ELF::SHF_MERGE | ELF::SHF_STRINGS):
>> -        return 'r';
>> -      }
>> -      break;
>> -    case ELF::SHT_NOBITS:
>> +    uint32_t Type = SecI->getType();
>> +    uint64_t Flags = SecI->getFlags();
>> +    if (Type == ELF::SHT_NOBITS)
>>        return 'b';
>> -    case ELF::SHT_INIT_ARRAY:
>> -    case ELF::SHT_FINI_ARRAY:
>> +    if (Flags & ELF::SHF_EXECINSTR)
>>        return 't';
>> -    }
>> +    if (Flags & ELF::SHF_ALLOC)
>> +      return Flags & ELF::SHF_WRITE ? 'd' : 'r';
>>    }
>>
>>    if (SymI->getELFType() == ELF::STT_SECTION) {
>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at lists.llvm.org
>> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>>
>

-- 
宋方睿
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20190503/96239412/attachment.html>


More information about the llvm-commits mailing list