<div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr">This is actually a GNU nm bug and the bug was introduced in <a href="https://reviews.llvm.org/D26937">https://reviews.llvm.org/D26937</a><div><br></div><div><a href="https://sourceware.org/git/?p=binutils-gdb.git;a=blob;hb=41f61c65a2e1cfdb4aca3bccf6e11025495ba02e;f=bfd/syms.c#l582">https://sourceware.org/git/?p=binutils-gdb.git;a=blob;hb=41f61c65a2e1cfdb4aca3bccf6e11025495ba02e;f=bfd/syms.c#l582</a> checks ".init" but fails to check ".init_array". ".init_array" contains pointers just like ".pre_init_array". You may notice that GNU nm prints:<br></div><div><br></div><div>t __init_array_start<br></div><div>d __preinit_array_start<br></div><div><br></div><div><br></div></div></div></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, May 3, 2019 at 5:27 AM Jordan Rupprecht <<a href="mailto:rupprecht@google.com">rupprecht@google.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div dir="ltr"><div dir="ltr">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).</div><div dir="ltr"><br></div><div>Can you send changes like this for review first, and reserve post-commit review for NFCs or other minor changes?</div></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, Apr 26, 2019 at 8:59 AM Fangrui Song via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Author: maskray<br>
Date: Fri Apr 26 09:01:48 2019<br>
New Revision: 359311<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=359311&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=359311&view=rev</a><br>
Log:<br>
[llvm-nm] Fix handling of symbol types 't' 'd' 'r'<br>
<br>
In addition, fix and convert the two tests to yaml2obj based. This<br>
allows us to delete two executables.<br>
<br>
X86/weak.test: 'v' was not tested<br>
X86/init-fini.test: symbol types of __bss_start _edata _end were wrong<br>
  GNU nm reports __init_array_start as 't', and __preinit_array_start as 'd'.<br>
  __init_array_start is 't' just because its section ".init_array" starts with ".init"<br>
<br>
  'd' makes more sense and allows us to drop the weird SHT_INIT_ARRAY rule.<br>
  So, change __init_array_start to 'd' instead.<br>
<br>
Removed:<br>
    llvm/trunk/test/tools/llvm-nm/X86/Inputs/init-fini.out.elf-x86_64<br>
    llvm/trunk/test/tools/llvm-nm/X86/Inputs/weak.obj.elf-x86_64<br>
Modified:<br>
    llvm/trunk/test/tools/llvm-nm/X86/init-fini.test<br>
    llvm/trunk/test/tools/llvm-nm/X86/weak.test<br>
    llvm/trunk/tools/llvm-nm/llvm-nm.cpp<br>
