[llvm] r363042 - [yaml2elf] - Check we are able to set custom sh_link for .symtab/.dynsym

George Rimar via llvm-commits llvm-commits at lists.llvm.org
Tue Jun 11 03:00:51 PDT 2019


Author: grimar
Date: Tue Jun 11 03:00:51 2019
New Revision: 363042

URL: http://llvm.org/viewvc/llvm-project?rev=363042&view=rev
Log:
[yaml2elf] - Check we are able to set custom sh_link for .symtab/.dynsym

Allow using both custom numeric and string values for Link field of the
dynamic and regular symbol tables.

Differential revision: https://reviews.llvm.org/D63077

Added:
    llvm/trunk/test/tools/yaml2obj/dynsymtab-shlink.yaml
    llvm/trunk/test/tools/yaml2obj/symtab-shlink.yaml
Modified:
    llvm/trunk/tools/yaml2obj/yaml2elf.cpp

Added: llvm/trunk/test/tools/yaml2obj/dynsymtab-shlink.yaml
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/yaml2obj/dynsymtab-shlink.yaml?rev=363042&view=auto
==============================================================================
--- llvm/trunk/test/tools/yaml2obj/dynsymtab-shlink.yaml (added)
+++ llvm/trunk/test/tools/yaml2obj/dynsymtab-shlink.yaml Tue Jun 11 03:00:51 2019
@@ -0,0 +1,97 @@
+## For implicit dynamic symbol table sections, `Link` field can also
+## be specified in YAML. Here we test the behavior in different cases.
+
+## Check we are able to set Link = 0 for .dynsym explicitly.
+
+# RUN: yaml2obj --docnum=1 %s -o %t1
+# RUN: llvm-readobj %t1 -S | FileCheck %s --check-prefix=CASE1
+
+# CASE1: Name: .dynsym
+# CASE1: Link:
+# CASE1-SAME: 0
+
+--- !ELF
+FileHeader:
+  Class:   ELFCLASS64
+  Data:    ELFDATA2LSB
+  Type:    ET_DYN
+  Machine: EM_X86_64
+Sections:
+  - Name: .dynsym
+    Type: SHT_DYNSYM
+    Link: 0
+
+## Check that by default .dynsym will be linked to .dynstr
+## if the latter exists.
+
+# RUN: yaml2obj --docnum=2 %s -o %t2
+# RUN: llvm-readobj %t2 -S | FileCheck %s --check-prefix=CASE2
+
+# CASE2:      .dynsym
+# CASE2:      Link:
+# CASE2-SAME: 2
+# CASE2:      Index: 2
+# CASE2-NEXT: Name: .dynstr
+
+--- !ELF
+FileHeader:
+  Class:   ELFCLASS64
+  Data:    ELFDATA2LSB
+  Type:    ET_DYN
+  Machine: EM_X86_64
+Sections:
+  - Name: .dynsym
+    Type: SHT_DYNSYM
+  - Name: .dynstr
+    Type: SHT_STRTAB
+
+## Even if .dynstr exists, we can explicitly link .dynsym
+## to another section.
+
+# RUN: yaml2obj --docnum=3 %s -o %t3
+# RUN: llvm-readobj %t3 -S | FileCheck %s --check-prefix=CASE3
+
+# CASE3:      .dynsym
+# CASE3:      Link:
+# CASE3-SAME: 3
+# CASE3:      Index: 3
+# CASE3-NEXT: Name: .foo
+
+--- !ELF
+FileHeader:
+  Class:   ELFCLASS64
+  Data:    ELFDATA2LSB
+  Type:    ET_DYN
+  Machine: EM_X86_64
+Sections:
+  - Name: .dynsym
+    Type: SHT_DYNSYM
+    Link: 3
+  - Name: .dynstr
+    Type: SHT_STRTAB
+  - Name: .foo
+    Type: SHT_PROGBITS
+
+## Check we can use a section name as a Link value for .dynsym.
+
+# RUN: yaml2obj --docnum=4 %s -o %t4
+# RUN: llvm-readobj %t4 -S | FileCheck %s --check-prefix=CASE4
+
+# CASE4:      .dynsym
+# CASE4:      Link:
+# CASE4-SAME: 2
+# CASE4:      Index: 2
+# CASE4-NEXT: Name: .foo
+
+--- !ELF
+FileHeader:
+  Class:   ELFCLASS64
+  Data:    ELFDATA2LSB
+  Type:    ET_DYN
+  Machine: EM_X86_64
+Sections:
+  - Name: .dynsym
+    Type: SHT_DYNSYM
+    Link: .foo
+  - Name: .foo
+    Type: SHT_PROGBITS

