forked from OSchip/llvm-project
parent
fce7f1f434
commit
e4c0e3712f
|
@ -49,6 +49,10 @@ public:
|
|||
return false;
|
||||
}
|
||||
|
||||
virtual StringRef getInterpreter() const {
|
||||
return "/lib64/ld-linux-x86-64.so.2";
|
||||
}
|
||||
|
||||
/// \brief Does the output have dynamic sections.
|
||||
bool isDynamic() const {
|
||||
return _options._outputKind == OutputKind::DynamicExecutable ||
|
||||
|
|
|
@ -183,7 +183,8 @@ bool ProgramHeader<ELFT>::addSegment(Segment<ELFT> *segment) {
|
|||
for (auto slice : segment->slices()) {
|
||||
// If we have a TLS segment, emit a LOAD first.
|
||||
if (segment->segmentType() == llvm::ELF::PT_TLS ||
|
||||
segment->segmentType() == llvm::ELF::PT_DYNAMIC) {
|
||||
segment->segmentType() == llvm::ELF::PT_DYNAMIC ||
|
||||
segment->segmentType() == llvm::ELF::PT_INTERP) {
|
||||
auto phdr = allocateProgramHeader();
|
||||
if (phdr.second)
|
||||
allocatedNew = true;
|
||||
|
|
|
@ -758,6 +758,31 @@ public:
|
|||
private:
|
||||
EntriesT _entries;
|
||||
};
|
||||
|
||||
template <class ELFT> class InterpSection : public Section<ELFT> {
|
||||
public:
|
||||
InterpSection(const ELFTargetInfo &ti, StringRef str, int32_t order,
|
||||
StringRef interp)
|
||||
: Section<ELFT>(ti, str),
|
||||
_interp(interp){
|
||||
this->setOrder(order);
|
||||
this->_align2 = 1;
|
||||
// + 1 for null term.
|
||||
this->_fsize = interp.size() + 1;
|
||||
this->_msize = this->_fsize;
|
||||
this->_type = SHT_PROGBITS;
|
||||
this->_flags = SHF_ALLOC;
|
||||
}
|
||||
|
||||
void write(ELFWriter *writer, llvm::FileOutputBuffer &buffer) {
|
||||
uint8_t *chunkBuffer = buffer.getBufferStart();
|
||||
uint8_t *dest = chunkBuffer + this->fileOffset();
|
||||
std::memcpy(dest, _interp.data(), _interp.size());
|
||||
}
|
||||
|
||||
private:
|
||||
StringRef _interp;
|
||||
};
|
||||
} // end namespace elf
|
||||
} // end namespace lld
|
||||
|
||||
|
|
|
@ -69,6 +69,7 @@ private:
|
|||
/// \name Dynamic sections.
|
||||
/// @{
|
||||
LLD_UNIQUE_BUMP_PTR(DynamicTable<ELFT>) _dynamicTable;
|
||||
LLD_UNIQUE_BUMP_PTR(InterpSection<ELFT>) _interpSection;
|
||||
/// @}
|
||||
CRuntimeFile<ELFT> _runtimeFile;
|
||||
};
|
||||
|
@ -337,7 +338,11 @@ void ExecutableWriter<ELFT>::createDefaultSections() {
|
|||
if (_targetInfo.isDynamic()) {
|
||||
_dynamicTable.reset(new (_alloc) DynamicTable<ELFT>(
|
||||
_targetInfo, ".dynamic", DefaultLayout<ELFT>::ORDER_DYNAMIC));
|
||||
_interpSection.reset(new (_alloc) InterpSection<ELFT>(
|
||||
_targetInfo, ".interp", DefaultLayout<ELFT>::ORDER_INTERP,
|
||||
_targetInfo.getInterpreter()));
|
||||
_layout->addSection(_dynamicTable.get());
|
||||
_layout->addSection(_interpSection.get());
|
||||
}
|
||||
|
||||
// give a chance for the target to add sections
|
||||
|
|
|
@ -0,0 +1,8 @@
|
|||
RUN: lld -core -target x86_64-linux %p/Inputs/use-shared.x86-64 \
|
||||
RUN: %p/Inputs/shared.so-x86-64 -output=%t -entry=main \
|
||||
RUN: -output-type=dynamic
|
||||
RUN: llvm-objdump -p %t | FileCheck %s
|
||||
|
||||
CHECK: INTERP
|
||||
CHECK: flags r--
|
||||
CHECK: off
|
Loading…
Reference in New Issue