Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b496cfd9 authored by Colin Cross's avatar Colin Cross
Browse files

Enable toc support for Darwin and Windows

Bug: 113936524
Test: m checkbuild
Change-Id: I0f2030ad75daae2cbe44e8cbedad329d33df55f7
parent 7b59e7b2
Loading
Loading
Loading
Loading
+15 −3
Original line number Diff line number Diff line
@@ -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{
@@ -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,
@@ -768,6 +779,7 @@ func TransformSharedObjectToToc(ctx android.ModuleContext, inputFile android.Pat
		Input:       inputFile,
		Args: map[string]string{
			"crossCompile": crossCompile,
			"format":       format,
		},
	})
}
+7 −9
Original line number Diff line number Diff line
@@ -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()
@@ -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.
+43 −5
Original line number Diff line number Diff line
@@ -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:-:

@@ -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
@@ -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 ;;
@@ -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}"
@@ -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"