[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