From 10ccabce65725083d5adb00da3bb85245ce89d0f Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Wed, 11 Dec 2013 19:38:51 -0700 Subject: [PATCH] Mac OS X: fix executable creation for LC_DYLIB_CODE_SIGN_DRS The LC_DYLIB_CODE_SIGN_DRS load command is relatively new, and it needs to be updated when we shift __LINKEDIT to add __PLTSCHEME. Merge to v6.0 (cherry picked from commit 861384d36d35b046ed666d238046a57ff589ed9c) --- racket/collects/compiler/private/mach-o.rkt | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/racket/collects/compiler/private/mach-o.rkt b/racket/collects/compiler/private/mach-o.rkt index f1e1f2cf86..6fa16067ee 100644 --- a/racket/collects/compiler/private/mach-o.rkt +++ b/racket/collects/compiler/private/mach-o.rkt @@ -65,7 +65,9 @@ [data-in-code-offset #f] [code-signature-pos #f] [code-signature-size 0] - [code-signature-lc-sz 0]) + [code-signature-lc-sz 0] + [code-sign-drs-pos #f] + [code-sign-drs-offset 0]) ;; (printf "~a cmds, length 0x~x\n" cnt cmdssz) (read-ulong p) ; flags (when (equal? exe-id #xFeedFacf) @@ -168,6 +170,11 @@ (set! code-signature-size (+ size extra))) (log-warning "WARNING: code signature is not at end of file"))) (log-warning "WARNING: code signature is not last load command"))] + [(#x2B) + ;; LC_DYLIB_CODE_SIGN_DRS + (set! code-sign-drs-pos pos) + (let ([offset (read-ulong p)]) + (set! code-sign-drs-offset offset))] [else (void)]) (file-position p (+ pos sz)) @@ -229,6 +236,9 @@ (when data-in-code-pos (when (data-in-code-pos . > . link-edit-pos) (set! data-in-code-pos (+ data-in-code-pos new-cmd-sz)))) + (when code-sign-drs-pos + (when (code-sign-drs-pos . > . link-edit-pos) + (set! code-sign-drs-pos (+ code-sign-drs-pos new-cmd-sz)))) (set! link-edit-pos (+ link-edit-pos new-cmd-sz)) (when move-link-edit? ;; Update link-edit segment entry: @@ -275,6 +285,10 @@ (when data-in-code-pos (file-position p (+ data-in-code-pos 8)) (write-ulong (+ data-in-code-offset outlen) out)) + ;; Shift code-sign drs: + (when code-sign-drs-pos + (file-position p (+ code-sign-drs-pos 8)) + (write-ulong (+ code-sign-drs-offset outlen) out)) ;; Shift dyld-info offs (when dyld-info-pos (let ([update (lambda (n)