forked from OSchip/llvm-project
Do not join sections for relocatable object files
Differential revision: https://reviews.llvm.org/D25232 llvm-svn: 283307
This commit is contained in:
parent
0e1a50e9c4
commit
a8d12ef853
|
@ -345,7 +345,7 @@ void LinkerScript<ELFT>::createSections(OutputSectionFactory<ELFT> &Factory) {
|
|||
for (ObjectFile<ELFT> *F : Symtab<ELFT>::X->getObjectFiles())
|
||||
for (InputSectionBase<ELFT> *S : F->getSections())
|
||||
if (!isDiscarded(S) && !S->OutSec)
|
||||
addSection(Factory, S, getOutputSectionName(S));
|
||||
addSection(Factory, S, getOutputSectionName(S->Name));
|
||||
}
|
||||
|
||||
// Sets value of a section-defined symbol. Two kinds of
|
||||
|
|
|
@ -89,9 +89,10 @@ private:
|
|||
};
|
||||
} // anonymous namespace
|
||||
|
||||
template <class ELFT>
|
||||
StringRef elf::getOutputSectionName(InputSectionBase<ELFT> *S) {
|
||||
StringRef Name = S->Name;
|
||||
StringRef elf::getOutputSectionName(StringRef Name) {
|
||||
if (Config->Relocatable)
|
||||
return Name;
|
||||
|
||||
for (StringRef V :
|
||||
{".text.", ".rodata.", ".data.rel.ro.", ".data.", ".bss.",
|
||||
".init_array.", ".fini_array.", ".ctors.", ".dtors.", ".tbss.",
|
||||
|
@ -712,7 +713,7 @@ template <class ELFT> void Writer<ELFT>::createSections() {
|
|||
}
|
||||
OutputSectionBase<ELFT> *Sec;
|
||||
bool IsNew;
|
||||
std::tie(Sec, IsNew) = Factory.create(IS, getOutputSectionName(IS));
|
||||
std::tie(Sec, IsNew) = Factory.create(IS, getOutputSectionName(IS->Name));
|
||||
if (IsNew)
|
||||
OutputSections.push_back(Sec);
|
||||
Sec->addSection(IS);
|
||||
|
@ -1444,11 +1445,6 @@ template bool elf::isRelroSection<ELF32BE>(OutputSectionBase<ELF32BE> *);
|
|||
template bool elf::isRelroSection<ELF64LE>(OutputSectionBase<ELF64LE> *);
|
||||
template bool elf::isRelroSection<ELF64BE>(OutputSectionBase<ELF64BE> *);
|
||||
|
||||
template StringRef elf::getOutputSectionName<ELF32LE>(InputSectionBase<ELF32LE> *);
|
||||
template StringRef elf::getOutputSectionName<ELF32BE>(InputSectionBase<ELF32BE> *);
|
||||
template StringRef elf::getOutputSectionName<ELF64LE>(InputSectionBase<ELF64LE> *);
|
||||
template StringRef elf::getOutputSectionName<ELF64BE>(InputSectionBase<ELF64BE> *);
|
||||
|
||||
template void elf::reportDiscarded<ELF32LE>(InputSectionBase<ELF32LE> *);
|
||||
template void elf::reportDiscarded<ELF32BE>(InputSectionBase<ELF32BE> *);
|
||||
template void elf::reportDiscarded<ELF64LE>(InputSectionBase<ELF64LE> *);
|
||||
|
|
|
@ -41,8 +41,7 @@ struct PhdrEntry {
|
|||
bool HasLMA = false;
|
||||
};
|
||||
|
||||
template <class ELFT>
|
||||
llvm::StringRef getOutputSectionName(InputSectionBase<ELFT> *S);
|
||||
llvm::StringRef getOutputSectionName(llvm::StringRef Name);
|
||||
|
||||
template <class ELFT> void reportDiscarded(InputSectionBase<ELFT> *IS);
|
||||
|
||||
|
|
|
@ -0,0 +1,30 @@
|
|||
# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t1.o
|
||||
# RUN: ld.lld -r %t1.o -o %t
|
||||
# RUN: llvm-objdump -section-headers %t | FileCheck %s
|
||||
|
||||
# CHECK: .text
|
||||
# CHECK-NEXT: .text._init
|
||||
# CHECK-NEXT: .text._fini
|
||||
# CHECK-NEXT: .rela.text
|
||||
# CHECK-NEXT: .rela.text._init
|
||||
# CHECK-NEXT: .rela.text._fini
|
||||
|
||||
.globl _start
|
||||
_start:
|
||||
call foo
|
||||
nop
|
||||
|
||||
.section .xxx,"a"
|
||||
.quad 0
|
||||
|
||||
.section .text._init,"ax"
|
||||
.quad .xxx
|
||||
foo:
|
||||
call bar
|
||||
nop
|
||||
|
||||
|
||||
.section .text._fini,"ax"
|
||||
.quad .xxx
|
||||
bar:
|
||||
nop
|
Loading…
Reference in New Issue