Loading cc/builder.go +15 −3 Original line number Diff line number Diff line Loading @@ -144,11 +144,11 @@ var ( blueprint.RuleParams{ Depfile: "${out}.d", Deps: blueprint.DepsGCC, Command: "CROSS_COMPILE=$crossCompile $tocPath -i ${in} -o ${out} -d ${out}.d", Command: "CROSS_COMPILE=$crossCompile $tocPath $format -i ${in} -o ${out} -d ${out}.d", CommandDeps: []string{"$tocPath"}, Restat: true, }, "crossCompile") "crossCompile", "format") clangTidy = pctx.AndroidStaticRule("clangTidy", blueprint.RuleParams{ Loading Loading @@ -759,7 +759,18 @@ func SourceAbiDiff(ctx android.ModuleContext, inputDump android.Path, referenceD func TransformSharedObjectToToc(ctx android.ModuleContext, inputFile android.Path, outputFile android.WritablePath, flags builderFlags) { crossCompile := gccCmd(flags.toolchain, "") var format string var crossCompile string if ctx.Darwin() { format = "--macho" crossCompile = "${config.MacToolPath}" } else if ctx.Windows() { format = "--pe" crossCompile = gccCmd(flags.toolchain, "") } else { format = "--elf" crossCompile = gccCmd(flags.toolchain, "") } ctx.Build(pctx, android.BuildParams{ Rule: toc, Loading @@ -768,6 +779,7 @@ func TransformSharedObjectToToc(ctx android.ModuleContext, inputFile android.Pat Input: inputFile, Args: map[string]string{ "crossCompile": crossCompile, "format": format, }, }) } Loading cc/library.go +7 −9 Original line number Diff line number Diff line Loading @@ -544,7 +544,6 @@ func (library *libraryDecorator) linkShared(ctx ModuleContext, builderFlags := flagsToBuilderFlags(flags) if !ctx.Darwin() && !ctx.Windows() { // Optimize out relinking against shared libraries whose interface hasn't changed by // depending on a table of contents file instead of the library itself. tocPath := outputFile.RelPathString() Loading @@ -552,7 +551,6 @@ func (library *libraryDecorator) linkShared(ctx ModuleContext, tocFile := android.PathForOutput(ctx, tocPath) library.tocFile = android.OptionalPathForPath(tocFile) TransformSharedObjectToToc(ctx, outputFile, tocFile, builderFlags) } if library.stripper.needsStrip(ctx) { // b/80093681, GNU strip/objcopy bug. Loading scripts/toc.sh +43 −5 Original line number Diff line number Diff line Loading @@ -22,6 +22,7 @@ # -i ${file}: input file (required) # -o ${file}: output file (required) # -d ${file}: deps file (required) # --elf | --macho | --pe: format (required) OPTSTRING=d:i:o:-: Loading @@ -36,13 +37,34 @@ EOF do_elf() { ("${CROSS_COMPILE}readelf" -d "${infile}" | grep SONAME || echo "No SONAME for ${infile}") > "${outfile}.tmp" "${CROSS_COMPILE}readelf" --dyn-syms "${infile}" | awk '{$2=""; $3=""; print}' >> "${outfile}.tmp" cat <<EOF > "${depsfile}" ${outfile}: \\ ${CROSS_COMPILE}readelf \\ EOF } do_macho() { "${CROSS_COMPILE}/otool" -l "${infile}" | grep LC_ID_DYLIB -A 5 > "${outfile}.tmp" "${CROSS_COMPILE}/nm" -gP "${infile}" | cut -f1-2 -d" " | grep -v 'U$' >> "${outfile}.tmp" "${CROSS_COMPILE}/nm" -gP "${infile}" | cut -f1-2 -d" " | (grep -v 'U$' >> "${outfile}.tmp" || true) cat <<EOF > "${depsfile}" ${outfile}: \\ ${CROSS_COMPILE}/otool \\ ${CROSS_COMPILE}/nm \\ EOF } do_pe() { "${CROSS_COMPILE}objdump" -x "${infile}" | grep "^Name" | cut -f3 -d" " > "${outfile}.tmp" "${CROSS_COMPILE}nm" -g -f p "${infile}" | cut -f1-2 -d" " >> "${outfile}.tmp" cat <<EOF > "${depsfile}" ${outfile}: \\ ${CROSS_COMPILE}objdump \\ ${CROSS_COMPILE}nm \\ EOF } while getopts $OPTSTRING opt; do case "$opt" in Loading @@ -51,6 +73,9 @@ while getopts $OPTSTRING opt; do o) outfile="${OPTARG}" ;; -) case "${OPTARG}" in elf) elf=1 ;; macho) macho=1 ;; pe) pe=1 ;; *) echo "Unknown option --${OPTARG}"; usage ;; esac;; ?) usage ;; Loading @@ -58,21 +83,26 @@ while getopts $OPTSTRING opt; do esac done if [ -z "${infile}" ]; then if [ -z "${infile:-}" ]; then echo "-i argument is required" usage fi if [ -z "${outfile}" ]; then if [ -z "${outfile:-}" ]; then echo "-o argument is required" usage fi if [ -z "${depsfile}" ]; then if [ -z "${depsfile:-}" ]; then echo "-d argument is required" usage fi if [ -z "${CROSS_COMPILE:-}" ]; then echo "CROSS_COMPILE environment variable must be set" usage fi rm -f "${outfile}.tmp" cat <<EOF > "${depsfile}" Loading @@ -80,7 +110,15 @@ ${outfile}: \\ ${CROSS_COMPILE}readelf \\ EOF if [ -n "${elf:-}" ]; then do_elf elif [ -n "${macho:-}" ]; then do_macho elif [ -n "${pe:-}" ]; then do_pe else echo "--elf, --macho or --pe is required"; usage fi if cmp "${outfile}" "${outfile}.tmp" > /dev/null 2> /dev/null; then rm -f "${outfile}.tmp" Loading Loading
cc/builder.go +15 −3 Original line number Diff line number Diff line Loading @@ -144,11 +144,11 @@ var ( blueprint.RuleParams{ Depfile: "${out}.d", Deps: blueprint.DepsGCC, Command: "CROSS_COMPILE=$crossCompile $tocPath -i ${in} -o ${out} -d ${out}.d", Command: "CROSS_COMPILE=$crossCompile $tocPath $format -i ${in} -o ${out} -d ${out}.d", CommandDeps: []string{"$tocPath"}, Restat: true, }, "crossCompile") "crossCompile", "format") clangTidy = pctx.AndroidStaticRule("clangTidy", blueprint.RuleParams{ Loading Loading @@ -759,7 +759,18 @@ func SourceAbiDiff(ctx android.ModuleContext, inputDump android.Path, referenceD func TransformSharedObjectToToc(ctx android.ModuleContext, inputFile android.Path, outputFile android.WritablePath, flags builderFlags) { crossCompile := gccCmd(flags.toolchain, "") var format string var crossCompile string if ctx.Darwin() { format = "--macho" crossCompile = "${config.MacToolPath}" } else if ctx.Windows() { format = "--pe" crossCompile = gccCmd(flags.toolchain, "") } else { format = "--elf" crossCompile = gccCmd(flags.toolchain, "") } ctx.Build(pctx, android.BuildParams{ Rule: toc, Loading @@ -768,6 +779,7 @@ func TransformSharedObjectToToc(ctx android.ModuleContext, inputFile android.Pat Input: inputFile, Args: map[string]string{ "crossCompile": crossCompile, "format": format, }, }) } Loading
cc/library.go +7 −9 Original line number Diff line number Diff line Loading @@ -544,7 +544,6 @@ func (library *libraryDecorator) linkShared(ctx ModuleContext, builderFlags := flagsToBuilderFlags(flags) if !ctx.Darwin() && !ctx.Windows() { // Optimize out relinking against shared libraries whose interface hasn't changed by // depending on a table of contents file instead of the library itself. tocPath := outputFile.RelPathString() Loading @@ -552,7 +551,6 @@ func (library *libraryDecorator) linkShared(ctx ModuleContext, tocFile := android.PathForOutput(ctx, tocPath) library.tocFile = android.OptionalPathForPath(tocFile) TransformSharedObjectToToc(ctx, outputFile, tocFile, builderFlags) } if library.stripper.needsStrip(ctx) { // b/80093681, GNU strip/objcopy bug. Loading
scripts/toc.sh +43 −5 Original line number Diff line number Diff line Loading @@ -22,6 +22,7 @@ # -i ${file}: input file (required) # -o ${file}: output file (required) # -d ${file}: deps file (required) # --elf | --macho | --pe: format (required) OPTSTRING=d:i:o:-: Loading @@ -36,13 +37,34 @@ EOF do_elf() { ("${CROSS_COMPILE}readelf" -d "${infile}" | grep SONAME || echo "No SONAME for ${infile}") > "${outfile}.tmp" "${CROSS_COMPILE}readelf" --dyn-syms "${infile}" | awk '{$2=""; $3=""; print}' >> "${outfile}.tmp" cat <<EOF > "${depsfile}" ${outfile}: \\ ${CROSS_COMPILE}readelf \\ EOF } do_macho() { "${CROSS_COMPILE}/otool" -l "${infile}" | grep LC_ID_DYLIB -A 5 > "${outfile}.tmp" "${CROSS_COMPILE}/nm" -gP "${infile}" | cut -f1-2 -d" " | grep -v 'U$' >> "${outfile}.tmp" "${CROSS_COMPILE}/nm" -gP "${infile}" | cut -f1-2 -d" " | (grep -v 'U$' >> "${outfile}.tmp" || true) cat <<EOF > "${depsfile}" ${outfile}: \\ ${CROSS_COMPILE}/otool \\ ${CROSS_COMPILE}/nm \\ EOF } do_pe() { "${CROSS_COMPILE}objdump" -x "${infile}" | grep "^Name" | cut -f3 -d" " > "${outfile}.tmp" "${CROSS_COMPILE}nm" -g -f p "${infile}" | cut -f1-2 -d" " >> "${outfile}.tmp" cat <<EOF > "${depsfile}" ${outfile}: \\ ${CROSS_COMPILE}objdump \\ ${CROSS_COMPILE}nm \\ EOF } while getopts $OPTSTRING opt; do case "$opt" in Loading @@ -51,6 +73,9 @@ while getopts $OPTSTRING opt; do o) outfile="${OPTARG}" ;; -) case "${OPTARG}" in elf) elf=1 ;; macho) macho=1 ;; pe) pe=1 ;; *) echo "Unknown option --${OPTARG}"; usage ;; esac;; ?) usage ;; Loading @@ -58,21 +83,26 @@ while getopts $OPTSTRING opt; do esac done if [ -z "${infile}" ]; then if [ -z "${infile:-}" ]; then echo "-i argument is required" usage fi if [ -z "${outfile}" ]; then if [ -z "${outfile:-}" ]; then echo "-o argument is required" usage fi if [ -z "${depsfile}" ]; then if [ -z "${depsfile:-}" ]; then echo "-d argument is required" usage fi if [ -z "${CROSS_COMPILE:-}" ]; then echo "CROSS_COMPILE environment variable must be set" usage fi rm -f "${outfile}.tmp" cat <<EOF > "${depsfile}" Loading @@ -80,7 +110,15 @@ ${outfile}: \\ ${CROSS_COMPILE}readelf \\ EOF if [ -n "${elf:-}" ]; then do_elf elif [ -n "${macho:-}" ]; then do_macho elif [ -n "${pe:-}" ]; then do_pe else echo "--elf, --macho or --pe is required"; usage fi if cmp "${outfile}" "${outfile}.tmp" > /dev/null 2> /dev/null; then rm -f "${outfile}.tmp" Loading