[lld] r278297 - [lld][MachO] Fix LC_SEGEMENT[_64] filesize computation in -r mode.

Lang Hames via llvm-commits llvm-commits at lists.llvm.org
Wed Aug 10 15:15:09 PDT 2016


Author: lhames
Date: Wed Aug 10 17:15:09 2016
New Revision: 278297

URL: http://llvm.org/viewvc/llvm-project?rev=278297&view=rev
Log:
[lld][MachO] Fix LC_SEGEMENT[_64] filesize computation in -r mode.

Using vmsize to populate this file works when outputing MachO images, but fails
when outputting relocatable objects. This patch fixes the computation to use
file offsets, which works for both output types.

Fixes <rdar://problem/27727666>



Added:
    lld/trunk/test/mach-o/lc_segment_filesize.yaml
Modified:
    lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileBinaryWriter.cpp

Modified: lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileBinaryWriter.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileBinaryWriter.cpp?rev=278297&r1=278296&r2=278297&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileBinaryWriter.cpp (original)
+++ lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileBinaryWriter.cpp Wed Aug 10 17:15:09 2016
@@ -643,7 +643,9 @@ llvm::Error MachOFileLayout::writeSingle
   seg->vmsize = _file.sections.back().address
               + _file.sections.back().content.size();
   seg->fileoff = _endOfLoadCommands;
-  seg->filesize = seg->vmsize;
+  seg->filesize = _sectInfo[&_file.sections.back()].fileOffset +
+                  _file.sections.back().content.size() -
+                  _sectInfo[&_file.sections.front()].fileOffset;
   seg->maxprot = VM_PROT_READ|VM_PROT_WRITE|VM_PROT_EXECUTE;
   seg->initprot = VM_PROT_READ|VM_PROT_WRITE|VM_PROT_EXECUTE;
   seg->nsects = _file.sections.size();

Added: lld/trunk/test/mach-o/lc_segment_filesize.yaml
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/mach-o/lc_segment_filesize.yaml?rev=278297&view=auto
==============================================================================
--- lld/trunk/test/mach-o/lc_segment_filesize.yaml (added)
+++ lld/trunk/test/mach-o/lc_segment_filesize.yaml Wed Aug 10 17:15:09 2016
@@ -0,0 +1,31 @@
+# RUN: lld -flavor darwin -arch x86_64 -r -o %t %s && llvm-objdump -private-headers %t | FileCheck %s
+
+# CHECK: filesize 19
+
+--- !mach-o
+arch:            x86_64
+file-type:       MH_OBJECT
+flags:           [ MH_SUBSECTIONS_VIA_SYMBOLS ]
+sections:
+  - segment:         __TEXT
+    section:         __text
+    type:            S_REGULAR
+    attributes:      [ S_ATTR_PURE_INSTRUCTIONS ]
+    alignment:       16
+    address:         0x0000000000000000
+    content:         [ 0x00, 0x00, 0x00 ]
+  - segment:         __TEXT
+    section:         __alt
+    type:            S_REGULAR
+    attributes:      [ S_ATTR_PURE_INSTRUCTIONS ]
+    alignment:       16
+    address:         0x0000000000000010
+    content:         [ 0x00, 0x00, 0x00 ]
+global-symbols:
+  - name:            _main
+    type:            N_SECT
+    scope:           [ N_EXT ]
+    sect:            1
+    value:           0x0000000000000000
+page-size:       0x00000000
+...




More information about the llvm-commits mailing list