diff options
40 files changed, 1195 insertions, 526 deletions
diff --git a/arch/darwin-arm/environ.sh b/arch/darwin-arm/environ.sh deleted file mode 100644 index 329ead2e6..000000000 --- a/arch/darwin-arm/environ.sh +++ /dev/null @@ -1 +0,0 @@ -export MACOSX_DEPLOYMENT_TARGET=10.4 diff --git a/arch/darwin-arm/firmware b/arch/darwin-arm/firmware deleted file mode 100644 index 2915ef33b..000000000 --- a/arch/darwin-arm/firmware +++ /dev/null @@ -1,12 +0,0 @@ -iPhone1,1-1.0-1A543a -iPhone1,1-1.0.1-1C25 -iPhone1,1-1.0.2-1C28 -iPhone1,1-1.1.1-3A109a -iPhone1,1-1.1.2-3B48b -iPhone1,1-1.1.3-4A93 -iPhone1,1-1.1.4-4A102 -iPod1,1-1.1-3A101a -iPod1,1-1.1.1-3A110a -iPod1,1-1.1.2-3B48b -iPod1,1-1.1.3-4A93 -iPod1,1-1.1.4-4A102 diff --git a/arch/darwin-arm/strip b/arch/darwin-arm/strip deleted file mode 100644 index 151f63b9d..000000000 --- a/arch/darwin-arm/strip +++ /dev/null @@ -1,9 +0,0 @@ -find "${PKG_DEST}" -type f \( -perm -0500 -o -name '*.dylib' -o -name '*.so' \) -print0 | while read -r -d $'\0' bin; do - case "$(file "${bin}")" in (\ - *': Mach-O fat file with '*([0-9])' architecture' |\ - *': Mach-O dynamically linked shared library acorn'\ - );; (*) continue;; esac - #*': '?(setuid )?(setgid )'Mach-O executable acorn' |\ - - "${PKG_TARG}-strip" -x -no_uuid "${bin}" -done diff --git a/arch/darwin-arm/target b/arch/darwin-arm/target deleted file mode 100644 index 34f6e4f76..000000000 --- a/arch/darwin-arm/target +++ /dev/null @@ -1 +0,0 @@ -arm-apple-darwin8 diff --git a/arch/iphoneos-arm/1443.00/entitlement.xml b/arch/iphoneos-arm/1443.00/entitlement.xml new file mode 100644 index 000000000..efcd38e15 --- /dev/null +++ b/arch/iphoneos-arm/1443.00/entitlement.xml @@ -0,0 +1,9 @@ +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>platform-application</key> + <true/> + <key>com.apple.private.skip-library-validation</key> + <true/> +</dict> +</plist> diff --git a/arch/iphoneos-arm/1443.00/environ.sh b/arch/iphoneos-arm/1443.00/environ.sh new file mode 100644 index 000000000..50cc6928f --- /dev/null +++ b/arch/iphoneos-arm/1443.00/environ.sh @@ -0,0 +1,13 @@ +export PKG_ar="xcrun -sdk iphoneos ar" +export PKG_dsymutil="xcrun -sdk iphoneos dsymutil" +export PKG_gcc="xcrun -sdk iphoneos gcc" +export PKG_nmedit="xcrun -sdk iphoneos nmedit" +export PKG_otool="xcrun -sdk iphoneos otool" +export PKG_strip="xcrun -sdk iphoneos strip" +export PKG_codesign_allocate="xcrun -sdk iphoneos codesign_allocate" +export PKG_gpp="xcrun -sdk iphoneos g++" +export PKG_nm="xcrun -sdk iphoneos nm" +export PKG_objdump="xcrun -sdk iphoneos objdump" +export PKG_ranlib="xcrun -sdk iphoneos ranlib" +export PKG_MCPU="" +export MACOSX_DEPLOYMENT_TARGET=10.13 diff --git a/arch/iphoneos-arm/firmware b/arch/iphoneos-arm/1443.00/firmware index 3618678d4..3618678d4 100644 --- a/arch/iphoneos-arm/firmware +++ b/arch/iphoneos-arm/1443.00/firmware diff --git a/arch/darwin-arm/prefix b/arch/iphoneos-arm/1443.00/prefix index 74e4e23b0..74e4e23b0 100644 --- a/arch/darwin-arm/prefix +++ b/arch/iphoneos-arm/1443.00/prefix diff --git a/arch/iphoneos-arm/1443.00/strip b/arch/iphoneos-arm/1443.00/strip new file mode 100644 index 000000000..fb6f928c1 --- /dev/null +++ b/arch/iphoneos-arm/1443.00/strip @@ -0,0 +1,33 @@ +export PATH=${PKG_BASE}/util:$PATH +find "${PKG_DEST}" -type f \( -perm -0100 -o -name '*.dylib' -o -name '*.so' \) -print0 | while read -r -d $'\0' bin; do + ENTITLEMENT="" + case "$(file "${bin}")" in (\ + *': Mach-O fat file with '*([0-9])' architecture' |\ + *': '*(setuid |setgid )'Mach-O 64-bit executable arm64' \ + ) + ENTITLEMENT="${PKG_BASE}/arch/${PKG_ARCH}/${PKG_CFTARG}/entitlement.xml" + ;; + (\ + *': Mach-O '?(64-bit )'dynamically linked shared library '@(acorn|arm64) |\ + *': Mach-O '?(64-bit )'bundle '@(acorn|arm64) |\ + *': '*(setuid |setgid )'Mach-O executable acorn' \ + ) + ;; + (*) continue + ;; + esac + + if "${PKG_TARG}-otool" -hv "${bin}" | grep DYLIB_STUB &>/dev/null; then + continue; fi + if grep $'\xfa\xde\x0c\x01' "${bin}" &>/dev/null; then + continue; fi + if "${PKG_BASE}/util/ldid3" -e "${bin}" >/dev/null 2>&1; then + continue; fi + + perms=$(stat -f %p "${bin}" | sed -e s/^1//) + chmod 755 "${bin}" + + echo "${PKG_BASE}/util/ldid3" -S"${ENTITLEMENT}" "${bin}" + "${PKG_BASE}/util/ldid3" -S"${ENTITLEMENT}" "${bin}" + chmod "${perms}" "${bin}" +done diff --git a/arch/iphoneos-arm/1443.00/target b/arch/iphoneos-arm/1443.00/target new file mode 100644 index 000000000..d05ed09dc --- /dev/null +++ b/arch/iphoneos-arm/1443.00/target @@ -0,0 +1 @@ +aarch64-apple-darwin17 diff --git a/arch/iphoneos-arm/1443.00/tools.txt b/arch/iphoneos-arm/1443.00/tools.txt new file mode 100644 index 000000000..5e90e3f2e --- /dev/null +++ b/arch/iphoneos-arm/1443.00/tools.txt @@ -0,0 +1,41 @@ +strip +dsymutil +nmedit +g++ +c++ +gpp +aCC +CC +cxx +cc++ +cl.exe +FCC +KCC +RCC +xlC_r +xlC +g77 +xlf +f77 +frt +pgf77 +cf77 +fort77 +fl32 +af77 +xlf90 +f90 +pgf90 +pghpf +epcf90 +gfortran +g95 +xlf95 +f95 +fort +ifort +ifc +efc +pgf95 +lf95 +ftn diff --git a/arch/iphoneos-arm/environ.sh b/arch/iphoneos-arm/478.23/environ.sh index f115e0123..469bb6485 100644 --- a/arch/iphoneos-arm/environ.sh +++ b/arch/iphoneos-arm/478.23/environ.sh @@ -1 +1,2 @@ +export PKG_MCPU=-mthumb export MACOSX_DEPLOYMENT_TARGET=10.5 diff --git a/arch/iphoneos-arm64/firmware b/arch/iphoneos-arm/478.23/firmware index 3618678d4..3618678d4 100644 --- a/arch/iphoneos-arm64/firmware +++ b/arch/iphoneos-arm/478.23/firmware diff --git a/arch/iphoneos-arm/prefix b/arch/iphoneos-arm/478.23/prefix index 74e4e23b0..74e4e23b0 100644 --- a/arch/iphoneos-arm/prefix +++ b/arch/iphoneos-arm/478.23/prefix diff --git a/arch/iphoneos-arm/478.23/strip b/arch/iphoneos-arm/478.23/strip new file mode 100644 index 000000000..f6c2125de --- /dev/null +++ b/arch/iphoneos-arm/478.23/strip @@ -0,0 +1,26 @@ +find "${PKG_DEST}" -type f \( -perm -0100 -o -name '*.dylib' -o -name '*.so' \) -print0 | while read -r -d $'\0' bin; do + ENTITLEMENT="" + case "$(file "${bin}")" in (\ + *': Mach-O fat file with '*([0-9])' architecture' |\ + *': '*(setuid |setgid )'Mach-O executable acorn' |\ + *': Mach-O '?(64-bit )'executable '@(arm64|arm_v6|acorn) |\ + *': Mach-O bundle acorn'\ + ) + ;; + (*': Mach-O '?(64-bit )'dynamically linked shared library '@(acorn|arm_v6|arm64)) + ;; + (*) continue + ;; + esac + +# if arm-apple-darwin9-otool -hv "${bin}" | grep DYLIB_STUB &>/dev/null; then +# continue; fi +# if grep $'\xfa\xde\x0c\x01' "${bin}" &>/dev/null; then +# continue; fi + + perms=$(stat -f %p "${bin}" | sed -e s/^1//) + chmod 755 "${bin}" + echo "${PKG_BASE}/util/ldid" -S "${bin}" + "${PKG_BASE}/util/ldid" -S "${bin}" + chmod "${perms}" "${bin}" +done diff --git a/arch/iphoneos-arm/target b/arch/iphoneos-arm/478.23/target index 573e31146..573e31146 100644 --- a/arch/iphoneos-arm/target +++ b/arch/iphoneos-arm/478.23/target diff --git a/arch/iphoneos-arm/550.58/environ.sh b/arch/iphoneos-arm/550.58/environ.sh new file mode 100644 index 000000000..9aa15966a --- /dev/null +++ b/arch/iphoneos-arm/550.58/environ.sh @@ -0,0 +1,2 @@ +export PKG_MCPU="-mthumb -Wl,-segalign,4000" +export MACOSX_DEPLOYMENT_TARGET=10.5 diff --git a/arch/iphoneos-arm/550.58/firmware b/arch/iphoneos-arm/550.58/firmware new file mode 100644 index 000000000..3618678d4 --- /dev/null +++ b/arch/iphoneos-arm/550.58/firmware @@ -0,0 +1,24 @@ +iPhone1,1_2.0_5A347 +iPhone1,2_2.0_5A347 +iPod1,1_2.0_5A347 +iPhone1,1_2.0.1_5B108 +iPhone1,2_2.0.1_5B108 +iPod1,1_2.0.1_5B108 +iPhone1,1_2.0.2_5C1 +iPhone1,2_2.0.2_5C1 +iPod1,1_2.0.2_5C1 +iPhone1,1_2.1_5F136 +iPhone1,2_2.1_5F136 +iPod1,1_2.1_5F137 +iPhone1,1_2.2_5G77 +iPhone1,2_2.2_5G77 +iPod1,1_2.2_5G77 +iPhone1,1_2.2.1_5H11 +iPhone1,2_2.2.1_5H11 +iPod1,1_2.2.1_5H11 +iPod2,1_2.2.1_5H11a +iPhone1,1_3.0_7A341 +iPhone1,2_3.0_7A341 +iPhone2,1_3.0_7A341 +iPod1,1_3.0_7A341 +iPod1,2_3.0_7A341 diff --git a/arch/iphoneos-arm64/prefix b/arch/iphoneos-arm/550.58/prefix index 74e4e23b0..74e4e23b0 100644 --- a/arch/iphoneos-arm64/prefix +++ b/arch/iphoneos-arm/550.58/prefix diff --git a/arch/iphoneos-arm/550.58/strip b/arch/iphoneos-arm/550.58/strip new file mode 100644 index 000000000..11c38c6d9 --- /dev/null +++ b/arch/iphoneos-arm/550.58/strip @@ -0,0 +1,26 @@ +find "${PKG_DEST}" -type f \( -perm -0100 -o -name '*.dylib' -o -name '*.so' \) -print0 | while read -r -d $'\0' bin; do + ENTITLEMENT="" + case "$(file "${bin}")" in (\ + *': Mach-O fat file with '*([0-9])' architecture' |\ + *': '*(setuid |setgid )'Mach-O executable acorn' |\ + *': Mach-O '?(64-bit )'executable '@(arm64|arm_v[67]|acorn) |\ + *': Mach-O bundle acorn'\ + ) + ;; + (*': Mach-O '?(64-bit )'dynamically linked shared library '@(acorn|arm_v[67]|arm64)) + ;; + (*) continue + ;; + esac + + if ${PKG_BASE}/util/arm-apple-darwin11-otool -hv "${bin}" | grep DYLIB_STUB &>/dev/null; then + continue; fi + if grep $'\xfa\xde\x0c\x01' "${bin}" &>/dev/null; then + continue; fi + + perms=$(stat -f %p "${bin}" | sed -e s/^1//) + chmod 755 "${bin}" + echo "${PKG_BASE}/util/ldid" -S "${bin}" + "${PKG_BASE}/util/ldid" -S "${bin}" + chmod "${perms}" "${bin}" +done diff --git a/arch/iphoneos-arm/550.58/target b/arch/iphoneos-arm/550.58/target new file mode 100644 index 000000000..df7b23146 --- /dev/null +++ b/arch/iphoneos-arm/550.58/target @@ -0,0 +1 @@ +arm-apple-darwin11 diff --git a/arch/iphoneos-arm/strip b/arch/iphoneos-arm/strip deleted file mode 100644 index 5eb943311..000000000 --- a/arch/iphoneos-arm/strip +++ /dev/null @@ -1,19 +0,0 @@ -find "${PKG_DEST}" -type f \( -perm -0100 -o -name '*.dylib' -o -name '*.so' \) -print0 | while read -r -d $'\0' bin; do - case "$(file "${bin}")" in (\ - *': Mach-O fat file with '*([0-9])' architecture' |\ - *': '?(setuid )?(setgid )'Mach-O executable acorn' |\ - *': Mach-O dynamically linked shared library acorn' |\ - *': Mach-O bundle acorn'\ - );; (*) continue;; esac - - if arm-apple-darwin9-otool -hv "${bin}" | grep DYLIB_STUB &>/dev/null; then - continue; fi - if grep $'\xfa\xde\x0c\x01' "${bin}" &>/dev/null; then - continue; fi - - perms=$(stat --format=%a "${bin}") - chmod 755 "${bin}" - "${PKG_BASE}/util/ldid" -S "${bin}" - #"${PKG_BASE}/arch/iphoneos-arm/entitlement.xml" "${bin}" - chmod "${perms}" "${bin}" -done diff --git a/arch/iphoneos-arm64/environ.sh b/arch/iphoneos-arm64/environ.sh deleted file mode 100644 index 36d412804..000000000 --- a/arch/iphoneos-arm64/environ.sh +++ /dev/null @@ -1,5 +0,0 @@ -arm64-apple-darwin9-gcc() { - xcrun -sdk iphoneos gcc $@ -} -export -f arm64-apple-darwin9-gcc -export MACOSX_DEPLOYMENT_TARGET=10.5 diff --git a/arch/iphoneos-arm64/strip b/arch/iphoneos-arm64/strip deleted file mode 100644 index c4801ca85..000000000 --- a/arch/iphoneos-arm64/strip +++ /dev/null @@ -1,18 +0,0 @@ -find "${PKG_DEST}" -type f \( -perm -0100 -o -name '*.dylib' -o -name '*.so' \) -print0 | while read -r -d $'\0' bin; do - case "$(file "${bin}")" in (\ - *': Mach-O fat file with '*([0-9])' architecture' |\ - *': '?(setuid )?(setgid )'Mach-O executable acorn' |\ - *': Mach-O dynamically linked shared library acorn' |\ - *': Mach-O bundle acorn'\ - );; (*) continue;; esac - - if arm64-apple-darwin9-otool -hv "${bin}" | grep DYLIB_STUB &>/dev/null; then - continue; fi - if grep $'\xfa\xde\x0c\x01' "${bin}" &>/dev/null; then - continue; fi - - perms=$(stat --format=%a "${bin}") - chmod 755 "${bin}" - "${PKG_BASE}/util/ldid" -S"${PKG_BASE}/arch/iphoneos-arm/entitlement.xml" "${bin}" - chmod "${perms}" "${bin}" -done diff --git a/arch/iphoneos-arm64/target b/arch/iphoneos-arm64/target deleted file mode 100644 index 3631f7228..000000000 --- a/arch/iphoneos-arm64/target +++ /dev/null @@ -1 +0,0 @@ -arm64-apple-darwin9 diff --git a/architect.sh b/architect.sh index c83df6fd1..062dd7d70 100644 --- a/architect.sh +++ b/architect.sh @@ -1,6 +1,7 @@ -if [[ ! -e ${PKG_BASE}/arch/${PKG_ARCH}/target ]]; then +if [[ ! -e ${PKG_BASE}/arch/${PKG_ARCH}/${PKG_CFTARG}/target ]]; then echo "unknown architecture: ${PKG_ARCH}" 1>&2 exit 1 fi -export PKG_TARG=$(cat "${PKG_BASE}/arch/${PKG_ARCH}/target") +source ${PKG_BASE}/arch/${PKG_ARCH}/${PKG_CFTARG}/environ.sh +export PKG_TARG=$(cat "${PKG_BASE}/arch/${PKG_ARCH}/${PKG_CFTARG}/target") diff --git a/bootstrap.sh b/bootstrap.sh index 7e484e3a5..df9022a9c 100755 --- a/bootstrap.sh +++ b/bootstrap.sh @@ -8,7 +8,7 @@ source "${PKG_BASE}/architect.sh" export PKG_BOOT=${PKG_BASE}/Packager rm -rf "${PKG_BOOT}" -svn export "${PKG_BASE}/over" "${PKG_BOOT}" +cp -a "${PKG_BASE}/over" "${PKG_BOOT}" mkdir -p "${PKG_BOOT}/var/lib/dpkg/info" @@ -16,7 +16,7 @@ mkdir -p "${PKG_BOOT}/var/lib/dpkg/info" #PKG_REQS=(adv-cmds apt7 base coreutils cydia cydia-sources diffutils diskdev-cmds essential findutils firmware-sbin grep inetutils less network-cmds openssh pam-modules profile.d sed sqlite3-lib system-cmds uikittools unzip wget zip) #PKG_REQS=(base cydia-sources dpkg essential firmware-sbin openssh pam-modules profile.d system-cmds wget) #PKG_REQS=(adv-cmds apt7 base coreutils cydia-sources diffutils diskdev-cmds findutils firmware-sbin grep inetutils less network-cmds openssh pam-modules profile.d sed sqlite3-lib system-cmds unzip wget zip) -PKG_REQS=(adv-cmds apr-lib apt7 base coreutils cydia-sources darwintools diffutils diskdev-cmds essential findutils firmware-sbin grep inetutils less network-cmds openssh pam-modules pcre profile.d sed shell-cmds sqlite3-lib system-cmds unzip wget zip) +PKG_REQS=(adv-cmds apr-lib apt7 base coreutils darwintools diffutils diskdev-cmds essential findutils firmware-sbin grep inetutils less network-cmds openssh pam-modules pcre profile.d sed shell-cmds sqlite3-lib system-cmds unzip wget zip) #PKG_REQS=(base cydia cydia-sources diskdev-cmds essential firmware-sbin pam-modules profile.d sqlite3-lib system-cmds uikittools libxml2-lib yellowsn0w.com) cd "${PKG_BASE}/data" @@ -52,14 +52,14 @@ for PKG_NAME in "${PKG_REQS[@]}"; do source "${PKG_BASE}/helper.sh" echo "merging ${PKG_NAME} ${PKG_VRSN}-${PKG_RVSN}..." - merge "${PKG_BASE}/debs/${PKG_NAME}_${PKG_VRSN}-${PKG_RVSN}_${PKG_ARCH}.deb" "${PKG_NAME}" + merge "${PKG_BASE}/debs/${PKG_CFTARG}/${PKG_NAME}_${PKG_VRSN}-${PKG_RVSN}_${PKG_ARCH}.deb" "${PKG_NAME}" "${PKG_BASE}/control.sh" "${PKG_NAME}" available >>"${PKG_BOOT}/var/lib/dpkg/available" "${PKG_BASE}/control.sh" "${PKG_NAME}" status >>"${PKG_BOOT}/var/lib/dpkg/status" done -merge debs/cydia_1.0.3366-1_iphoneos-arm.deb cydia -merge debs/uikittools_1.1.0_iphoneos-arm.deb uikittools +#merge debs/cydia_1.0.3366-1_iphoneos-arm.deb cydia +#merge debs/uikittools_1.1.0_iphoneos-arm.deb uikittools rm -rf "${PKG_BASE}/temp" cd "${PKG_BOOT}" @@ -2,7 +2,7 @@ set -e shopt -s extglob #for package in coreutils berkeleydb bzip2 apt adv-cmds libutil gettext gawk tar network-cmds shell-cmds odcctools readline modmyifone darwintools sed pcre gnupg grep inetutils saurik gzip dpkg iphonesurge unzip libarmfp nano base bash system-cmds libresolv zip ncurses less; do -for package in data/!(*_|apptapptools|gdata-objectivec-client|iphone-python|metasploit3|mobileterminal|jocstrap|iphone-java|uicaboodle|uicaboodle.py|uikittools|x264); do +for package in data/!(*_|apptapptools|gdata-objectivec-client|iphone-python|metasploit3|mobileterminal|jocstrap|iphone-java|uicaboodle|uicaboodle.py|uikittools|x264|_apt7); do #for package in data/!(*_); do PKG_NAME=$(basename "${package}") echo "========== ${PKG_NAME} ==========" diff --git a/construct.sh b/construct.sh index 3c7327bb1..979269048 100755 --- a/construct.sh +++ b/construct.sh @@ -4,121 +4,137 @@ shopt -s extglob nullglob PKG_BASE=$(dirname "$(realpath "$0")") cd "${PKG_BASE}" -PKG_RVSN=282 - -PKG_REPO=/dat/web/beta.apt.saurik.com - -for PKG_ARCH in "${PKG_BASE}/arch"/*; do - PKG_ARCH=$(basename "${PKG_ARCH}") - echo "scanning ${PKG_ARCH}" - - PKG_DCBF=${PKG_REPO}/dists/tangelo/main/binary-${PKG_ARCH} - mkdir -p "${PKG_DCBF}" - PKG_PKGS=${PKG_DCBF}/Packages - - rm -rf "${PKG_BASE}/link" - mkdir "${PKG_BASE}/link" - - for package in "${PKG_BASE}/data"/!(*_); do - PKG_NAME=$(basename "${package}") +PKG_RVSN=1 + +PKG_REPO="${PKG_BASE}/apt/" + +rm -rf "${PKG_REPO}/debs/" +mkdir -p "${PKG_REPO}/debs/" + +for PKG_ARCH in "${PKG_BASE}/arch"/*/; do + if [[ -e "${PKG_BASE}/$environ.sh" ]]; then + source "${PKG_BASE}/$environ.sh" + fi + for PKG_CFTARG in "${PKG_ARCH}"/*/; do + if [[ -e "${PKG_BASE}/$environ.sh" ]]; then + source "${PKG_CFTARG}/$environ.sh" + fi + PKG_ARCH=$(basename "${PKG_ARCH}") + PKG_CFTARG=$(basename "${PKG_CFTARG}") + echo "scanning ${PKG_ARCH}/${PKG_CFTARG}" + + PKG_DCBF=${PKG_REPO}/dists/ios/${PKG_CFTARG}/main/binary-${PKG_ARCH} + mkdir -p "${PKG_DCBF}" + PKG_PKGS=${PKG_DCBF}/Packages + + rm -rf "${PKG_BASE}/link" + mkdir "${PKG_BASE}/link" + mkdir "${PKG_BASE}/link/${PKG_CFTARG}" + + for package in "${PKG_BASE}/data"/!(*_); do + PKG_NAME=$(basename "${package}") + + # XXX: add to above filter + if [[ ${PKG_NAME} == _* || ! -f "${package}/_metadata/in.${PKG_CFTARG}" ]]; then + continue + fi - # XXX: add to above filter - if [[ ${PKG_NAME} == _* ]]; then - continue - fi + PKG_DATA="${PKG_BASE}/data/${PKG_NAME}" + PKG_STAT="${PKG_BASE}/stat/${PKG_ARCH}/${PKG_CFTARG}/${PKG_NAME}" + PKG_PRIO=$(cat "${PKG_DATA}/_metadata/priority") - PKG_DATA="${PKG_BASE}/data/${PKG_NAME}" - PKG_STAT="${PKG_BASE}/stat/${PKG_ARCH}/${PKG_NAME}" - PKG_PRIO=$(cat "${PKG_DATA}/_metadata/priority") + if [[ -e ${PKG_STAT}/fail ]]; then + continue + fi - if [[ -e ${PKG_STAT}/fail ]]; then - continue - fi + echo "${PKG_NAME}" "${PKG_PRIO#+}" "$(cat "${PKG_DATA}/_metadata/section")" - echo "${PKG_NAME}" "${PKG_PRIO#+}" "$(cat "${PKG_DATA}/_metadata/section")" + PKG_FILE=${PKG_STAT}/dest-ver + if [[ -e ${PKG_FILE} ]]; then + PKG_REAL=${PKG_STAT}/real-ver + if [[ -e ${PKG_REAL} ]]; then + PKG_RVER=$(cat "${PKG_REAL}") + else + PKG_RVER=$(cat "${PKG_STAT}/data-ver")-$(cat "${PKG_FILE}") + fi - PKG_FILE=${PKG_BASE}/stat/${PKG_ARCH}/${PKG_NAME}/dest-ver - if [[ -e ${PKG_FILE} ]]; then - PKG_REAL=${PKG_BASE}/stat/${PKG_ARCH}/${PKG_NAME}/real-ver - if [[ -e ${PKG_REAL} ]]; then - PKG_RVER=$(cat "${PKG_REAL}") - else - PKG_RVER=$(cat "${PKG_STAT}/data-ver")-$(cat "${PKG_FILE}") + PKG_FILE=${PKG_BASE}/debs/${PKG_CFTARG}/${PKG_NAME}_${PKG_RVER}_${PKG_ARCH}.deb + if [[ -e ${PKG_FILE} && ! -e "${PKG_STAT}/exclude" ]]; then + ln -s "${PKG_FILE}" "${PKG_BASE}/link/${PKG_CFTARG}/" + fi fi + done >"${PKG_BASE}/overrides.txt" - PKG_FILE=${PKG_BASE}/debs/${PKG_NAME}_${PKG_RVER}_${PKG_ARCH}.deb - if [[ -e ${PKG_FILE} && ! -e "${PKG_STAT}/exclude" ]]; then - ln -s "${PKG_FILE}" "${PKG_BASE}/link" - echo "${PKG_FILE}" - fi - fi - done >"${PKG_BASE}/overrides.txt" + for deb in "${PKG_BASE}/xtra/${PKG_ARCH}/${PKG_CFTARG}"/*.deb; do + ln -s "$(readlink -f "${deb}")" "${PKG_BASE}/link/${PKG_CFTARG}/" + done - for deb in "${PKG_BASE}/xtra/${PKG_ARCH}"/*.deb; do - ln -s "$(readlink -f "${deb}")" "${PKG_BASE}/link" - done + for deb in "${PKG_BASE}/xtra/all/${PKG_CFTARG}"/*.deb; do + ln -s "$(readlink -f "${deb}")" "${PKG_BASE}/link/${PKG_CFTARG}/" + done - dpkg-scanpackages -m link "${PKG_BASE}/overrides.txt" | sed -e 's/: link\//: debs\//' | while IFS= read -r line; do - if [[ ${line} == '' ]]; then - PKG_TAGS=$(cat "${PKG_BASE}/tags/${PKG_NAME}" 2>/dev/null || true) - if [[ -z ${PKG_TAGS} ]]; then - PKG_TAGS=$(cat "${PKG_BASE}/data/${PKG_NAME}/_metadata/tags" 2>/dev/null || true) - fi - PKG_ROLE="${PKG_BASE}/data/${PKG_NAME}/_metadata/role" - if [[ -n ${PKG_TAGS} || -e ${PKG_ROLE} ]]; then - echo -n "Tag: " - if [[ -n ${PKG_TAGS} ]]; then - echo -n "${PKG_TAGS}" - fi - if [[ -n ${PKG_TAGS} && -e ${PKG_ROLE} ]]; then - echo -n ", " + dpkg-scanpackages -m link "${PKG_BASE}/overrides.txt" | sed -e 's/: link\//: debs\//' | while IFS= read -r line; do + if [[ ${line} == '' ]]; then + PKG_TAGS=$(cat "${PKG_BASE}/tags/${PKG_NAME}" 2>/dev/null || true) + if [[ -z ${PKG_TAGS} ]]; then + PKG_TAGS=$(cat "${PKG_BASE}/data/${PKG_NAME}/_metadata/tags" 2>/dev/null || true) fi - if [[ -e ${PKG_ROLE} ]]; then - echo -n "role::$(cat "${PKG_ROLE}")" + PKG_ROLE="${PKG_BASE}/data/${PKG_NAME}/_metadata/role" + if [[ -n ${PKG_TAGS} || -e ${PKG_ROLE} ]]; then + echo -n "Tag: " + if [[ -n ${PKG_TAGS} ]]; then + echo -n "${PKG_TAGS}" + fi + if [[ -n ${PKG_TAGS} && -e ${PKG_ROLE} ]]; then + echo -n ", " + fi + if [[ -e ${PKG_ROLE} ]]; then + echo -n "role::$(cat "${PKG_ROLE}")" + fi + echo fi - echo + elif [[ ${line} == Package:* ]]; then + PKG_NAME=${line#Package: } fi - elif [[ ${line} == Package:* ]]; then - PKG_NAME=${line#Package: } - fi - - echo "${line}" - done >"${PKG_PKGS}" - - if [[ ${PKG_ARCH} == "iphoneos-arm" ]]; then - dpkg-scanpackages paid >>"${PKG_PKGS}" - fi - rm -f "${PKG_BASE}/overrides.txt" -done - -for PKG_ARCH in "${PKG_BASE}/arch"/*; do - PKG_ARCH=$(basename "${PKG_ARCH}") - PKG_PKGS=${PKG_REPO}/dists/tangelo/main/binary-${PKG_ARCH}/Packages - bzip2 -c "${PKG_PKGS}" >"${PKG_PKGS}.bz2" + echo "${line}" + done >"${PKG_PKGS}" + cp -a "${PKG_BASE}/link"/* "${PKG_REPO}/debs/" +#rm -f "${PKG_BASE}/overrides.txt" + bzip2 -c "${PKG_PKGS}" >"${PKG_PKGS}.bz2" + xz -c "${PKG_PKGS}" >"${PKG_PKGS}.xz" + done done -cd "${PKG_REPO}/dists/tangelo" +cd "${PKG_REPO}/dists/ios/" -{ - cat <<EOF -Origin: Telesphoreo Tangelo -Label: Cydia/Telesphoreo +for PKG_CFTARG in */ */*/binary*/; do + pushd ${PKG_CFTARG} +# for PKG_ARCH in */; do +# pushd ${PKG_ARCH} + { + cat <<EOF +Origin: Bingner/Elucubratus +Label: Bingner/Elucubratus Suite: stable Version: 1.0r${PKG_RVSN} -Codename: tangelo-3.7 -Architectures:$(for PKG_ARCH in "${PKG_BASE}/arch"/*; do echo -n " $(basename "${PKG_ARCH}")"; done) +Codename: ios +Architectures: iphoneos-arm Components: main -Description: Distribution of Unix Software for iPhoneOS 3 -Support: http://cydia.saurik.com/support/* +Description: Distribution of Unix Software for iPhoneOS +Support: https://cydia.saurik.com/api/support/* MD5Sum: EOF - find */* -type f | while read -r line; do - echo " $(md5sum "${line}" | cut -d ' ' -f 1) $(du -b "${line}" | cut -d $'\t' -f 1) ${line}" - done + find * -type f | grep -v Release | while read -r line; do + echo " $(md5sum "${line}" | cut -d ' ' -f 1) $(stat -f %z "${line}" | cut -d $'\t' -f 1) ${line}" + done -} >"Release" + } >"Release" -rm -f Release.gpg -gpg -abs -o Release.gpg Release + rm -f Release.gpg + gpg -abs -o Release.gpg Release +# popd +# done + popd +done diff --git a/control.sh b/control.sh index e82c45308..48372f725 100755 --- a/control.sh +++ b/control.sh @@ -34,7 +34,7 @@ EOF if [[ $1 == status || $1 == available ]]; then cat <<EOF -Installed-Size: $(dpkg -f "${PKG_BASE}/debs/${PKG_NAME}_${PKG_VRSN}-${PKG_RVSN}_${PKG_ARCH}.deb" Installed-Size) +Installed-Size: $(dpkg -f "${PKG_BASE}/debs/${PKG_CFTARG}/${PKG_NAME}_${PKG_VRSN}-${PKG_RVSN}_${PKG_DEB_ARCH}.deb" Installed-Size) EOF elif [[ $1 == control ]]; then cat <<EOF @@ -8,7 +8,7 @@ export PATH=${PKG_BASE}/util:$PATH shift source "${PKG_BASE}/helper.sh" -export PKG_TAPF=$(cat "${PKG_BASE}/arch/${PKG_ARCH}/prefix") +export PKG_TAPF=$(cat "${PKG_BASE}/arch/${PKG_ARCH}/${PKG_CFTARG}/prefix") PKG_PATH= @@ -38,6 +38,10 @@ for dep in ${deps[@]}; do DEP_DEST=$(PKG_DEST_ "${DEP_NAME}") PKG_PATH=${PKG_PATH}:${DEP_DEST} + if [[ -f "$(PKG_DATA_ ${DEP_NAME})/_metadata/exclude.${PKG_CFTARG}" ]]; then + continue + fi + if [[ -d ${DEP_DEST}${PKG_TAPF}/include ]]; then PKG_INCL=${DEP_DEST}${PKG_TAPF}/include:${PKG_INCL} fi @@ -46,6 +50,10 @@ for dep in ${deps[@]}; do PKG_LIBS=${DEP_DEST}${PKG_TAPF}/lib:${PKG_LIBS} fi + if [[ -d ${DEP_DEST}${PKG_TAPF}/local/lib ]]; then + PKG_LIBS=${DEP_DEST}${PKG_TAPF}/local/lib:${PKG_LIBS} + fi + if [[ -d ${DEP_MORE}${PKG_TAPF}/lib ]]; then PKG_LIBS=${DEP_MORE}${PKG_TAPF}/lib:${PKG_LIBS} fi @@ -53,6 +61,10 @@ for dep in ${deps[@]}; do if [[ -d ${DEP_DEST}${PKG_TAPF}/lib/pkgconfig ]]; then PKG_PKGS=${DEP_DEST}${PKG_TAPF}/lib/pkgconfig:${PKG_PKGS} fi + + if [[ -d ${DEP_DEST}${PKG_TAPF}/local/lib/pkgconfig ]]; then + PKG_PKGS=${DEP_DEST}${PKG_TAPF}/local/lib/pkgconfig:${PKG_PKGS} + fi done PKG_PATH=${PKG_PATH}:${PKG_ROOT} diff --git a/folders.sh b/folders.sh index b9991a416..d73a21283 100755 --- a/folders.sh +++ b/folders.sh @@ -7,17 +7,17 @@ function PKG_DATA_() { export -f PKG_DATA_ function PKG_WORK_() { - echo "${PKG_BASE}/work/${PKG_ARCH}/$1" + echo "${PKG_BASE}/work/${PKG_ARCH}/${PKG_CFTARG}/$1" } export -f PKG_WORK_ function PKG_MORE_() { - echo "${PKG_BASE}/more/${PKG_ARCH}/$1" + echo "${PKG_BASE}/more/${PKG_ARCH}/${PKG_CFTARG}/$1" } function PKG_DEST_() { - echo "${PKG_BASE}/dest/${PKG_ARCH}/$1" + echo "${PKG_BASE}/dest/${PKG_ARCH}/${PKG_CFTARG}/$1" } export -f PKG_DEST_ @@ -2,7 +2,7 @@ source "${PKG_BASE}/architect.sh" -export PKG_ROOT=$("${PKG_TARG}-gcc" -dumpspecs | grep '%{isysroot' | sed -e 's/.*%{isysroot\*:\([^}]*\)}.*/\1/; s/;:/\n/g' | sed -e 's/^-syslibroot //' | tail -n 1) +export PKG_ROOT=$(xcrun -sdk iphoneos --show-sdk-path) export PKG_CCPF=$("${PKG_TARG}-gcc" -v 2>&1 | grep -- --prefix | sed -e 's/.*--prefix=\([^ ]*\).*/\1/') source "${PKG_BASE}/folders.sh" @@ -13,7 +13,7 @@ if [[ ${PKG_NAME} != @(-|:*) ]]; then export PKG_WORK=$(PKG_WORK_ "${PKG_NAME}") export PKG_DEST=$(PKG_DEST_ "${PKG_NAME}") - export PKG_STAT=${PKG_BASE}/stat/${PKG_ARCH}/${PKG_NAME} + export PKG_STAT=${PKG_BASE}/stat/${PKG_ARCH}/${PKG_CFTARG}/${PKG_NAME} export PKG_DATA=$(echo "${PKG_BASE}"/data/"${PKG_NAME}"?(_)) export PKG_RVSN=$(cat "${PKG_STAT}/dest-ver" 2>/dev/null) @@ -11,6 +11,8 @@ export PKG_MAKE=$0 export PKG_NAME=${1%_} export PKG_BASE=$(realpath "$(dirname "$0")") +export FAKEROOT=fakeroot + . "${PKG_BASE}/helper.sh" if [[ ! -x ${PKG_BASE}/util/arid || ${PKG_BASE}/util/arid -ot ${PKG_BASE}/util/arid.cpp ]]; then @@ -21,11 +23,11 @@ if [[ ! -x ${PKG_BASE}/util/ldid || ${PKG_BASE}/util/ldid -ot ${PKG_BASE}/util/l g++ -I ~/menes -o "${PKG_BASE}"/util/ldid{,.cpp} -x c "${PKG_BASE}"/util/{lookup2,sha1}.c fi -export CODESIGN_ALLOCATE=$(which arm-apple-darwin9-codesign_allocate) +export CODESIGN_ALLOCATE=$(which codesign_allocate) -#for DEP_NAME in "${PKG_DEPS[@]}"; do -# "${PKG_MAKE}" "${DEP_NAME}" -#done +for DEP_NAME in "${PKG_DEPS[@]}"; do + "${PKG_MAKE}" "${DEP_NAME}" +done export PKG_HASH=$({ "${PKG_BASE}"/util/catdir.sh "${PKG_DATA}" -L \( -name '.svn' -o -name '_*' \) -prune -o @@ -82,12 +84,12 @@ function pkg:bin() { popd fi - mkdir -p "${PKG_DEST}/bin" + ${FAKEROOT} mkdir -p "${PKG_DEST}/bin" for bin in "$@"; do - mv -v "${PKG_DEST}/usr/bin/${bin}" "${PKG_DEST}/bin/${bin}" + ${FAKEROOT} mv -v "${PKG_DEST}/usr/bin/${bin}" "${PKG_DEST}/bin/${bin}" done - rmdir --ignore-fail-on-non-empty -p "${PKG_DEST}/usr/bin" + ${FAKEROOT} rmdir --ignore-fail-on-non-empty -p "${PKG_DEST}/usr/bin" } export -f pkg:bin @@ -97,13 +99,12 @@ function pkg:autoconf() { patch -F 3 -r/dev/null "${m4}" "${PKG_BASE}/util/libtool.m4.diff" || true done - autoconf + autoconf } export -f pkg:autoconf export PKG_CONF=./configure -export PKG_MCPU=-mthumb function pkg:libtool_() { for ltmain in $(find -name "$1"); do @@ -115,6 +116,10 @@ export -f pkg:libtool_ function pkg:setup() { pkg:extract + if [ -z ""*/ ]; then + echo "Empty package??" + exit 1 + fi cd */ pkg:patch } @@ -128,10 +133,10 @@ function pkg:configure() { --host="${PKG_TARG}" \ --enable-static=no \ --enable-shared=yes \ - --prefix=$(cat "${PKG_BASE}/arch/${PKG_ARCH}/prefix") \ + --prefix=$(cat "${PKG_BASE}/arch/${PKG_ARCH}/${PKG_CFTARG}/prefix") \ --localstatedir="/var/cache/${PKG_NAME}" \ - CFLAGS="-O2 ${PKG_MCPU} -fno-common" \ - CXXFLAGS="-O2 ${PKG_MCPU} -fno-common" \ + CFLAGS="-O2 ${PKG_MCPU} ${CFLAGS}" \ + CXXFLAGS="-O2 ${PKG_MCPU} ${CXXFLAGS}" \ "$@") echo "${cfg[@]}" PKG_CONFIG="$(realpath "${PKG_BASE}/util/pkg-config.sh")" \ @@ -141,29 +146,27 @@ function pkg:configure() { export -f pkg:configure function pkg:make() { - make CC="${PKG_TARG}-gcc" CXX="${PKG_TARG}-g++" AR="${PKG_TARG}-ar" "$@" + make -j16 CC="${PKG_TARG}-gcc" CXX="${PKG_TARG}-g++" AR="${PKG_TARG}-ar" "$@" } export -f pkg:make function pkg:install() { - make install DESTDIR="${PKG_DEST}" "$@" + ${FAKEROOT} make install -j16 CC="${PKG_TARG}-gcc" CXX="${PKG_TARG}-g++" AR="${PKG_TARG}-ar" DESTDIR="${PKG_DEST}" "$@" + # Go die in a horrible fire, libtool + find "${PKG_DEST}" -name '*.la' -exec rm {} + } export -f pkg:install function pkg:extract() { - for tgz in "${PKG_DATA}"/*.{tar.gz,tgz}; do - tar -zxf "${tgz}" + for tgz in "${PKG_DATA}"/*.{tar.{gz,xz,bz2},tgz}; do + tar -xf "${tgz}" done for zip in "${PKG_DATA}"/*.zip; do unzip "${zip}" done - - for tbz2 in "${PKG_DATA}"/*.tar.bz2; do - tar -jxf "${tbz2}" - done } export -f pkg:extract @@ -204,8 +207,8 @@ rmdir_ "${PKG_DEST}/usr/local" rmdir_ "${PKG_DEST}/usr/lib" rmdir_ "${PKG_DEST}/usr" -if [[ -e "${PKG_BASE}/arch/${PKG_ARCH}/strip" ]]; then - . "${PKG_BASE}/arch/${PKG_ARCH}/strip" +if [[ -e "${PKG_BASE}/arch/${PKG_ARCH}/${PKG_CFTARG}/strip" ]]; then + . "${PKG_BASE}/arch/${PKG_ARCH}/${PKG_CFTARG}/strip" fi find "${PKG_DEST}" -type f -name '*.elc' -print0 | while read -r -d $'\0' bin; do diff --git a/package.sh b/package.sh index 10775ddb2..25db5b39b 100755 --- a/package.sh +++ b/package.sh @@ -7,10 +7,6 @@ if [[ $# == 0 ]]; then exit fi -if [[ $UID -ne 0 ]]; then - exec fakeroot "$0" "$@" -fi - export PKG_MAKE=$0 export PKG_NAME=${1%_} @@ -32,7 +28,11 @@ pkg: mkdir -p /DEBIAN for script in preinst extrainst_ postinst prerm postrm; do if [[ -e "${PKG_DATA}/_metadata/${script}.c" ]]; then ./exec.sh - "${PKG_TARG}-gcc" -o "$(pkg_ /DEBIAN)/${script}" "${PKG_DATA}/_metadata/${script}.c" - ./exec.sh - ldid -S "$(pkg_ /DEBIAN)/${script}" + if [[ -e "${PKG_BASE}/arch/${PKG_ARCH}/${PKG_CFTARG}/entitlement.xml" ]]; then + ./exec.sh - ldid -S"${PKG_BASE}/arch/${PKG_ARCH}/${PKG_CFTARG}/entitlement.xml" "$(pkg_ /DEBIAN)/${script}" + else + ./exec.sh - ldid -S "$(pkg_ /DEBIAN)/${script}" + fi elif [[ -e "${PKG_DATA}/_metadata/${script}" ]]; then cp -a "${PKG_DATA}/_metadata/${script}" "$(pkg_ /DEBIAN)" fi @@ -54,15 +54,20 @@ else PKG_RVSN=$((${PKG_RVSN} + 1)) fi - export PKG_PACK=${PKG_BASE}/debs/${PKG_NAME}_${PKG_VRSN}-${PKG_RVSN}_${PKG_ARCH}.deb + if [[ ! -d "${PKG_BASE}/debs/${PKG_CFTARG}" ]]; then + mkdir -p "${PKG_BASE}/debs/${PKG_CFTARG}" + fi + export PKG_PACK=${PKG_BASE}/debs/${PKG_CFTARG}/${PKG_NAME}_${PKG_VRSN}-${PKG_RVSN}_${PKG_ARCH}.deb if [[ -e ${PKG_PACK} ]]; then echo "package ${PKG_PACK} already exists..." else ./control.sh "${PKG_NAME}" control "${PKG_VRSN}-${PKG_RVSN}" >"$(pkg_ /DEBIAN/control)" - dpkg-deb -Z"${PKG_ZLIB}" -b "${PKG_DEST}" "${PKG_PACK}" + fakeroot dm.pl -Z"${PKG_ZLIB}" -b "${PKG_DEST}" "${PKG_PACK}" echo "${PKG_HASH}" >"${PKG_STAT}/dest-md5" echo "${PKG_RVSN}" >"${PKG_STAT}/dest-ver" - "${PKG_BASE}"/upload.sh debs "${PKG_PACK}" + if [[ -e "${PKG_BASE}"/upload.sh ]]; then + "${PKG_BASE}"/upload.sh debs "${PKG_PACK}" + fi fi fi diff --git a/util/catdir.sh b/util/catdir.sh index 19dfd2461..cd4ed12e3 100755 --- a/util/catdir.sh +++ b/util/catdir.sh @@ -1,4 +1,5 @@ #!/bin/bash +[ -d "$1" ] || exit 1 cd "$1" shift find -H "$@" -type l -printf '%p -> %l\n' -o -printf '%p (%U/%G/%#m)\n' | sort diff --git a/util/configure.sh b/util/configure.sh index 396c6f59b..de03c69f8 100755 --- a/util/configure.sh +++ b/util/configure.sh @@ -7,4 +7,4 @@ if [[ -z $PKG_CONF ]]; then PKG_CONF=./configure fi -PKG_ROOT=/home/saurik/iphone/sysroot PKG_CONFIG="$(realpath ../../../util/pkg-config.sh) --define-variable=prefix=/home/saurik/iphone/sysroot/usr" PKG_CONFIG_PATH=/home/saurik/iphone/sysroot/usr/lib/pkgconfig $PKG_CONF --prefix=/usr --host=arm-apple-darwin9 --enable-static=no --enable-shared=yes "$@" +PKG_ROOT=/home/saurik/iphone/sysroot PKG_CONFIG="$(realpath ../../../util/pkg-config.sh) --define-variable=prefix=/home/saurik/iphone/sysroot/usr" PKG_CONFIG_PATH=/home/saurik/iphone/sysroot/usr/lib/pkgconfig $PKG_CONF --prefix=/usr --host=${PKG_TARG} --enable-static=no --enable-shared=yes "$@" diff --git a/util/ldid.cpp b/util/ldid.cpp index a438e2391..7238767c9 100644 --- a/util/ldid.cpp +++ b/util/ldid.cpp @@ -1,54 +1,36 @@ -/* JocStrap - Java/Objective-C Bootstrap - * Copyright (C) 2007 Jay Freeman (saurik) +/* ldid - (Mach-O) Link-Loader Identity Editor + * Copyright (C) 2007-2012 Jay Freeman (saurik) */ +/* GNU Affero General Public License, Version 3 {{{ */ /* - * Redistribution and use in source and binary - * forms, with or without modification, are permitted - * provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the - * above copyright notice, this list of conditions - * and the following disclaimer. - * 2. Redistributions in binary form must reproduce the - * above copyright notice, this list of conditions - * and the following disclaimer in the documentation - * and/or other materials provided with the - * distribution. - * 3. The name of the author may not be used to endorse - * or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, - * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR - * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * This program 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 Affero General Public License for more details. + + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. +**/ +/* }}} */ #include "minimal/stdlib.h" #include "minimal/string.h" #include "minimal/mapping.h" +extern "C" { #include "sha1.h" +} #include <cstring> #include <string> #include <vector> -#include <sys/wait.h> -#include <sys/types.h> -#include <sys/stat.h> - struct fat_header { uint32_t magic; uint32_t nfat_arch; @@ -78,8 +60,12 @@ struct mach_header { #define MH_MAGIC 0xfeedface #define MH_CIGAM 0xcefaedfe +#define MH_MAGIC_64 0xfeedfacf +#define MH_CIGAM_64 0xcffaedfe + #define MH_DYLDLINK 0x4 +#define MH_OBJECT 0x1 #define MH_EXECUTE 0x2 #define MH_DYLIB 0x6 #define MH_BUNDLE 0x8 @@ -90,14 +76,21 @@ struct load_command { uint32_t cmdsize; } _packed; -#define LC_REQ_DYLD uint32_t(0x80000000) - -#define LC_SEGMENT uint32_t(0x01) -#define LC_LOAD_DYLIB uint32_t(0x0c) -#define LC_ID_DYLIB uint32_t(0x0d) -#define LC_UUID uint32_t(0x1b) -#define LC_CODE_SIGNATURE uint32_t(0x1d) -#define LC_REEXPORT_DYLIB uint32_t(0x1f | LC_REQ_DYLD) +#define LC_REQ_DYLD uint32_t(0x80000000) + +#define LC_SEGMENT uint32_t(0x01) +#define LC_SYMTAB uint32_t(0x02) +#define LC_DYSYMTAB uint32_t(0x0b) +#define LC_LOAD_DYLIB uint32_t(0x0c) +#define LC_ID_DYLIB uint32_t(0x0d) +#define LC_SEGMENT_64 uint32_t(0x19) +#define LC_UUID uint32_t(0x1b) +#define LC_CODE_SIGNATURE uint32_t(0x1d) +#define LC_SEGMENT_SPLIT_INFO uint32_t(0x1e) +#define LC_REEXPORT_DYLIB uint32_t(0x1f | LC_REQ_DYLD) +#define LC_ENCRYPTION_INFO uint32_t(0x21) +#define LC_DYLD_INFO uint32_t(0x22) +#define LC_DYLD_INFO_ONLY uint32_t(0x22 | LC_REQ_DYLD) struct dylib { uint32_t name; @@ -118,6 +111,100 @@ struct uuid_command { uint8_t uuid[16]; } _packed; +struct symtab_command { + uint32_t cmd; + uint32_t cmdsize; + uint32_t symoff; + uint32_t nsyms; + uint32_t stroff; + uint32_t strsize; +} _packed; + +struct dyld_info_command { + uint32_t cmd; + uint32_t cmdsize; + uint32_t rebase_off; + uint32_t rebase_size; + uint32_t bind_off; + uint32_t bind_size; + uint32_t weak_bind_off; + uint32_t weak_bind_size; + uint32_t lazy_bind_off; + uint32_t lazy_bind_size; + uint32_t export_off; + uint32_t export_size; +} _packed; + +struct dysymtab_command { + uint32_t cmd; + uint32_t cmdsize; + uint32_t ilocalsym; + uint32_t nlocalsym; + uint32_t iextdefsym; + uint32_t nextdefsym; + uint32_t iundefsym; + uint32_t nundefsym; + uint32_t tocoff; + uint32_t ntoc; + uint32_t modtaboff; + uint32_t nmodtab; + uint32_t extrefsymoff; + uint32_t nextrefsyms; + uint32_t indirectsymoff; + uint32_t nindirectsyms; + uint32_t extreloff; + uint32_t nextrel; + uint32_t locreloff; + uint32_t nlocrel; +} _packed; + +struct dylib_table_of_contents { + uint32_t symbol_index; + uint32_t module_index; +} _packed; + +struct dylib_module { + uint32_t module_name; + uint32_t iextdefsym; + uint32_t nextdefsym; + uint32_t irefsym; + uint32_t nrefsym; + uint32_t ilocalsym; + uint32_t nlocalsym; + uint32_t iextrel; + uint32_t nextrel; + uint32_t iinit_iterm; + uint32_t ninit_nterm; + uint32_t objc_module_info_addr; + uint32_t objc_module_info_size; +} _packed; + +struct dylib_reference { + uint32_t isym:24; + uint32_t flags:8; +} _packed; + +struct relocation_info { + int32_t r_address; + uint32_t r_symbolnum:24; + uint32_t r_pcrel:1; + uint32_t r_length:2; + uint32_t r_extern:1; + uint32_t r_type:4; +} _packed; + +struct nlist { + union { + char *n_name; + int32_t n_strx; + } n_un; + + uint8_t n_type; + uint8_t n_sect; + uint8_t n_desc; + uint32_t n_value; +} _packed; + struct segment_command { uint32_t cmd; uint32_t cmdsize; @@ -130,7 +217,21 @@ struct segment_command { uint32_t initprot; uint32_t nsects; uint32_t flags; -}; +} _packed; + +struct segment_command_64 { + uint32_t cmd; + uint32_t cmdsize; + char segname[16]; + uint64_t vmaddr; + uint64_t vmsize; + uint64_t fileoff; + uint64_t filesize; + uint32_t maxprot; + uint32_t initprot; + uint32_t nsects; + uint32_t flags; +} _packed; struct section { char sectname[16]; @@ -144,7 +245,21 @@ struct section { uint32_t flags; uint32_t reserved1; uint32_t reserved2; -}; +} _packed; + +struct section_64 { + char sectname[16]; + char segname[16]; + uint64_t addr; + uint64_t size; + uint32_t offset; + uint32_t align; + uint32_t reloff; + uint32_t nreloc; + uint32_t flags; + uint32_t reserved1; + uint32_t reserved2; +} _packed; struct linkedit_data_command { uint32_t cmd; @@ -153,6 +268,38 @@ struct linkedit_data_command { uint32_t datasize; } _packed; +struct encryption_info_command { + uint32_t cmd; + uint32_t cmdsize; + uint32_t cryptoff; + uint32_t cryptsize; + uint32_t cryptid; +} _packed; + +#define BIND_OPCODE_MASK 0xf0 +#define BIND_IMMEDIATE_MASK 0x0f +#define BIND_OPCODE_DONE 0x00 +#define BIND_OPCODE_SET_DYLIB_ORDINAL_IMM 0x10 +#define BIND_OPCODE_SET_DYLIB_ORDINAL_ULEB 0x20 +#define BIND_OPCODE_SET_DYLIB_SPECIAL_IMM 0x30 +#define BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM 0x40 +#define BIND_OPCODE_SET_TYPE_IMM 0x50 +#define BIND_OPCODE_SET_ADDEND_SLEB 0x60 +#define BIND_OPCODE_SET_SEGMENT_AND_OFFSET_ULEB 0x70 +#define BIND_OPCODE_ADD_ADDR_ULEB 0x80 +#define BIND_OPCODE_DO_BIND 0x90 +#define BIND_OPCODE_DO_BIND_ADD_ADDR_ULEB 0xa0 +#define BIND_OPCODE_DO_BIND_ADD_ADDR_IMM_SCALED 0xb0 +#define BIND_OPCODE_DO_BIND_ULEB_TIMES_SKIPPING_ULEB 0xc0 + +template <typename Type_> +Type_ Align(Type_ value, size_t align) { + value += align - 1; + value /= align; + value *= align; + return value; +} + uint16_t Swap_(uint16_t value) { return ((value >> 8) & 0x00ff) | @@ -167,6 +314,13 @@ uint32_t Swap_(uint32_t value) { return value; } +uint64_t Swap_(uint64_t value) { + value = (value & 0x00000000ffffffffULL) << 32 | (value & 0xffffffff00000000ULL) >> 32; + value = (value & 0x0000ffff0000ffffULL) << 16 | (value & 0xffff0000ffff0000ULL) >> 16; + value = (value & 0x00ff00ff00ff00ffULL) << 8 | (value & 0xff00ff00ff00ff00ULL) >> 8; + return value; +} + int16_t Swap_(int16_t value) { return Swap_(static_cast<uint16_t>(value)); } @@ -175,12 +329,22 @@ int32_t Swap_(int32_t value) { return Swap_(static_cast<uint32_t>(value)); } +int64_t Swap_(int64_t value) { + return Swap_(static_cast<uint64_t>(value)); +} + +bool little_(true); + uint16_t Swap(uint16_t value) { - return true ? Swap_(value) : value; + return little_ ? Swap_(value) : value; } uint32_t Swap(uint32_t value) { - return true ? Swap_(value) : value; + return little_ ? Swap_(value) : value; +} + +uint64_t Swap(uint64_t value) { + return little_ ? Swap_(value) : value; } int16_t Swap(int16_t value) { @@ -191,17 +355,29 @@ int32_t Swap(int32_t value) { return Swap(static_cast<uint32_t>(value)); } +int64_t Swap(int64_t value) { + return Swap(static_cast<uint64_t>(value)); +} + template <typename Target_> class Pointer; -class Framework { +class Data { private: void *base_; size_t size_; - mach_header *mach_header_; + + protected: bool swapped_; public: + Data(void *base, size_t size) : + base_(base), + size_(size), + swapped_(false) + { + } + uint16_t Swap(uint16_t value) const { return swapped_ ? Swap_(value) : value; } @@ -210,6 +386,10 @@ class Framework { return swapped_ ? Swap_(value) : value; } + uint64_t Swap(uint64_t value) const { + return swapped_ ? Swap_(value) : value; + } + int16_t Swap(int16_t value) const { return Swap(static_cast<uint16_t>(value)); } @@ -218,35 +398,55 @@ class Framework { return Swap(static_cast<uint32_t>(value)); } - Framework(const char *framework_path) : - swapped_(false) + int64_t Swap(int64_t value) const { + return Swap(static_cast<uint64_t>(value)); + } + + void *GetBase() const { + return base_; + } + + size_t GetSize() const { + return size_; + } +}; + +class MachHeader : + public Data +{ + private: + bool bits64_; + + struct mach_header *mach_header_; + struct load_command *load_command_; + + public: + MachHeader(void *base, size_t size) : + Data(base, size) { - base_ = map(framework_path, 0, _not(size_t), &size_, false); - fat_header *fat_header = reinterpret_cast<struct fat_header *>(base_); + mach_header_ = (mach_header *) base; - if (Swap(fat_header->magic) == FAT_CIGAM) { - swapped_ = !swapped_; - goto fat; - } else if (Swap(fat_header->magic) != FAT_MAGIC) - mach_header_ = (mach_header *) base_; - else fat: { - size_t fat_narch = Swap(fat_header->nfat_arch); - fat_arch *fat_arch = reinterpret_cast<struct fat_arch *>(fat_header + 1); - size_t arch; - for (arch = 0; arch != fat_narch; ++arch) { - uint32_t arch_offset = Swap(fat_arch->offset); - mach_header_ = (mach_header *) ((uint8_t *) base_ + arch_offset); - goto found; - ++fat_arch; - } + switch (Swap(mach_header_->magic)) { + case MH_CIGAM: + swapped_ = !swapped_; + case MH_MAGIC: + bits64_ = false; + break; - _assert(false); + case MH_CIGAM_64: + swapped_ = !swapped_; + case MH_MAGIC_64: + bits64_ = true; + break; + + default: + _assert(false); } - found: - if (Swap(mach_header_->magic) == MH_CIGAM) - swapped_ = !swapped_; - else _assert(Swap(mach_header_->magic) == MH_MAGIC); + void *post = mach_header_ + 1; + if (bits64_) + post = (uint32_t *) post + 1; + load_command_ = (struct load_command *) post; _assert( Swap(mach_header_->filetype) == MH_EXECUTE || @@ -259,18 +459,26 @@ class Framework { return mach_header_; } - void *GetBase() { - return base_; + operator struct mach_header *() const { + return mach_header_; } - size_t GetSize() { - return size_; + uint32_t GetCPUType() const { + return Swap(mach_header_->cputype); + } + + uint32_t GetCPUSubtype() const { + return Swap(mach_header_->cpusubtype) & 0xff; + } + + struct load_command *GetLoadCommand() const { + return load_command_; } - std::vector<struct load_command *> GetLoadCommands() { + std::vector<struct load_command *> GetLoadCommands() const { std::vector<struct load_command *> load_commands; - struct load_command *load_command = reinterpret_cast<struct load_command *>(mach_header_ + 1); + struct load_command *load_command = load_command_; for (uint32_t cmd = 0; cmd != Swap(mach_header_->ncmds); ++cmd) { load_commands.push_back(load_command); load_command = (struct load_command *) ((uint8_t *) load_command + Swap(load_command->cmdsize)); @@ -279,27 +487,42 @@ class Framework { return load_commands; } - std::vector<segment_command *> GetSegments(const char *segment_name) { + std::vector<segment_command *> GetSegments(const char *segment_name) const { std::vector<struct segment_command *> segment_commands; - _foreach (load_command, GetLoadCommands()) - if (Swap((*load_command)->cmd) == LC_SEGMENT) { - segment_command *segment_command = reinterpret_cast<struct segment_command *>(*load_command); + _foreach (load_command, GetLoadCommands()) { + if (Swap(load_command->cmd) == LC_SEGMENT) { + segment_command *segment_command = reinterpret_cast<struct segment_command *>(load_command); if (strncmp(segment_command->segname, segment_name, 16) == 0) segment_commands.push_back(segment_command); } + } return segment_commands; } - std::vector<section *> GetSections(const char *segment_name, const char *section_name) { + std::vector<segment_command_64 *> GetSegments64(const char *segment_name) const { + std::vector<struct segment_command_64 *> segment_commands; + + _foreach (load_command, GetLoadCommands()) { + if (Swap(load_command->cmd) == LC_SEGMENT_64) { + segment_command_64 *segment_command = reinterpret_cast<struct segment_command_64 *>(load_command); + if (strncmp(segment_command->segname, segment_name, 16) == 0) + segment_commands.push_back(segment_command); + } + } + + return segment_commands; + } + + std::vector<section *> GetSections(const char *segment_name, const char *section_name) const { std::vector<section *> sections; _foreach (segment, GetSegments(segment_name)) { - section *section = (struct section *) (*segment + 1); + section *section = (struct section *) (segment + 1); uint32_t sect; - for (sect = 0; sect != Swap((*segment)->nsects); ++sect) { + for (sect = 0; sect != Swap(segment->nsects); ++sect) { if (strncmp(section->sectname, section_name, 16) == 0) sections.push_back(section); ++section; @@ -310,7 +533,7 @@ class Framework { } template <typename Target_> - Pointer<Target_> GetPointer(uint32_t address, const char *segment_name = NULL) { + Pointer<Target_> GetPointer(uint32_t address, const char *segment_name = NULL) const { load_command *load_command = (struct load_command *) (mach_header_ + 1); uint32_t cmd; @@ -346,14 +569,87 @@ class Framework { } }; +class FatMachHeader : + public MachHeader +{ + private: + fat_arch *fat_arch_; + + public: + FatMachHeader(void *base, size_t size, fat_arch *fat_arch) : + MachHeader(base, size), + fat_arch_(fat_arch) + { + } + + fat_arch *GetFatArch() const { + return fat_arch_; + } +}; + +class FatHeader : + public Data +{ + private: + fat_header *fat_header_; + std::vector<FatMachHeader> mach_headers_; + + public: + FatHeader(void *base, size_t size) : + Data(base, size) + { + fat_header_ = reinterpret_cast<struct fat_header *>(base); + + if (Swap(fat_header_->magic) == FAT_CIGAM) { + swapped_ = !swapped_; + goto fat; + } else if (Swap(fat_header_->magic) != FAT_MAGIC) { + fat_header_ = NULL; + mach_headers_.push_back(FatMachHeader(base, size, NULL)); + } else fat: { + size_t fat_narch = Swap(fat_header_->nfat_arch); + fat_arch *fat_arch = reinterpret_cast<struct fat_arch *>(fat_header_ + 1); + size_t arch; + for (arch = 0; arch != fat_narch; ++arch) { + uint32_t arch_offset = Swap(fat_arch->offset); + uint32_t arch_size = Swap(fat_arch->size); + mach_headers_.push_back(FatMachHeader((uint8_t *) base + arch_offset, arch_size, fat_arch)); + ++fat_arch; + } + } + } + + std::vector<FatMachHeader> &GetMachHeaders() { + return mach_headers_; + } + + bool IsFat() const { + return fat_header_ != NULL; + } + + struct fat_header *operator ->() const { + return fat_header_; + } + + operator struct fat_header *() const { + return fat_header_; + } +}; + +FatHeader Map(const char *path, bool ro = false) { + size_t size; + void *base(map(path, 0, _not(size_t), &size, ro)); + return FatHeader(base, size); +} + template <typename Target_> class Pointer { private: - const Framework *framework_; + const MachHeader *framework_; const Target_ *pointer_; public: - Pointer(const Framework *framework = NULL, const Target_ *pointer = NULL) : + Pointer(const MachHeader *framework = NULL, const Target_ *pointer = NULL) : framework_(framework), pointer_(pointer) { @@ -420,8 +716,6 @@ struct CodeDirectory { extern "C" uint32_t hash(uint8_t *k, uint32_t length, uint32_t initval); -#define CODESIGN_ALLOCATE "arm-apple-darwin9-codesign_allocate" - void sha1(uint8_t *hash, uint8_t *data, size_t size) { SHA1Context context; SHA1Reset(&context); @@ -429,8 +723,34 @@ void sha1(uint8_t *hash, uint8_t *data, size_t size) { SHA1Result(&context, hash); } +struct CodesignAllocation { + FatMachHeader mach_header_; + uint32_t offset_; + uint32_t size_; + uint32_t alloc_; + uint32_t align_; + + CodesignAllocation(FatMachHeader mach_header, size_t offset, size_t size, size_t alloc, size_t align) : + mach_header_(mach_header), + offset_(offset), + size_(size), + alloc_(alloc), + align_(align) + { + } +}; + int main(int argc, const char *argv[]) { + union { + uint16_t word; + uint8_t byte[2]; + } endian = {1}; + + little_ = endian.byte[0]; + bool flag_R(false); + bool flag_r(false); + bool flag_t(false); bool flag_p(false); bool flag_u(false); @@ -441,6 +761,19 @@ int main(int argc, const char *argv[]) { bool flag_S(false); bool flag_s(false); + bool flag_O(false); + + bool flag_D(false); + bool flag_d(false); + + bool flag_A(false); + bool flag_a(false); + + uint32_t flag_CPUType(_not(uint32_t)); + uint32_t flag_CPUSubtype(_not(uint32_t)); + + const char *flag_I(NULL); + bool timeh(false); uint32_t timev(0); @@ -465,10 +798,32 @@ int main(int argc, const char *argv[]) { files.push_back(argv[argi]); else switch (argv[argi][1]) { case 'R': flag_R = true; break; + case 'r': flag_r = true; break; + case 't': flag_t = true; break; case 'u': flag_u = true; break; case 'p': flag_p = true; break; case 'e': flag_e = true; break; + case 'O': flag_O = true; break; + + case 'D': flag_D = true; break; + case 'd': flag_d = true; break; + + case 'a': flag_a = true; break; + + case 'A': + flag_A = true; + if (argv[argi][2] != '\0') { + const char *cpu = argv[argi] + 2; + const char *colon = strchr(cpu, ':'); + _assert(colon != NULL); + char *arge; + flag_CPUType = strtoul(cpu, &arge, 0); + _assert(arge == colon); + flag_CPUSubtype = strtoul(colon + 1, &arge, 0); + _assert(arge == argv[argi] + strlen(argv[argi])); + } + break; case 's': _assert(!flag_S); @@ -495,6 +850,10 @@ int main(int argc, const char *argv[]) { } } break; + case 'I': { + flag_I = argv[argi] + 2; + } break; + case 'n': { char *arge; noffset = strtoul(argv[argi] + 2, &arge, 0); @@ -518,7 +877,7 @@ int main(int argc, const char *argv[]) { size_t filei(0), filee(0); _foreach (file, files) try { - const char *path(file->c_str()); + const char *path(file.c_str()); const char *base = strrchr(path, '/'); char *temp(NULL), *dir; @@ -529,260 +888,446 @@ int main(int argc, const char *argv[]) { base = path; } - if (flag_S) { - asprintf(&temp, "%s.%s.cs", dir, base); - const char *allocate = getenv("CODESIGN_ALLOCATE"); - if (allocate == NULL) - allocate = "codesign_allocate"; - - size_t size = _not(size_t); - const char *arch; { - Framework framework(path); - framework->flags |= MH_DYLDLINK; - - _foreach (load_command, framework.GetLoadCommands()) { - uint32_t cmd(framework.Swap((*load_command)->cmd)); - if (cmd == LC_CODE_SIGNATURE) { - struct linkedit_data_command *signature = reinterpret_cast<struct linkedit_data_command *>(*load_command); - size = framework.Swap(signature->dataoff); - _assert(size < framework.GetSize()); - break; + const char *name(flag_I ?: base); + + if (flag_r) { + uint32_t clip(0); { + FatHeader fat_header(Map(path)); + _foreach (mach_header, fat_header.GetMachHeaders()) { + if (flag_A) { + if (mach_header.GetCPUType() != flag_CPUType) + continue; + if (mach_header.GetCPUSubtype() != flag_CPUSubtype) + continue; } - } - if (size == _not(size_t)) - size = framework.GetSize(); + mach_header->flags = mach_header.Swap(mach_header.Swap(mach_header->flags) | MH_DYLDLINK); + + uint32_t size(_not(uint32_t)); { + _foreach (load_command, mach_header.GetLoadCommands()) { + switch (mach_header.Swap(load_command->cmd)) { + case LC_CODE_SIGNATURE: { + struct linkedit_data_command *signature = reinterpret_cast<struct linkedit_data_command *>(load_command); + memset(reinterpret_cast<uint8_t *>(mach_header.GetBase()) + mach_header.Swap(signature->dataoff), 0, mach_header.Swap(signature->datasize)); + memset(signature, 0, sizeof(struct linkedit_data_command)); + + mach_header->ncmds = mach_header.Swap(mach_header.Swap(mach_header->ncmds) - 1); + mach_header->sizeofcmds = mach_header.Swap(uint32_t(mach_header.Swap(mach_header->sizeofcmds) - sizeof(struct linkedit_data_command))); + } break; + + case LC_SYMTAB: { + struct symtab_command *symtab = reinterpret_cast<struct symtab_command *>(load_command); + size = mach_header.Swap(symtab->stroff) + mach_header.Swap(symtab->strsize); + } break; + } + } + } - switch (framework->cputype) { - case 12: switch (framework->cpusubtype) { - case 0: arch = "arm"; break; - case 6: arch = "armv6"; break; - default: arch = NULL; break; - } break; + _assert(size != _not(uint32_t)); - default: arch = NULL; break; - } - } + _foreach (segment, mach_header.GetSegments("__LINKEDIT")) { + segment->filesize -= mach_header.GetSize() - size; + + if (fat_arch *fat_arch = mach_header.GetFatArch()) { + fat_arch->size = fat_header.Swap(size); + clip = std::max(clip, fat_header.Swap(fat_arch->offset) + size); + } else + clip = std::max(clip, size); + } - _assert(arch != NULL); + _foreach (segment, mach_header.GetSegments64("__LINKEDIT")) { + segment->filesize -= mach_header.GetSize() - size; - pid_t pid = fork(); - _syscall(pid); - if (pid == 0) { - char *ssize; - asprintf(&ssize, "%u", (sizeof(struct SuperBlob) + 2 * sizeof(struct BlobIndex) + sizeof(struct CodeDirectory) + strlen(base) + 1 + ((xmld == NULL ? CSSLOT_REQUIREMENTS : CSSLOT_ENTITLEMENTS) + (size + 0x1000 - 1) / 0x1000) * 0x14 + 0xc + (xmld == NULL ? 0 : 0x10 + xmls) + 15) / 16 * 16); - //printf("%s -i %s -a %s %s -o %s\n", allocate, path, arch, ssize, temp); - execlp(allocate, allocate, "-i", path, "-a", arch, ssize, "-o", temp, NULL); - _assert(false); + if (fat_arch *fat_arch = mach_header.GetFatArch()) { + fat_arch->size = fat_header.Swap(size); + clip = std::max(clip, fat_header.Swap(fat_arch->offset) + size); + } else + clip = std::max(clip, size); + } + } } - int status; - _syscall(waitpid(pid, &status, 0)); - _assert(WIFEXITED(status)); - _assert(WEXITSTATUS(status) == 0); + if (clip != 0) + _syscall(truncate(path, clip)); } - Framework framework(temp == NULL ? path : temp); - struct linkedit_data_command *signature(NULL); + if (flag_S) { + FatHeader source(Map(path)); - if (flag_p) - printf("path%zu='%s'\n", filei, file->c_str()); - - if (woffset != _not(uintptr_t)) { - Pointer<uint32_t> wvalue(framework.GetPointer<uint32_t>(woffset)); - if (wvalue == NULL) - printf("(null) %p\n", woffset); - else - printf("0x%.08x\n", *wvalue); - } + size_t offset(0); - if (noffset != _not(uintptr_t)) - printf("%s\n", &*framework.GetPointer<char>(noffset)); - - _foreach (load_command, framework.GetLoadCommands()) { - uint32_t cmd(framework.Swap((*load_command)->cmd)); - - if (flag_R && cmd == LC_REEXPORT_DYLIB) - (*load_command)->cmd = framework.Swap(LC_LOAD_DYLIB); - else if (cmd == LC_CODE_SIGNATURE) - signature = reinterpret_cast<struct linkedit_data_command *>(*load_command); - else if (cmd == LC_UUID) { - volatile struct uuid_command *uuid_command(reinterpret_cast<struct uuid_command *>(*load_command)); - - if (flag_u) { - printf("uuid%zu=%.2x%.2x%.2x%.2x-%.2x%.2x-%.2x%.2x-%.2x%.2x-%.2x%.2x%.2x%.2x%.2x%.2x\n", filei, - uuid_command->uuid[ 0], uuid_command->uuid[ 1], uuid_command->uuid[ 2], uuid_command->uuid[ 3], - uuid_command->uuid[ 4], uuid_command->uuid[ 5], uuid_command->uuid[ 6], uuid_command->uuid[ 7], - uuid_command->uuid[ 8], uuid_command->uuid[ 9], uuid_command->uuid[10], uuid_command->uuid[11], - uuid_command->uuid[12], uuid_command->uuid[13], uuid_command->uuid[14], uuid_command->uuid[15] - ); - } - } else if (cmd == LC_ID_DYLIB) { - volatile struct dylib_command *dylib_command(reinterpret_cast<struct dylib_command *>(*load_command)); + if (source.IsFat()) + offset += sizeof(fat_header) + sizeof(fat_arch) * source.Swap(source->nfat_arch); + + std::vector<CodesignAllocation> allocations; { + _foreach (mach_header, source.GetMachHeaders()) { + if (flag_A) { + if (mach_header.GetCPUType() != flag_CPUType) + continue; + if (mach_header.GetCPUSubtype() != flag_CPUSubtype) + continue; + } + + mach_header->flags = mach_header.Swap(mach_header.Swap(mach_header->flags) | MH_DYLDLINK); + + size_t size(_not(size_t)); { + _foreach (load_command, mach_header.GetLoadCommands()) { + uint32_t cmd(mach_header.Swap(load_command->cmd)); + if (cmd == LC_CODE_SIGNATURE) { + struct linkedit_data_command *signature = reinterpret_cast<struct linkedit_data_command *>(load_command); + size = mach_header.Swap(signature->dataoff); + _assert(size < mach_header.GetSize()); + break; + } + } + + if (size == _not(size_t)) + size = mach_header.GetSize(); + } - if (flag_t) - printf("time%zu=0x%.8x\n", filei, framework.Swap(dylib_command->dylib.timestamp)); + size_t alloc(0); + alloc += sizeof(struct SuperBlob); + uint32_t special(0); - if (flag_T) { - uint32_t timed; + special = std::max(special, CSSLOT_CODEDIRECTORY); + alloc += sizeof(struct BlobIndex); + alloc += sizeof(struct CodeDirectory); + alloc += strlen(name) + 1; - if (!timeh) - timed = timev; - else { - dylib_command->dylib.timestamp = 0; - timed = hash(reinterpret_cast<uint8_t *>(framework.GetBase()), framework.GetSize(), timev); + special = std::max(special, CSSLOT_REQUIREMENTS); + alloc += sizeof(struct BlobIndex); + alloc += 0xc; + + if (xmld != NULL) { + special = std::max(special, CSSLOT_ENTITLEMENTS); + alloc += sizeof(struct BlobIndex); + alloc += sizeof(struct Blob); + alloc += xmls; } - dylib_command->dylib.timestamp = framework.Swap(timed); + size_t normal((size + 0x1000 - 1) / 0x1000); + alloc = Align(alloc + (special + normal) * 0x14, 16); + + fat_arch *fat_arch(mach_header.GetFatArch()); + uint32_t align(fat_arch == NULL ? 0 : source.Swap(fat_arch->align)); + offset = Align(offset, 1 << align); + + allocations.push_back(CodesignAllocation(mach_header, offset, size, alloc, align)); + offset += size + alloc; + offset = Align(offset, 16); } } - } - if (flag_e) { - _assert(signature != NULL); + asprintf(&temp, "%s.%s.cs", dir, base); + fclose(fopen(temp, "w+")); + _syscall(truncate(temp, offset)); + + void *file(map(temp, 0, offset, NULL, false)); + memset(file, 0, offset); + + fat_arch *fat_arch; + if (!source.IsFat()) + fat_arch = NULL; + else { + fat_header *fat_header(reinterpret_cast<struct fat_header *>(file)); + fat_header->magic = Swap(FAT_MAGIC); + fat_header->nfat_arch = Swap(source.Swap(source->nfat_arch)); + fat_arch = reinterpret_cast<struct fat_arch *>(fat_header + 1); + } - uint32_t data = framework.Swap(signature->dataoff); - uint32_t size = framework.Swap(signature->datasize); + _foreach (allocation, allocations) { + const FatMachHeader &source(allocation.mach_header_); - uint8_t *top = reinterpret_cast<uint8_t *>(framework.GetBase()); - uint8_t *blob = top + data; - struct SuperBlob *super = reinterpret_cast<struct SuperBlob *>(blob); + uint32_t align(allocation.size_); + align = Align(align, 0x10); - for (size_t index(0); index != Swap(super->count); ++index) - if (Swap(super->index[index].type) == CSSLOT_ENTITLEMENTS) { - uint32_t begin = Swap(super->index[index].offset); - struct Blob *entitlements = reinterpret_cast<struct Blob *>(blob + begin); - fwrite(entitlements + 1, 1, Swap(entitlements->length) - sizeof(struct Blob), stdout); + if (fat_arch != NULL) { + fat_arch->cputype = Swap(source->cputype); + fat_arch->cpusubtype = Swap(source->cpusubtype); + fat_arch->offset = Swap(allocation.offset_); + fat_arch->size = Swap(align + allocation.alloc_); + fat_arch->align = Swap(allocation.align_); + ++fat_arch; + } + + void *target(reinterpret_cast<uint8_t *>(file) + allocation.offset_); + memcpy(target, source, allocation.size_); + MachHeader mach_header(target, align + allocation.alloc_); + + struct linkedit_data_command *signature(NULL); + _foreach (load_command, mach_header.GetLoadCommands()) { + uint32_t cmd(mach_header.Swap(load_command->cmd)); + if (cmd != LC_CODE_SIGNATURE) + continue; + signature = reinterpret_cast<struct linkedit_data_command *>(load_command); + break; + } + + if (signature == NULL) { + mach_header->ncmds = mach_header.Swap(mach_header.Swap(mach_header->ncmds) + 1); + signature = reinterpret_cast<struct linkedit_data_command *>(reinterpret_cast<uint8_t *>(mach_header.GetLoadCommand()) + mach_header.Swap(mach_header->sizeofcmds)); + mach_header->sizeofcmds = mach_header.Swap(mach_header.Swap(mach_header->sizeofcmds) + uint32_t(sizeof(*signature))); + signature->cmd = mach_header.Swap(LC_CODE_SIGNATURE); + signature->cmdsize = mach_header.Swap(uint32_t(sizeof(*signature))); } + + signature->dataoff = mach_header.Swap(align); + signature->datasize = mach_header.Swap(allocation.alloc_); + + _foreach (segment, mach_header.GetSegments("__LINKEDIT")) { + size_t size(mach_header.Swap(align + allocation.alloc_ - mach_header.Swap(segment->fileoff))); + segment->filesize = size; + segment->vmsize = Align(size, 0x1000); + } + + _foreach (segment, mach_header.GetSegments64("__LINKEDIT")) { + size_t size(mach_header.Swap(align + allocation.alloc_ - mach_header.Swap(segment->fileoff))); + segment->filesize = size; + segment->vmsize = Align(size, 0x1000); + } + } } - if (flag_s) { - _assert(signature != NULL); + if (flag_p) + printf("path%zu='%s'\n", filei, file.c_str()); + + FatHeader fat_header(Map(temp == NULL ? path : temp, !(flag_R || flag_T || flag_s || flag_S || flag_O || flag_D))); + struct linkedit_data_command *signature(NULL); + + _foreach (mach_header, fat_header.GetMachHeaders()) { + if (flag_A) { + if (mach_header.GetCPUType() != flag_CPUType) + continue; + if (mach_header.GetCPUSubtype() != flag_CPUSubtype) + continue; + } - uint32_t data = framework.Swap(signature->dataoff); - uint32_t size = framework.Swap(signature->datasize); + if (flag_a) + printf("cpu=0x%x:0x%x\n", mach_header.GetCPUType(), mach_header.GetCPUSubtype()); - uint8_t *top = reinterpret_cast<uint8_t *>(framework.GetBase()); - uint8_t *blob = top + data; - struct SuperBlob *super = reinterpret_cast<struct SuperBlob *>(blob); + if (flag_d) { + if (struct fat_arch *fat_arch = mach_header.GetFatArch()) + printf("offset=0x%x\n", Swap(fat_arch->offset)); + else + printf("offset=0x0\n"); + } - for (size_t index(0); index != Swap(super->count); ++index) - if (Swap(super->index[index].type) == CSSLOT_CODEDIRECTORY) { - uint32_t begin = Swap(super->index[index].offset); - struct CodeDirectory *directory = reinterpret_cast<struct CodeDirectory *>(blob + begin); + if (woffset != _not(uintptr_t)) { + Pointer<uint32_t> wvalue(mach_header.GetPointer<uint32_t>(woffset)); + if (wvalue == NULL) + printf("(null) %p\n", reinterpret_cast<void *>(woffset)); + else + printf("0x%.08x\n", *wvalue); + } - uint8_t (*hashes)[20] = reinterpret_cast<uint8_t (*)[20]>(blob + begin + Swap(directory->hashOffset)); - uint32_t pages = Swap(directory->nCodeSlots); + if (noffset != _not(uintptr_t)) + printf("%s\n", &*mach_header.GetPointer<char>(noffset)); - if (pages != 1) - for (size_t i = 0; i != pages - 1; ++i) - sha1(hashes[i], top + 0x1000 * i, 0x1000); - if (pages != 0) - sha1(hashes[pages - 1], top + 0x1000 * (pages - 1), ((data - 1) % 0x1000) + 1); + if (flag_d) + _foreach(segment, mach_header.GetSegments("__TEXT")) { + printf("vmaddr=0x%x\n", mach_header.Swap(segment->vmaddr)); + printf("fileoff=0x%x\n", mach_header.Swap(segment->fileoff)); } - } - if (flag_S) { - _assert(signature != NULL); + if (flag_O) { + _foreach(section, mach_header.GetSections("__TEXT", "__text")) + section->addr = mach_header.Swap(0); + } + + _foreach (load_command, mach_header.GetLoadCommands()) { + uint32_t cmd(mach_header.Swap(load_command->cmd)); + + if (flag_R && cmd == LC_REEXPORT_DYLIB) + load_command->cmd = mach_header.Swap(LC_LOAD_DYLIB); + else if (cmd == LC_CODE_SIGNATURE) + signature = reinterpret_cast<struct linkedit_data_command *>(load_command); + else if (cmd == LC_UUID) { + volatile struct uuid_command *uuid_command(reinterpret_cast<struct uuid_command *>(load_command)); + + if (flag_u) { + printf("uuid%zu=%.2x%.2x%.2x%.2x-%.2x%.2x-%.2x%.2x-%.2x%.2x-%.2x%.2x%.2x%.2x%.2x%.2x\n", filei, + uuid_command->uuid[ 0], uuid_command->uuid[ 1], uuid_command->uuid[ 2], uuid_command->uuid[ 3], + uuid_command->uuid[ 4], uuid_command->uuid[ 5], uuid_command->uuid[ 6], uuid_command->uuid[ 7], + uuid_command->uuid[ 8], uuid_command->uuid[ 9], uuid_command->uuid[10], uuid_command->uuid[11], + uuid_command->uuid[12], uuid_command->uuid[13], uuid_command->uuid[14], uuid_command->uuid[15] + ); + } + } else if (cmd == LC_ID_DYLIB) { + volatile struct dylib_command *dylib_command(reinterpret_cast<struct dylib_command *>(load_command)); - uint32_t data = framework.Swap(signature->dataoff); - uint32_t size = framework.Swap(signature->datasize); + if (flag_t) + printf("time%zu=0x%.8x\n", filei, mach_header.Swap(dylib_command->dylib.timestamp)); - uint8_t *top = reinterpret_cast<uint8_t *>(framework.GetBase()); - uint8_t *blob = top + data; - struct SuperBlob *super = reinterpret_cast<struct SuperBlob *>(blob); - super->blob.magic = Swap(CSMAGIC_EMBEDDED_SIGNATURE); + if (flag_T) { + uint32_t timed; - uint32_t count = xmld == NULL ? 2 : 3; - uint32_t offset = sizeof(struct SuperBlob) + count * sizeof(struct BlobIndex); + if (!timeh) + timed = timev; + else { + dylib_command->dylib.timestamp = 0; + timed = hash(reinterpret_cast<uint8_t *>(mach_header.GetBase()), mach_header.GetSize(), timev); + } - super->index[0].type = Swap(CSSLOT_CODEDIRECTORY); - super->index[0].offset = Swap(offset); + dylib_command->dylib.timestamp = mach_header.Swap(timed); + } + } else if (cmd == LC_ENCRYPTION_INFO) { + volatile struct encryption_info_command *encryption_info_command(reinterpret_cast<struct encryption_info_command *>(load_command)); - uint32_t begin = offset; - struct CodeDirectory *directory = reinterpret_cast<struct CodeDirectory *>(blob + begin); - offset += sizeof(struct CodeDirectory); + if (flag_D) + encryption_info_command->cryptid = mach_header.Swap(0); - directory->blob.magic = Swap(CSMAGIC_CODEDIRECTORY); - directory->version = Swap(uint32_t(0x00020001)); - directory->flags = Swap(uint32_t(0)); - directory->codeLimit = Swap(data); - directory->hashSize = 0x14; - directory->hashType = 0x01; - directory->spare1 = 0x00; - directory->pageSize = 0x0c; - directory->spare2 = Swap(uint32_t(0)); + if (flag_d) { + printf("cryptoff=0x%x\n", mach_header.Swap(encryption_info_command->cryptoff)); + printf("cryptsize=0x%x\n", mach_header.Swap(encryption_info_command->cryptsize)); + printf("cryptid=0x%x\n", mach_header.Swap(encryption_info_command->cryptid)); + } + } + } - directory->identOffset = Swap(offset - begin); - strcpy(reinterpret_cast<char *>(blob + offset), base); - offset += strlen(base) + 1; + if (flag_e) { + _assert(signature != NULL); - uint32_t special = xmld == NULL ? CSSLOT_REQUIREMENTS : CSSLOT_ENTITLEMENTS; - directory->nSpecialSlots = Swap(special); + uint32_t data = mach_header.Swap(signature->dataoff); - uint8_t (*hashes)[20] = reinterpret_cast<uint8_t (*)[20]>(blob + offset); - memset(hashes, 0, sizeof(*hashes) * special); + uint8_t *top = reinterpret_cast<uint8_t *>(mach_header.GetBase()); + uint8_t *blob = top + data; + struct SuperBlob *super = reinterpret_cast<struct SuperBlob *>(blob); - offset += sizeof(*hashes) * special; - hashes += special; + for (size_t index(0); index != Swap(super->count); ++index) + if (Swap(super->index[index].type) == CSSLOT_ENTITLEMENTS) { + uint32_t begin = Swap(super->index[index].offset); + struct Blob *entitlements = reinterpret_cast<struct Blob *>(blob + begin); + fwrite(entitlements + 1, 1, Swap(entitlements->length) - sizeof(struct Blob), stdout); + } + } - uint32_t pages = (data + 0x1000 - 1) / 0x1000; - directory->nCodeSlots = Swap(pages); + if (flag_s) { + _assert(signature != NULL); - if (pages != 1) - for (size_t i = 0; i != pages - 1; ++i) - sha1(hashes[i], top + 0x1000 * i, 0x1000); - if (pages != 0) - sha1(hashes[pages - 1], top + 0x1000 * (pages - 1), ((data - 1) % 0x1000) + 1); + uint32_t data = mach_header.Swap(signature->dataoff); - directory->hashOffset = Swap(offset - begin); - offset += sizeof(*hashes) * pages; - directory->blob.length = Swap(offset - begin); + uint8_t *top = reinterpret_cast<uint8_t *>(mach_header.GetBase()); + uint8_t *blob = top + data; + struct SuperBlob *super = reinterpret_cast<struct SuperBlob *>(blob); - super->index[1].type = Swap(CSSLOT_REQUIREMENTS); - super->index[1].offset = Swap(offset); + for (size_t index(0); index != Swap(super->count); ++index) + if (Swap(super->index[index].type) == CSSLOT_CODEDIRECTORY) { + uint32_t begin = Swap(super->index[index].offset); + struct CodeDirectory *directory = reinterpret_cast<struct CodeDirectory *>(blob + begin); - memcpy(blob + offset, "\xfa\xde\x0c\x01\x00\x00\x00\x0c\x00\x00\x00\x00", 0xc); - offset += 0xc; + uint8_t (*hashes)[20] = reinterpret_cast<uint8_t (*)[20]>(blob + begin + Swap(directory->hashOffset)); + uint32_t pages = Swap(directory->nCodeSlots); - if (xmld != NULL) { - super->index[2].type = Swap(CSSLOT_ENTITLEMENTS); - super->index[2].offset = Swap(offset); + if (pages != 1) + for (size_t i = 0; i != pages - 1; ++i) + sha1(hashes[i], top + 0x1000 * i, 0x1000); + if (pages != 0) + sha1(hashes[pages - 1], top + 0x1000 * (pages - 1), ((data - 1) % 0x1000) + 1); + } + } + + if (flag_S) { + _assert(signature != NULL); + + uint32_t data = mach_header.Swap(signature->dataoff); + uint32_t size = mach_header.Swap(signature->datasize); + + uint8_t *top = reinterpret_cast<uint8_t *>(mach_header.GetBase()); + uint8_t *blob = top + data; + struct SuperBlob *super = reinterpret_cast<struct SuperBlob *>(blob); + super->blob.magic = Swap(CSMAGIC_EMBEDDED_SIGNATURE); + + uint32_t count = xmld == NULL ? 2 : 3; + uint32_t offset = sizeof(struct SuperBlob) + count * sizeof(struct BlobIndex); + + super->index[0].type = Swap(CSSLOT_CODEDIRECTORY); + super->index[0].offset = Swap(offset); uint32_t begin = offset; - struct Blob *entitlements = reinterpret_cast<struct Blob *>(blob + begin); - offset += sizeof(struct Blob); + struct CodeDirectory *directory = reinterpret_cast<struct CodeDirectory *>(blob + begin); + offset += sizeof(struct CodeDirectory); - memcpy(blob + offset, xmld, xmls); - offset += xmls; + directory->blob.magic = Swap(CSMAGIC_CODEDIRECTORY); + directory->version = Swap(uint32_t(0x00020001)); + directory->flags = Swap(uint32_t(0)); + directory->codeLimit = Swap(data); + directory->hashSize = 0x14; + directory->hashType = 0x01; + directory->spare1 = 0x00; + directory->pageSize = 0x0c; + directory->spare2 = Swap(uint32_t(0)); - entitlements->magic = Swap(CSMAGIC_ENTITLEMENTS); - entitlements->length = Swap(offset - begin); - } + directory->identOffset = Swap(offset - begin); + strcpy(reinterpret_cast<char *>(blob + offset), name); + offset += strlen(name) + 1; + + uint32_t special = xmld == NULL ? CSSLOT_REQUIREMENTS : CSSLOT_ENTITLEMENTS; + directory->nSpecialSlots = Swap(special); + + uint8_t (*hashes)[20] = reinterpret_cast<uint8_t (*)[20]>(blob + offset); + memset(hashes, 0, sizeof(*hashes) * special); - for (size_t index(0); index != count; ++index) { - uint32_t type = Swap(super->index[index].type); - if (type != 0 && type <= special) { - uint32_t offset = Swap(super->index[index].offset); - struct Blob *local = (struct Blob *) (blob + offset); - sha1((uint8_t *) (hashes - type), (uint8_t *) local, Swap(local->length)); + offset += sizeof(*hashes) * special; + hashes += special; + + uint32_t pages = (data + 0x1000 - 1) / 0x1000; + directory->nCodeSlots = Swap(pages); + + if (pages != 1) + for (size_t i = 0; i != pages - 1; ++i) + sha1(hashes[i], top + 0x1000 * i, 0x1000); + if (pages != 0) + sha1(hashes[pages - 1], top + 0x1000 * (pages - 1), ((data - 1) % 0x1000) + 1); + + directory->hashOffset = Swap(offset - begin); + offset += sizeof(*hashes) * pages; + directory->blob.length = Swap(offset - begin); + + super->index[1].type = Swap(CSSLOT_REQUIREMENTS); + super->index[1].offset = Swap(offset); + + memcpy(blob + offset, "\xfa\xde\x0c\x01\x00\x00\x00\x0c\x00\x00\x00\x00", 0xc); + offset += 0xc; + + if (xmld != NULL) { + super->index[2].type = Swap(CSSLOT_ENTITLEMENTS); + super->index[2].offset = Swap(offset); + + uint32_t begin = offset; + struct Blob *entitlements = reinterpret_cast<struct Blob *>(blob + begin); + offset += sizeof(struct Blob); + + memcpy(blob + offset, xmld, xmls); + offset += xmls; + + entitlements->magic = Swap(CSMAGIC_ENTITLEMENTS); + entitlements->length = Swap(offset - begin); + } + + for (size_t index(0); index != count; ++index) { + uint32_t type = Swap(super->index[index].type); + if (type != 0 && type <= special) { + uint32_t offset = Swap(super->index[index].offset); + struct Blob *local = (struct Blob *) (blob + offset); + sha1((uint8_t *) (hashes - type), (uint8_t *) local, Swap(local->length)); + } } - } - super->count = Swap(count); - super->blob.length = Swap(offset); + super->count = Swap(count); + super->blob.length = Swap(offset); - if (offset > size) { - fprintf(stderr, "offset (%u) > size (%u)\n", offset, size); - _assert(false); - } //else fprintf(stderr, "offset (%zu) <= size (%zu)\n", offset, size); + if (offset > size) { + fprintf(stderr, "offset (%u) > size (%u)\n", offset, size); + _assert(false); + } //else fprintf(stderr, "offset (%zu) <= size (%zu)\n", offset, size); - memset(blob + offset, 0, size - offset); + memset(blob + offset, 0, size - offset); + } } if (flag_S) { - uint8_t *top = reinterpret_cast<uint8_t *>(framework.GetBase()); - size_t size = framework.GetSize(); + uint8_t *top = reinterpret_cast<uint8_t *>(fat_header.GetBase()); + size_t size = fat_header.GetSize(); char *copy; asprintf(©, "%s.%s.cp", dir, base); @@ -796,7 +1341,7 @@ int main(int argc, const char *argv[]) { temp = copy; } - if (temp) { + if (temp != NULL) { struct stat info; _syscall(stat(path, &info)); _syscall(chown(temp, info.st_uid, info.st_gid)); diff --git a/util/nmedit b/util/nmedit deleted file mode 100755 index 674579e73..000000000 --- a/util/nmedit +++ /dev/null @@ -1,30 +0,0 @@ -#!/bin/bash -base=$(basename "$0") -if [[ $0 == */* ]]; then - self=${0} -else - self=$(which "$0") -fi -self=$(realpath "${self}") -which -a "${base}" | while read -r fake; do - real=$(realpath "${fake}") - if [[ ${real} != ${self} ]]; then - "${real}" "$@" - break - fi -done -declare -a file -while [[ $# -ne 0 ]]; do - case "$1" in - (-s) shift;; - (-o) outp=$2; break;; - (*) file[${#file[@]}]=$1;; - esac; shift -done -if [[ -n "${outp}" ]]; then - ldid -T- "${outp}" -else - for mach in "${file[@]}"; do - ldid -T- "${mach}" - done -fi diff --git a/util/pkg-config.sh b/util/pkg-config.sh index cc70779b0..c1dc486c1 100755 --- a/util/pkg-config.sh +++ b/util/pkg-config.sh @@ -17,7 +17,7 @@ while [[ $# -ne 0 ]]; do case "$1" in args[${#args[@]}]=$1 ;; - (--errors-to-stdout|--exists|--modversion|--print-errors|--short-errors|--uninstalled) + (--errors-to-stdout|--exists|--modversion|--print-errors|--short-errors|--uninstalled|--debug) args[${#args[@]}]=$1 ;; @@ -27,6 +27,11 @@ while [[ $# -ne 0 ]]; do case "$1" in shift ;; + (--atleast-version=*) + args[${#args[@]}]=--atleast-version + args[${#args[@]}]=$(echo $1 | cut -d = -f 2) + ;; + (--*) echo "unknown pkg-config option $1" 1>&2 exit 1 @@ -56,7 +61,7 @@ for pkg in "${pkgs[@]}"; do done | head -n 1) && args_=(--define-variable=prefix="${dest}/usr" "${args_[@]}") fi - #echo @@@ pkg-config "${args_[@]}" "${pkg}" 1>&2 + echo @@@ pkg-config "${args_[@]}" "${pkg}" 1>&2 out=$(pkg-config "${args_[@]}" "${pkg}") || exit $? #echo "=== ${out}" 1>&2 outs+=\ ${out} |