[ELF] Ignore .interp section in case linker script specifies PHDRS without PT_INTERP
llvm-svn: 278781
This commit is contained in:
@@ -486,6 +486,15 @@ std::vector<PhdrEntry<ELFT>> LinkerScript<ELFT>::createPhdrs() {
|
||||
return Ret;
|
||||
}
|
||||
|
||||
template <class ELFT> bool LinkerScript<ELFT>::ignoreInterpSection() {
|
||||
// Ignore .interp section in case we have PHDRS specification
|
||||
// and PT_INTERP isn't listed.
|
||||
return !Opt.PhdrsCommands.empty() &&
|
||||
llvm::find_if(Opt.PhdrsCommands, [](const PhdrsCommand &Cmd) {
|
||||
return Cmd.Type == PT_INTERP;
|
||||
}) == Opt.PhdrsCommands.end();
|
||||
}
|
||||
|
||||
template <class ELFT>
|
||||
ArrayRef<uint8_t> LinkerScript<ELFT>::getFiller(StringRef Name) {
|
||||
for (const std::unique_ptr<BaseCommand> &Base : Opt.Commands)
|
||||
|
||||
@@ -144,6 +144,7 @@ public:
|
||||
void createSections(OutputSectionFactory<ELFT> &Factory);
|
||||
|
||||
std::vector<PhdrEntry<ELFT>> createPhdrs();
|
||||
bool ignoreInterpSection();
|
||||
|
||||
ArrayRef<uint8_t> getFiller(StringRef Name);
|
||||
bool shouldKeep(InputSectionBase<ELFT> *S);
|
||||
|
||||
@@ -105,7 +105,8 @@ template <class ELFT> void elf::reportDiscarded(InputSectionBase<ELFT> *IS) {
|
||||
|
||||
template <class ELFT> static bool needsInterpSection() {
|
||||
return !Symtab<ELFT>::X->getSharedFiles().empty() &&
|
||||
!Config->DynamicLinker.empty();
|
||||
!Config->DynamicLinker.empty() &&
|
||||
!Script<ELFT>::X->ignoreInterpSection();
|
||||
}
|
||||
|
||||
template <class ELFT> void elf::writeResult() {
|
||||
|
||||
12
lld/test/ELF/linkerscript/linkerscript-discard-interp.s
Normal file
12
lld/test/ELF/linkerscript/linkerscript-discard-interp.s
Normal file
@@ -0,0 +1,12 @@
|
||||
// RUN: llvm-mc -filetype=obj -triple=i686-unknown-linux %s -o %t.o
|
||||
// RUN: llvm-mc -filetype=obj -triple=i686-unknown-linux %p/../Inputs/shared.s -o %t2.o
|
||||
// RUN: ld.lld -shared %t2.o -o %t2.so
|
||||
// RUN: echo "PHDRS { text PT_LOAD FILEHDR PHDRS; } \
|
||||
// RUN: SECTIONS { .text : { *(.text) } : text }" >> %t.script
|
||||
// RUN: ld.lld -dynamic-linker /lib64/ld-linux-x86-64.so.2 -rpath foo -rpath bar --script %t.script --export-dynamic %t.o %t2.so -o %t
|
||||
// RUN: llvm-readobj -s %t | FileCheck %s
|
||||
|
||||
// CHECK-NOT: Name: .interp
|
||||
|
||||
.global _start
|
||||
_start:
|
||||
Reference in New Issue
Block a user