]> git.saurik.com Git - cycript.git/blame - trampoline.sh
/System/Library/Frameworks is an Apple-only path.
[cycript.git] / trampoline.sh
CommitLineData
944dc32c 1#!/usr/bin/env bash
eed4f174 2
c15969fd 3# Cycript - Optimizing JavaScript Compiler/Runtime
f95d2598 4# Copyright (C) 2009-2014 Jay Freeman (saurik)
c15969fd 5
f95d2598 6# GNU Affero General Public License, Version 3 {{{
c15969fd 7#
f95d2598
JF
8# This program is free software: you can redistribute it and/or modify
9# it under the terms of the GNU Affero General Public License as published by
10# the Free Software Foundation, either version 3 of the License, or
11# (at your option) any later version.
c15969fd 12#
f95d2598
JF
13# This program is distributed in the hope that it will be useful,
14# but WITHOUT ANY WARRANTY; without even the implied warranty of
c15969fd 15# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
f95d2598 16# GNU Affero General Public License for more details.
c15969fd 17#
f95d2598
JF
18# You should have received a copy of the GNU Affero General Public License
19# along with this program. If not, see <http://www.gnu.org/licenses/>.
c15969fd
JF
20# }}}
21
eaf660f1
JF
22set -e
23
eed4f174
JF
24hpp=$1
25object=$2
26name=$3
27sed=$4
a243b558
JF
28lipo=$5
29nm=$6
30otool=$7
eed4f174 31
a243b558 32exec >"${hpp}"
eed4f174 33
fae1d9be 34detailed=$("${lipo}" -detailed_info "${object}")
eed4f174 35
6d3af51e
JF
36regex=$'\nNon-fat file: .* is architecture: (.*)'
37if [[ ${detailed} =~ ${regex} ]]; then
38 archs=(${BASH_REMATCH[1]})
39 unset detailed
40else
41 archs=($(echo "${detailed}" | "${sed}" -e '/^architecture / { s/^architecture //; p; }; d;'))
42fi
43
eed4f174
JF
44echo '#include "Trampoline.hpp"'
45
6d3af51e
JF
46for arch in "${archs[@]}"; do
47 if [[ "${detailed+@}" ]]; then
48 offset=$(echo "${detailed}" | "${sed}" -e '
49 /^architecture / { x; s/.*/0/; x; };
50 /^architecture '${arch}'$/ { x; s/.*/1/; x; };
51 x; /^1$/ { x; /^ *offset / { s/^ *offset //; p; }; x; }; x;
52 d;
53 ')
54 else
55 offset=0
56 fi
eed4f174
JF
57
58 file=($("${otool}" -arch "${arch}" -l "${object}" | "${sed}" -e '
59 x; /^1$/ { x;
60 /^ *fileoff / { s/^.* //; p; };
61 /^ *filesize / { s/^.* //; p; };
62 x; }; x;
63
64 /^ *cmd LC_SEGMENT/ { x; s/.*/1/; x; };
a243b558 65
eed4f174
JF
66 d;
67 '))
68
69 fileoff=${file[0]}
70 filesize=${file[1]}
71
72 echo
73 echo "static const char ${name}_${arch}_data_[] = {"
74
dbcf53a9 75 LANG=C od -v -t x1 -t c -j "$((offset + fileoff))" -N "${filesize}" "${object}" | "${sed}" -e '
eed4f174
JF
76 /^[0-7]/ ! {
77 s@^ @// @;
78 s/\(....\)/ \1/g;
79 s@^ // @//@;
73d3a679 80 s/ *$/,/;
eed4f174
JF
81 };
82
83 /^[0-7]/ {
84 s/^[^ ]*//;
85 s/ */ /g;
86 s/^ *//;
87 s/ $//;
88 s/ /,/g;
89 s/\([^,][^,]\)/0x\1/g;
90 s/$/,/;
91 /^,$/ ! { s/^/ /g; p; }; d;
92 };
93 '
94
95 echo "};"
96
97 echo
98 entry=$("${nm}" -arch "${arch}" "${object}" | "${sed}" -e '/ _Start$/ { s/ .*//; p; }; d;')
99 entry=${entry##*(0)}
100 echo "static size_t ${name}_${arch}_entry_ = 0x${entry:=0};"
101
102 echo
103 echo "/*"
a243b558 104 "${otool}" -arch "${arch}" -vVt "${object}"
eed4f174
JF
105 echo "*/"
106
107 echo
a69dc826 108 echo "_disused static Trampoline ${name}_${arch}_ = {"
eed4f174
JF
109 echo " ${name}_${arch}_data_,"
110 echo " sizeof(${name}_${arch}_data_),"
111 echo " ${name}_${arch}_entry_,"
112 echo "};"
eed4f174 113
a243b558 114done