[lld] r217486 - [mach-o]: implement -image_base option on Darwin.

Tim Northover tnorthover at apple.com
Wed Sep 10 03:39:57 PDT 2014


Author: tnorthover
Date: Wed Sep 10 05:39:57 2014
New Revision: 217486

URL: http://llvm.org/viewvc/llvm-project?rev=217486&view=rev
Log:
[mach-o]: implement -image_base option on Darwin.

As suggested by Nick, this will make __unwind_info implementation more natural,
and it'd have to be done at some point anyway.

Added:
    lld/trunk/test/mach-o/image-base.yaml
Modified:
    lld/trunk/include/lld/ReaderWriter/MachOLinkingContext.h
    lld/trunk/lib/Driver/DarwinLdDriver.cpp
    lld/trunk/lib/Driver/DarwinLdOptions.td
    lld/trunk/lib/ReaderWriter/MachO/MachOLinkingContext.cpp
    lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileFromAtoms.cpp

Modified: lld/trunk/include/lld/ReaderWriter/MachOLinkingContext.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/include/lld/ReaderWriter/MachOLinkingContext.h?rev=217486&r1=217485&r2=217486&view=diff
==============================================================================
--- lld/trunk/include/lld/ReaderWriter/MachOLinkingContext.h (original)
+++ lld/trunk/include/lld/ReaderWriter/MachOLinkingContext.h Wed Sep 10 05:39:57 2014
@@ -108,6 +108,9 @@ public:
   bool PIE() const { return _pie; }
   void setPIE(bool pie) { _pie = pie; }
 
+  uint64_t baseAddress() const { return _baseAddress; }
+  void setBaseAddress(uint64_t baseAddress) { _baseAddress = baseAddress; }
+
   /// \brief Checks whether a given path on the filesystem exists.
   ///
   /// When running in -test_file_usage mode, this method consults an
@@ -275,6 +278,7 @@ private:
   uint32_t _osMinVersion;
   uint64_t _pageZeroSize;
   uint64_t _pageSize;
+  uint64_t _baseAddress;
   uint32_t _compatibilityVersion;
   uint32_t _currentVersion;
   StringRef _installName;

Modified: lld/trunk/lib/Driver/DarwinLdDriver.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/Driver/DarwinLdDriver.cpp?rev=217486&r1=217485&r2=217486&view=diff
==============================================================================
--- lld/trunk/lib/Driver/DarwinLdDriver.cpp (original)
+++ lld/trunk/lib/Driver/DarwinLdDriver.cpp Wed Sep 10 05:39:57 2014
@@ -33,6 +33,7 @@
 #include "llvm/Support/Signals.h"
 
 #include <algorithm>
+#include <cstdlib>
 
 using namespace lld;
 
