Skip to content

Commit 9becc4a

Browse files
committed
[ELF] ObjFile::parse: check EM_AARCH64 for SHT_AARCH64_MEMTAG_GLOBAL_STATIC
and reorder sh_type checks to make SHT_PROGBITS/SHT_GROUP fast.
1 parent 7776798 commit 9becc4a

File tree

1 file changed

+71
-64
lines changed

1 file changed

+71
-64
lines changed

lld/ELF/InputFiles.cpp

Lines changed: 71 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -556,12 +556,45 @@ template <class ELFT> void ObjFile<ELFT>::parse(bool ignoreComdats) {
556556
sections.resize(size);
557557
for (size_t i = 0; i != size; ++i) {
558558
const Elf_Shdr &sec = objSections[i];
559+
if (LLVM_LIKELY(sec.sh_type == SHT_PROGBITS))
560+
continue;
561+
if (LLVM_LIKELY(sec.sh_type == SHT_GROUP)) {
562+
StringRef signature = getShtGroupSignature(objSections, sec);
563+
ArrayRef<Elf_Word> entries =
564+
CHECK2(obj.template getSectionContentsAsArray<Elf_Word>(sec), this);
565+
if (entries.empty())
566+
Fatal(ctx) << this << ": empty SHT_GROUP";
567+
568+
Elf_Word flag = entries[0];
569+
if (flag && flag != GRP_COMDAT)
570+
Fatal(ctx) << this << ": unsupported SHT_GROUP format";
571+
572+
bool keepGroup = !flag || ignoreComdats ||
573+
ctx.symtab->comdatGroups
574+
.try_emplace(CachedHashStringRef(signature), this)
575+
.second;
576+
if (keepGroup) {
577+
if (!ctx.arg.resolveGroups)
578+
sections[i] = createInputSection(
579+
i, sec, check(obj.getSectionName(sec, shstrtab)));
580+
} else {
581+
// Otherwise, discard group members.
582+
for (uint32_t secIndex : entries.slice(1)) {
583+
if (secIndex >= size)
584+
Fatal(ctx) << this
585+
<< ": invalid section index in group: " << secIndex;
586+
sections[secIndex] = &InputSection::discarded;
587+
}
588+
}
589+
continue;
590+
}
591+
559592
if (sec.sh_type == SHT_LLVM_DEPENDENT_LIBRARIES && !ctx.arg.relocatable) {
560593
StringRef name = check(obj.getSectionName(sec, shstrtab));
561594
ArrayRef<char> data = CHECK2(
562595
this->getObj().template getSectionContentsAsArray<char>(sec), this);
563596
if (!data.empty() && data.back() != '\0') {
564-
ErrAlways(ctx)
597+
Err(ctx)
565598
<< this
566599
<< ": corrupted dependent libraries section (unterminated string): "
567600
<< name;
@@ -572,74 +605,48 @@ template <class ELFT> void ObjFile<ELFT>::parse(bool ignoreComdats) {
572605
d += s.size() + 1;
573606
}
574607
}
575-
this->sections[i] = &InputSection::discarded;
608+
sections[i] = &InputSection::discarded;
576609
continue;
577610
}
578611

579-
if (sec.sh_type == SHT_ARM_ATTRIBUTES && ctx.arg.emachine == EM_ARM) {
580-
ARMAttributeParser attributes;
581-
ArrayRef<uint8_t> contents =
582-
check(this->getObj().getSectionContents(sec));
583-
StringRef name = check(obj.getSectionName(sec, shstrtab));
584-
this->sections[i] = &InputSection::discarded;
585-
if (Error e = attributes.parse(contents, ekind == ELF32LEKind
586-
? llvm::endianness::little
587-
: llvm::endianness::big)) {
588-
InputSection isec(*this, sec, name);
589-
Warn(ctx) << &isec << ": " << std::move(e);
590-
} else {
591-
updateSupportedARMFeatures(ctx, attributes);
592-
updateARMVFPArgs(ctx, attributes, this);
593-
594-
// FIXME: Retain the first attribute section we see. The eglibc ARM
595-
// dynamic loaders require the presence of an attribute section for
596-
// dlopen to work. In a full implementation we would merge all attribute
597-
// sections.
598-
if (ctx.in.attributes == nullptr) {
599-
ctx.in.attributes = std::make_unique<InputSection>(*this, sec, name);
600-
this->sections[i] = ctx.in.attributes.get();
612+
switch (ctx.arg.emachine) {
613+
case EM_ARM:
614+
if (sec.sh_type == SHT_ARM_ATTRIBUTES) {
615+
ARMAttributeParser attributes;
616+
ArrayRef<uint8_t> contents =
617+
check(this->getObj().getSectionContents(sec));
618+
StringRef name = check(obj.getSectionName(sec, shstrtab));
619+
sections[i] = &InputSection::discarded;
620+
if (Error e = attributes.parse(contents, ekind == ELF32LEKind
621+
? llvm::endianness::little
622+
: llvm::endianness::big)) {
623+
InputSection isec(*this, sec, name);
624+
Warn(ctx) << &isec << ": " << std::move(e);
625+
} else {
626+
updateSupportedARMFeatures(ctx, attributes);
627+
updateARMVFPArgs(ctx, attributes, this);
628+
629+
// FIXME: Retain the first attribute section we see. The eglibc ARM
630+
// dynamic loaders require the presence of an attribute section for
631+
// dlopen to work. In a full implementation we would merge all
632+
// attribute sections.
633+
if (ctx.in.attributes == nullptr) {
634+
ctx.in.attributes =
635+
std::make_unique<InputSection>(*this, sec, name);
636+
sections[i] = ctx.in.attributes.get();
637+
}
601638
}
602639
}
603-
}
604-
605-
// Producing a static binary with MTE globals is not currently supported,
606-
// remove all SHT_AARCH64_MEMTAG_GLOBALS_STATIC sections as they're unused
607-
// medatada, and we don't want them to end up in the output file for static
608-
// executables.
609-
if (sec.sh_type == SHT_AARCH64_MEMTAG_GLOBALS_STATIC &&
610-
!canHaveMemtagGlobals(ctx)) {
611-
this->sections[i] = &InputSection::discarded;
612-
continue;
613-
}
614-
615-
if (sec.sh_type != SHT_GROUP)
616-
continue;
617-
StringRef signature = getShtGroupSignature(objSections, sec);
618-
ArrayRef<Elf_Word> entries =
619-
CHECK2(obj.template getSectionContentsAsArray<Elf_Word>(sec), this);
620-
if (entries.empty())
621-
Fatal(ctx) << this << ": empty SHT_GROUP";
622-
623-
Elf_Word flag = entries[0];
624-
if (flag && flag != GRP_COMDAT)
625-
Fatal(ctx) << this << ": unsupported SHT_GROUP format";
626-
627-
bool keepGroup = (flag & GRP_COMDAT) == 0 || ignoreComdats ||
628-
ctx.symtab->comdatGroups
629-
.try_emplace(CachedHashStringRef(signature), this)
630-
.second;
631-
if (keepGroup) {
632-
if (!ctx.arg.resolveGroups)
633-
this->sections[i] = createInputSection(
634-
i, sec, check(obj.getSectionName(sec, shstrtab)));
635-
continue;
636-
}
637-
638-
// Otherwise, discard group members.
639-
for (uint32_t secIndex : entries.slice(1)) {
640-
if (secIndex >= size)
641-
Fatal(ctx) << this << ": invalid section index in group: " << secIndex;
642-
this->sections[secIndex] = &InputSection::discarded;
640+
break;
641+
case EM_AARCH64:
642+
// Producing a static binary with MTE globals is not currently supported,
643+
// remove all SHT_AARCH64_MEMTAG_GLOBALS_STATIC sections as they're unused
644+
// medatada, and we don't want them to end up in the output file for
645+
// static executables.
646+
if (sec.sh_type == SHT_AARCH64_MEMTAG_GLOBALS_STATIC &&
647+
!canHaveMemtagGlobals(ctx))
648+
sections[i] = &InputSection::discarded;
649+
break;
643650
}
644651
}
645652

0 commit comments

Comments
 (0)