185 lines
6.7 KiB
Diff
185 lines
6.7 KiB
Diff
From 57c0b049382957077c94fa2167258da2654f990c Mon Sep 17 00:00:00 2001
|
|
From: =?UTF-8?q?Martin=20Storsj=C3=B6?= <martin@martin.st>
|
|
Date: Wed, 30 Jul 2025 15:39:04 +0200
|
|
Subject: [PATCH] [llvm-objcopy] [COFF] Ignore associative sections in
|
|
executables (#151143)
|
|
|
|
COFF associative sections is a feature where relocatable object files
|
|
can have section snippets marked as related to another section snippet,
|
|
so they are kept or discarded in relation to that other section snippet.
|
|
|
|
When llvm-objcopy removes sections, it also removes sections that are
|
|
marked as associative to the removed section (as the associative
|
|
sections otherwise would end up orphaned).
|
|
|
|
In a linked executable module (EXE or DLL), section associativity is
|
|
meaningless - thus, we should ignore those fields from the input.
|
|
|
|
After linking, GNU ld keeps the SectionDefinition auxillary part of
|
|
symbols intact as it was in the source object file, which means that it
|
|
references section numbers in the source object files.
|
|
|
|
This fixes https://github.com/llvm/llvm-project/issues/53433.
|
|
---
|
|
llvm/lib/ObjCopy/COFF/COFFReader.cpp | 2 +-
|
|
.../llvm-objcopy/COFF/exe-bogus-assoc.test | 134 ++++++++++++++++++
|
|
2 files changed, 135 insertions(+), 1 deletion(-)
|
|
create mode 100644 llvm/test/tools/llvm-objcopy/COFF/exe-bogus-assoc.test
|
|
|
|
diff --git a/llvm/lib/ObjCopy/COFF/COFFReader.cpp b/llvm/lib/ObjCopy/COFF/COFFReader.cpp
|
|
index 32aceb805a..d046db39dd 100644
|
|
--- a/llvm/lib/ObjCopy/COFF/COFFReader.cpp
|
|
+++ b/llvm/lib/ObjCopy/COFF/COFFReader.cpp
|
|
@@ -136,7 +136,7 @@ Error COFFReader::readSymbols(Object &Obj, bool IsBigObj) const {
|
|
// it is, find the target section unique id.
|
|
const coff_aux_section_definition *SD = SymRef.getSectionDefinition();
|
|
const coff_aux_weak_external *WE = SymRef.getWeakExternal();
|
|
- if (SD && SD->Selection == IMAGE_COMDAT_SELECT_ASSOCIATIVE) {
|
|
+ if (SD && SD->Selection == IMAGE_COMDAT_SELECT_ASSOCIATIVE && !Obj.IsPE) {
|
|
int32_t Index = SD->getNumber(IsBigObj);
|
|
if (Index <= 0 || static_cast<uint32_t>(Index - 1) >= Sections.size())
|
|
return createStringError(object_error::parse_failed,
|
|
diff --git a/llvm/test/tools/llvm-objcopy/COFF/exe-bogus-assoc.test b/llvm/test/tools/llvm-objcopy/COFF/exe-bogus-assoc.test
|
|
new file mode 100644
|
|
index 0000000000..12f14b5d58
|
|
--- /dev/null
|
|
+++ b/llvm/test/tools/llvm-objcopy/COFF/exe-bogus-assoc.test
|
|
@@ -0,0 +1,134 @@
|
|
+## Test that bogus associative section symbols in executables are ignored.
|
|
+##
|
|
+## The executable contains two (bogus) associative section symbols, both for
|
|
+## (parts of) the .rdata section; one pointing at the .debug_info section
|
|
+## (which will be stripped out) and one pointing at a nonexistent section.
|
|
+##
|
|
+## Check that stripping does succeed, and that it doesn't end up removing
|
|
+## the .rdata section.
|
|
+
|
|
+# RUN: yaml2obj %s -o %t.in.exe
|
|
+
|
|
+# RUN: llvm-strip --strip-debug %t.in.exe -o %t.out.exe
|
|
+# RUN: llvm-readobj --sections %t.out.exe | FileCheck %s
|
|
+
|
|
+# CHECK: Name: .rdata
|
|
+
|
|
+--- !COFF
|
|
+OptionalHeader:
|
|
+ AddressOfEntryPoint: 4096
|
|
+ ImageBase: 5368709120
|
|
+ SectionAlignment: 4096
|
|
+ FileAlignment: 512
|
|
+ MajorOperatingSystemVersion: 4
|
|
+ MinorOperatingSystemVersion: 0
|
|
+ MajorImageVersion: 0
|
|
+ MinorImageVersion: 0
|
|
+ MajorSubsystemVersion: 5
|
|
+ MinorSubsystemVersion: 2
|
|
+ Subsystem: IMAGE_SUBSYSTEM_WINDOWS_CUI
|
|
+ DLLCharacteristics: [ ]
|
|
+ SizeOfStackReserve: 2097152
|
|
+ SizeOfStackCommit: 4096
|
|
+ SizeOfHeapReserve: 1048576
|
|
+ SizeOfHeapCommit: 4096
|
|
+header:
|
|
+ Machine: IMAGE_FILE_MACHINE_AMD64
|
|
+ Characteristics: [ ]
|
|
+sections:
|
|
+ - Name: .text
|
|
+ Characteristics: [ IMAGE_SCN_CNT_CODE, IMAGE_SCN_MEM_EXECUTE, IMAGE_SCN_MEM_READ ]
|
|
+ VirtualAddress: 4096
|
|
+ VirtualSize: 48
|
|
+ SectionData: E806000000E802000000C3C3C30F1F00FFFFFFFFFFFFFFFF0000000000000000FFFFFFFFFFFFFFFF0000000000000000
|
|
+ SizeOfRawData: 512
|
|
+ - Name: .rdata
|
|
+ Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_READ ]
|
|
+ VirtualAddress: 8192
|
|
+ VirtualSize: 4
|
|
+ SectionData: '00000000'
|
|
+ SizeOfRawData: 512
|
|
+ - Name: .debug_info
|
|
+ Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_DISCARDABLE, IMAGE_SCN_MEM_READ ]
|
|
+ VirtualAddress: 16384
|
|
+ VirtualSize: 4
|
|
+ SectionData: '00000000'
|
|
+ SizeOfRawData: 512
|
|
+symbols:
|
|
+ - Name: .text
|
|
+ Value: 0
|
|
+ SectionNumber: 1
|
|
+ SimpleType: IMAGE_SYM_TYPE_NULL
|
|
+ ComplexType: IMAGE_SYM_DTYPE_NULL
|
|
+ StorageClass: IMAGE_SYM_CLASS_STATIC
|
|
+ SectionDefinition:
|
|
+ Length: 11
|
|
+ NumberOfRelocations: 2
|
|
+ NumberOfLinenumbers: 0
|
|
+ CheckSum: 1703692295
|
|
+ Number: 1
|
|
+ - Name: '.text$func1'
|
|
+ Value: 11
|
|
+ SectionNumber: 1
|
|
+ SimpleType: IMAGE_SYM_TYPE_NULL
|
|
+ ComplexType: IMAGE_SYM_DTYPE_NULL
|
|
+ StorageClass: IMAGE_SYM_CLASS_STATIC
|
|
+ SectionDefinition:
|
|
+ Length: 1
|
|
+ NumberOfRelocations: 0
|
|
+ NumberOfLinenumbers: 0
|
|
+ CheckSum: 40735498
|
|
+ Number: 3
|
|
+ Selection: IMAGE_COMDAT_SELECT_ANY
|
|
+ - Name: .rdata
|
|
+ Value: 0
|
|
+ SectionNumber: 2
|
|
+ SimpleType: IMAGE_SYM_TYPE_NULL
|
|
+ ComplexType: IMAGE_SYM_DTYPE_NULL
|
|
+ StorageClass: IMAGE_SYM_CLASS_STATIC
|
|
+ SectionDefinition:
|
|
+ Length: 1
|
|
+ NumberOfRelocations: 0
|
|
+ NumberOfLinenumbers: 0
|
|
+ CheckSum: 0
|
|
+ Number: 3
|
|
+ Selection: IMAGE_COMDAT_SELECT_ASSOCIATIVE
|
|
+ - Name: '.text$func2'
|
|
+ Value: 12
|
|
+ SectionNumber: 1
|
|
+ SimpleType: IMAGE_SYM_TYPE_NULL
|
|
+ ComplexType: IMAGE_SYM_DTYPE_NULL
|
|
+ StorageClass: IMAGE_SYM_CLASS_STATIC
|
|
+ SectionDefinition:
|
|
+ Length: 1
|
|
+ NumberOfRelocations: 0
|
|
+ NumberOfLinenumbers: 0
|
|
+ CheckSum: 40735498
|
|
+ Number: 4
|
|
+ Selection: IMAGE_COMDAT_SELECT_ANY
|
|
+ - Name: .rdata
|
|
+ Value: 1
|
|
+ SectionNumber: 2
|
|
+ SimpleType: IMAGE_SYM_TYPE_NULL
|
|
+ ComplexType: IMAGE_SYM_DTYPE_NULL
|
|
+ StorageClass: IMAGE_SYM_CLASS_STATIC
|
|
+ SectionDefinition:
|
|
+ Length: 1
|
|
+ NumberOfRelocations: 0
|
|
+ NumberOfLinenumbers: 0
|
|
+ CheckSum: 0
|
|
+ Number: 4
|
|
+ Selection: IMAGE_COMDAT_SELECT_ASSOCIATIVE
|
|
+ - Name: .debug_info
|
|
+ Value: 0
|
|
+ SectionNumber: 3
|
|
+ SimpleType: IMAGE_SYM_TYPE_NULL
|
|
+ ComplexType: IMAGE_SYM_DTYPE_NULL
|
|
+ StorageClass: IMAGE_SYM_CLASS_STATIC
|
|
+ SectionDefinition:
|
|
+ Length: 4
|
|
+ NumberOfRelocations: 0
|
|
+ NumberOfLinenumbers: 0
|
|
+ CheckSum: 0
|
|
+ Number: 0
|
|
+...
|
|
--
|
|
2.50.1.windows.1
|
|
|