@@ -312,6 +313,20 @@ bool DarwinLdDriver::parse(int argc, con
   else
     ctx.setOutputPath("a.out");
 
+  if (llvm::opt::Arg *imageBase = parsedArgs->getLastArg(OPT_image_base)) {
+    char *endPtr;
+    uint64_t baseAddress = strtoull(imageBase->getValue(), &endPtr, 16);
+    if (*endPtr != 0) {
+      diagnostics << "error: image_base expects a hex number\n";
+      return false;
+    } else if  (baseAddress < ctx.pageZeroSize()) {
+      diagnostics << "error: image_base overlaps with __PAGEZERO\n";
+      return false;
+    }
+
+    ctx.setBaseAddress(baseAddress);
+  }
+
   // Handle -dead_strip
   if (parsedArgs->getLastArg(OPT_dead_strip))
     ctx.setDeadStripping(true);

Modified: lld/trunk/lib/Driver/DarwinLdOptions.td
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/Driver/DarwinLdOptions.td?rev=217486&r1=217485&r2=217486&view=diff
==============================================================================
--- lld/trunk/lib/Driver/DarwinLdOptions.td (original)
+++ lld/trunk/lib/Driver/DarwinLdOptions.td Wed Sep 10 05:39:57 2014
@@ -142,6 +142,7 @@ def arch : Separate<["-"], "arch">,
 def sectalign : MultiArg<["-"], "sectalign", 3>,
      MetaVarName<"<segname> <sectname> <alignment>">,
      HelpText<"alignment for segment/section">;
+def image_base : Separate<["-"], "image_base">;
 def t : Flag<["-"], "t">,
      HelpText<"Print the names of the input files as ld processes them">;
 def v : Flag<["-"], "v">,

Modified: lld/trunk/lib/ReaderWriter/MachO/MachOLinkingContext.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/MachO/MachOLinkingContext.cpp?rev=217486&r1=217485&r2=217486&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/MachO/MachOLinkingContext.cpp (original)
+++ lld/trunk/lib/ReaderWriter/MachO/MachOLinkingContext.cpp Wed Sep 10 05:39:57 2014
@@ -133,11 +133,10 @@ bool MachOLinkingContext::isThinObjectFi
 
 MachOLinkingContext::MachOLinkingContext()
     : _outputMachOType(MH_EXECUTE), _outputMachOTypeStatic(false),
-      _doNothing(false), _pie(false),
-      _arch(arch_unknown), _os(OS::macOSX), _osMinVersion(0),
-      _pageZeroSize(0), _pageSize(4096), _compatibilityVersion(0),
-      _currentVersion(0), _deadStrippableDylib(false), _printAtoms(false),
-      _testingFileUsage(false), _keepPrivateExterns(false),
+      _doNothing(false), _pie(false), _arch(arch_unknown), _os(OS::macOSX),
+      _osMinVersion(0), _pageZeroSize(0), _pageSize(4096), _baseAddress(0),
+      _compatibilityVersion(0), _currentVersion(0), _deadStrippableDylib(false),
+      _printAtoms(false), _testingFileUsage(false), _keepPrivateExterns(false),
       _archHandler(nullptr), _exportMode(ExportMode::globals) {}
 
 MachOLinkingContext::~MachOLinkingContext() {}

Modified: lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileFromAtoms.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileFromAtoms.cpp?rev=217486&r1=217485&r2=217486&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileFromAtoms.cpp (original)
+++ lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileFromAtoms.cpp Wed Sep 10 05:39:57 2014
@@ -95,8 +95,8 @@ SegmentInfo::SegmentInfo(StringRef n)
 
 class Util {
 public:
-  Util(const MachOLinkingContext &ctxt) : _context(ctxt), 
-    _archHandler(ctxt.archHandler()), _entryAtom(nullptr) {}
+  Util(const MachOLinkingContext &ctxt)
+      : _context(ctxt), _archHandler(ctxt.archHandler()), _entryAtom(nullptr) {}
 
   void      assignAtomsToSections(const lld::File &atomFile);
   void      organizeSections();
@@ -468,16 +468,19 @@ void Util::layoutSectionsInTextSegment(s
 
 void Util::assignAddressesToSections(const NormalizedFile &file) {
   size_t hlcSize = headerAndLoadCommandsSize(file);
-  uint64_t address = 0;  // FIXME
+  uint64_t address = 0;
   if (_context.outputMachOType() != llvm::MachO::MH_OBJECT) {
     for (SegmentInfo *seg : _segmentInfos) {
       if (seg->name.equals("__PAGEZERO")) {
         seg->size = _context.pageZeroSize();
         address += seg->size;
       }
-      else if (seg->name.equals("__TEXT"))
+      else if (seg->name.equals("__TEXT")) {
+        // _context.baseAddress()  == 0 implies it was either unspecified or
+        // pageZeroSize is also 0. In either case resetting address is safe.
+        address = _context.baseAddress() ? _context.baseAddress() : address;
         layoutSectionsInTextSegment(hlcSize, seg, address);
-      else
+      } else
         layoutSectionsInSegment(seg, address);
 
       address = llvm::RoundUpToAlignment(address, _context.pageSize());

Added: lld/trunk/test/mach-o/image-base.yaml
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/mach-o/image-base.yaml?rev=217486&view=auto
==============================================================================
--- lld/trunk/test/mach-o/image-base.yaml (added)
+++ lld/trunk/test/mach-o/image-base.yaml Wed Sep 10 05:39:57 2014
@@ -0,0 +1,14 @@
+# RUN: lld -flavor darwin -arch x86_64 -macosx_version_min 10.9 %s -o %t -image_base 31415926530 %p/Inputs/libSystem.yaml
+# RUN: macho-dump %t | FileCheck %s
+
+--- !native
+defined-atoms:
+   - name:            _main
+     scope:           global
+     content:         []
+
+  # Unfortunately, llvm-objdump and llvm-readobj are too generic and don't give
+  # us easy access to the MachO segment model, so we have to check the uglier
+  # macho-dump output.
+# CHECK: 'segment_name', '__TEXT
+# CHECK-NEXT: 'vm_addr', 3384796144944





More information about the llvm-commits mailing list