Home | History | Annotate | Download | only in mac
      1 #!/bin/bash
      2 
      3 # Copyright (c) 2012 The Chromium Authors. All rights reserved.
      4 # Use of this source code is governed by a BSD-style license that can be
      5 # found in the LICENSE file.
      6 
      7 # Usage: make_more_helpers.sh <directory_within_contents> <app_name>
      8 #
      9 # This script creates additional helper .app bundles for Chromium, based on
     10 # the existing helper .app bundle, changing their Mach-O header's flags to
     11 # enable and disable various features. Based on Chromium Helper.app, it will
     12 # create Chromium Helper EH.app, which has the MH_NO_HEAP_EXECUTION bit
     13 # cleared to support Chromium child processes that require an executable heap,
     14 # and Chromium Helper NP.app, which has the MH_PIE bit cleared to support
     15 # Chromium child processes that cannot tolerate ASLR.
     16 #
     17 # This script expects to be called from the chrome_exe target as a postbuild,
     18 # and operates directly within the built-up browser app's versioned directory.
     19 #
     20 # Each helper is adjusted by giving it the proper bundle name, renaming the
     21 # executable, adjusting several Info.plist keys, and changing the executable's
     22 # Mach-O flags.
     23 
     24 set -eu
     25 
     26 make_helper() {
     27   local containing_dir="${1}"
     28   local app_name="${2}"
     29   local feature="${3}"
     30   local flags="${4}"
     31 
     32   local helper_name="${app_name} Helper"
     33   local helper_stem="${containing_dir}/${helper_name}"
     34   local original_helper="${helper_stem}.app"
     35   if [[ ! -d "${original_helper}" ]]; then
     36     echo "${0}: error: ${original_helper} is a required directory" >& 2
     37     exit 1
     38   fi
     39   local original_helper_exe="${original_helper}/Contents/MacOS/${helper_name}"
     40   if [[ ! -f "${original_helper_exe}" ]]; then
     41     echo "${0}: error: ${original_helper_exe} is a required file" >& 2
     42     exit 1
     43   fi
     44 
     45   local feature_helper="${helper_stem} ${feature}.app"
     46 
     47   rsync -acC --delete --include '*.so' "${original_helper}/" "${feature_helper}"
     48 
     49   local helper_feature="${helper_name} ${feature}"
     50   local helper_feature_exe="${feature_helper}/Contents/MacOS/${helper_feature}"
     51   mv "${feature_helper}/Contents/MacOS/${helper_name}" "${helper_feature_exe}"
     52 
     53   local change_flags="$(dirname "${0}")/change_mach_o_flags.py"
     54   "${change_flags}" ${flags} "${helper_feature_exe}"
     55 
     56   local feature_info="${feature_helper}/Contents/Info"
     57   local feature_info_plist="${feature_info}.plist"
     58 
     59   defaults write "${feature_info}" "CFBundleDisplayName" "${helper_feature}"
     60   defaults write "${feature_info}" "CFBundleExecutable" "${helper_feature}"
     61 
     62   cfbundleid="$(defaults read "${feature_info}" "CFBundleIdentifier")"
     63   feature_cfbundleid="${cfbundleid}.${feature}"
     64   defaults write "${feature_info}" "CFBundleIdentifier" "${feature_cfbundleid}"
     65 
     66   cfbundlename="$(defaults read "${feature_info}" "CFBundleName")"
     67   feature_cfbundlename="${cfbundlename} ${feature}"
     68   defaults write "${feature_info}" "CFBundleName" "${feature_cfbundlename}"
     69 
     70   # As usual, defaults might have put the plist into whatever format excites
     71   # it, but Info.plists get converted back to the expected XML format.
     72   plutil -convert xml1 "${feature_info_plist}"
     73 
     74   # `defaults` also changes the file permissions, so make the file
     75   # world-readable again.
     76   chmod a+r "${feature_info_plist}"
     77 }
     78 
     79 if [[ ${#} -ne 2 ]]; then
     80   echo "usage: ${0} <directory_within_contents> <app_name>" >& 2
     81   exit 1
     82 fi
     83 
     84 DIRECTORY_WITHIN_CONTENTS="${1}"
     85 APP_NAME="${2}"
     86 
     87 CONTENTS_DIR="${BUILT_PRODUCTS_DIR}/${CONTENTS_FOLDER_PATH}"
     88 CONTAINING_DIR="${CONTENTS_DIR}/${DIRECTORY_WITHIN_CONTENTS}"
     89 
     90 make_helper "${CONTAINING_DIR}" "${APP_NAME}" "EH" "--executable-heap"
     91 make_helper "${CONTAINING_DIR}" "${APP_NAME}" "NP" "--no-pie"
     92