From 6525e92b32c52772f7d750ada7084245655629e6 Mon Sep 17 00:00:00 2001 From: Sean Silva Date: Thu, 20 Jun 2013 20:59:41 +0000 Subject: [yaml2obj][ELF] Allow symbols to reference sections. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@184468 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Object/ELFYAML.h | 1 + lib/Object/ELFYAML.cpp | 1 + test/Object/yaml2obj-elf-symbol-basic.yaml | 2 ++ tools/yaml2obj/yaml2elf.cpp | 7 +++++++ 4 files changed, 11 insertions(+) diff --git a/include/llvm/Object/ELFYAML.h b/include/llvm/Object/ELFYAML.h index 29bba0ca38..b0079445c4 100644 --- a/include/llvm/Object/ELFYAML.h +++ b/include/llvm/Object/ELFYAML.h @@ -57,6 +57,7 @@ struct Symbol { StringRef Name; ELF_STB Binding; ELF_STT Type; + StringRef Section; }; struct Section { StringRef Name; diff --git a/lib/Object/ELFYAML.cpp b/lib/Object/ELFYAML.cpp index 5692f4b150..39faf7df2b 100644 --- a/lib/Object/ELFYAML.cpp +++ b/lib/Object/ELFYAML.cpp @@ -315,6 +315,7 @@ void MappingTraits::mapping(IO &IO, ELFYAML::Symbol &Symbol) { IO.mapOptional("Name", Symbol.Name, StringRef()); IO.mapOptional("Binding", Symbol.Binding, ELFYAML::ELF_STB(0)); IO.mapOptional("Type", Symbol.Type, ELFYAML::ELF_STT(0)); + IO.mapOptional("Section", Symbol.Section, StringRef()); } void MappingTraits::mapping(IO &IO, diff --git a/test/Object/yaml2obj-elf-symbol-basic.yaml b/test/Object/yaml2obj-elf-symbol-basic.yaml index c7593b3159..f3883bb880 100644 --- a/test/Object/yaml2obj-elf-symbol-basic.yaml +++ b/test/Object/yaml2obj-elf-symbol-basic.yaml @@ -15,6 +15,7 @@ Sections: - Name: main Binding: STB_GLOBAL Type: STT_FUNC + Section: .text # CHECK: Symbols [ # CHECK-NEXT: Symbol { @@ -23,3 +24,4 @@ Sections: # CHECK-NEXT: Name: main # CHECK: Binding: Global # CHECK-NEXT: Type: Function +# CHECK: Section: .text diff --git a/tools/yaml2obj/yaml2elf.cpp b/tools/yaml2obj/yaml2elf.cpp index 667718af38..421781ce14 100644 --- a/tools/yaml2obj/yaml2elf.cpp +++ b/tools/yaml2obj/yaml2elf.cpp @@ -199,6 +199,13 @@ static void handleSymtabSectionHeader( if (!Sym.Name.empty()) Symbol.st_name = State.getStringTable().addString(Sym.Name); Symbol.setBindingAndType(Sym.Binding, Sym.Type); + unsigned Index; + if (State.getSN2I().lookupSection(Sym.Section, Index)) { + errs() << "error: Unknown section referenced: '" << Sym.Section + << "' by YAML symbol " << Sym.Name << ".\n"; + exit(1); + } + Symbol.st_shndx = Index; Syms.push_back(Symbol); } -- cgit v1.2.3