]> granicus.if.org Git - llvm/commitdiff
[Object] Remove check for BIND_OPCODE_DONE/REBASE_OPCODE_DONE.
authorJuergen Ributzka <juergen@ributzka.de>
Thu, 30 Mar 2017 19:56:50 +0000 (19:56 +0000)
committerJuergen Ributzka <juergen@ributzka.de>
Thu, 30 Mar 2017 19:56:50 +0000 (19:56 +0000)
BIND_OPCODE_DONE/REBASE_OPCODE_DONE may appear at the end of the opcode array,
but they are not required to. The linker only adds them as padding to align the
opcodes to pointer size.

This fixes rdar://problem/31285560.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@299104 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Object/MachOObjectFile.cpp
test/tools/llvm-objdump/Inputs/macho-bind-missing-done [deleted file]
test/tools/llvm-objdump/Inputs/macho-rebase-missing-done [deleted file]
test/tools/llvm-objdump/macho-bad-bind.test

index 8124c18f30e97467dd252076819c5a53b4336c6b..f2c2aead5a9c49fa93ec2df35ff681d343d491bf 100644 (file)
@@ -2780,12 +2780,10 @@ void MachORebaseEntry::moveNext() {
     --RemainingLoopCount;
     return;
   }
-  if (Ptr >= Opcodes.end()) {
-    if (Opcodes.begin() != Opcodes.end() && Done != true) {
-      *E = malformedError("missing REBASE_OPCODE_DONE at end of opcodes");
-      moveToEnd();
-      return;
-    }
+  // REBASE_OPCODE_DONE is only used for padding if we are not aligned to
+  // pointer size. Therefore it is possible to reach the end without ever having
+  // seen REBASE_OPCODE_DONE.
+  if (Ptr == Opcodes.end()) {
     Done = true;
     return;
   }
@@ -3164,12 +3162,10 @@ void MachOBindEntry::moveNext() {
     --RemainingLoopCount;
     return;
   }
-  if (Ptr >= Opcodes.end()) {
-    if (Opcodes.begin() != Opcodes.end() && Done != true) {
-      *E = malformedError("missing BIND_OPCODE_DONE at end of opcodes");
-      moveToEnd();
-      return;
-    }
+  // BIND_OPCODE_DONE is only used for padding if we are not aligned to
+  // pointer size. Therefore it is possible to reach the end without ever having
+  // seen BIND_OPCODE_DONE.
+  if (Ptr == Opcodes.end()) {
     Done = true;
     return;
   }
diff --git a/test/tools/llvm-objdump/Inputs/macho-bind-missing-done b/test/tools/llvm-objdump/Inputs/macho-bind-missing-done
deleted file mode 100755 (executable)
index ced8840..0000000
Binary files a/test/tools/llvm-objdump/Inputs/macho-bind-missing-done and /dev/null differ
diff --git a/test/tools/llvm-objdump/Inputs/macho-rebase-missing-done b/test/tools/llvm-objdump/Inputs/macho-rebase-missing-done
deleted file mode 100755 (executable)
index 633a117..0000000
Binary files a/test/tools/llvm-objdump/Inputs/macho-rebase-missing-done and /dev/null differ
index baf8dee3234746e06c68a3bd697328b50da7bc0e..98fd08f4009e80671884fb0f19d5146fe5d9a988 100644 (file)
@@ -67,9 +67,6 @@ WEAK-BIND-SET-DYLIB-ORDINAL-ULEB: macho-weak-bind-set-dylib-ordinal-uleb': trunc
 RUN: not llvm-objdump -macho -weak-bind %p/Inputs/macho-weak-bind-set-dylib-special-imm 2>&1 | FileCheck -check-prefix WEAK-BIND-SET-DYLIB-SPECIAL-IMM %s 
 WEAK-BIND-SET-DYLIB-SPECIAL-IMM: macho-weak-bind-set-dylib-special-imm': truncated or malformed object (BIND_OPCODE_SET_DYLIB_SPECIAL_IMM not allowed in weak bind table for opcode at: 0x2)
 
-RUN: not llvm-objdump -macho -bind %p/Inputs/macho-bind-missing-done 2>&1 | FileCheck -check-prefix BIND-MISSING-DONE %s 
-BIND-MISSING-DONE: macho-bind-missing-done': truncated or malformed object (missing BIND_OPCODE_DONE at end of opcodes)
-
 RUN: not llvm-objdump -macho -rebase %p/Inputs/macho-rebase-set-type-imm 2>&1 | FileCheck -check-prefix REBASE-SET-TYPE-IMM %s 
 REBASE-SET-TYPE-IMM: macho-rebase-set-type-imm': truncated or malformed object (for REBASE_OPCODE_SET_TYPE_IMM bad bind type: 5 for opcode at: 0x0)
 
@@ -102,6 +99,3 @@ REBASE-ULEB-TIMES-SKIPPING-ULEB: macho-rebase-uleb-times-skipping-uleb': truncat
 
 RUN: not llvm-objdump -macho -rebase %p/Inputs/macho-rebase-bad-opcode-value 2>&1 | FileCheck -check-prefix REBASE-BAD-OPCODE-VALUE %s 
 REBASE-BAD-OPCODE-VALUE: macho-rebase-bad-opcode-value': truncated or malformed object (bad rebase info (bad opcode value 0xD0 for opcode at: 0x4)
-
-RUN: not llvm-objdump -macho -rebase %p/Inputs/macho-rebase-missing-done 2>&1 | FileCheck -check-prefix REBASE-MISSING-DONE %s 
-REBASE-MISSING-DONE: macho-rebase-missing-done': truncated or malformed object (missing REBASE_OPCODE_DONE at end of opcodes)