Recovery partition uses the first architecture only

To save space in the recovery partition, modules installed to the
partition are restricted to be built in the first architecure (i.e.,
32bit for 32bit-only device or when TARGET_PREFER_32_BIT is true, and
64bit otherwise).

Most notably, this change removes the 32-bit variant of the linker
(about 1MB). The linker was installed regardless of whether there is a
32-bit executable or not. Now, the unnecessary linker is not installed
and it is guaranteed that all modules in the partition are built with the
same architecture.

Bug: 79146551
Test: m -j
Test: out/target/product/<name>/recovery/root/system/bin/ has only one
variant of the linker.

Change-Id: I4070a43555bad4cfa8eff5253b09dcd004ea8251
diff --git a/cc/cc.go b/cc/cc.go
index 6438bcd..b7183d7 100644
--- a/cc/cc.go
+++ b/cc/cc.go
@@ -1569,6 +1569,19 @@
 				recoveryVariantNeeded = true
 			}
 
+			if recoveryVariantNeeded {
+				var recoveryMultilib string
+				if mctx.Config().DevicePrefer32BitExecutables() {
+					recoveryMultilib = "lib32"
+				} else {
+					recoveryMultilib = "lib64"
+				}
+				multilib := genrule.Target().Arch.ArchType.Multilib
+				if multilib != recoveryMultilib {
+					recoveryVariantNeeded = false
+				}
+			}
+
 			var variants []string
 			if coreVariantNeeded {
 				variants = append(variants, coreMode)
@@ -1676,6 +1689,19 @@
 		coreVariantNeeded = false
 	}
 
+	if recoveryVariantNeeded {
+		var recoveryMultilib string
+		if mctx.Config().DevicePrefer32BitExecutables() {
+			recoveryMultilib = "lib32"
+		} else {
+			recoveryMultilib = "lib64"
+		}
+		multilib := m.Target().Arch.ArchType.Multilib
+		if multilib != recoveryMultilib {
+			recoveryVariantNeeded = false
+		}
+	}
+
 	var variants []string
 	if coreVariantNeeded {
 		variants = append(variants, coreMode)