diff --git a/cc/builder.go b/cc/builder.go index ad7e1e6ac..054201567 100644 --- a/cc/builder.go +++ b/cc/builder.go @@ -126,15 +126,22 @@ var ( _ = pctx.SourcePathVariable("stripPath", "build/soong/scripts/strip.sh") _ = pctx.SourcePathVariable("xzCmd", "prebuilts/build-tools/${config.HostPrebuiltTag}/bin/xz") + _ = pctx.SourcePathVariable("createMiniDebugInfo", "prebuilts/build-tools/${config.HostPrebuiltTag}/bin/create_minidebuginfo") // Rule to invoke `strip` (to discard symbols and data from object files). strip = pctx.AndroidStaticRule("strip", blueprint.RuleParams{ - Depfile: "${out}.d", - Deps: blueprint.DepsGCC, - Command: "XZ=$xzCmd CLANG_BIN=${config.ClangBin} $stripPath ${args} -i ${in} -o ${out} -d ${out}.d", - CommandDeps: []string{"$stripPath", "$xzCmd"}, - Pool: darwinStripPool, + Depfile: "${out}.d", + Deps: blueprint.DepsGCC, + Command: "XZ=$xzCmd CREATE_MINIDEBUGINFO=$createMiniDebugInfo CLANG_BIN=${config.ClangBin} $stripPath ${args} -i ${in} -o ${out} -d ${out}.d", + CommandDeps: func() []string { + if runtime.GOOS != "darwin" { + return []string{"$stripPath", "$xzCmd", "$createMiniDebugInfo"} + } else { + return []string{"$stripPath", "$xzCmd"} + } + }(), + Pool: darwinStripPool, }, "args", "crossCompile") diff --git a/cc/makevars.go b/cc/makevars.go index fa0b2ccce..2b7bb9bb6 100644 --- a/cc/makevars.go +++ b/cc/makevars.go @@ -151,6 +151,7 @@ func makeVarsProvider(ctx android.MakeVarsContext) { ctx.Strict("SOONG_STRIP_PATH", "${stripPath}") ctx.Strict("XZ", "${xzCmd}") + ctx.Strict("CREATE_MINIDEBUGINFO", "${createMiniDebugInfo}") includeFlags, err := ctx.Eval("${config.CommonGlobalIncludes}") if err != nil { diff --git a/scripts/strip.sh b/scripts/strip.sh index e3e527381..d09c187b1 100755 --- a/scripts/strip.sh +++ b/scripts/strip.sh @@ -71,7 +71,7 @@ do_strip_keep_symbol_list() { "${CLANG_BIN}/llvm-objcopy" -w "${infile}" "${outfile}.tmp" ${KEEP_SYMBOLS} } -do_strip_keep_mini_debug_info() { +do_strip_keep_mini_debug_info_darwin() { rm -f "${outfile}.dynsyms" "${outfile}.funcsyms" "${outfile}.keep_symbols" "${outfile}.debug" "${outfile}.mini_debuginfo" "${outfile}.mini_debuginfo.xz" local fail= "${CLANG_BIN}/llvm-strip" --strip-all --keep-section=.ARM.attributes --remove-section=.comment "${infile}" -o "${outfile}.tmp" || fail=true @@ -92,6 +92,32 @@ do_strip_keep_mini_debug_info() { fi } +do_strip_keep_mini_debug_info_linux() { + rm -f "${outfile}.mini_debuginfo.xz" + local fail= + "${CLANG_BIN}/llvm-strip" --strip-all --keep-section=.ARM.attributes --remove-section=.comment "${infile}" -o "${outfile}.tmp" || fail=true + + if [ -z $fail ]; then + "${CREATE_MINIDEBUGINFO}" "${infile}" "${outfile}.mini_debuginfo.xz" + "${CLANG_BIN}/llvm-objcopy" --add-section .gnu_debugdata="${outfile}.mini_debuginfo.xz" "${outfile}.tmp" + rm -f "${outfile}.mini_debuginfo.xz" + else + cp -f "${infile}" "${outfile}.tmp" + fi +} + +do_strip_keep_mini_debug_info() { + case $(uname) in + Linux) + do_strip_keep_mini_debug_info_linux + ;; + Darwin) + do_strip_keep_mini_debug_info_darwin + ;; + *) echo "unknown OS:" $(uname) >&2 && exit 1;; + esac +} + do_add_gnu_debuglink() { "${CLANG_BIN}/llvm-objcopy" --add-gnu-debuglink="${infile}" "${outfile}.tmp" }