Index: lld/ELF/InputFiles.cpp
--- lld/ELF/InputFiles.cpp.orig
+++ lld/ELF/InputFiles.cpp
@@ -53,6 +53,8 @@ uint32_t InputFile::nextGroupId;
 
 std::unique_ptr<TarWriter> elf::tar;
 
+DenseMap<StringRef, StringRef> elf::gnuWarnings;
+
 // Returns "<internal>", "foo.a(bar.o)" or "baz.o".
 std::string lld::toString(const InputFile *f) {
   static std::mutex mu;
@@ -71,6 +73,19 @@ std::string lld::toString(const InputFile *f) {
   return std::string(f->toStringCache);
 }
 
+// .gnu.warning.SYMBOL are treated as warning symbols for the given symbol
+void lld::parseGNUWarning(StringRef name, ArrayRef<char> data, size_t size) {
+  static std::mutex mu;
+  if (!name.empty() && name.starts_with(".gnu.warning.")) {
+    std::lock_guard<std::mutex> lock(mu);
+    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;
@@ -801,6 +816,14 @@ void ObjFile<ELFT>::initializeSections(bool ignoreComd
     case SHT_RELA:
     case SHT_NULL:
       break;
+    case SHT_PROGBITS: {
+      this->sections[i] = createInputSection(i, sec, check(obj.getSectionName(sec, shstrtab)));
+      StringRef name = check(obj.getSectionName(sec, shstrtab));
+      ArrayRef<char> data =
+          CHECK(obj.template getSectionContentsAsArray<char>(sec), this);
+      parseGNUWarning(name, data, sec.sh_size);
+      }
+      break;
     case SHT_LLVM_SYMPART:
       ctx.hasSympart.store(true, std::memory_order_relaxed);
       [[fallthrough]];
@@ -1404,6 +1427,9 @@ template <class ELFT> void SharedFile::parse() {
   const ELFFile<ELFT> obj = this->getObj<ELFT>();
   ArrayRef<Elf_Shdr> sections = getELFShdrs<ELFT>();
 
+  StringRef sectionStringTable =
+      CHECK(obj.getSectionStringTable(sections), this);
+
   const Elf_Shdr *versymSec = nullptr;
   const Elf_Shdr *verdefSec = nullptr;
   const Elf_Shdr *verneedSec = nullptr;
@@ -1426,6 +1452,13 @@ template <class ELFT> void SharedFile::parse() {
     case SHT_GNU_verneed:
       verneedSec = &sec;
       break;
+    case SHT_PROGBITS: {
+      StringRef name = CHECK(obj.getSectionName(sec, sectionStringTable), this);
+      ArrayRef<char> data =
+          CHECK(obj.template getSectionContentsAsArray<char>(sec), this);
+      parseGNUWarning(name, data, sec.sh_size);
+      break;
+    }
     }
   }
 
