forked from OSchip/llvm-project
parent
d7a7ae061f
commit
03fc8d1e0d
|
|
@ -208,7 +208,7 @@ struct ScriptConfiguration {
|
||||||
// A map from memory region name to a memory region descriptor.
|
// A map from memory region name to a memory region descriptor.
|
||||||
llvm::DenseMap<llvm::StringRef, MemoryRegion> MemoryRegions;
|
llvm::DenseMap<llvm::StringRef, MemoryRegion> MemoryRegions;
|
||||||
|
|
||||||
// A list of undefined symbols referenced by the script.
|
// A list of symbols referenced by the script.
|
||||||
std::vector<llvm::StringRef> ReferencedSymbols;
|
std::vector<llvm::StringRef> ReferencedSymbols;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -434,13 +434,19 @@ SortSectionPolicy ScriptParser::readSortKind() {
|
||||||
return SortSectionPolicy::Default;
|
return SortSectionPolicy::Default;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Method reads a list of sequence of excluded files and section globs given in
|
// Reads SECTIONS command contents in the following form:
|
||||||
// a following form: ((EXCLUDE_FILE(file_pattern+))? section_pattern+)+
|
//
|
||||||
// Example: *(.foo.1 EXCLUDE_FILE (*a.o) .foo.2 EXCLUDE_FILE (*b.o) .foo.3)
|
// <contents> ::= <elem>*
|
||||||
// The semantics of that is next:
|
// <elem> ::= <exclude>? <glob-pattern>
|
||||||
// * Include .foo.1 from every file.
|
// <exclude> ::= "EXCLUDE_FILE" "(" <glob-pattern>+ ")"
|
||||||
// * Include .foo.2 from every file but a.o
|
//
|
||||||
// * Include .foo.3 from every file but b.o
|
// For example,
|
||||||
|
//
|
||||||
|
// *(.foo EXCLUDE_FILE (a.o) .bar EXCLUDE_FILE (b.o) .baz)
|
||||||
|
//
|
||||||
|
// is parsed as ".foo", ".bar" with "a.o", and ".baz" with "b.o".
|
||||||
|
// The semantics of that is section .foo in any file, section .bar in
|
||||||
|
// any file but a.o, and section .baz in any file but b.o.
|
||||||
std::vector<SectionPattern> ScriptParser::readInputSectionsList() {
|
std::vector<SectionPattern> ScriptParser::readInputSectionsList() {
|
||||||
std::vector<SectionPattern> Ret;
|
std::vector<SectionPattern> Ret;
|
||||||
while (!Error && peek() != ")") {
|
while (!Error && peek() != ")") {
|
||||||
|
|
|
||||||
|
|
@ -446,8 +446,8 @@ bool X86TargetInfo::isTlsInitialExecRel(uint32_t Type) const {
|
||||||
void X86TargetInfo::writePltHeader(uint8_t *Buf) const {
|
void X86TargetInfo::writePltHeader(uint8_t *Buf) const {
|
||||||
if (Config->Pic) {
|
if (Config->Pic) {
|
||||||
const uint8_t V[] = {
|
const uint8_t V[] = {
|
||||||
0xff, 0xb3, 0x04, 0x00, 0x00, 0x00, // pushl 4(%ebx)
|
0xff, 0xb3, 0x04, 0x00, 0x00, 0x00, // pushl GOTPLT+4(%ebx)
|
||||||
0xff, 0xa3, 0x08, 0x00, 0x00, 0x00, // jmp *8(%ebx)
|
0xff, 0xa3, 0x08, 0x00, 0x00, 0x00, // jmp *GOTPLT+8(%ebx)
|
||||||
0x90, 0x90, 0x90, 0x90 // nop
|
0x90, 0x90, 0x90, 0x90 // nop
|
||||||
};
|
};
|
||||||
memcpy(Buf, V, sizeof(V));
|
memcpy(Buf, V, sizeof(V));
|
||||||
|
|
@ -460,8 +460,8 @@ void X86TargetInfo::writePltHeader(uint8_t *Buf) const {
|
||||||
}
|
}
|
||||||
|
|
||||||
const uint8_t PltData[] = {
|
const uint8_t PltData[] = {
|
||||||
0xff, 0x35, 0x00, 0x00, 0x00, 0x00, // pushl (GOT+4)
|
0xff, 0x35, 0x00, 0x00, 0x00, 0x00, // pushl (GOTPLT+4)
|
||||||
0xff, 0x25, 0x00, 0x00, 0x00, 0x00, // jmp *(GOT+8)
|
0xff, 0x25, 0x00, 0x00, 0x00, 0x00, // jmp *(GOTPLT+8)
|
||||||
0x90, 0x90, 0x90, 0x90 // nop
|
0x90, 0x90, 0x90, 0x90 // nop
|
||||||
};
|
};
|
||||||
memcpy(Buf, PltData, sizeof(PltData));
|
memcpy(Buf, PltData, sizeof(PltData));
|
||||||
|
|
@ -720,15 +720,15 @@ void X86_64TargetInfo<ELFT>::writeGotPlt(uint8_t *Buf,
|
||||||
template <class ELFT>
|
template <class ELFT>
|
||||||
void X86_64TargetInfo<ELFT>::writePltHeader(uint8_t *Buf) const {
|
void X86_64TargetInfo<ELFT>::writePltHeader(uint8_t *Buf) const {
|
||||||
const uint8_t PltData[] = {
|
const uint8_t PltData[] = {
|
||||||
0xff, 0x35, 0x00, 0x00, 0x00, 0x00, // pushq GOT+8(%rip)
|
0xff, 0x35, 0x00, 0x00, 0x00, 0x00, // pushq GOTPLT+8(%rip)
|
||||||
0xff, 0x25, 0x00, 0x00, 0x00, 0x00, // jmp *GOT+16(%rip)
|
0xff, 0x25, 0x00, 0x00, 0x00, 0x00, // jmp *GOTPLT+16(%rip)
|
||||||
0x0f, 0x1f, 0x40, 0x00 // nopl 0x0(rax)
|
0x0f, 0x1f, 0x40, 0x00 // nop
|
||||||
};
|
};
|
||||||
memcpy(Buf, PltData, sizeof(PltData));
|
memcpy(Buf, PltData, sizeof(PltData));
|
||||||
uint64_t Got = In<ELFT>::GotPlt->getVA();
|
uint64_t GotPlt = In<ELFT>::GotPlt->getVA();
|
||||||
uint64_t Plt = In<ELFT>::Plt->getVA();
|
uint64_t Plt = In<ELFT>::Plt->getVA();
|
||||||
write32le(Buf + 2, Got - Plt + 2); // GOT+8
|
write32le(Buf + 2, GotPlt - Plt + 2); // GOTPLT+8
|
||||||
write32le(Buf + 8, Got - Plt + 4); // GOT+16
|
write32le(Buf + 8, GotPlt - Plt + 4); // GOTPLT+16
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class ELFT>
|
template <class ELFT>
|
||||||
|
|
@ -2222,14 +2222,16 @@ void MipsTargetInfo<ELFT>::writePltHeader(uint8_t *Buf) const {
|
||||||
write32<E>(Buf + 8, 0x279c0000); // addiu $28, $28, %lo(&GOTPLT[0])
|
write32<E>(Buf + 8, 0x279c0000); // addiu $28, $28, %lo(&GOTPLT[0])
|
||||||
write32<E>(Buf + 12, 0x031cc023); // subu $24, $24, $28
|
write32<E>(Buf + 12, 0x031cc023); // subu $24, $24, $28
|
||||||
}
|
}
|
||||||
|
|
||||||
write32<E>(Buf + 16, 0x03e07825); // move $15, $31
|
write32<E>(Buf + 16, 0x03e07825); // move $15, $31
|
||||||
write32<E>(Buf + 20, 0x0018c082); // srl $24, $24, 2
|
write32<E>(Buf + 20, 0x0018c082); // srl $24, $24, 2
|
||||||
write32<E>(Buf + 24, 0x0320f809); // jalr $25
|
write32<E>(Buf + 24, 0x0320f809); // jalr $25
|
||||||
write32<E>(Buf + 28, 0x2718fffe); // subu $24, $24, 2
|
write32<E>(Buf + 28, 0x2718fffe); // subu $24, $24, 2
|
||||||
uint64_t Got = In<ELFT>::GotPlt->getVA();
|
|
||||||
writeMipsHi16<E>(Buf, Got);
|
uint64_t GotPlt = In<ELFT>::GotPlt->getVA();
|
||||||
writeMipsLo16<E>(Buf + 4, Got);
|
writeMipsHi16<E>(Buf, GotPlt);
|
||||||
writeMipsLo16<E>(Buf + 8, Got);
|
writeMipsLo16<E>(Buf + 4, GotPlt);
|
||||||
|
writeMipsLo16<E>(Buf + 8, GotPlt);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class ELFT>
|
template <class ELFT>
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue