From cad124910683d12220eb3a137992317dc36bfd32 Mon Sep 17 00:00:00 2001 From: Juergen Ributzka Date: Thu, 30 Mar 2017 19:56:50 +0000 Subject: [PATCH] [Object] Remove check for BIND_OPCODE_DONE/REBASE_OPCODE_DONE. 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. llvm-svn: 299104 --- llvm/lib/Object/MachOObjectFile.cpp | 20 ++++++++------------ .../llvm-objdump/Inputs/macho-bind-missing-done | Bin 8432 -> 0 bytes .../llvm-objdump/Inputs/macho-rebase-missing-done | Bin 8456 -> 0 bytes llvm/test/tools/llvm-objdump/macho-bad-bind.test | 6 ------ 4 files changed, 8 insertions(+), 18 deletions(-) delete mode 100755 llvm/test/tools/llvm-objdump/Inputs/macho-bind-missing-done delete mode 100755 llvm/test/tools/llvm-objdump/Inputs/macho-rebase-missing-done diff --git a/llvm/lib/Object/MachOObjectFile.cpp b/llvm/lib/Object/MachOObjectFile.cpp index 8124c18f..f2c2aea 100644 --- a/llvm/lib/Object/MachOObjectFile.cpp +++ b/llvm/lib/Object/MachOObjectFile.cpp @@ -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/llvm/test/tools/llvm-objdump/Inputs/macho-bind-missing-done b/llvm/test/tools/llvm-objdump/Inputs/macho-bind-missing-done deleted file mode 100755 index ced8840ea83211607a29be7cb2438d0c471f9819..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8432 zcmeHM&ui2`6rQx!E^W0bh`*IsTB#n|Dm{4YmM*5WXn%qT^4#sF?qc=_*(_}Zp;A1o zP^dS(c+iW7B0YLnsCv+U!GlT#g@P9maeZGhX_Kwnvxj-`cJj@8^Uceb8OUZn{QCZ< zSqQCBh@}Q0L_51^65_rva3zkho9sm6@ym(piOH+zjhYsP|3u*F;R%SQ6W6ArDc*QJ z+9xFD+E9+zFT+HxwczgL*7Ei94S?^GOab1vlMb*HhD0T|oGNX1)$(N|Uod}wg8?zg z7sP!&%2;;MayY4$uPFJBO9Ei%zHPhen=QFcHh)Vd)bc%$dtZOhXL1e_!0k?$jZ>1lgwEGj`Dq!d`IOVU|wr=4eMl+ooF~d9S^1P zdWfu(V7-La33!8AiSjm;7IUeBO-0wK%NNjKy@l(-^YrGEB@o%kz4&wC4&dK<&bD&?<<#_K0BN0OE21K#;_CYsAFjD z+3l_u7vDemv1SewA5U~~pUy5?TRcA>VDz!|@cm*O_I21W5AFjo)U36<mBOlIES2O7R`lVW}nwD)BjQN6Nr}@=a$lurGQdEDWDWk3Md7X0!jg;fKosy zpcMF@73k>HCs1F!*>+7F?jaUGq-%yzdK#J?wwW2)=c2yZz|_=YV1C({iT} VgSa;MM0a-$LDGhFE(f$MxWJsE=S={_!v!SUVM2d$M z3iYNJ4|*-qKS5BadQkra4=NQD1TP|DeBbU&vzwZpJB#PZ{B`81Dl<9zrOux zXH08ltlGjD>n3MyjNM~8uGn#MgPil3#O37mB(E(*Q~dGq zXde@pYC}2fpa^sBniaR6+sHReHvqm-kpg_6o(@nAL(WTXIbGWAYUIlbJ~_X{azIS* z$#}rWv!-1%9ZG8CD+<07f&du0@7kXFmP)Q;mjmEn&Uto~J*bD1mc3wI5%c#v?x_@`1yA zSjS;p-&fO zxB8x4di(gtrZG}{G}}jgsF!ti_q6g3Jyui>$nNmP0pcGIFCZ?)rDa6RaE#7VM?mI#)+!F7>xW@mBE*cs4M-w2L zBYs1%+jC5-#I<-=du#*bO{_|M`-Gc}Qr$`crGQdEDWDWk3Md7X0!jg;fKosypcGIF z{Lc#X^u}lRtFLDahj#uUIZxBMF&%2pI&6bE@t!eWq=RX9nGl)A>72fW=d#?am`i2X zq%-go($D5nR-X0a!$m9GIwK~N7wGQR{1ZR_yTef*2j4j4HxO!fKS|(xFpL9QpL7h@ TI-T_Ht%3VB$a?qO5smu`tc%FA diff --git a/llvm/test/tools/llvm-objdump/macho-bad-bind.test b/llvm/test/tools/llvm-objdump/macho-bad-bind.test index baf8dee..98fd08f 100644 --- a/llvm/test/tools/llvm-objdump/macho-bad-bind.test +++ b/llvm/test/tools/llvm-objdump/macho-bad-bind.test @@ -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) -- 2.7.4