mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-22 18:54:02 +01:00
Revert "[llvm-objcopy] Add support for relocations"
This reverts r312643 because it's failing on llvm-i686-linux-RA. llvm-svn: 312645
This commit is contained in:
parent
c3ef22ce69
commit
3a78bfa9ca
@ -1,91 +0,0 @@
|
||||
# RUN: yaml2obj %s > %t
|
||||
# RUN: llvm-objcopy %t %t2
|
||||
# RUN: llvm-readobj -relocations %t2 | FileCheck %s
|
||||
|
||||
!ELF
|
||||
FileHeader:
|
||||
Class: ELFCLASS64
|
||||
Data: ELFDATA2LSB
|
||||
Type: ET_EXEC
|
||||
Machine: EM_X86_64
|
||||
Sections:
|
||||
- Name: .text
|
||||
Type: SHT_PROGBITS
|
||||
Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
|
||||
Address: 0x1000
|
||||
AddressAlign: 0x0000000000000010
|
||||
Content: "0000000000000000"
|
||||
- Name: .rel.text
|
||||
Type: SHT_REL
|
||||
Link: .symtab
|
||||
Info: .text
|
||||
Relocations:
|
||||
- Offset: 0x1000
|
||||
Symbol: foo
|
||||
Type: R_X86_64_PC32
|
||||
- Name: .data
|
||||
Type: SHT_PROGBITS
|
||||
Flags: [ SHF_ALLOC ]
|
||||
Address: 0x2000
|
||||
AddressAlign: 0x0000000000000010
|
||||
Content: "0000000000000000"
|
||||
- Name: .rel.data
|
||||
Type: SHT_REL
|
||||
Link: .symtab
|
||||
Info: .data
|
||||
Relocations:
|
||||
- Offset: 0x2000
|
||||
Symbol: bar
|
||||
Type: R_X86_64_PC32
|
||||
- Name: .rela.data
|
||||
Type: SHT_RELA
|
||||
Link: .symtab
|
||||
Info: .data
|
||||
Relocations:
|
||||
- Offset: 0x2000
|
||||
Symbol: barA
|
||||
Type: R_X86_64_PC32
|
||||
Addend: 0x17
|
||||
- Name: .rela.text
|
||||
Type: SHT_RELA
|
||||
Link: .symtab
|
||||
Info: .text
|
||||
Relocations:
|
||||
- Offset: 0x1000
|
||||
Symbol: fooA
|
||||
Type: R_X86_64_PC32
|
||||
Addend: 0x13
|
||||
Symbols:
|
||||
Global:
|
||||
- Name: _start
|
||||
Type: STT_FUNC
|
||||
Section: .text
|
||||
Value: 0x1000
|
||||
Size: 4
|
||||
- Name: foo
|
||||
Type: STT_FUNC
|
||||
Size: 4
|
||||
- Name: fooA
|
||||
Type: STT_FUNC
|
||||
Size: 4
|
||||
- Name: bar
|
||||
Type: STT_OBJECT
|
||||
Size: 4
|
||||
- Name: barA
|
||||
Type: STT_OBJECT
|
||||
Size: 4
|
||||
|
||||
# CHECK: Relocations [
|
||||
# CHECK-NEXT: Section (2) .rel.text {
|
||||
# CHECK-NEXT: 0x1000 R_X86_64_PC32 foo 0x0
|
||||
# CHECK-NEXT: }
|
||||
# CHECK-NEXT: Section (4) .rel.data {
|
||||
# CHECK-NEXT: 0x2000 R_X86_64_PC32 bar 0x0
|
||||
# CHECK-NEXT: }
|
||||
# CHECK-NEXT: Section (5) .rela.data {
|
||||
# CHECK-NEXT: 0x2000 R_X86_64_PC32 barA 0x17
|
||||
# CHECK-NEXT: }
|
||||
# CHECK-NEXT: Section (6) .rela.text {
|
||||
# CHECK-NEXT: 0x1000 R_X86_64_PC32 fooA 0x13
|
||||
# CHECK-NEXT: }
|
||||
# CHECK-NEXT:]
|
@ -1,30 +0,0 @@
|
||||
# RUN: yaml2obj %s > %t
|
||||
# RUN: llvm-objcopy %t %t2
|
||||
# RUN: llvm-readobj -relocations %t2 | FileCheck %s
|
||||
|
||||
!ELF
|
||||
FileHeader:
|
||||
Class: ELFCLASS64
|
||||
Data: ELFDATA2LSB
|
||||
Type: ET_EXEC
|
||||
Machine: EM_X86_64
|
||||
Sections:
|
||||
- Name: .text
|
||||
Type: SHT_PROGBITS
|
||||
Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
|
||||
Address: 0x1000
|
||||
AddressAlign: 0x0000000000000010
|
||||
Content: "0000000000000000"
|
||||
- Name: .rel.text
|
||||
Type: SHT_REL
|
||||
Link: .symtab
|
||||
Info: .text
|
||||
Relocations:
|
||||
- Offset: 0x1000
|
||||
Type: R_X86_64_RELATIVE
|
||||
|
||||
# CHECK: Relocations [
|
||||
# CHECK-NEXT: Section (2) .rel.text {
|
||||
# CHECK-NEXT: 0x1000 R_X86_64_RELATIVE - 0x0
|
||||
# CHECK-NEXT: }
|
||||
# CHECK-NEXT:]
|
@ -154,39 +154,6 @@ void SymbolTableSectionImpl<ELFT>::writeSection(
|
||||
}
|
||||
}
|
||||
|
||||
template <class ELFT> void RelocationSection<ELFT>::finalize() {
|
||||
this->Link = Symbols->Index;
|
||||
this->Info = SecToApplyRel->Index;
|
||||
}
|
||||
|
||||
template <class ELFT>
|
||||
void setAddend(Elf_Rel_Impl<ELFT, false> &Rel, uint64_t Addend) {}
|
||||
|
||||
template <class ELFT>
|
||||
void setAddend(Elf_Rel_Impl<ELFT, true> &Rela, uint64_t Addend) {
|
||||
Rela.r_addend = Addend;
|
||||
}
|
||||
|
||||
template <class ELFT>
|
||||
template <class T>
|
||||
void RelocationSection<ELFT>::writeRel(T *Buf) const {
|
||||
for (const auto &Reloc : Relocations) {
|
||||
Buf->r_offset = Reloc.Offset;
|
||||
setAddend(*Buf, Reloc.Addend);
|
||||
Buf->setSymbolAndType(Reloc.Symbol->Index, Reloc.Type, false);
|
||||
++Buf;
|
||||
}
|
||||
}
|
||||
|
||||
template <class ELFT>
|
||||
void RelocationSection<ELFT>::writeSection(llvm::FileOutputBuffer &Out) const {
|
||||
uint8_t *Buf = Out.getBufferStart() + Offset;
|
||||
if (Type == SHT_REL)
|
||||
writeRel(reinterpret_cast<Elf_Rel *>(Buf));
|
||||
else
|
||||
writeRel(reinterpret_cast<Elf_Rela *>(Buf));
|
||||
}
|
||||
|
||||
// Returns true IFF a section is wholly inside the range of a segment
|
||||
static bool sectionWithinSegment(const SectionBase &Section,
|
||||
const Segment &Segment) {
|
||||
@ -263,36 +230,12 @@ void Object<ELFT>::initSymbolTable(const llvm::object::ELFFile<ELFT> &ElfFile,
|
||||
}
|
||||
}
|
||||
|
||||
template <class ELFT>
|
||||
static void getAddend(uint64_t &ToSet, const Elf_Rel_Impl<ELFT, false> &Rel) {}
|
||||
|
||||
template <class ELFT>
|
||||
static void getAddend(uint64_t &ToSet, const Elf_Rel_Impl<ELFT, true> &Rela) {
|
||||
ToSet = Rela.r_addend;
|
||||
}
|
||||
|
||||
template <class ELFT, class T>
|
||||
void initRelocations(RelocationSection<ELFT> *Relocs,
|
||||
SymbolTableSection *SymbolTable, T RelRange) {
|
||||
for (const auto &Rel : RelRange) {
|
||||
Relocation ToAdd;
|
||||
ToAdd.Offset = Rel.r_offset;
|
||||
getAddend(ToAdd.Addend, Rel);
|
||||
ToAdd.Type = Rel.getType(false);
|
||||
ToAdd.Symbol = SymbolTable->getSymbolByIndex(Rel.getSymbol(false));
|
||||
Relocs->addRelocation(ToAdd);
|
||||
}
|
||||
}
|
||||
|
||||
template <class ELFT>
|
||||
std::unique_ptr<SectionBase>
|
||||
Object<ELFT>::makeSection(const llvm::object::ELFFile<ELFT> &ElfFile,
|
||||
const Elf_Shdr &Shdr) {
|
||||
ArrayRef<uint8_t> Data;
|
||||
switch (Shdr.sh_type) {
|
||||
case SHT_REL:
|
||||
case SHT_RELA:
|
||||
return llvm::make_unique<RelocationSection<ELFT>>();
|
||||
case SHT_STRTAB:
|
||||
return llvm::make_unique<StringTableSection>();
|
||||
case SHT_SYMTAB: {
|
||||
@ -336,35 +279,6 @@ void Object<ELFT>::readSectionHeaders(const ELFFile<ELFT> &ElfFile) {
|
||||
// details about symbol tables.
|
||||
if (SymbolTable)
|
||||
initSymbolTable(ElfFile, SymbolTable);
|
||||
|
||||
// Now that all sections and symbols have been added we can add
|
||||
// relocations that reference symbols and set the link and info fields for
|
||||
// relocation sections.
|
||||
for (auto &Section : Sections) {
|
||||
if (auto RelSec = dyn_cast<RelocationSection<ELFT>>(Section.get())) {
|
||||
if (RelSec->Link - 1 >= Sections.size() || RelSec->Link == 0) {
|
||||
error("Link field value " + Twine(RelSec->Link) + " in section " +
|
||||
RelSec->Name + " is invalid");
|
||||
}
|
||||
if (RelSec->Info - 1 >= Sections.size() || RelSec->Info == 0) {
|
||||
error("Info field value " + Twine(RelSec->Link) + " in section " +
|
||||
RelSec->Name + " is invalid");
|
||||
}
|
||||
auto SymTab =
|
||||
dyn_cast<SymbolTableSection>(Sections[RelSec->Link - 1].get());
|
||||
if (SymTab == nullptr) {
|
||||
error("Link field of relocation section " + RelSec->Name +
|
||||
" is not a symbol table");
|
||||
}
|
||||
RelSec->setSymTab(SymTab);
|
||||
RelSec->setSection(Sections[RelSec->Info - 1].get());
|
||||
auto Shdr = unwrapOrError(ElfFile.sections()).begin() + RelSec->Index;
|
||||
if (RelSec->Type == SHT_REL)
|
||||
initRelocations(RelSec, SymTab, unwrapOrError(ElfFile.rels(Shdr)));
|
||||
else
|
||||
initRelocations(RelSec, SymTab, unwrapOrError(ElfFile.relas(Shdr)));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
template <class ELFT> Object<ELFT>::Object(const ELFObjectFile<ELFT> &Obj) {
|
||||
|
@ -146,35 +146,6 @@ template <class ELFT> class SymbolTableSectionImpl : public SymbolTableSection {
|
||||
void writeSection(llvm::FileOutputBuffer &Out) const override;
|
||||
};
|
||||
|
||||
struct Relocation {
|
||||
const Symbol *Symbol;
|
||||
uint64_t Offset;
|
||||
uint64_t Addend;
|
||||
uint32_t Type;
|
||||
};
|
||||
|
||||
template <class ELFT> class RelocationSection : public SectionBase {
|
||||
private:
|
||||
typedef typename ELFT::Rel Elf_Rel;
|
||||
typedef typename ELFT::Rela Elf_Rela;
|
||||
|
||||
std::vector<Relocation> Relocations;
|
||||
SymbolTableSection *Symbols;
|
||||
SectionBase *SecToApplyRel;
|
||||
|
||||
template <class T> void writeRel(T *Buf) const;
|
||||
|
||||
public:
|
||||
void setSymTab(SymbolTableSection *StrTab) { Symbols = StrTab; }
|
||||
void setSection(SectionBase *Sec) { SecToApplyRel = Sec; }
|
||||
void addRelocation(Relocation Rel) { Relocations.push_back(Rel); }
|
||||
void finalize() override;
|
||||
void writeSection(llvm::FileOutputBuffer &Out) const override;
|
||||
static bool classof(const SectionBase *S) {
|
||||
return S->Type == llvm::ELF::SHT_REL || S->Type == llvm::ELF::SHT_RELA;
|
||||
}
|
||||
};
|
||||
|
||||
template <class ELFT> class Object {
|
||||
private:
|
||||
typedef std::unique_ptr<SectionBase> SecPtr;
|
||||
|
Loading…
Reference in New Issue
Block a user