[yaml2obj][obj2yaml] - Add support for dumping/parsing .dynamic sections.

This teaches the tools to parse and dump
the .dynamic section and its dynamic tags.

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

llvm-svn: 353606
This commit is contained in:
George Rimar 2019-02-09 11:34:28 +00:00
parent 283d103bde
commit 0e7ed91264
19 changed files with 623 additions and 125 deletions

View File

@ -43,6 +43,8 @@ LLVM_YAML_STRONG_TYPEDEF(uint8_t, ELF_ELFDATA)
LLVM_YAML_STRONG_TYPEDEF(uint8_t, ELF_ELFOSABI)
// Just use 64, since it can hold 32-bit values too.
LLVM_YAML_STRONG_TYPEDEF(uint64_t, ELF_EF)
// Just use 64, since it can hold 32-bit values too.
LLVM_YAML_STRONG_TYPEDEF(uint64_t, ELF_DYNTAG)
LLVM_YAML_STRONG_TYPEDEF(uint32_t, ELF_PF)
LLVM_YAML_STRONG_TYPEDEF(uint32_t, ELF_SHT)
LLVM_YAML_STRONG_TYPEDEF(uint32_t, ELF_REL)
@ -107,8 +109,14 @@ struct SectionOrType {
StringRef sectionNameOrType;
};
struct DynamicEntry {
ELF_DYNTAG Tag;
llvm::yaml::Hex64 Val;
};
struct Section {
enum class SectionKind {
Dynamic,
Group,
RawContent,
Relocation,
@ -128,6 +136,17 @@ struct Section {
Section(SectionKind Kind) : Kind(Kind) {}
virtual ~Section();
};
struct DynamicSection : Section {
std::vector<DynamicEntry> Entries;
DynamicSection() : Section(SectionKind::Dynamic) {}
static bool classof(const Section *S) {
return S->Kind == SectionKind::Dynamic;
}
};
struct RawContentSection : Section {
yaml::BinaryRef Content;
llvm::yaml::Hex64 Size;
@ -214,6 +233,7 @@ struct Object {
} // end namespace ELFYAML
} // end namespace llvm
LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::ELFYAML::DynamicEntry)
LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::ELFYAML::ProgramHeader)
LLVM_YAML_IS_SEQUENCE_VECTOR(std::unique_ptr<llvm::ELFYAML::Section>)
LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::ELFYAML::Symbol)
@ -296,6 +316,11 @@ struct ScalarEnumerationTraits<ELFYAML::ELF_REL> {
static void enumeration(IO &IO, ELFYAML::ELF_REL &Value);
};
template <>
struct ScalarEnumerationTraits<ELFYAML::ELF_DYNTAG> {
static void enumeration(IO &IO, ELFYAML::ELF_DYNTAG &Value);
};
template <>
struct ScalarEnumerationTraits<ELFYAML::ELF_RSS> {
static void enumeration(IO &IO, ELFYAML::ELF_RSS &Value);
@ -351,6 +376,10 @@ struct MappingTraits<ELFYAML::LocalGlobalWeakSymbols> {
static void mapping(IO &IO, ELFYAML::LocalGlobalWeakSymbols &Symbols);
};
template <> struct MappingTraits<ELFYAML::DynamicEntry> {
static void mapping(IO &IO, ELFYAML::DynamicEntry &Rel);
};
template <> struct MappingTraits<ELFYAML::Relocation> {
static void mapping(IO &IO, ELFYAML::Relocation &Rel);
};

View File

@ -661,6 +661,33 @@ void ScalarEnumerationTraits<ELFYAML::ELF_REL>::enumeration(
IO.enumFallback<Hex32>(Value);
}
void ScalarEnumerationTraits<ELFYAML::ELF_DYNTAG>::enumeration(
IO &IO, ELFYAML::ELF_DYNTAG &Value) {
const auto *Object = static_cast<ELFYAML::Object *>(IO.getContext());
assert(Object && "The IO context is not initialized");
// TODO: For simplicity we do not handle target specific flags. They are
// still supported and will be shown as a raw numeric values in the output.
#define MIPS_DYNAMIC_TAG(name, value)
#define HEXAGON_DYNAMIC_TAG(name, value)
#define PPC64_DYNAMIC_TAG(name, value)
// Also ignore marker tags such as DT_HIOS (maps to DT_VERNEEDNUM), etc.
#define DYNAMIC_TAG_MARKER(name, value)
#define STRINGIFY(X) (#X)
#define DYNAMIC_TAG(X, Y) IO.enumCase(Value, STRINGIFY(DT_##X), ELF::DT_##X);
#include "llvm/BinaryFormat/DynamicTags.def"
#undef MIPS_DYNAMIC_TAG
#undef HEXAGON_DYNAMIC_TAG
#undef PPC64_DYNAMIC_TAG
#undef DYNAMIC_TAG_MARKER
#undef STRINGIFY
#undef DYNAMIC_TAG
IO.enumFallback<Hex64>(Value);
}
void ScalarEnumerationTraits<ELFYAML::MIPS_AFL_REG>::enumeration(
IO &IO, ELFYAML::MIPS_AFL_REG &Value) {
#define ECase(X) IO.enumCase(Value, #X, Mips::AFL_##X)
@ -831,6 +858,11 @@ static void commonSectionMapping(IO &IO, ELFYAML::Section &Section) {
IO.mapOptional("Info", Section.Info, StringRef());
}
static void sectionMapping(IO &IO, ELFYAML::DynamicSection &Section) {
commonSectionMapping(IO, Section);
IO.mapOptional("Entries", Section.Entries);
}
static void sectionMapping(IO &IO, ELFYAML::RawContentSection &Section) {
commonSectionMapping(IO, Section);
IO.mapOptional("Content", Section.Content);
@ -891,6 +923,11 @@ void MappingTraits<std::unique_ptr<ELFYAML::Section>>::mapping(
IO.mapRequired("Type", sectionType);
switch (sectionType) {
case ELF::SHT_DYNAMIC:
if (!IO.outputting())
Section.reset(new ELFYAML::DynamicSection());
sectionMapping(IO, *cast<ELFYAML::DynamicSection>(Section.get()));
break;
case ELF::SHT_REL:
case ELF::SHT_RELA:
if (!IO.outputting())
@ -952,6 +989,15 @@ struct NormalizedMips64RelType {
} // end anonymous namespace
void MappingTraits<ELFYAML::DynamicEntry>::mapping(IO &IO,
ELFYAML::DynamicEntry &Rel) {
const auto *Object = static_cast<ELFYAML::Object *>(IO.getContext());
assert(Object && "The IO context is not initialized");
IO.mapRequired("Tag", Rel.Tag);
IO.mapRequired("Value", Rel.Val);
}
void MappingTraits<ELFYAML::Relocation>::mapping(IO &IO,
ELFYAML::Relocation &Rel) {
const auto *Object = static_cast<ELFYAML::Object *>(IO.getContext());

View File

@ -16,15 +16,19 @@ Sections:
- Name: .dynamic
Type: SHT_DYNAMIC
Flags: [ SHF_ALLOC ]
Address: 0x0008
AddressAlign: 8
Content: "0a000000000000000100000000000000050000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000"
# DT_STRSZ 1 (0x1)
# DT_STRTAB 0x0
# DT_SYMTAB 0x0
# DT_NULL 0x0
Size: 64
Address: 0x0000000000000008
Link: .dynstr
AddressAlign: 0x0000000000000008
EntSize: 0x0000000000000010
Entries:
- Tag: DT_STRSZ
Value: 0x0000000000000001
- Tag: DT_STRTAB
Value: 0x0000000000000000
- Tag: DT_SYMTAB
Value: 0x0000000000000000
- Tag: DT_NULL
Value: 0x0000000000000000
ProgramHeaders:
- Type: PT_LOAD
Flags: [ PF_R ]

View File

@ -16,15 +16,19 @@ Sections:
- Name: .dynamic
Type: SHT_DYNAMIC
Flags: [ SHF_ALLOC ]
Address: 0x0008
AddressAlign: 8
Content: "0a000000000000000100000000000000050000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000"
# DT_STRSZ 1 (0x1)
# DT_STRTAB 0x0
# DT_SYMTAB 0x0
# DT_NULL 0x0
Size: 64
Address: 0x0000000000000008
Link: .dynstr
AddressAlign: 0x0000000000000008
EntSize: 0x0000000000000010
Entries:
- Tag: DT_STRSZ
Value: 0x0000000000000001
- Tag: DT_STRTAB
Value: 0x0000000000000000
- Tag: DT_SYMTAB
Value: 0x0000000000000000
- Tag: DT_NULL
Value: 0x0000000000000000
ProgramHeaders:
- Type: PT_LOAD
Flags: [ PF_R ]

View File

@ -16,16 +16,21 @@ Sections:
- Name: .dynamic
Type: SHT_DYNAMIC
Flags: [ SHF_ALLOC ]
Address: 0x0008
AddressAlign: 8
Content: "0e000000000000000d000000000000000a000000000000000100000000000000050000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000"
# DT_SONAME 13 (0x0d)
# DT_STRSZ 1 (0x01)
# DT_STRTAB 0x0
# DT_SYMTAB 0x0
# DT_NULL 0x0
Size: 80
Address: 0x0000000000000008
Link: .dynstr
AddressAlign: 0x0000000000000008
EntSize: 0x0000000000000010
Entries:
- Tag: DT_SONAME
Value: 0x000000000000000D
- Tag: DT_STRSZ
Value: 0x0000000000000001
- Tag: DT_STRTAB
Value: 0x0000000000000000
- Tag: DT_SYMTAB
Value: 0x0000000000000000
- Tag: DT_NULL
Value: 0x0000000000000000
ProgramHeaders:
- Type: PT_LOAD
Flags: [ PF_R ]

View File

@ -16,16 +16,21 @@ Sections:
- Name: .dynamic
Type: SHT_DYNAMIC
Flags: [ SHF_ALLOC ]
Address: 0x1008
AddressAlign: 8
Content: "0e0000000000000000000000000000000a000000000000000100000000000000050000000000000060020000000000000600000000000000001000000000000000000000000000000000000000000000"
# DT_SONAME 0
# DT_STRSZ 1
# DT_STRTAB 0x0260 # Bad vaddr (no PT_LOAD for 0x0000 to 0x0FFF)
# DT_SYMTAB 0x1000
# DT_NULL 0x0
Size: 80
Address: 0x0000000000001008
Link: .dynstr
AddressAlign: 0x0000000000000008
EntSize: 0x0000000000000010
Entries:
- Tag: DT_SONAME
Value: 0x0000000000000000
- Tag: DT_STRSZ
Value: 0x0000000000000001
- Tag: DT_STRTAB
Value: 0x0000000000000260 # Bad vaddr (no PT_LOAD for 0x0000 to 0x0FFF)
- Tag: DT_SYMTAB
Value: 0x0000000000001000
- Tag: DT_NULL
Value: 0x0000000000000000
ProgramHeaders:
- Type: PT_LOAD
Flags: [ PF_R ]

View File

@ -17,17 +17,24 @@ Sections:
- Name: .dynamic
Type: SHT_DYNAMIC
Flags: [ SHF_ALLOC ]
Address: 0x1024
Content: "010000000000000001000000000000000e0000000000000015000000000000000100000000000000ffff0000000000000a000000000000002400000000000000050000000000000000100000000000000600000000000000001000000000000000000000000000000000000000000000"
# DT_NEEDED 1 (0x01)
# DT_SONAME 21 (0x15)
Address: 0x0000000000001024
EntSize: 0x0000000000000010
Entries:
- Tag: DT_NEEDED
Value: 0x0000000000000001
- Tag: DT_SONAME
Value: 0x0000000000000015
# Bad DT_NEEDED entry (offset outside string table):
# DT_NEEDED 65535 (0xffff)
# DT_STRSZ 36 (0x24)
# DT_STRTAB 0x1000
# DT_SYMTAB 0x1000
# DT_NULL 0x0
Size: 112
- Tag: DT_NEEDED
Value: 0x000000000000FFFF
- Tag: DT_STRSZ
Value: 0x0000000000000024
- Tag: DT_STRTAB
Value: 0x0000000000001000
- Tag: DT_SYMTAB
Value: 0x0000000000001000
- Tag: DT_NULL
Value: 0x0000000000000000
ProgramHeaders:
- Type: PT_LOAD
Flags: [ PF_R ]

View File

@ -17,16 +17,23 @@ Sections:
- Name: .dynamic
Type: SHT_DYNAMIC
Flags: [ SHF_ALLOC ]
Address: 0x1024
Content: "010000000000000001000000000000000e00000000000000150000000000000001000000000000000b000000000000000a000000000000002400000000000000050000000000000000100000000000000600000000000000001000000000000000000000000000000000000000000000"
# DT_NEEDED 1 (0x01)
# DT_SONAME 21 (0x15)
# DT_NEEDED 11 (0x0b)
# DT_STRSZ 36 (0x24)
# DT_STRTAB 0x1000
# DT_SYMTAB 0x1000
# DT_NULL 0x0
Size: 112
Address: 0x0000000000001024
EntSize: 0x0000000000000010
Entries:
- Tag: DT_NEEDED
Value: 0x0000000000000001
- Tag: DT_SONAME
Value: 0x0000000000000015
- Tag: DT_NEEDED
Value: 0x000000000000000B
- Tag: DT_STRSZ
Value: 0x0000000000000024
- Tag: DT_STRTAB
Value: 0x0000000000001000
- Tag: DT_SYMTAB
Value: 0x0000000000001000
- Tag: DT_NULL
Value: 0x0000000000000000
ProgramHeaders:
- Type: PT_LOAD
Flags: [ PF_R ]

View File

@ -17,13 +17,15 @@ Sections:
- Name: .dynamic
Type: SHT_DYNAMIC
Flags: [ SHF_ALLOC ]
Address: 0x0008
AddressAlign: 8
Content: "0500000000000000000000000000000000000000000000000000000000000000"
# DT_STRTAB 0x0
# DT_NULL 0x0
Size: 32
Address: 0x0000000000000008
Link: .dynstr
AddressAlign: 0x0000000000000008
EntSize: 0x0000000000000010
Entries:
- Tag: DT_STRTAB
Value: 0x0000000000000000
- Tag: DT_NULL
Value: 0x0000000000000000
ProgramHeaders:
- Type: PT_LOAD
Flags: [ PF_R ]

View File

@ -16,13 +16,15 @@ Sections:
- Name: .dynamic
Type: SHT_DYNAMIC
Flags: [ SHF_ALLOC ]
Address: 0x0008
AddressAlign: 8
Content: "0a00000000000000010000000000000000000000000000000000000000000000"
# DT_STRSZ 1 (0x1)
# DT_NULL 0x0
Size: 32
Address: 0x0000000000000008
Link: .dynstr
AddressAlign: 0x0000000000000008
EntSize: 0x0000000000000010
Entries:
- Tag: DT_STRSZ
Value: 0x0000000000000001
- Tag: DT_NULL
Value: 0x0000000000000000
ProgramHeaders:
- Type: PT_LOAD
Flags: [ PF_R ]

View File

@ -18,16 +18,21 @@ Sections:
- Name: .dynamic
Type: SHT_DYNAMIC
Flags: [ SHF_ALLOC ]
Address: 0x1018
AddressAlign: 8
Content: "0e0000000000000005000000000000000a000000000000001400000000000000050000000000000000100000000000000600000000000000001000000000000000000000000000000000000000000000"
# DT_SONAME 5 (0x05)
# DT_STRSZ 20 (0x14)
# DT_STRTAB 0x1000
# DT_SYMTAB 0x1000
# DT_NULL 0x0
Size: 80
Address: 0x0000000000001018
Link: .dynstr
AddressAlign: 0x0000000000000008
EntSize: 0x0000000000000010
Entries:
- Tag: DT_SONAME
Value: 0x0000000000000005
- Tag: DT_STRSZ
Value: 0x0000000000000014
- Tag: DT_STRTAB
Value: 0x0000000000001000
- Tag: DT_SYMTAB
Value: 0x0000000000001000
- Tag: DT_NULL
Value: 0x0000000000000000
ProgramHeaders:
- Type: PT_LOAD
Flags: [ PF_R ]

View File

@ -17,16 +17,21 @@ Sections:
- Name: .dynamic
Type: SHT_DYNAMIC
Flags: [ SHF_ALLOC ]
Address: 0x1018
AddressAlign: 8
Content: "0e0000000000000005000000000000000a000000000000000f00000000000000050000000000000000100000000000000600000000000000001000000000000000000000000000000000000000000000"
# DT_SONAME 5 (0x05)
# DT_STRSZ 15 (0x0F)
# DT_STRTAB 0x1000
# DT_SYMTAB 0x1000
# DT_NULL 0x0
Size: 80
Address: 0x0000000000001018
Link: .dynstr
AddressAlign: 0x0000000000000008
EntSize: 0x0000000000000010
Entries:
- Tag: DT_SONAME
Value: 0x0000000000000005
- Tag: DT_STRSZ
Value: 0x000000000000000F
- Tag: DT_STRTAB
Value: 0x0000000000001000
- Tag: DT_SYMTAB
Value: 0x0000000000001000
- Tag: DT_NULL
Value: 0x0000000000000000
ProgramHeaders:
- Type: PT_LOAD
Flags: [ PF_R ]

View File

@ -17,16 +17,21 @@ Sections:
- Name: .dynamic
Type: SHT_DYNAMIC
Flags: [ SHF_ALLOC ]
Address: 0x1018
AddressAlign: 8
Content: "0e0000000000000005000000000000000a000000000000001400000000000000050000000000000000100000000000000600000000000000001000000000000000000000000000000000000000000000"
# DT_SONAME 5 (0x05)
# DT_STRSZ 20 (0x14)
# DT_STRTAB 0x1000
# DT_SYMTAB 0x1000
# DT_NULL 0x0
Size: 80
Address: 0x0000000000001018
Link: .dynstr
AddressAlign: 0x0000000000000008
EntSize: 0x0000000000000010
Entries:
- Tag: DT_SONAME
Value: 0x0000000000000005
- Tag: DT_STRSZ
Value: 0x0000000000000014
- Tag: DT_STRTAB
Value: 0x0000000000001000
- Tag: DT_SYMTAB
Value: 0x0000000000001000
- Tag: DT_NULL
Value: 0x0000000000000000
ProgramHeaders:
- Type: PT_LOAD
Flags: [ PF_R ]

View File

@ -10,8 +10,65 @@ FileHeader:
Sections:
- Name: .dynamic
Type: SHT_DYNAMIC
Flags: [ SHF_ALLOC, SHF_WRITE ]
Content: 0c00000000000000a0060000000000000d0000000000000024090000000000001900000000000000a80d2000000000001b0000000000000010000000000000001a00000000000000b80d2000000000001c000000000000000800000000000000f5feff6f0000000098020000000000000500000000000000c8030000000000000600000000000000c0020000000000000a000000000000002f010000000000000b0000000000000018000000000000001500000000000000000000000000000003000000000000000010200000000000020000000000000048000000000000001400000000000000070000000000000017000000000000005806000000000000070000000000000050050000000000000800000000000000080100000000000009000000000000001800000000000000fbffff6f000000000000000800000000feffff6f000000001005000000000000ffffff6f000000000200000000000000f0ffff6f00000000f804000000000000f9ffff6f0000000004000000000000002300000000000000140000000000000024000000000000002143658700000000250000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000
Flags: [ SHF_WRITE, SHF_ALLOC ]
EntSize: 0x0000000000000010
Entries:
- Tag: DT_INIT
Value: 0x00000000000006A0
- Tag: DT_FINI
Value: 0x0000000000000924
- Tag: DT_INIT_ARRAY
Value: 0x0000000000200DA8
- Tag: DT_INIT_ARRAYSZ
Value: 0x0000000000000010
- Tag: DT_FINI_ARRAY
Value: 0x0000000000200DB8
- Tag: DT_FINI_ARRAYSZ
Value: 0x0000000000000008
- Tag: DT_GNU_HASH
Value: 0x0000000000000298
- Tag: DT_STRTAB
Value: 0x00000000000003C8
- Tag: DT_SYMTAB
Value: 0x00000000000002C0
- Tag: DT_STRSZ
Value: 0x000000000000012F
- Tag: DT_SYMENT
Value: 0x0000000000000018
- Tag: DT_DEBUG
Value: 0x0000000000000000
- Tag: DT_PLTGOT
Value: 0x0000000000201000
- Tag: DT_PLTRELSZ
Value: 0x0000000000000048
- Tag: DT_PLTREL
Value: 0x0000000000000007
- Tag: DT_JMPREL
Value: 0x0000000000000658
- Tag: DT_RELA
Value: 0x0000000000000550
- Tag: DT_RELASZ
Value: 0x0000000000000108
- Tag: DT_RELAENT
Value: 0x0000000000000018
- Tag: DT_FLAGS_1
Value: 0x0000000008000000
- Tag: DT_VERNEED
Value: 0x0000000000000510
- Tag: DT_VERNEEDNUM
Value: 0x0000000000000002
- Tag: DT_VERSYM
Value: 0x00000000000004F8
- Tag: DT_RELACOUNT
Value: 0x0000000000000004
- Tag: DT_RELRSZ
Value: 0x0000000000000014
- Tag: DT_RELR
Value: 0x0000000087654321
- Tag: DT_RELRENT
Value: 0x0000000000000010
- Tag: DT_NULL
Value: 0x0000000000000000
# CHECK: INIT 0x00000000000006a0
# CHECK: FINI 0x0000000000000924

View File

@ -156,21 +156,30 @@ Sections:
Symbol: _Z3fooc
Type: R_X86_64_PC32
Addend: 0x4
- Name: .dynamic
Type: SHT_DYNAMIC
Flags: [ SHF_ALLOC ]
Link: .dynstr
Address: 0x1000
AddressAlign: 0x1000
## DT_STRTAB - 0x0
## DT_STRSZ - 0x9
## DT_SYMTAB - 0x100
## DT_SYMENT - 0x18
## DT_RELA - 0x200
## DT_RELASZ - 0x18
## DT_RELAENT - 0x18
## DT_NULL - 0x0
Content: "050000000000000000000000000000000a000000000000000900000000000000060000000000000000010000000000000b00000000000000180000000000000007000000000000000002000000000000080000000000000018000000000000000900000000000000180000000000000000000000000000000000000000000000"
- Name: .dynamic
Type: SHT_DYNAMIC
Flags: [ SHF_ALLOC ]
Address: 0x0000000000001000
Link: .dynstr
AddressAlign: 0x0000000000001000
EntSize: 0x0000000000000010
Entries:
- Tag: DT_STRTAB
Value: 0x0000000000000000
- Tag: DT_STRSZ
Value: 0x0000000000000009
- Tag: DT_SYMTAB
Value: 0x0000000000000100
- Tag: DT_SYMENT
Value: 0x0000000000000018
- Tag: DT_RELA
Value: 0x0000000000000200
- Tag: DT_RELASZ
Value: 0x0000000000000018
- Tag: DT_RELAENT
Value: 0x0000000000000018
- Tag: DT_NULL
Value: 0x0000000000000000
- Name: .text.foo
Type: SHT_PROGBITS
Flags: [ SHF_ALLOC, SHF_EXECINSTR, SHF_GROUP ]

View File

@ -71,18 +71,24 @@ Sections:
## st_name: 1; st_info: Global | Func; st_other: 0;
## st_shndx: .text.foo; st_value: 0x2000; st_size: 0
Content: "000000000000000000000000000000000000000000000000010000001200040000200000000000000000000000000000"
- Name: .dynamic
Type: SHT_DYNAMIC
Flags: [ SHF_ALLOC ]
Link: .dynstr
Address: 0x1000
AddressAlign: 0x1000
## DT_STRTAB - 0x0
## DT_STRSZ - 0x9
## DT_SYMTAB - 0x100
## DT_SYMENT - 0x18
## DT_NULL - 0x0
Content: "050000000000000000000000000000000a000000000000000900000000000000060000000000000000010000000000000b00000000000000180000000000000000000000000000000000000000000000"
- Name: .dynamic
Type: SHT_DYNAMIC
Flags: [ SHF_ALLOC ]
Address: 0x0000000000001000
Link: .dynstr
AddressAlign: 0x0000000000001000
EntSize: 0x0000000000000010
Entries:
- Tag: DT_STRTAB
Value: 0x0000000000000000
- Tag: DT_STRSZ
Value: 0x0000000000000009
- Tag: DT_SYMTAB
Value: 0x0000000000000100
- Tag: DT_SYMENT
Value: 0x0000000000000018
- Tag: DT_NULL
Value: 0x0000000000000000
- Name: .text.foo
Type: SHT_PROGBITS
Flags: [ SHF_ALLOC, SHF_EXECINSTR, SHF_GROUP ]

View File

@ -0,0 +1,248 @@
# RUN: yaml2obj %s -o %t
# RUN: obj2yaml %t | FileCheck %s
## Check we can use obj2yaml to yamalize the object containing
## .dynamic section. Check that resulting section has the
## proper attributes and dynamic tags.
# CHECK: Sections:
# CHECK-NEXT: - Name: .dynamic
# CHECK-NEXT: Type: SHT_DYNAMIC
# CHECK-NEXT: Address: 0x0000000000001000
# CHECK-NEXT: AddressAlign: 0x0000000000002000
# CHECK-NEXT: EntSize: 0x0000000000000010
# CHECK-NEXT: Entries:
# CHECK-NEXT: - Tag: DT_NULL
# CHECK-NEXT: Value: 0x0000000000000000
# CHECK-NEXT: - Tag: DT_NEEDED
# CHECK-NEXT: Value: 0x0000000000000001
# CHECK-NEXT: - Tag: DT_PLTRELSZ
# CHECK-NEXT: Value: 0x0000000000000002
# CHECK-NEXT: - Tag: DT_PLTGOT
# CHECK-NEXT: Value: 0x0000000000000003
# CHECK-NEXT: - Tag: DT_HASH
# CHECK-NEXT: Value: 0x0000000000000004
# CHECK-NEXT: - Tag: DT_STRTAB
# CHECK-NEXT: Value: 0x0000000000000005
# CHECK-NEXT: - Tag: DT_SYMTAB
# CHECK-NEXT: Value: 0x0000000000000006
# CHECK-NEXT: - Tag: DT_RELA
# CHECK-NEXT: Value: 0x0000000000000007
# CHECK-NEXT: - Tag: DT_RELASZ
# CHECK-NEXT: Value: 0x0000000000000008
# CHECK-NEXT: - Tag: DT_RELAENT
# CHECK-NEXT: Value: 0x0000000000000009
# CHECK-NEXT: - Tag: DT_STRSZ
# CHECK-NEXT: Value: 0x000000000000000A
# CHECK-NEXT: - Tag: DT_SYMENT
# CHECK-NEXT: Value: 0x000000000000000B
# CHECK-NEXT: - Tag: DT_INIT
# CHECK-NEXT: Value: 0x000000000000000C
# CHECK-NEXT: - Tag: DT_FINI
# CHECK-NEXT: Value: 0x000000000000000D
# CHECK-NEXT: - Tag: DT_SONAME
# CHECK-NEXT: Value: 0x000000000000000E
# CHECK-NEXT: - Tag: DT_RPATH
# CHECK-NEXT: Value: 0x000000000000000F
# CHECK-NEXT: - Tag: DT_SYMBOLIC
# CHECK-NEXT: Value: 0x0000000000000010
# CHECK-NEXT: - Tag: DT_REL
# CHECK-NEXT: Value: 0x0000000000000011
# CHECK-NEXT: - Tag: DT_RELSZ
# CHECK-NEXT: Value: 0x0000000000000012
# CHECK-NEXT: - Tag: DT_RELENT
# CHECK-NEXT: Value: 0x0000000000000013
# CHECK-NEXT: - Tag: DT_PLTREL
# CHECK-NEXT: Value: 0x0000000000000014
# CHECK-NEXT: - Tag: DT_DEBUG
# CHECK-NEXT: Value: 0x0000000000000015
# CHECK-NEXT: - Tag: DT_TEXTREL
# CHECK-NEXT: Value: 0x0000000000000016
# CHECK-NEXT: - Tag: DT_JMPREL
# CHECK-NEXT: Value: 0x0000000000000017
# CHECK-NEXT: - Tag: DT_BIND_NOW
# CHECK-NEXT: Value: 0x0000000000000018
# CHECK-NEXT: - Tag: DT_INIT_ARRAY
# CHECK-NEXT: Value: 0x0000000000000019
# CHECK-NEXT: - Tag: DT_FINI_ARRAY
# CHECK-NEXT: Value: 0x000000000000001A
# CHECK-NEXT: - Tag: DT_INIT_ARRAYSZ
# CHECK-NEXT: Value: 0x000000000000001B
# CHECK-NEXT: - Tag: DT_FINI_ARRAYSZ
# CHECK-NEXT: Value: 0x000000000000001C
# CHECK-NEXT: - Tag: DT_RUNPATH
# CHECK-NEXT: Value: 0x000000000000001D
# CHECK-NEXT: - Tag: DT_FLAGS
# CHECK-NEXT: Value: 0x000000000000001E
# CHECK-NEXT: - Tag: DT_PREINIT_ARRAY
# CHECK-NEXT: Value: 0x000000000000001F
# CHECK-NEXT: - Tag: DT_PREINIT_ARRAYSZ
# CHECK-NEXT: Value: 0x0000000000000020
# CHECK-NEXT: - Tag: DT_SYMTAB_SHNDX
# CHECK-NEXT: Value: 0x0000000000000021
# CHECK-NEXT: - Tag: DT_RELRSZ
# CHECK-NEXT: Value: 0x0000000000000022
# CHECK-NEXT: - Tag: DT_RELR
# CHECK-NEXT: Value: 0x0000000000000023
# CHECK-NEXT: - Tag: DT_RELRENT
# CHECK-NEXT: Value: 0x0000000000000024
# CHECK-NEXT: - Tag: DT_ANDROID_REL
# CHECK-NEXT: Value: 0x0000000000000025
# CHECK-NEXT: - Tag: DT_ANDROID_RELSZ
# CHECK-NEXT: Value: 0x0000000000000026
# CHECK-NEXT: - Tag: DT_ANDROID_RELA
# CHECK-NEXT: Value: 0x0000000000000027
# CHECK-NEXT: - Tag: DT_ANDROID_RELASZ
# CHECK-NEXT: Value: 0x0000000000000028
# CHECK-NEXT: - Tag: DT_ANDROID_RELR
# CHECK-NEXT: Value: 0x0000000000000029
# CHECK-NEXT: - Tag: DT_ANDROID_RELRSZ
# CHECK-NEXT: Value: 0x000000000000002A
# CHECK-NEXT: - Tag: DT_ANDROID_RELRENT
# CHECK-NEXT: Value: 0x000000000000002B
# CHECK-NEXT: - Tag: DT_GNU_HASH
# CHECK-NEXT: Value: 0x000000000000002C
# CHECK-NEXT: - Tag: DT_TLSDESC_PLT
# CHECK-NEXT: Value: 0x000000000000002D
# CHECK-NEXT: - Tag: DT_TLSDESC_GOT
# CHECK-NEXT: Value: 0x000000000000002E
# CHECK-NEXT: - Tag: DT_RELACOUNT
# CHECK-NEXT: Value: 0x000000000000002F
# CHECK-NEXT: - Tag: DT_RELCOUNT
# CHECK-NEXT: Value: 0x0000000000000030
# CHECK-NEXT: - Tag: DT_FLAGS_1
# CHECK-NEXT: Value: 0x0000000000000031
# CHECK-NEXT: - Tag: DT_VERSYM
# CHECK-NEXT: Value: 0x0000000000000032
# CHECK-NEXT: - Tag: DT_VERDEF
# CHECK-NEXT: Value: 0x0000000000000033
# CHECK-NEXT: - Tag: DT_VERDEFNUM
# CHECK-NEXT: Value: 0x0000000000000034
# CHECK-NEXT: - Tag: DT_VERNEED
# CHECK-NEXT: Value: 0x0000000000000035
# CHECK-NEXT: - Tag: DT_VERNEEDNUM
# CHECK-NEXT: Value: 0x0000000000000036
!ELF
FileHeader:
Class: ELFCLASS64
Data: ELFDATA2LSB
Type: ET_DYN
Machine: EM_X86_64
Sections:
- Name: .dynamic
Type: SHT_DYNAMIC
Address: 0x0000000000001000
AddressAlign: 0x0000000000002000
EntSize: 0x0000000000000010
Entries:
- Tag: DT_NULL
Value: 0x0000000000000000
- Tag: DT_NEEDED
Value: 0x0000000000000001
- Tag: DT_PLTRELSZ
Value: 0x0000000000000002
- Tag: DT_PLTGOT
Value: 0x0000000000000003
- Tag: DT_HASH
Value: 0x0000000000000004
- Tag: DT_STRTAB
Value: 0x0000000000000005
- Tag: DT_SYMTAB
Value: 0x0000000000000006
- Tag: DT_RELA
Value: 0x0000000000000007
- Tag: DT_RELASZ
Value: 0x0000000000000008
- Tag: DT_RELAENT
Value: 0x0000000000000009
- Tag: DT_STRSZ
Value: 0x000000000000000A
- Tag: DT_SYMENT
Value: 0x000000000000000B
- Tag: DT_INIT
Value: 0x000000000000000C
- Tag: DT_FINI
Value: 0x000000000000000D
- Tag: DT_SONAME
Value: 0x000000000000000E
- Tag: DT_RPATH
Value: 0x000000000000000F
- Tag: DT_SYMBOLIC
Value: 0x0000000000000010
- Tag: DT_REL
Value: 0x0000000000000011
- Tag: DT_RELSZ
Value: 0x0000000000000012
- Tag: DT_RELENT
Value: 0x0000000000000013
- Tag: DT_PLTREL
Value: 0x0000000000000014
- Tag: DT_DEBUG
Value: 0x0000000000000015
- Tag: DT_TEXTREL
Value: 0x0000000000000016
- Tag: DT_JMPREL
Value: 0x0000000000000017
- Tag: DT_BIND_NOW
Value: 0x0000000000000018
- Tag: DT_INIT_ARRAY
Value: 0x0000000000000019
- Tag: DT_FINI_ARRAY
Value: 0x000000000000001A
- Tag: DT_INIT_ARRAYSZ
Value: 0x000000000000001B
- Tag: DT_FINI_ARRAYSZ
Value: 0x000000000000001C
- Tag: DT_RUNPATH
Value: 0x000000000000001D
- Tag: DT_FLAGS
Value: 0x000000000000001E
- Tag: DT_PREINIT_ARRAY
Value: 0x000000000000001F
- Tag: DT_PREINIT_ARRAYSZ
Value: 0x0000000000000020
- Tag: DT_SYMTAB_SHNDX
Value: 0x0000000000000021
- Tag: DT_RELRSZ
Value: 0x0000000000000022
- Tag: DT_RELR
Value: 0x0000000000000023
- Tag: DT_RELRENT
Value: 0x0000000000000024
- Tag: DT_ANDROID_REL
Value: 0x0000000000000025
- Tag: DT_ANDROID_RELSZ
Value: 0x0000000000000026
- Tag: DT_ANDROID_RELA
Value: 0x0000000000000027
- Tag: DT_ANDROID_RELASZ
Value: 0x0000000000000028
- Tag: DT_ANDROID_RELR
Value: 0x0000000000000029
- Tag: DT_ANDROID_RELRSZ
Value: 0x000000000000002A
- Tag: DT_ANDROID_RELRENT
Value: 0x000000000000002B
- Tag: DT_GNU_HASH
Value: 0x000000000000002C
- Tag: DT_TLSDESC_PLT
Value: 0x000000000000002D
- Tag: DT_TLSDESC_GOT
Value: 0x000000000000002E
- Tag: DT_RELACOUNT
Value: 0x000000000000002F
- Tag: DT_RELCOUNT
Value: 0x0000000000000030
- Tag: DT_FLAGS_1
Value: 0x0000000000000031
- Tag: DT_VERSYM
Value: 0x0000000000000032
- Tag: DT_VERDEF
Value: 0x0000000000000033
- Tag: DT_VERDEFNUM
Value: 0x0000000000000034
- Tag: DT_VERNEED
Value: 0x0000000000000035
- Tag: DT_VERNEEDNUM
Value: 0x0000000000000036

View File

@ -21,6 +21,7 @@ namespace {
template <class ELFT>
class ELFDumper {
typedef object::Elf_Sym_Impl<ELFT> Elf_Sym;
typedef typename ELFT::Dyn Elf_Dyn;
typedef typename ELFT::Shdr Elf_Shdr;
typedef typename ELFT::Word Elf_Word;
typedef typename ELFT::Rel Elf_Rel;
@ -50,7 +51,8 @@ class ELFDumper {
template <class RelT>
std::error_code dumpRelocation(const RelT *Rel, const Elf_Shdr *SymTab,
ELFYAML::Relocation &R);
ErrorOr<ELFYAML::DynamicSection *> dumpDynamicSection(const Elf_Shdr *Shdr);
ErrorOr<ELFYAML::RelocationSection *> dumpRelocSection(const Elf_Shdr *Shdr);
ErrorOr<ELFYAML::RawContentSection *>
dumpContentSection(const Elf_Shdr *Shdr);
@ -129,6 +131,13 @@ template <class ELFT> ErrorOr<ELFYAML::Object *> ELFDumper<ELFT>::dump() {
SectionNames.resize(Sections.size());
for (const Elf_Shdr &Sec : Sections) {
switch (Sec.sh_type) {
case ELF::SHT_DYNAMIC: {
ErrorOr<ELFYAML::DynamicSection *> S = dumpDynamicSection(&Sec);
if (std::error_code EC = S.getError())
return EC;
Y->Sections.push_back(std::unique_ptr<ELFYAML::Section>(S.get()));
break;
}
case ELF::SHT_NULL:
case ELF::SHT_STRTAB:
// Do not dump these sections.
@ -350,6 +359,23 @@ ELFDumper<ELFT>::dumpCommonRelocationSection(const Elf_Shdr *Shdr,
return obj2yaml_error::success;
}
template <class ELFT>
ErrorOr<ELFYAML::DynamicSection *>
ELFDumper<ELFT>::dumpDynamicSection(const Elf_Shdr *Shdr) {
auto S = make_unique<ELFYAML::DynamicSection>();
if (std::error_code EC = dumpCommonSection(Shdr, *S))
return EC;
auto DynTagsOrErr = Obj.template getSectionContentsAsArray<Elf_Dyn>(Shdr);
if (!DynTagsOrErr)
return errorToErrorCode(DynTagsOrErr.takeError());
for (const Elf_Dyn &Dyn : *DynTagsOrErr)
S->Entries.push_back({(ELFYAML::ELF_DYNTAG)Dyn.getTag(), Dyn.getVal()});
return S.release();
}
template <class ELFT>
ErrorOr<ELFYAML::RelocationSection *>
ELFDumper<ELFT>::dumpRelocSection(const Elf_Shdr *Shdr) {

View File

@ -159,6 +159,9 @@ class ELFState {
bool writeSectionContent(Elf_Shdr &SHeader,
const ELFYAML::MipsABIFlags &Section,
ContiguousBlobAccumulator &CBA);
void writeSectionContent(Elf_Shdr &SHeader,
const ELFYAML::DynamicSection &Section,
ContiguousBlobAccumulator &CBA);
bool hasDynamicSymbols() const;
SmallVector<const char *, 5> implicitSectionNames() const;
@ -291,6 +294,8 @@ bool ELFState<ELFT>::initSectionHeaders(std::vector<Elf_Shdr> &SHeaders,
// SHT_NOBITS section does not have content
// so just to setup the section offset.
CBA.getOSAndAlignedOffset(SHeader.sh_offset, SHeader.sh_addralign);
} else if (auto S = dyn_cast<ELFYAML::DynamicSection>(Sec.get())) {
writeSectionContent(SHeader, *S, CBA);
} else
llvm_unreachable("Unknown section type");
@ -465,8 +470,6 @@ ELFState<ELFT>::writeSectionContent(Elf_Shdr &SHeader,
SHeader.sh_entsize = *Section.EntSize;
else if (Section.Type == llvm::ELF::SHT_RELR)
SHeader.sh_entsize = sizeof(Elf_Relr);
else if (Section.Type == llvm::ELF::SHT_DYNAMIC)
SHeader.sh_entsize = sizeof(Elf_Dyn);
else
SHeader.sh_entsize = 0;
SHeader.sh_size = Section.Size;
@ -575,6 +578,29 @@ bool ELFState<ELFT>::writeSectionContent(Elf_Shdr &SHeader,
return true;
}
template <class ELFT>
void ELFState<ELFT>::writeSectionContent(Elf_Shdr &SHeader,
const ELFYAML::DynamicSection &Section,
ContiguousBlobAccumulator &CBA) {
typedef typename ELFT::uint uintX_t;
assert(Section.Type == llvm::ELF::SHT_DYNAMIC &&
"Section type is not SHT_DYNAMIC");
SHeader.sh_size = 2 * sizeof(uintX_t) * Section.Entries.size();
if (Section.EntSize)
SHeader.sh_entsize = *Section.EntSize;
else
SHeader.sh_entsize = sizeof(Elf_Dyn);
auto &OS = CBA.getOSAndAlignedOffset(SHeader.sh_offset, SHeader.sh_addralign);
for (const ELFYAML::DynamicEntry &DE : Section.Entries) {
uintX_t Tag = DE.Tag;
OS.write((const char *)&Tag, sizeof(uintX_t));
uintX_t Val = DE.Val;
OS.write((const char *)&Val, sizeof(uintX_t));
}
}
template <class ELFT> bool ELFState<ELFT>::buildSectionIndex() {
for (unsigned i = 0, e = Doc.Sections.size(); i != e; ++i) {
StringRef Name = Doc.Sections[i]->Name;