[llvm] [objcopy][MachO] Revert special handling of encryptable binaries (PR #144058)
Daniel RodrÃguez Troitiño via llvm-commits
llvm-commits at lists.llvm.org
Fri Jun 13 04:57:25 PDT 2025
https://github.com/drodriguez created https://github.com/llvm/llvm-project/pull/144058
Code originally added in #120995 and later corrected in #130517 but apparently still not correct according to #141494 and rust-lang/rust#141913.
Revert the special handling because the test written in #120995 and #130517 still passes without those changes. Kept the test and improved it with a `__DATA` section to keep the current behaviour checked in case other changes modify the behaviour and break this edge case.
>From ff8dea8a381ec98d810c6ec2cd3daf5f017b68c1 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Daniel=20Rodr=C3=ADguez?= <danielrodriguez at meta.com>
Date: Fri, 13 Jun 2025 13:42:13 +0200
Subject: [PATCH] [objcopy][MachO] Revert special handling of encryptable
binaries
Code originally added in #120995 and later corrected in #130517 but
apparently still not correct according to #141494 and rust-lang/rust#141913.
Revert the special handling because the test written in #120995 and #130517
still passes without those changes. Kept the test and improved it with
a `__DATA` section to keep the current behaviour checked in case other
changes modify the behaviour and break this edge case.
---
llvm/lib/ObjCopy/MachO/MachOLayoutBuilder.cpp | 8 -
llvm/lib/ObjCopy/MachO/MachOObject.cpp | 4 -
llvm/lib/ObjCopy/MachO/MachOObject.h | 3 -
llvm/lib/ObjCopy/MachO/MachOReader.cpp | 4 -
.../MachO/strip-with-encryption-info.test | 156 ++++++++++++------
5 files changed, 106 insertions(+), 69 deletions(-)
diff --git a/llvm/lib/ObjCopy/MachO/MachOLayoutBuilder.cpp b/llvm/lib/ObjCopy/MachO/MachOLayoutBuilder.cpp
index 8ecd669e67178..93bc6631e64c8 100644
--- a/llvm/lib/ObjCopy/MachO/MachOLayoutBuilder.cpp
+++ b/llvm/lib/ObjCopy/MachO/MachOLayoutBuilder.cpp
@@ -116,10 +116,6 @@ uint64_t MachOLayoutBuilder::layoutSegments() {
const bool IsObjectFile =
O.Header.FileType == MachO::HeaderFileType::MH_OBJECT;
uint64_t Offset = IsObjectFile ? (HeaderSize + O.Header.SizeOfCmds) : 0;
- // If we are emitting an encryptable binary, our load commands must have a
- // separate (non-encrypted) page to themselves.
- bool RequiresFirstSectionOutsideFirstPage =
- O.EncryptionInfoCommandIndex.has_value();
for (LoadCommand &LC : O.LoadCommands) {
auto &MLC = LC.MachOLoadCommand;
StringRef Segname;
@@ -173,10 +169,6 @@ uint64_t MachOLayoutBuilder::layoutSegments() {
if (!Sec->hasValidOffset()) {
Sec->Offset = 0;
} else {
- if (RequiresFirstSectionOutsideFirstPage) {
- SectOffset = alignToPowerOf2(SectOffset, PageSize);
- RequiresFirstSectionOutsideFirstPage = false;
- }
Sec->Offset = SegOffset + SectOffset;
Sec->Size = Sec->Content.size();
SegFileSize = std::max(SegFileSize, SectOffset + Sec->Size);
diff --git a/llvm/lib/ObjCopy/MachO/MachOObject.cpp b/llvm/lib/ObjCopy/MachO/MachOObject.cpp
index e0819d89d24ff..8d2c02dc37c99 100644
--- a/llvm/lib/ObjCopy/MachO/MachOObject.cpp
+++ b/llvm/lib/ObjCopy/MachO/MachOObject.cpp
@@ -98,10 +98,6 @@ void Object::updateLoadCommandIndexes() {
case MachO::LC_DYLD_EXPORTS_TRIE:
ExportsTrieCommandIndex = Index;
break;
- case MachO::LC_ENCRYPTION_INFO:
- case MachO::LC_ENCRYPTION_INFO_64:
- EncryptionInfoCommandIndex = Index;
- break;
}
}
}
diff --git a/llvm/lib/ObjCopy/MachO/MachOObject.h b/llvm/lib/ObjCopy/MachO/MachOObject.h
index 13ac87ed3ed06..8f9444f5fb025 100644
--- a/llvm/lib/ObjCopy/MachO/MachOObject.h
+++ b/llvm/lib/ObjCopy/MachO/MachOObject.h
@@ -341,9 +341,6 @@ struct Object {
/// The index of the LC_SEGMENT or LC_SEGMENT_64 load command
/// corresponding to the __TEXT segment.
std::optional<size_t> TextSegmentCommandIndex;
- /// The index of the LC_ENCRYPTION_INFO or LC_ENCRYPTION_INFO_64 load command
- /// if present.
- std::optional<size_t> EncryptionInfoCommandIndex;
BumpPtrAllocator Alloc;
StringSaver NewSectionsContents;
diff --git a/llvm/lib/ObjCopy/MachO/MachOReader.cpp b/llvm/lib/ObjCopy/MachO/MachOReader.cpp
index ef0e0262f9395..2b344f36d8e78 100644
--- a/llvm/lib/ObjCopy/MachO/MachOReader.cpp
+++ b/llvm/lib/ObjCopy/MachO/MachOReader.cpp
@@ -184,10 +184,6 @@ Error MachOReader::readLoadCommands(Object &O) const {
case MachO::LC_DYLD_CHAINED_FIXUPS:
O.ChainedFixupsCommandIndex = O.LoadCommands.size();
break;
- case MachO::LC_ENCRYPTION_INFO:
- case MachO::LC_ENCRYPTION_INFO_64:
- O.EncryptionInfoCommandIndex = O.LoadCommands.size();
- break;
}
#define HANDLE_LOAD_COMMAND(LCName, LCValue, LCStruct) \
case MachO::LCName: \
diff --git a/llvm/test/tools/llvm-objcopy/MachO/strip-with-encryption-info.test b/llvm/test/tools/llvm-objcopy/MachO/strip-with-encryption-info.test
index 2b2bd670613de..d6f6fe10d88c2 100644
--- a/llvm/test/tools/llvm-objcopy/MachO/strip-with-encryption-info.test
+++ b/llvm/test/tools/llvm-objcopy/MachO/strip-with-encryption-info.test
@@ -16,7 +16,11 @@
# CHECK: fileoff: 0
# The YAML below is the following code
+# ```
+# static int foo = 12345;
+# int bar = 4567;
# int main(int argc, char **argv) { return 0; }
+# ```
# Compiled on macOS against the macOS SDK and passing `-Wl,-encryptable`
# Contents are removed, since they are not important for the test. We need a
# small text segment (smaller than a page).
@@ -26,8 +30,8 @@ FileHeader:
cputype: 0x100000C
cpusubtype: 0x0
filetype: 0x2
- ncmds: 15
- sizeofcmds: 696
+ ncmds: 18
+ sizeofcmds: 920
flags: 0x200085
reserved: 0x0
LoadCommands:
@@ -69,7 +73,7 @@ LoadCommands:
- sectname: __unwind_info
segname: __TEXT
addr: 0x100004020
- size: 4152
+ size: 88
offset: 0x4020
align: 2
reloff: 0x0
@@ -79,37 +83,61 @@ LoadCommands:
reserved2: 0x0
reserved3: 0x0
- cmd: LC_SEGMENT_64
- cmdsize: 72
- segname: __LINKEDIT
+ cmdsize: 152
+ segname: __DATA
vmaddr: 4295000064
- vmsize: 592
+ vmsize: 16384
fileoff: 32768
- filesize: 592
+ filesize: 16384
+ maxprot: 3
+ initprot: 3
+ nsects: 1
+ flags: 0
+ Sections:
+ - sectname: __data
+ segname: __DATA
+ addr: 0x100008000
+ size: 4
+ offset: 0x8000
+ align: 2
+ reloff: 0x0
+ nreloc: 0
+ flags: 0x0
+ reserved1: 0x0
+ reserved2: 0x0
+ reserved3: 0x0
+ - cmd: LC_SEGMENT_64
+ cmdsize: 72
+ segname: __LINKEDIT
+ vmaddr: 4295016448
+ vmsize: 16384
+ fileoff: 49152
+ filesize: 768
maxprot: 1
initprot: 1
nsects: 0
flags: 0
- cmd: LC_DYLD_CHAINED_FIXUPS
cmdsize: 16
- dataoff: 32768
- datasize: 48
+ dataoff: 49152
+ datasize: 56
- cmd: LC_DYLD_EXPORTS_TRIE
cmdsize: 16
- dataoff: 32816
- datasize: 48
+ dataoff: 49208
+ datasize: 64
- cmd: LC_SYMTAB
cmdsize: 24
- symoff: 32872
- nsyms: 2
- stroff: 32904
- strsize: 32
+ symoff: 49280
+ nsyms: 3
+ stroff: 49328
+ strsize: 40
- cmd: LC_DYSYMTAB
cmdsize: 80
ilocalsym: 0
nlocalsym: 0
iextdefsym: 0
- nextdefsym: 2
- iundefsym: 2
+ nextdefsym: 3
+ iundefsym: 3
nundefsym: 0
tocoff: 0
ntoc: 0
@@ -123,12 +151,6 @@ LoadCommands:
nextrel: 0
locreloff: 0
nlocrel: 0
- - cmd: LC_ENCRYPTION_INFO_64
- cmdsize: 24
- cryptoff: 16384
- cryptsize: 16384
- cryptid: 0
- pad: 0
- cmd: LC_LOAD_DYLINKER
cmdsize: 32
name: 12
@@ -136,32 +158,50 @@ LoadCommands:
ZeroPadBytes: 7
- cmd: LC_UUID
cmdsize: 24
- uuid: 4C4C4447-5555-3144-A18A-01E9EB7E7D92
+ uuid: ADDA943C-657A-3A49-9580-168E17A40FFB
- cmd: LC_BUILD_VERSION
cmdsize: 32
platform: 1
minos: 983040
- sdk: 983552
+ sdk: 984320
ntools: 1
Tools:
- - tool: 4
- version: 1310720
+ - tool: 3
+ version: 76481537
+ - cmd: LC_SOURCE_VERSION
+ cmdsize: 16
+ version: 0
- cmd: LC_MAIN
cmdsize: 24
entryoff: 16384
stacksize: 0
+ - cmd: LC_ENCRYPTION_INFO_64
+ cmdsize: 24
+ cryptoff: 16384
+ cryptsize: 16384
+ cryptid: 0
+ pad: 0
+ - cmd: LC_LOAD_DYLIB
+ cmdsize: 56
+ dylib:
+ name: 24
+ timestamp: 2
+ current_version: 88539136
+ compatibility_version: 65536
+ Content: '/usr/lib/libSystem.B.dylib'
+ ZeroPadBytes: 6
- cmd: LC_FUNCTION_STARTS
cmdsize: 16
- dataoff: 32864
+ dataoff: 49272
datasize: 8
- cmd: LC_DATA_IN_CODE
cmdsize: 16
- dataoff: 32872
+ dataoff: 49280
datasize: 0
- cmd: LC_CODE_SIGNATURE
cmdsize: 16
- dataoff: 32944
- datasize: 416
+ dataoff: 49376
+ datasize: 544
LinkEditData:
ExportTrie:
TerminalSize: 0
@@ -173,51 +213,67 @@ LinkEditData:
ImportName: ''
Children:
- TerminalSize: 0
- NodeOffset: 5
+ NodeOffset: 25
Name: _
Flags: 0x0
Address: 0x0
Other: 0x0
ImportName: ''
Children:
+ - TerminalSize: 2
+ NodeOffset: 9
+ Name: _mh_execute_header
+ Flags: 0x0
+ Address: 0x0
+ Other: 0x0
+ ImportName: ''
- TerminalSize: 4
- NodeOffset: 33
- Name: main
+ NodeOffset: 13
+ Name: bar
Flags: 0x0
- Address: 0x4000
+ Address: 0x8000
Other: 0x0
ImportName: ''
- - TerminalSize: 2
- NodeOffset: 39
- Name: _mh_execute_header
+ - TerminalSize: 4
+ NodeOffset: 19
+ Name: main
Flags: 0x0
- Address: 0x0
+ Address: 0x4000
Other: 0x0
ImportName: ''
NameList:
- n_strx: 2
n_type: 0xF
n_sect: 1
+ n_desc: 16
+ n_value: 4294967296
+ - n_strx: 22
+ n_type: 0xF
+ n_sect: 3
n_desc: 0
- n_value: 4294983680
- - n_strx: 8
+ n_value: 4295000064
+ - n_strx: 27
n_type: 0xF
n_sect: 1
- n_desc: 16
- n_value: 4294967296
+ n_desc: 0
+ n_value: 4294983680
StringTable:
- ' '
- - _main
- __mh_execute_header
+ - _bar
+ - _main
+ - ''
+ - ''
+ - ''
- ''
- ''
- ''
- ''
FunctionStarts: [ 0x4000 ]
- ChainedFixups: [ 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x30, 0x0,
- 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
- 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
- 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
- 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 ]
+ ChainedFixups: [ 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x34, 0x0,
+ 0x0, 0x0, 0x34, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 ]
...
-
More information about the llvm-commits
mailing list