<br>
Removed: llvm/trunk/test/tools/llvm-nm/X86/Inputs/init-fini.out.elf-x86_64<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-nm/X86/Inputs/init-fini.out.elf-x86_64?rev=359310&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-nm/X86/Inputs/init-fini.out.elf-x86_64?rev=359310&view=auto</a><br>
==============================================================================<br>
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<br>
<br>
Removed: llvm/trunk/test/tools/llvm-nm/X86/Inputs/weak.obj.elf-x86_64<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-nm/X86/Inputs/weak.obj.elf-x86_64?rev=359310&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-nm/X86/Inputs/weak.obj.elf-x86_64?rev=359310&view=auto</a><br>
==============================================================================<br>
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<br>
<br>
Modified: llvm/trunk/test/tools/llvm-nm/X86/init-fini.test<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-nm/X86/init-fini.test?rev=359311&r1=359310&r2=359311&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-nm/X86/init-fini.test?rev=359311&r1=359310&r2=359311&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/test/tools/llvm-nm/X86/init-fini.test (original)<br>
+++ llvm/trunk/test/tools/llvm-nm/X86/init-fini.test Fri Apr 26 09:01:48 2019<br>
@@ -1,8 +1,50 @@<br>
-# RUN: llvm-nm -B -S %p/Inputs/init-fini.out.elf-x86_64 | FileCheck --match-full-lines %s<br>
+# RUN: yaml2obj %s -o %t<br>
+# RUN: llvm-nm -B -S %t | FileCheck %s<br>
+!ELF<br>
+FileHeader:<br>
+  Class:           ELFCLASS64<br>
+  Data:            ELFDATA2LSB<br>
+  Type:            ET_EXEC<br>
+  Machine:         EM_X86_64<br>
+Sections:<br>
+  - Name: .text<br>
+    Type: SHT_PROGBITS<br>
+    Flags: [ SHF_ALLOC, SHF_EXECINSTR ]<br>
+  - Name: .init_array<br>
+    Type: SHT_INIT_ARRAY<br>
+    Flags: [ SHF_ALLOC, SHF_WRITE ]<br>
+  - Name: .preinit_array<br>
+    Type: SHT_PREINIT_ARRAY<br>
+    Flags: [ SHF_ALLOC, SHF_WRITE ]<br>
+  - Name: .fini_array<br>
+    Type: SHT_FINI_ARRAY<br>
+    Flags: [ SHF_ALLOC, SHF_WRITE ]<br>
+  - Name: .data<br>
+    Type: SHT_PROGBITS<br>
+    Flags: [ SHF_ALLOC, SHF_WRITE ]<br>
+  - Name: .bss<br>
+    Type: SHT_NOBITS<br>
+    Flags: [ SHF_ALLOC, SHF_WRITE ]<br>
+Symbols:<br>
+  - Name:    __init_array_start<br>
+    Section: .init_array<br>
+  - Name:    __preinit_array_start<br>
+    Section: .preinit_array<br>
+  - Name:    __fini_array_start<br>
+    Section: .fini_array<br>
+  - Name:    __bss_start<br>
+    Section: .bss<br>
+    Binding: STB_GLOBAL<br>
+  - Name:    _edata<br>
+    Section: .data<br>
+    Binding: STB_GLOBAL<br>
+  - Name:    _end<br>
+    Section: .bss<br>
+    Binding: STB_GLOBAL<br>
<br>
-CHECK: 00000000006000c2 0000000000000000 T __bss_start<br>
-CHECK: 00000000006000c2 0000000000000000 t __init_array_end<br>
-CHECK: 00000000006000ba 0000000000000000 t __init_array_start<br>
-CHECK: 00000000006000c2 0000000000000000 T _edata<br>
-CHECK: 00000000006000c8 0000000000000000 T _end<br>
-CHECK: 00000000004000b0 0000000000000000 T _start<br>
+# CHECK: B __bss_start<br>
+# CHECK: d __fini_array_start<br>
+# CHECK: d __init_array_start<br>
+# CHECK: d __preinit_array_start<br>
+# CHECK: D _edata<br>
+# CHECK: B _end<br>
<br>
Modified: llvm/trunk/test/tools/llvm-nm/X86/weak.test<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-nm/X86/weak.test?rev=359311&r1=359310&r2=359311&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-nm/X86/weak.test?rev=359311&r1=359310&r2=359311&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/test/tools/llvm-nm/X86/weak.test (original)<br>
+++ llvm/trunk/test/tools/llvm-nm/X86/weak.test Fri Apr 26 09:01:48 2019<br>
@@ -1,7 +1,36 @@<br>
-# RUN: llvm-nm -B -S %p/Inputs/weak.obj.elf-x86_64 | FileCheck --match-full-lines %s<br>
-# RUN: llvm-nm -W -B -S %p/Inputs/weak.obj.elf-x86_64 | count 0<br>
+# RUN: yaml2obj %s -o %t<br>
+# RUN: llvm-nm -B -S %t | FileCheck --match-full-lines %s<br>
+# RUN: llvm-nm -W -B -S %t | count 0<br>
+!ELF<br>
+FileHeader:<br>
+  Class:           ELFCLASS64<br>
+  Data:            ELFDATA2LSB<br>
+  Type:            ET_REL<br>
+  Machine:         EM_X86_64<br>
+Sections:<br>
+  - Name: .text<br>
+    Type: SHT_PROGBITS<br>
+  - Name: .data<br>
+    Type: SHT_PROGBITS<br>
+Symbols:<br>
+  - Name:    weak_func<br>
+    Type:    STT_FUNC<br>
+    Section: .text<br>
+    Binding: STB_WEAK<br>
+    Size:    17<br>
+  - Name:    weak_var<br>
+    Type:    STT_OBJECT<br>
+    Section: .data<br>
+    Binding: STB_WEAK<br>
+    Size:    4<br>
+  - Name:    weak_extern_func<br>
+    Type:    STT_FUNC<br>
+    Binding: STB_WEAK<br>
+  - Name:    weak_extern_var<br>
+    Type:    STT_OBJECT<br>
+    Binding: STB_WEAK<br>
<br>
-CHECK:                  w weak_extern_func<br>
-CHECK:                  w weak_extern_var<br>
-CHECK: 0000000000000000 0000000000000011 W weak_func<br>
-CHECK: 0000000000000000 0000000000000004 V weak_var<br>
+# CHECK:                  w weak_extern_func<br>
+# CHECK:                  v weak_extern_var<br>
+# CHECK: 0000000000000000 0000000000000011 W weak_func<br>
+# CHECK: 0000000000000000 0000000000000004 V weak_var<br>
<br>
Modified: llvm/trunk/tools/llvm-nm/llvm-nm.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-nm/llvm-nm.cpp?rev=359311&r1=359310&r2=359311&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-nm/llvm-nm.cpp?rev=359311&r1=359310&r2=359311&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/tools/llvm-nm/llvm-nm.cpp (original)<br>
+++ llvm/trunk/tools/llvm-nm/llvm-nm.cpp Fri Apr 26 09:01:48 2019<br>
@@ -936,27 +936,14 @@ static char getSymbolNMTypeChar(ELFObjec<br>
<br>
   elf_section_iterator SecI = *SecIOrErr;<br>
   if (SecI != Obj.section_end()) {<br>
-    switch (SecI->getType()) {<br>
-    case ELF::SHT_PROGBITS:<br>
-    case ELF::SHT_DYNAMIC:<br>
-      switch (SecI->getFlags()) {<br>
-      case (ELF::SHF_ALLOC | ELF::SHF_EXECINSTR):<br>
-        return 't';<br>
-      case (ELF::SHF_TLS | ELF::SHF_ALLOC | ELF::SHF_WRITE):<br>
-      case (ELF::SHF_ALLOC | ELF::SHF_WRITE):<br>
-        return 'd';<br>
-      case ELF::SHF_ALLOC:<br>
-      case (ELF::SHF_ALLOC | ELF::SHF_MERGE):<br>
-      case (ELF::SHF_ALLOC | ELF::SHF_MERGE | ELF::SHF_STRINGS):<br>
-        return 'r';<br>
-      }<br>
-      break;<br>
-    case ELF::SHT_NOBITS:<br>
+    uint32_t Type = SecI->getType();<br>
+    uint64_t Flags = SecI->getFlags();<br>
+    if (Type == ELF::SHT_NOBITS)<br>
       return 'b';<br>
-    case ELF::SHT_INIT_ARRAY:<br>
-    case ELF::SHT_FINI_ARRAY:<br>
+    if (Flags & ELF::SHF_EXECINSTR)<br>
       return 't';<br>
-    }<br>
+    if (Flags & ELF::SHF_ALLOC)<br>
+      return Flags & ELF::SHF_WRITE ? 'd' : 'r';<br>
   }<br>
<br>
   if (SymI->getELFType() == ELF::STT_SECTION) {<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a><br>
<a href="https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
</blockquote></div>
</blockquote></div><br clear="all"><div><br></div>-- <br><div dir="ltr" class="gmail_signature"><div dir="ltr">宋方睿</div></div>