diff options
author | Yi Kong <yikong@google.com> | 2019-10-15 02:01:19 -0700 |
---|---|---|
committer | Yi Kong <yikong@google.com> | 2019-10-24 16:34:54 -0700 |
commit | c49c393f73ac6d1dd35322415dd9e719325c2307 (patch) | |
tree | 43af3fc68f2a1700548faa17e3c10249bb8eb6ca /scripts | |
parent | 8436ccea9c591b8c312555ff468c003c2d73f266 (diff) | |
download | build_soong-c49c393f73ac6d1dd35322415dd9e719325c2307.tar.gz build_soong-c49c393f73ac6d1dd35322415dd9e719325c2307.tar.bz2 build_soong-c49c393f73ac6d1dd35322415dd9e719325c2307.zip |
Repack libgcc.a to only include required objects
Previous solution by using objcopy uses a quirky behaviour of the GNU
objcopy and there is no equivalent option in llvm-objcopy.
Instead of removing symbols, extract and repack libgcc to only include
required objects.
Bug: 142585047
Test: presubmit
Change-Id: I58af74c18838f797e481da38c3265f0624fddf99
Diffstat (limited to 'scripts')
-rwxr-xr-x | scripts/archive_repack.sh | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/scripts/archive_repack.sh b/scripts/archive_repack.sh new file mode 100755 index 00000000..f09372dd --- /dev/null +++ b/scripts/archive_repack.sh @@ -0,0 +1,87 @@ +#!/bin/bash -e + +# Copyright 2019 Google Inc. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Script to extract and repack an archive with specified object files. +# Inputs: +# Environment: +# CLANG_BIN: path to the clang bin directory +# Arguments: +# -i ${file}: input file +# -o ${file}: output file +# -d ${file}: deps file + +set -o pipefail + +OPTSTRING=d:i:o: + +usage() { + cat <<EOF +Usage: archive_repack.sh [options] <objects to repack> + +OPTIONS: + -i <file>: input file + -o <file>: output file + -d <file>: deps file +EOF + exit 1 +} + +while getopts $OPTSTRING opt; do + case "$opt" in + d) depsfile="${OPTARG}" ;; + i) infile="${OPTARG}" ;; + o) outfile="${OPTARG}" ;; + ?) usage ;; + esac +done +shift "$(($OPTIND -1))" + +if [ -z "${infile}" ]; then + echo "-i argument is required" + usage +fi + +if [ -z "${outfile}" ]; then + echo "-o argument is required" + usage +fi + +# Produce deps file +if [ ! -z "${depsfile}" ]; then + cat <<EOF > "${depsfile}" +${outfile}: ${infile} ${CLANG_BIN}/llvm-ar +EOF +fi + +# Get absolute path for outfile and llvm-ar. +LLVM_AR="${PWD}/${CLANG_BIN}/llvm-ar" +if [[ "$outfile" != /* ]]; then + outfile="${PWD}/${outfile}" +fi + +tempdir="${outfile}.tmp" + +# Clean up any previous temporary files. +rm -f "${outfile}" +rm -rf "${tempdir}" + +# Do repack +# We have to change working directory since ar only allows extracting to CWD. +mkdir "${tempdir}" +cp "${infile}" "${tempdir}/archive" +cd "${tempdir}" +"${LLVM_AR}" x "archive" +"${LLVM_AR}" --format=gnu qc "${outfile}" "$@" |