Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 18 additions & 2 deletions llvm/lib/Object/ArchiveWriter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1119,10 +1119,26 @@ Error writeArchiveToStream(raw_ostream &Out,
// to switch to 64-bit. Note that the file can be larger than 4GB as long as
// the last member starts before the 4GB offset.
if (*HeadersSize + LastMemberHeaderOffset >= Sym64Threshold) {
if (Kind == object::Archive::K_DARWIN)
switch (Kind) {
case object::Archive::K_COFF:
// COFF format has no 64-bit version, so we use GNU64 instead.
if (!SymMap.Map.empty() && !SymMap.ECMap.empty())
// Only the COFF format supports the ECSYMBOLS section, so don’t use
// GNU64 when two symbol maps are required.
return make_error<object::GenericBinaryError>(
"Archive is too large: ARM64X does not support archives larger "
"than 4GB");
// Since this changes the headers, we need to recalculate everything.
return writeArchiveToStream(Out, NewMembers, WriteSymtab,
object::Archive::K_GNU64, Deterministic,
Thin, IsEC, Warn);
case object::Archive::K_DARWIN:
Kind = object::Archive::K_DARWIN64;
else
break;
default:
Kind = object::Archive::K_GNU64;
break;
}
HeadersSize.reset();
}
}
Expand Down
71 changes: 71 additions & 0 deletions llvm/test/tools/llvm-lib/sym64-threshold.test
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
# RUN: yaml2obj --docnum=1 %s -o %t01234567890234567789.obj
# RUN: yaml2obj --docnum=2 %s -o %t-ec.obj
# RUN: env SYM64_THRESHOLD=100 llvm-lib -machine:amd64 -out:%t.lib %t01234567890234567789.obj
# RUN: llvm-nm --print-armap %t.lib | FileCheck --check-prefix=ARMAP %s
# ARMAP: Archive map
# ARMAP-NEXT: sym

# RUN: env SYM64_THRESHOLD=100 not llvm-lib -machine:arm64x -out:%t-ec.lib %t-ec.obj %t01234567890234567789.obj 2>&1 | FileCheck %s
# CHECK: Archive is too large: ARM64X does not support archives larger than 4GB

--- !COFF
header:
Machine: IMAGE_FILE_MACHINE_AMD64
Characteristics: [ ]
sections:
- Name: .text
Characteristics: [ IMAGE_SCN_CNT_CODE, IMAGE_SCN_MEM_EXECUTE, IMAGE_SCN_MEM_READ ]
Alignment: 4
SectionData: ''
symbols:
- Name: .text
Value: 0
SectionNumber: 1
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: 1
- !Symbol
Name: sym
Value: 0
SectionNumber: 1
SimpleType: IMAGE_SYM_TYPE_NULL # (0)
ComplexType: IMAGE_SYM_DTYPE_FUNCTION # (2)
StorageClass: IMAGE_SYM_CLASS_EXTERNAL # (2)
...

--- !COFF
header:
Machine: IMAGE_FILE_MACHINE_ARM64
Characteristics: [ ]
sections:
- Name: .text
Characteristics: [ IMAGE_SCN_CNT_CODE, IMAGE_SCN_MEM_EXECUTE, IMAGE_SCN_MEM_READ ]
Alignment: 4
SectionData: ''
symbols:
- Name: .text
Value: 0
SectionNumber: 1
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: 1
- !Symbol
Name: sym
Value: 0
SectionNumber: 1
SimpleType: IMAGE_SYM_TYPE_NULL # (0)
ComplexType: IMAGE_SYM_DTYPE_FUNCTION # (2)
StorageClass: IMAGE_SYM_CLASS_EXTERNAL # (2)
...