[llvm] [llvm-objcopy] MachO: Fix section finding policy for object files (PR #127604)

Dmitry Nechitaev via llvm-commits llvm-commits at lists.llvm.org
Wed Feb 19 13:03:03 PST 2025


https://github.com/Nechda updated https://github.com/llvm/llvm-project/pull/127604

>From f694f516a592f74511388221881552cbf73b46f2 Mon Sep 17 00:00:00 2001
From: Dmitry Nechitaev <nechda6 at gmail.com>
Date: Tue, 18 Feb 2025 12:29:56 +0300
Subject: [PATCH 1/2] llvm-objcopy MachO: scan each section when
 --update-section option is used

---
 llvm/lib/ObjCopy/MachO/MachOObjcopy.cpp | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/llvm/lib/ObjCopy/MachO/MachOObjcopy.cpp b/llvm/lib/ObjCopy/MachO/MachOObjcopy.cpp
index 682edffc84f34..b5ddaa5666229 100644
--- a/llvm/lib/ObjCopy/MachO/MachOObjcopy.cpp
+++ b/llvm/lib/ObjCopy/MachO/MachOObjcopy.cpp
@@ -360,6 +360,12 @@ static Error addSection(const NewSectionInfo &NewSection, Object &Obj) {
 static Expected<Section &> findSection(StringRef SecName, Object &O) {
   StringRef SegName;
   std::tie(SegName, SecName) = SecName.split(",");
+  if (O.Header.FileType == MachO::HeaderFileType::MH_OBJECT) {
+    for (const auto& LC : O.LoadCommands)
+      for (const auto& Sec : LC.Sections)
+        if (Sec->Segname == SegName && Sec->Sectname == SecName)
+          return *Sec;
+  }
   auto FoundSeg =
       llvm::find_if(O.LoadCommands, [SegName](const LoadCommand &LC) {
         return LC.getSegmentName() == SegName;

>From 116d1ee62f24e27e1c0a85f8c7c75137671d3a00 Mon Sep 17 00:00:00 2001
From: Dmitry Nechitaev <nechda6 at gmail.com>
Date: Thu, 20 Feb 2025 00:01:48 +0300
Subject: [PATCH 2/2] Add test

---
 .../MachO/Inputs/macho_sections.s             | 30 ++++++++++++
 .../MachO/update-section-object.test          | 48 +++++++++++++++++++
 2 files changed, 78 insertions(+)
 create mode 100644 llvm/test/tools/llvm-objcopy/MachO/Inputs/macho_sections.s
 create mode 100644 llvm/test/tools/llvm-objcopy/MachO/update-section-object.test

diff --git a/llvm/test/tools/llvm-objcopy/MachO/Inputs/macho_sections.s b/llvm/test/tools/llvm-objcopy/MachO/Inputs/macho_sections.s
new file mode 100644
index 0000000000000..0818d3544e8fc
--- /dev/null
+++ b/llvm/test/tools/llvm-objcopy/MachO/Inputs/macho_sections.s
@@ -0,0 +1,30 @@
+	.section	__TEXT,__text,regular,pure_instructions
+	.build_version macos, 11, 0
+	.globl	_main                           ; -- Begin function main
+	.p2align	2
+_main:                                  ; @main
+	.cfi_startproc
+; %bb.0:
+	sub	sp, sp, #32
+	stp	x29, x30, [sp, #16]             ; 16-byte Folded Spill
+	add	x29, sp, #16
+	.cfi_def_cfa w29, 16
+	.cfi_offset w30, -8
+	.cfi_offset w29, -16
+	mov	w8, #0                          ; =0x0
+	str	w8, [sp, #8]                    ; 4-byte Folded Spill
+	stur	wzr, [x29, #-4]
+	adrp	x0, __ZL7storage at PAGE
+	add	x0, x0, __ZL7storage at PAGEOFF
+	bl	__Z3fooPKc
+	ldr	w0, [sp, #8]                    ; 4-byte Folded Reload
+	ldp	x29, x30, [sp, #16]             ; 16-byte Folded Reload
+	add	sp, sp, #32
+	ret
+	.cfi_endproc
+                                        ; -- End function
+	.section	__DATA,__storage
+__ZL7storage:                           ; @_ZL7storage
+	.space	1383                        ; 0x567
+
+.subsections_via_symbols
diff --git a/llvm/test/tools/llvm-objcopy/MachO/update-section-object.test b/llvm/test/tools/llvm-objcopy/MachO/update-section-object.test
new file mode 100644
index 0000000000000..8db7c821ff447
--- /dev/null
+++ b/llvm/test/tools/llvm-objcopy/MachO/update-section-object.test
@@ -0,0 +1,48 @@
+# REQUIRES: aarch64-registered-target
+
+# RUN: llvm-mc -assemble -triple=arm64-apple-macos11 -filetype=obj %p/Inputs/macho_sections.s -o %t.o
+# RUN: llvm-otool -l %t.o | FileCheck %s --check-prefix=ORIG
+
+
+# RUN: llvm-objcopy %t.o --update-section __DATA,__storage=%p/Inputs/macho_sections.s %t.new.o
+# RUN: llvm-otool -l %t.new.o | FileCheck %s --check-prefix=UPDATED
+
+
+# ORIG:      cmd LC_SEGMENT_64
+# ORIG-NEXT: cmdsize 312
+# ORIG-NEXT: segname
+# ORIG-NEXT: vmaddr 0x0000000000000000
+# ORIG-NEXT: vmsize 0x00000000000005c0
+# ORIG-NEXT: fileoff 472
+# ORIG-NEXT: filesize 1472
+# ORIG-NEXT: maxprot 0x00000007
+# ORIG-NEXT: initprot 0x00000007
+# ORIG-NEXT: nsects 3
+# ORIG-NEXT: flags 0x0
+
+# ORIG:      Section
+# ORIG:      sectname __storage
+# ORIG-NEXT: segname __DATA
+# ORIG-NEXT: addr 0x0000000000000034
+# ORIG-NEXT: size 0x0000000000000567
+
+
+### Make sure the file size and segment size have changed
+# UPDATED:      cmd LC_SEGMENT_64
+# UPDATED-NEXT: cmdsize 312
+# UPDATED-NEXT: segname
+# UPDATED-NEXT: vmaddr 0x0000000000000000
+# UPDATED-NEXT: vmsize 0x00000000000005c0
+# UPDATED-NEXT: fileoff 472
+# UPDATED-NEXT: filesize 1048
+# UPDATED-NEXT: maxprot 0x00000007
+# UPDATED-NEXT: initprot 0x00000007
+# UPDATED-NEXT: nsects 3
+# UPDATED-NEXT: flags 0x0
+
+# UPDATED:      Section
+# UPDATED:      sectname __storage
+# UPDATED-NEXT: segname __DATA
+# UPDATED-NEXT: addr 0x0000000000000034
+# UPDATED-NEXT: size 0x00000000000003be
+



More information about the llvm-commits mailing list