diff --git a/lld/COFF/Config.h b/lld/COFF/Config.h --- a/lld/COFF/Config.h +++ b/lld/COFF/Config.h @@ -218,6 +218,7 @@ bool warnMissingOrderSymbol = true; bool warnLocallyDefinedImported = true; bool warnDebugInfoUnusable = true; + bool warnLongSectionNames = true; bool incremental = true; bool integrityCheck = false; bool killAt = false; diff --git a/lld/COFF/Driver.cpp b/lld/COFF/Driver.cpp --- a/lld/COFF/Driver.cpp +++ b/lld/COFF/Driver.cpp @@ -1188,6 +1188,8 @@ config->warnDebugInfoUnusable = false; else if (s == "4217") config->warnLocallyDefinedImported = false; + else if (s == "longsections") + config->warnLongSectionNames = false; // Other warning numbers are ignored. } } @@ -1527,6 +1529,11 @@ config->debugGHashes = debug == DebugKind::GHash; config->debugSymtab = debug == DebugKind::Symtab; + // Don't warn about long section names, such as .debug_info, for mingw or when + // -debug:dwarf is requested. + if (config->mingw || config->debugDwarf) + config->warnLongSectionNames = false; + config->mapFile = getMapFile(args); if (config->incremental && args.hasArg(OPT_profile)) { diff --git a/lld/COFF/Writer.cpp b/lld/COFF/Writer.cpp --- a/lld/COFF/Writer.cpp +++ b/lld/COFF/Writer.cpp @@ -1148,6 +1148,11 @@ continue; if ((sec->header.Characteristics & IMAGE_SCN_MEM_DISCARDABLE) == 0) continue; + if (config->warnLongSectionNames) { + warn("section name " + sec->name + + " is longer than 8 characters and will use a non-standard string " + "table"); + } sec->setStringTableOff(addEntryToStringTable(sec->name)); } diff --git a/lld/test/COFF/long-section-name.test b/lld/test/COFF/long-section-name.test --- a/lld/test/COFF/long-section-name.test +++ b/lld/test/COFF/long-section-name.test @@ -1,8 +1,18 @@ # RUN: yaml2obj < %s > %t.obj -# RUN: lld-link /out:%t.exe /entry:main %t.obj +# RUN: lld-link /out:%t.exe /entry:main %t.obj 2>&1 | FileCheck %s --check-prefix=WARN # RUN: llvm-readobj --sections %t.exe | FileCheck %s -# RUN: lld-link /debug /out:%t2.exe /entry:main %t.obj +# RUN: lld-link /debug /out:%t2.exe /entry:main %t.obj 2>&1 | FileCheck %s --check-prefix=WARN # RUN: llvm-readobj --sections %t2.exe | FileCheck %s +# +# No warnings in mingw mode or with ignore flag. +# RUN: lld-link /out:%t.exe /entry:main %t.obj /ignore:longsections 2>&1 | FileCheck %s --check-prefix=IGNORE --allow-empty +# RUN: lld-link /out:%t.exe /entry:main %t.obj -lldmingw 2>&1 | FileCheck %s --check-prefix=IGNORE --allow-empty +# RUN: lld-link /out:%t.exe /entry:main %t.obj -debug:dwarf 2>&1 | FileCheck %s --check-prefix=IGNORE --allow-empty + +# WARN: warning: section name .data_long_section_name is longer than 8 characters and will use a non-standard string table +# WARN: warning: section name .text_long_section_name is longer than 8 characters and will use a non-standard string table + +# IGNORE-NOT: warning: # CHECK: Name: .eh_fram ( # CHECK: Name: .data_long_section_name