X-Git-Url: https://git.saurik.com/cycript.git/blobdiff_plain/abcec963c029fdfee781a4cd7dcaa35e4e6e5aed..e7ff015817107dbac9373c19ce851178e4f3c791:/trampoline.sh?ds=inline diff --git a/trampoline.sh b/trampoline.sh index 0409808..97e078a 100755 --- a/trampoline.sh +++ b/trampoline.sh @@ -1,34 +1,59 @@ -#!/bin/bash - -shopt -s extglob +#!/usr/bin/env bash + +# Cycript - Optimizing JavaScript Compiler/Runtime +# Copyright (C) 2009-2013 Jay Freeman (saurik) + +# GNU General Public License, Version 3 {{{ +# +# Cycript is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published +# by the Free Software Foundation, either version 3 of the License, +# or (at your option) any later version. +# +# Cycript is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Cycript. If not, see . +# }}} + +set -e hpp=$1 object=$2 name=$3 sed=$4 -otool=$5 -lipo=$6 -nm=$7 -shift 7 - -#shift 1 -#set /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc-4.2 -I/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.1.3.sdk/usr/include "$@" +lipo=$5 +nm=$6 +otool=$7 -"$@" +exec >"${hpp}" -detailed=$(lipo -detailed_info "${object}") +detailed=$("${lipo}" -detailed_info "${object}") -{ +regex=$'\nNon-fat file: .* is architecture: (.*)' +if [[ ${detailed} =~ ${regex} ]]; then + archs=(${BASH_REMATCH[1]}) + unset detailed +else + archs=($(echo "${detailed}" | "${sed}" -e '/^architecture / { s/^architecture //; p; }; d;')) +fi echo '#include "Trampoline.hpp"' -for arch in $(echo "${detailed}" | "${sed}" -e '/^architecture / { s/^architecture //; p; }; d;'); do - offset=$(echo "${detailed}" | "${sed}" -e ' - /^architecture / { x; s/.*/0/; x; }; - /^architecture '${arch}'$/ { x; s/.*/1/; x; }; - x; /^1$/ { x; /^ *offset / { s/^ *offset //; p; }; x; }; x; - d; - ') +for arch in "${archs[@]}"; do + if [[ "${detailed+@}" ]]; then + offset=$(echo "${detailed}" | "${sed}" -e ' + /^architecture / { x; s/.*/0/; x; }; + /^architecture '${arch}'$/ { x; s/.*/1/; x; }; + x; /^1$/ { x; /^ *offset / { s/^ *offset //; p; }; x; }; x; + d; + ') + else + offset=0 + fi file=($("${otool}" -arch "${arch}" -l "${object}" | "${sed}" -e ' x; /^1$/ { x; @@ -37,7 +62,7 @@ for arch in $(echo "${detailed}" | "${sed}" -e '/^architecture / { s/^architectu x; }; x; /^ *cmd LC_SEGMENT/ { x; s/.*/1/; x; }; - + d; ')) @@ -47,12 +72,12 @@ for arch in $(echo "${detailed}" | "${sed}" -e '/^architecture / { s/^architectu echo echo "static const char ${name}_${arch}_data_[] = {" - od -v -t x1 -t c -j "$((offset + fileoff))" -N "${filesize}" "${object}" | "${sed}" -e ' + LANG=C od -v -t x1 -t c -j "$((offset + fileoff))" -N "${filesize}" "${object}" | "${sed}" -e ' /^[0-7]/ ! { s@^ @// @; s/\(....\)/ \1/g; s@^ // @//@; - s/ *$/ /; # comments cannot end with \ (XXX: put something else there, line it up) + s/ *$/,/; }; /^[0-7]/ { @@ -76,17 +101,14 @@ for arch in $(echo "${detailed}" | "${sed}" -e '/^architecture / { s/^architectu echo echo "/*" - "${otool}" -vVt -arch "${arch}" "${object}" + "${otool}" -arch "${arch}" -vVt "${object}" echo "*/" echo - echo "static Trampoline ${name}_${arch}_ = {" + echo "_disused static Trampoline ${name}_${arch}_ = {" echo " ${name}_${arch}_data_," echo " sizeof(${name}_${arch}_data_)," echo " ${name}_${arch}_entry_," echo "};" -done - -} >"${hpp}" -#rm -f "${object}" +done