• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#!/bin/bash
2
3# Copyright 2023 Google LLC
4#
5# Redistribution and use in source and binary forms, with or without
6# modification, are permitted provided that the following conditions are
7# met:
8#
9#     * Redistributions of source code must retain the above copyright
10# notice, this list of conditions and the following disclaimer.
11#     * Redistributions in binary form must reproduce the above
12# copyright notice, this list of conditions and the following disclaimer
13# in the documentation and/or other materials provided with the
14# distribution.
15#     * Neither the name of Google LLC nor the names of its
16# contributors may be used to endorse or promote products derived from
17# this software without specific prior written permission.
18#
19# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30
31# Finds the dyld_shared_cache on a system, extracts it, and dumps the symbols
32# in Breakpad format to the directory passed as the first argument
33# The script must be in the same directory as `dump_syms`,
34# `upload_system_symbols` and `dsc_extractor` binaries.
35# Exits with 0 if all supported architectures for this OS version were found and
36# dumped, and nonzero otherwise.
37
38set -ex
39
40if [[ $# -ne 1 ]]; then
41  echo "usage: $0 <destination_directory>" >& 2
42  exit 1
43fi
44
45destination_dir="$1"
46
47dir="$(dirname "$0")"
48dir="$(cd "${dir}"; pwd)"
49major_version=$(sw_vers -productVersion | cut -d . -f 1)
50if [[ "${major_version}" -lt 13 ]]; then
51  dsc_directory="/System/Library/dyld"
52else
53  dsc_directory="/System/Volumes/Preboot/Cryptexes/OS/System/Library/dyld"
54fi
55
56working_dir=$(mktemp -d)
57mkdir "${destination_dir}"
58trap 'rm -rf "${working_dir}" "${destination_dir}"' EXIT
59
60architectures=(x86_64h)
61missing_architectures=()
62# macOS >= 13 on arm64 still has a x86_64 cache for Rosetta.
63if [[ "${major_version}" -lt 13 ]] || [[ $(uname -p) == "arm" ]]; then
64  architectures+=( x86_64 )
65fi
66if [[ "${major_version}" -ge 11 ]]; then
67  architectures+=( arm64e )
68fi
69
70for arch in "${architectures[@]}"; do
71  cache="${dsc_directory}/dyld_shared_cache_${arch}"
72  if [[ ! -f "${cache}" ]]; then
73    missing_architectures+=("${arch}")
74    continue
75  fi
76  "${dir}/dsc_extractor" \
77      "${cache}" \
78      "${working_dir}/${arch}"
79  "${dir}/upload_system_symbols" \
80      --breakpad-tools="${dir}" \
81      --system-root="${working_dir}/${arch}" \
82      --dump-to="${destination_dir}"
83done
84if [[ "${#missing_architectures[@]}" -eq "${#architectures[@]}" ]]; then
85  echo "Couldn't locate dyld_shared_cache for any architectures" >& 2
86  echo "in ${dsc_directory}. Exiting." >& 2
87  exit 1
88fi
89
90rm -rf "${working_dir}"
91# We have results now, so let's keep `destination_dir`.
92trap '' EXIT
93
94"${dir}/upload_system_symbols" \
95    --breakpad-tools="${dir}" \
96    --system-root=/ \
97    --dump-to="${destination_dir}"
98
99set +x
100echo
101echo "Dumped!"
102echo "To upload, run:"
103echo
104echo "'${dir}/upload_system_symbols'" \\
105echo "    --breakpad-tools='${dir}'" \\
106echo "    --api-key=<YOUR API KEY>" \\
107echo "    --upload-from='${destination_dir}'"
108
109if [[ "${#missing_architectures[@]}" -gt 0 ]]; then
110  echo "dyld_shared_cache not found for architecture(s):" >& 2
111  echo "  " "${missing_architectures[@]}" >& 2
112  echo "You'll need to get symbols for them elsewhere." >& 2
113  exit 1
114fi
115