[lld] r259960 - Move creation of "__LINKEDIT" segment. NFC.

Pete Cooper via llvm-commits llvm-commits at lists.llvm.org
Fri Feb 5 16:14:15 PST 2016


Author: pete
Date: Fri Feb  5 18:14:15 2016
New Revision: 259960

URL: http://llvm.org/viewvc/llvm-project?rev=259960&view=rev
Log:
Move creation of "__LINKEDIT" segment.  NFC.

We currently tag on a "__LINKEDIT" when we are emitting the segments.
However, an upcoming patch aims to set the initprot and maxprot segment members
to their correct values, and in order to share code, its better to create this
segment for real and handle it in buildFileOffsets the same way ld64 does.

The commit for segment protections will add a test for this all being correct so
no test here until that code is committed.

Modified:
    lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileBinaryWriter.cpp
    lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileFromAtoms.cpp

Modified: lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileBinaryWriter.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileBinaryWriter.cpp?rev=259960&r1=259959&r2=259960&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileBinaryWriter.cpp (original)
+++ lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileBinaryWriter.cpp Fri Feb  5 18:14:15 2016
@@ -430,9 +430,6 @@ uint32_t MachOFileLayout::loadCommandsSi
   count += _file.segments.size();
   // Add section record for each section.
   size += _file.sections.size() * sectionSize;
-  // Add one LC_SEGMENT for implicit  __LINKEDIT segment
-  size += segCommandSize;
-  ++count;
 
   // If creating a dylib, add LC_ID_DYLIB.
   if (_file.fileType == llvm::MachO::MH_DYLIB) {
@@ -595,8 +592,11 @@ void MachOFileLayout::buildFileOffsets()
                   << ", fileOffset=" << fileOffset << "\n");
     }
 
-    _segInfo[&sg].fileSize = llvm::alignTo(segFileSize, _file.pageSize);
-    fileOffset = llvm::alignTo(fileOffset + segFileSize, _file.pageSize);
+    // round up all segments to page aligned, except __LINKEDIT
+    if (!sg.name.equals("__LINKEDIT")) {
+      _segInfo[&sg].fileSize = llvm::alignTo(segFileSize, _file.pageSize);
+      fileOffset = llvm::alignTo(fileOffset + segFileSize, _file.pageSize);
+    }
     _addressOfLinkEdit = sg.address + sg.size;
   }
   _startOfLinkEdit = fileOffset;
@@ -697,8 +697,30 @@ template <typename T>
 std::error_code MachOFileLayout::writeSegmentLoadCommands(uint8_t *&lc) {
   uint32_t indirectSymRunningIndex = 0;
   for (const Segment &seg : _file.segments) {
-    // Write segment command with trailing sections.
+    // Link edit has no sections and a custom range of address, so handle it
+    // specially.
     SegExtraInfo &segInfo = _segInfo[&seg];
+    if (seg.name.equals("__LINKEDIT")) {
+      size_t linkeditSize = _endOfLinkEdit - _startOfLinkEdit;
+      typename T::command* cmd = reinterpret_cast<typename T::command*>(lc);
+      cmd->cmd = T::LC;
+      cmd->cmdsize = sizeof(typename T::command);
+      uint8_t *next = lc + cmd->cmdsize;
+      setString16("__LINKEDIT", cmd->segname);
+      cmd->vmaddr   = _addressOfLinkEdit;
+      cmd->vmsize   = llvm::alignTo(linkeditSize, _file.pageSize);
+      cmd->fileoff  = _startOfLinkEdit;
+      cmd->filesize = linkeditSize;
+      cmd->initprot = seg.access;
+      cmd->maxprot  = seg.access;
+      cmd->nsects   = 0;
+      cmd->flags    = 0;
+      if (_swap)
+        swapStruct(*cmd);
+      lc = next;
+      continue;
+    }
+    // Write segment command with trailing sections.
     typename T::command* cmd = reinterpret_cast<typename T::command*>(lc);
     cmd->cmd = T::LC;
     cmd->cmdsize = sizeof(typename T::command)
@@ -738,24 +760,6 @@ std::error_code MachOFileLayout::writeSe
     }
     lc = reinterpret_cast<uint8_t*>(next);
   }
-  // Add implicit __LINKEDIT segment
-  size_t linkeditSize = _endOfLinkEdit - _startOfLinkEdit;
-  typename T::command* cmd = reinterpret_cast<typename T::command*>(lc);
-  cmd->cmd = T::LC;
-  cmd->cmdsize = sizeof(typename T::command);
-  uint8_t *next = lc + cmd->cmdsize;
-  setString16("__LINKEDIT", cmd->segname);
-  cmd->vmaddr   = _addressOfLinkEdit;
-  cmd->vmsize   = llvm::alignTo(linkeditSize, _file.pageSize);
-  cmd->fileoff  = _startOfLinkEdit;
-  cmd->filesize = linkeditSize;
-  cmd->maxprot  = VM_PROT_READ;
-  cmd->initprot = VM_PROT_READ;
-  cmd->nsects   = 0;
-  cmd->flags    = 0;
-  if (_swap)
-    swapStruct(*cmd);
-  lc = next;
   return std::error_code();
 }
 

Modified: lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileFromAtoms.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileFromAtoms.cpp?rev=259960&r1=259959&r2=259960&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileFromAtoms.cpp (original)
+++ lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileFromAtoms.cpp Fri Feb  5 18:14:15 2016
@@ -487,6 +487,8 @@ void Util::organizeSections() {
     default:
       break;
   }
+  segmentForName("__LINKEDIT");
+
   // Group sections into segments.
   for (SectionInfo *si : _sectionInfos) {
     SegmentInfo *seg = segmentForName(si->segmentName);




More information about the llvm-commits mailing list