Stop versioning NDK stubs pre-M.

Test: make ndk # readelf various stubs to check version info
Bug: https://github.com/android-ndk/ndk/issues/622
Merged-In: Ic2930cfe5ee8377bb89bfb1bc051b6975f6e57d3
Change-Id: Ic2930cfe5ee8377bb89bfb1bc051b6975f6e57d3
diff --git a/cc/ndk_library.go b/cc/ndk_library.go
index 5a76666..db96325 100644
--- a/cc/ndk_library.go
+++ b/cc/ndk_library.go
@@ -156,11 +156,11 @@
 	return strconv.Atoi(firstSupportedVersion)
 }
 
-func shouldUseVersionScript(stub *stubDecorator) (bool, error) {
-	// unversioned_until is normally empty, in which case we should use the version script.
-	if String(stub.properties.Unversioned_until) == "" {
-		return true, nil
-	}
+func shouldUseVersionScript(ctx android.BaseContext, stub *stubDecorator) (bool, error) {
+	// https://github.com/android-ndk/ndk/issues/622
+	// The loader spews warnings to stderr on L-MR1 when loading a library that
+	// has symbol versioning.
+	firstVersionSupportingRelease := 23
 
 	if String(stub.properties.Unversioned_until) == "current" {
 		if stub.properties.ApiLevel == "current" {
@@ -174,16 +174,31 @@
 		return true, nil
 	}
 
-	unversionedUntil, err := strconv.Atoi(String(stub.properties.Unversioned_until))
+	version, err := android.ApiStrToNum(ctx, stub.properties.ApiLevel)
 	if err != nil {
 		return true, err
 	}
 
-	version, err := strconv.Atoi(stub.properties.ApiLevel)
+	// unversioned_until is normally empty, in which case we use the version
+	// script as long as we are on a supported API level.
+	if String(stub.properties.Unversioned_until) == "" {
+		return version >= firstVersionSupportingRelease, nil
+	}
+
+	unversionedUntil, err := android.ApiStrToNum(ctx, String(stub.properties.Unversioned_until))
 	if err != nil {
 		return true, err
 	}
 
+	if unversionedUntil < firstVersionSupportingRelease {
+		return true, fmt.Errorf("unversioned_until must be at least %d",
+			firstVersionSupportingRelease)
+	}
+
+	if version < firstVersionSupportingRelease {
+		return false, nil
+	}
+
 	return version >= unversionedUntil, nil
 }
 
@@ -318,7 +333,7 @@
 func (stub *stubDecorator) link(ctx ModuleContext, flags Flags, deps PathDeps,
 	objs Objects) android.Path {
 
-	useVersionScript, err := shouldUseVersionScript(stub)
+	useVersionScript, err := shouldUseVersionScript(ctx, stub)
 	if err != nil {
 		ctx.ModuleErrorf(err.Error())
 	}