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())
}