[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