Index: lld/trunk/COFF/Writer.cpp =================================================================== --- lld/trunk/COFF/Writer.cpp +++ lld/trunk/COFF/Writer.cpp @@ -211,7 +211,8 @@ // If name is too long, write offset into the string table as a name. sprintf(Hdr->Name, "/%d", StringTableOff); } else { - assert(!Config->Debug || Name.size() <= COFF::NameSize); + assert(!Config->Debug || Name.size() <= COFF::NameSize || + (Hdr->Characteristics & IMAGE_SCN_MEM_DISCARDABLE) == 0); strncpy(Hdr->Name, Name.data(), std::min(Name.size(), (size_t)COFF::NameSize)); } @@ -541,6 +542,13 @@ StringRef Name = Sec->getName(); if (Name.size() <= COFF::NameSize) continue; + // If a section isn't discardable (i.e. will be mapped at runtime), + // prefer a truncated section name over a long section name in + // the string table that is unavailable at runtime. This is different from + // what link.exe does, but finding ".eh_fram" instead of "/4" is useful + // to libunwind. + if ((Sec->getPermissions() & IMAGE_SCN_MEM_DISCARDABLE) == 0) + continue; Sec->setStringTableOff(addEntryToStringTable(Name)); } Index: lld/trunk/test/COFF/long-section-name.test =================================================================== --- lld/trunk/test/COFF/long-section-name.test +++ lld/trunk/test/COFF/long-section-name.test @@ -2,6 +2,7 @@ # RUN: lld-link /debug /out:%t.exe /entry:main %t.obj # RUN: llvm-readobj -sections %t.exe | FileCheck %s +# CHECK: Name: .eh_fram ( # CHECK: Name: .data_long_section_name # CHECK: Name: .text_long_section_name @@ -11,10 +12,14 @@ Characteristics: [ ] sections: - Name: .text_long_section_name - Characteristics: [ IMAGE_SCN_CNT_CODE, IMAGE_SCN_MEM_EXECUTE, IMAGE_SCN_MEM_READ ] + Characteristics: [ IMAGE_SCN_CNT_CODE, IMAGE_SCN_MEM_EXECUTE, IMAGE_SCN_MEM_READ, IMAGE_SCN_MEM_DISCARDABLE ] Alignment: 4 SectionData: B82A000000C3 - Name: .data_long_section_name + Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_READ, IMAGE_SCN_MEM_WRITE, IMAGE_SCN_MEM_DISCARDABLE ] + Alignment: 4 + SectionData: "00" + - Name: .eh_frame Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_READ, IMAGE_SCN_MEM_WRITE ] Alignment: 4 SectionData: "00" @@ -49,6 +54,18 @@ NumberOfLinenumbers: 0 CheckSum: 0 Number: 0 + - Name: .eh_frame + Value: 0 + SectionNumber: 3 + SimpleType: IMAGE_SYM_TYPE_NULL + ComplexType: IMAGE_SYM_DTYPE_NULL + StorageClass: IMAGE_SYM_CLASS_STATIC + SectionDefinition: + Length: 0 + NumberOfRelocations: 0 + NumberOfLinenumbers: 0 + CheckSum: 0 + Number: 0 - Name: main Value: 0 SectionNumber: 1