diff --git a/android/api_levels.go b/android/api_levels.go index 9bc7e837b..84ab27c4c 100644 --- a/android/api_levels.go +++ b/android/api_levels.go @@ -158,6 +158,21 @@ var NoneApiLevel = ApiLevel{ // The first version that introduced 64-bit ABIs. var FirstLp64Version = uncheckedFinalApiLevel(21) +// Android has had various kinds of packed relocations over the years +// (http://b/187907243). +// +// API level 30 is where the now-standard SHT_RELR is available. +var FirstShtRelrVersion = uncheckedFinalApiLevel(30) + +// API level 28 introduced SHT_RELR when it was still Android-only, and used an +// Android-specific relocation. +var FirstAndroidRelrVersion = uncheckedFinalApiLevel(28) + +// API level 23 was when we first had the Chrome relocation packer, which is +// obsolete and has been removed, but lld can now generate compatible packed +// relocations itself. +var FirstPackedRelocationsVersion = uncheckedFinalApiLevel(23) + // The first API level that does not require NDK code to link // libandroid_support. var FirstNonLibAndroidSupportVersion = uncheckedFinalApiLevel(21) diff --git a/cc/linker.go b/cc/linker.go index a9930ada0..196806d33 100644 --- a/cc/linker.go +++ b/cc/linker.go @@ -18,7 +18,6 @@ import ( "android/soong/android" "android/soong/cc/config" "fmt" - "strconv" "github.com/google/blueprint" "github.com/google/blueprint/proptools" @@ -390,17 +389,17 @@ func (linker *baseLinker) useClangLld(ctx ModuleContext) bool { } // Check whether the SDK version is not older than the specific one -func CheckSdkVersionAtLeast(ctx ModuleContext, SdkVersion int) bool { - if ctx.sdkVersion() == "current" { +func CheckSdkVersionAtLeast(ctx ModuleContext, SdkVersion android.ApiLevel) bool { + if ctx.minSdkVersion() == "current" { return true } - parsedSdkVersion, err := strconv.Atoi(ctx.sdkVersion()) + parsedSdkVersion, err := android.ApiLevelFromUser(ctx, ctx.minSdkVersion()) if err != nil { - ctx.PropertyErrorf("sdk_version", - "Invalid sdk_version value (must be int or current): %q", - ctx.sdkVersion()) + ctx.PropertyErrorf("min_sdk_version", + "Invalid min_sdk_version value (must be int or current): %q", + ctx.minSdkVersion()) } - if parsedSdkVersion < SdkVersion { + if parsedSdkVersion.LessThan(SdkVersion) { return false } return true @@ -425,13 +424,13 @@ func (linker *baseLinker) linkerFlags(ctx ModuleContext, flags Flags) Flags { // ANDROID_RELR relocations were supported at API level >= 28. // Relocation packer was supported at API level >= 23. // Do the best we can... - if !ctx.useSdk() || CheckSdkVersionAtLeast(ctx, 30) { + if !ctx.useSdk() || CheckSdkVersionAtLeast(ctx, android.FirstShtRelrVersion) { flags.Global.LdFlags = append(flags.Global.LdFlags, "-Wl,--pack-dyn-relocs=android+relr") - } else if CheckSdkVersionAtLeast(ctx, 28) { + } else if CheckSdkVersionAtLeast(ctx, android.FirstAndroidRelrVersion) { flags.Global.LdFlags = append(flags.Global.LdFlags, "-Wl,--pack-dyn-relocs=android+relr", "-Wl,--use-android-relr-tags") - } else if CheckSdkVersionAtLeast(ctx, 23) { + } else if CheckSdkVersionAtLeast(ctx, android.FirstPackedRelocationsVersion) { flags.Global.LdFlags = append(flags.Global.LdFlags, "-Wl,--pack-dyn-relocs=android") } }