Added: llvm/trunk/test/tools/yaml2obj/symtab-shlink.yaml
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/yaml2obj/symtab-shlink.yaml?rev=363042&view=auto
==============================================================================
--- llvm/trunk/test/tools/yaml2obj/symtab-shlink.yaml (added)
+++ llvm/trunk/test/tools/yaml2obj/symtab-shlink.yaml Tue Jun 11 03:00:51 2019
@@ -0,0 +1,94 @@
+## For implicit symbol table sections, `Link` field can also
+## be specified in YAML. Here we test the behavior in different cases.
+
+## Check we are able to set Link = 0 for .symtab explicitly.
+
+# RUN: yaml2obj --docnum=1 %s -o %t1
+# RUN: llvm-readobj %t1 -S | FileCheck %s --check-prefix=CASE1
+
+# CASE1: Name: .symtab
+# CASE1: Link:
+# CASE1-SAME: 0
+
+--- !ELF
+FileHeader:
+  Class:   ELFCLASS64
+  Data:    ELFDATA2LSB
+  Type:    ET_DYN
+  Machine: EM_X86_64
+Sections:
+  - Name: .symtab
+    Type: SHT_SYMTAB
+    Link: 0
+
+## Check that by default .symtab will be linked with .strtab.
+
+# RUN: yaml2obj --docnum=2 %s -o %t2
+# RUN: llvm-readobj %t2 -S | FileCheck %s --check-prefix=CASE2
+
+# CASE2:      .symtab
+# CASE2:      Link:
+# CASE2-SAME: 2
+# CASE2:      Index: 2
+# CASE2-NEXT: Name: .strtab
+
+--- !ELF
+FileHeader:
+  Class:   ELFCLASS64
+  Data:    ELFDATA2LSB
+  Type:    ET_DYN
+  Machine: EM_X86_64
+Sections:
+  - Name: .symtab
+    Type: SHT_SYMTAB
+
+## Even if .strtab is defined in YAML, we can explicitly link .symtab
+## to another section.
+
+# RUN: yaml2obj --docnum=3 %s -o %t3
+# RUN: llvm-readobj %t3 -S | FileCheck %s --check-prefix=CASE3
+
+# CASE3:      .symtab
+# CASE3:      Link:
+# CASE3-SAME: 3
+# CASE3:      Index: 3
+# CASE3-NEXT: Name: .foo
+
+--- !ELF
+FileHeader:
+  Class:   ELFCLASS64
+  Data:    ELFDATA2LSB
+  Type:    ET_DYN
+  Machine: EM_X86_64
+Sections:
+  - Name: .symtab
+    Type: SHT_SYMTAB
+    Link: 3
+  - Name: .strtab
+    Type: SHT_STRTAB
+  - Name: .foo
+    Type: SHT_PROGBITS
+
+## Check we can use a section name as a Link value for .symtab.
+
+# RUN: yaml2obj --docnum=4 %s -o %t4
+# RUN: llvm-readobj %t4 -S | FileCheck %s --check-prefix=CASE4
+
+# CASE4:      .symtab
+# CASE4:      Link:
+# CASE4-SAME: 2
+# CASE4:      Index: 2
+# CASE4-NEXT: Name: .foo
+
+--- !ELF
+FileHeader:
+  Class:   ELFCLASS64
+  Data:    ELFDATA2LSB
+  Type:    ET_DYN
+  Machine: EM_X86_64
+Sections:
+  - Name: .symtab
+    Type: SHT_SYMTAB
+    Link: .foo
+  - Name: .foo
+    Type: SHT_PROGBITS

Modified: llvm/trunk/tools/yaml2obj/yaml2elf.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/yaml2obj/yaml2elf.cpp?rev=363042&r1=363041&r2=363042&view=diff
==============================================================================
--- llvm/trunk/tools/yaml2obj/yaml2elf.cpp (original)
+++ llvm/trunk/tools/yaml2obj/yaml2elf.cpp Tue Jun 11 03:00:51 2019
@@ -404,16 +404,25 @@ void ELFState<ELFT>::initSymtabSectionHe
   SHeader.sh_name = DotShStrtab.getOffset(IsStatic ? ".symtab" : ".dynsym");
   SHeader.sh_type = IsStatic ? ELF::SHT_SYMTAB : ELF::SHT_DYNSYM;
 
-  // When we describe the .dynsym section in the document explicitly, it is
-  // allowed to omit the "DynamicSymbols" tag. In this case .dynstr is not added
-  // implicitly and we should be able to leave the Link zeroed if .dynstr is not
-  // defined.
-  unsigned Link = 0;
-  if (IsStatic)
-    Link = SN2I.get(".strtab");
-  else
-    SN2I.lookup(".dynstr", Link);
-  SHeader.sh_link = Link;
+  if (RawSec && !RawSec->Link.empty()) {
+    // If the Link field is explicitly defined in the document,
+    // we should use it.
+    unsigned Index;
+    if (!convertSectionIndex(SN2I, RawSec->Name, RawSec->Link, Index))
+      return;
+    SHeader.sh_link = Index;
+  } else {
+    // When we describe the .dynsym section in the document explicitly, it is
+    // allowed to omit the "DynamicSymbols" tag. In this case .dynstr is not
+    // added implicitly and we should be able to leave the Link zeroed if
+    // .dynstr is not defined.
+    unsigned Link = 0;
+    if (IsStatic)
+      Link = SN2I.get(".strtab");
+    else
+      SN2I.lookup(".dynstr", Link);
+    SHeader.sh_link = Link;
+  }
 
   if (!IsStatic)
     SHeader.sh_flags |= ELF::SHF_ALLOC;




More information about the llvm-commits mailing list