- lld: do not report undefined weak references in shared libraries https://github.com/llvm/llvm-project/commit/52bfd2c1ccd86ff813ee6df5a6700690acdd - add .gnu.warning.SYMBOL support to ld.lld(1) Index: tools/lld/ELF/InputFiles.cpp --- tools/lld/ELF/InputFiles.cpp.orig +++ tools/lld/ELF/InputFiles.cpp @@ -52,6 +52,8 @@ std::vector elf::sharedFiles; std::unique_ptr elf::tar; +DenseMap elf::gnuWarnings; + // Returns "", "foo.a(bar.o)" or "baz.o". std::string lld::toString(const InputFile *f) { if (!f) @@ -66,6 +68,17 @@ std::string lld::toString(const InputFile *f) { return f->toStringCache; } +// .gnu.warning.SYMBOL are treated as warning symbols for the given symbol +void lld::parseGNUWarning(StringRef name, ArrayRef data, size_t size) { + if (!name.empty() && name.startswith(".gnu.warning.")) { + StringRef wsym = name.substr(13); + StringRef s(data.begin()); + StringRef wng(s.substr(0, size)); + symtab->insert(wsym)->gwarn = true; + gnuWarnings.insert({wsym, wng}); + } +} + static ELFKind getELFKind(MemoryBufferRef mb, StringRef archiveName) { unsigned char size; unsigned char endian; @@ -647,6 +660,14 @@ void ObjFile::initializeSections(bool ignoreComd case SHT_RELA: case SHT_NULL: break; + case SHT_PROGBITS: { + this->sections[i] = createInputSection(sec); + StringRef name = CHECK(obj.getSectionName(sec, this->sectionStringTable), this); + ArrayRef data = + CHECK(obj.template getSectionContentsAsArray(sec), this); + parseGNUWarning(name, data, sec.sh_size); + } + break; default: this->sections[i] = createInputSection(sec); } @@ -1450,6 +1471,9 @@ template void SharedFile::parse() { const ELFFile obj = this->getObj(); ArrayRef sections = CHECK(obj.sections(), this); + StringRef sectionStringTable = + CHECK(obj.getSectionStringTable(sections), this); + const Elf_Shdr *versymSec = nullptr; const Elf_Shdr *verdefSec = nullptr; const Elf_Shdr *verneedSec = nullptr; @@ -1472,7 +1496,14 @@ template void SharedFile::parse() { case SHT_GNU_verneed: verneedSec = &sec; break; + case SHT_PROGBITS: { + StringRef name = CHECK(obj.getSectionName(sec, sectionStringTable), this); + ArrayRef data = + CHECK(obj.template getSectionContentsAsArray(sec), this); + parseGNUWarning(name, data, sec.sh_size); + break; } + } } if (versymSec && numELFSyms == 0) { @@ -1567,7 +1598,7 @@ template void SharedFile::parse() { Symbol *s = symtab->addSymbol( Undefined{this, name, sym.getBinding(), sym.st_other, sym.getType()}); s->exportDynamic = true; - if (s->isUndefined() && !s->isWeak() && + if (s->isUndefined() && sym.getBinding() != STB_WEAK && config->unresolvedSymbolsInShlib != UnresolvedPolicy::Ignore) requiredSymbols.push_back(s); continue;