diff --git a/llvm/test/tools/llvm-objcopy/MachO/dump-section-before-add-remove.test b/llvm/test/tools/llvm-objcopy/MachO/dump-section-before-add-remove.test new file mode 100644 --- /dev/null +++ b/llvm/test/tools/llvm-objcopy/MachO/dump-section-before-add-remove.test @@ -0,0 +1,62 @@ +# RUN: yaml2obj %s -o %t + +## Verify that section is dumped before remove. +# RUN: llvm-objcopy --dump-section __TEXT,__text=%t1.dump --remove-section __TEXT,__text %t %t1 +# RUN: FileCheck %s --input-file=%t1.dump --check-prefix=CONTENTS --implicit-check-not={{.}} + +# CONTENTS: abcd + +## Verify that the newly added section is not dumped. +# RUN: echo CAFE > %t2.txt +# RUN: not llvm-objcopy --dump-section __TEXT,__const=%t2.dump --add-section __TEXT,__const=%t2.txt %t %t2 2>&1 | \ +# RUN: FileCheck %s --check-prefix=NODUMP -DINPUT=%t + +# NODUMP: error: '[[INPUT]]': section '__TEXT,__const' not found + +--- !mach-o +FileHeader: + magic: 0xFEEDFACF + cputype: 0x01000007 + cpusubtype: 0x00000003 + filetype: 0x00000001 + ncmds: 1 + sizeofcmds: 312 + flags: 0x00002000 + reserved: 0x00000000 +LoadCommands: + - cmd: LC_SEGMENT_64 + cmdsize: 312 + segname: '' + vmaddr: 0 + vmsize: 12 + fileoff: 344 + filesize: 12 + maxprot: 7 + initprot: 7 + nsects: 3 + flags: 0 + Sections: + - sectname: __text + segname: __TEXT + addr: 0x0000000000000000 + content: '61626364' + size: 4 + offset: 344 + align: 0 + reloff: 0x00000000 + nreloc: 0 + flags: 0x80000400 + reserved1: 0x00000000 + reserved2: 0x00000000 + - sectname: __data + segname: __DATA + addr: 0x0000000000000004 + content: 'EEFFEEFF' + size: 4 + offset: 348 + align: 0 + reloff: 0x00000000 + nreloc: 0 + flags: 0x00000000 + reserved1: 0x00000000 + reserved2: 0x00000000 diff --git a/llvm/tools/llvm-objcopy/MachO/MachOObjcopy.cpp b/llvm/tools/llvm-objcopy/MachO/MachOObjcopy.cpp --- a/llvm/tools/llvm-objcopy/MachO/MachOObjcopy.cpp +++ b/llvm/tools/llvm-objcopy/MachO/MachOObjcopy.cpp @@ -187,6 +187,15 @@ "option not supported by llvm-objcopy for MachO"); } + // Dump sections before add/remove for compatibility with GNU objcopy. + for (StringRef Flag : Config.DumpSection) { + StringRef SectionName; + StringRef FileName; + std::tie(SectionName, FileName) = Flag.split("="); + if (Error E = dumpSectionToFile(SectionName, FileName, Obj)) + return E; + } + if (Error E = removeSections(Config, Obj)) return E; @@ -201,16 +210,8 @@ for (std::unique_ptr
&Sec : LC.Sections) Sec->Relocations.clear(); - for (const StringRef &Flag : Config.DumpSection) { - std::pair SecPair = Flag.split("="); - StringRef SecName = SecPair.first; - StringRef File = SecPair.second; - if (Error E = dumpSectionToFile(SecName, File, Obj)) - return E; - } - for (const auto &Flag : Config.AddSection) { - std::pair SecPair = Flag.split("="); + std::pair SecPair = Flag.split('='); StringRef SecName = SecPair.first; StringRef File = SecPair.second; if (Error E = isValidMachOCannonicalName(SecName))