diff --git a/lld/MachO/Driver.cpp b/lld/MachO/Driver.cpp --- a/lld/MachO/Driver.cpp +++ b/lld/MachO/Driver.cpp @@ -1513,6 +1513,12 @@ inputFiles.insert(make(*buffer, segName, sectName)); } + for (const Arg *arg : args.filtered(OPT_add_empty_section)) { + StringRef segName = arg->getValue(0); + StringRef sectName = arg->getValue(1); + inputFiles.insert(make(MemoryBufferRef(), segName, sectName)); + } + gatherInputSections(); if (config->callGraphProfileSort) extractCallGraphProfile(); diff --git a/lld/MachO/Options.td b/lld/MachO/Options.td --- a/lld/MachO/Options.td +++ b/lld/MachO/Options.td @@ -252,6 +252,10 @@ Alias, HelpText<"Alias for -sectcreate">, Group; +def add_empty_section : MultiArg<["-"], "add_empty_section", 2>, + MetaVarName<"
">, + HelpText<"Create an empty
in ">, + Group; def filelist : Separate<["-"], "filelist">, MetaVarName<"">, HelpText<"Read names of files to link from ">, diff --git a/lld/test/MachO/sectcreate.s b/lld/test/MachO/sectcreate.s --- a/lld/test/MachO/sectcreate.s +++ b/lld/test/MachO/sectcreate.s @@ -7,6 +7,7 @@ # RUN: -sectcreate SEG SEC1 %t1 \ # RUN: -segcreate SEG SEC2 %t3 \ # RUN: -sectcreate SEG SEC1 %t2 \ +# RUN: -add_empty_section __DATA __data \ # RUN: -o %t %t.o # RUN: llvm-objdump -s %t | FileCheck %s @@ -16,10 +17,17 @@ # RUN: -sectcreate SEG SEC1 %t1 \ # RUN: -segcreate SEG SEC2 %t3 \ # RUN: -sectcreate SEG SEC1 %t2 \ +# RUN: -add_empty_section SEG SEC1 \ # RUN: -o %t %t.o # RUN: llvm-objdump -s %t | FileCheck --check-prefix=STRIPPED %s # RUN: llvm-readobj --sections %t | FileCheck --check-prefix=STRIPPEDSEC %s +# RUN: %lld -add_empty_section foo bar -o %t %t.o +# RUN: llvm-readobj --sections %t | FileCheck --check-prefix=EMPTYSECTION %s + +# RUN: %lld -sectcreate SEG SEC1 %t1 -add_empty_section SEG SEC1 -o %t %t.o +# RUN: llvm-readobj --sections %t | FileCheck --check-prefix=CREATEDANDEMPTY %s + # CHECK: Contents of section __TEXT,__text: # CHECK: Contents of section __DATA,__data: # CHECK: my string!. @@ -40,6 +48,16 @@ # STRIPPEDSEC-NOT: NoDeadStrip +# EMPTYSECTION: Name: bar +# EMPTYSECTION: Segment: foo +# EMPTYSECTION: Size: 0x0 +# EMPTYSECTION-NOT: Name: + +# CREATEDANDEMPTY: Name: SEC1 +# CREATEDANDEMPTY: Segment: SEG +# CREATEDANDEMPTY: Size: 0x10 +# CREATEDANDEMPTY-NOT: Name: + .text .global _main _main: