Android Release - Link Error - Aws::Utils::EnumParseOverflowContainer

Hello,

I’m back on trying to get an Android Clang Release build up and running, and I’m running into a linker error:

c:\Amazon\Lumberyard\1.11.1.0\dev\Code\SDKs\AWSNativeSDK\lib\android\ndk_r12\android-21\armeabi-v7a\clang-3.8\Release/libaws-cpp-sdk-cognito-identity.a(ub_COGNITO-IDENTITY.cpp.o):/var/lib/jenkins/jobs/AndroidArm32Sta/workspace/aws-sdk-cpp/_build_android_arm_32_static_release/aws-cpp-sdk-cognito-identity/ub_COGNITO-IDENTITY.cpp:function Aws::CognitoIdentity::Model::RoleMappingTypeMapper::GetRoleMappingTypeForName(std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, Aws::Allocator<char> > const&): error: undefined reference to 'Aws::Utils::EnumParseOverflowContainer::StoreOverflow(int, std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, Aws::Allocator<char> > const&)'
c:\Amazon\Lumberyard\1.11.1.0\dev\Code\SDKs\AWSNativeSDK\lib\android\ndk_r12\android-21\armeabi-v7a\clang-3.8\Release/libaws-cpp-sdk-cognito-identity.a(ub_COGNITO-IDENTITY.cpp.o):/var/lib/jenkins/jobs/AndroidArm32Sta/workspace/aws-sdk-cpp/_build_android_arm_32_static_release/aws-cpp-sdk-cognito-identity/ub_COGNITO-IDENTITY.cpp:function Aws::CognitoIdentity::Model::RoleMappingTypeMapper::GetNameForRoleMappingType(Aws::CognitoIdentity::Model::RoleMappingType): error: undefined reference to 'Aws::Utils::EnumParseOverflowContainer::RetrieveOverflow(int) const'
c:\Amazon\Lumberyard\1.11.1.0\dev\Code\SDKs\AWSNativeSDK\lib\android\ndk_r12\android-21\armeabi-v7a\clang-3.8\Release/libaws-cpp-sdk-cognito-identity.a(ub_COGNITO-IDENTITY.cpp.o):/var/lib/jenkins/jobs/AndroidArm32Sta/workspace/aws-sdk-cpp/_build_android_arm_32_static_release/aws-cpp-sdk-cognito-identity/ub_COGNITO-IDENTITY.cpp:function Aws::CognitoIdentity::Model::AmbiguousRoleResolutionTypeMapper::GetAmbiguousRoleResolutionTypeForName(std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, Aws::Allocator<char> > const&): error: undefined reference to 'Aws::Utils::EnumParseOverflowContainer::StoreOverflow(int, std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, Aws::Allocator<char> > const&)'
c:\Amazon\Lumberyard\1.11.1.0\dev\Code\SDKs\AWSNativeSDK\lib\android\ndk_r12\android-21\armeabi-v7a\clang-3.8\Release/libaws-cpp-sdk-cognito-identity.a(ub_COGNITO-IDENTITY.cpp.o):/var/lib/jenkins/jobs/AndroidArm32Sta/workspace/aws-sdk-cpp/_build_android_arm_32_static_release/aws-cpp-sdk-cognito-identity/ub_COGNITO-IDENTITY.cpp:function Aws::CognitoIdentity::Model::AmbiguousRoleResolutionTypeMapper::GetNameForAmbiguousRoleResolutionType(Aws::CognitoIdentity::Model::AmbiguousRoleResolutionType): error: undefined reference to 'Aws::Utils::EnumParseOverflowContainer::RetrieveOverflow(int) const'
c:\Amazon\Lumberyard\1.11.1.0\dev\Code\SDKs\AWSNativeSDK\lib\android\ndk_r12\android-21\armeabi-v7a\clang-3.8\Release/libaws-cpp-sdk-cognito-identity.a(ub_COGNITO-IDENTITY.cpp.o):/var/lib/jenkins/jobs/AndroidArm32Sta/workspace/aws-sdk-cpp/_build_android_arm_32_static_release/aws-cpp-sdk-cognito-identity/ub_COGNITO-IDENTITY.cpp:function Aws::CognitoIdentity::Model::MappingRule::Jsonize() const: error: undefined reference to 'Aws::Utils::EnumParseOverflowContainer::RetrieveOverflow(int) const'
c:\Amazon\Lumberyard\1.11.1.0\dev\Code\SDKs\AWSNativeSDK\lib\android\ndk_r12\android-21\armeabi-v7a\clang-3.8\Release/libaws-cpp-sdk-cognito-identity.a(ub_COGNITO-IDENTITY.cpp.o):/var/lib/jenkins/jobs/AndroidArm32Sta/workspace/aws-sdk-cpp/_build_android_arm_32_static_release/aws-cpp-sdk-cognito-identity/ub_COGNITO-IDENTITY.cpp:function Aws::CognitoIdentity::Model::RoleMapping::operator=(Aws::Utils::Json::JsonValue const&): error: undefined reference to 'Aws::Utils::EnumParseOverflowContainer::StoreOverflow(int, std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, Aws::Allocator<char> > const&)'
c:\Amazon\Lumberyard\1.11.1.0\dev\Code\SDKs\AWSNativeSDK\lib\android\ndk_r12\android-21\armeabi-v7a\clang-3.8\Release/libaws-cpp-sdk-cognito-identity.a(ub_COGNITO-IDENTITY.cpp.o):/var/lib/jenkins/jobs/AndroidArm32Sta/workspace/aws-sdk-cpp/_build_android_arm_32_static_release/aws-cpp-sdk-cognito-identity/ub_COGNITO-IDENTITY.cpp:function Aws::CognitoIdentity::Model::RoleMapping::operator=(Aws::Utils::Json::JsonValue const&): error: undefined reference to 'Aws::Utils::EnumParseOverflowContainer::StoreOverflow(int, std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, Aws::Allocator<char> > const&)'
c:\Amazon\Lumberyard\1.11.1.0\dev\Code\SDKs\AWSNativeSDK\lib\android\ndk_r12\android-21\armeabi-v7a\clang-3.8\Release/libaws-cpp-sdk-cognito-identity.a(ub_COGNITO-IDENTITY.cpp.o):/var/lib/jenkins/jobs/AndroidArm32Sta/workspace/aws-sdk-cpp/_build_android_arm_32_static_release/aws-cpp-sdk-cognito-identity/ub_COGNITO-IDENTITY.cpp:function Aws::CognitoIdentity::Model::RoleMapping::Jsonize() const: error: undefined reference to 'Aws::Utils::EnumParseOverflowContainer::RetrieveOverflow(int) const'
clang++.exe: error: linker command failed with exit code 1 (use -v to see invocation)

tl;dr:

“undefined reference to ‘Aws::Utils::EnumParseOverflowContainer::RetrieveOverflow(…)’”

“undefined reference to ‘Aws::Utils::EnumParseOverflowContainer::StoreOverflow(…)’”

Android Clang Debug works fine, runs on device, etc. Any help here would be MOST appreciated.

Cheers!

Oh man this looks fun – fetching some answers for ya. Sorry for the delayed response!

FWIW, I checked the shared and static libs - the symbols are there:

(static)

$ nm -g -C ./Debug/libaws-cpp-sdk-core.a | grep EnumParseOverflowContainer
00000000 T Aws::CheckAndSwapEnumOverflowContainer(Aws::Utils::EnumParseOverflowContainer*, Aws::Utils::EnumParseOverflowContainer*)
00000000 W Aws::Utils::EnumParseOverflowContainer* Aws::New<Aws::Utils::EnumParseOverflowContainer>(char const*)
00000000 W Aws::Utils::EnumParseOverflowContainer::EnumParseOverflowContainer()
00000000 W Aws::Utils::EnumParseOverflowContainer::~EnumParseOverflowContainer()
00000000 W void Aws::Delete<Aws::Utils::EnumParseOverflowContainer>(Aws::Utils::EnumParseOverflowContainer*)
EnumParseOverflowContainer.cpp.o:
00000000 T Aws::Utils::EnumParseOverflowContainer::StoreOverflow(int, std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, Aws::Allocator<char> > const&)
00000000 T Aws::Utils::EnumParseOverflowContainer::RetrieveOverflow(int) const
$ nm -g -C ./Release/libaws-cpp-sdk-core.a | grep EnumParseOverflowContainer
00000001 T Aws::CheckAndSwapEnumOverflowContainer(Aws::Utils::EnumParseOverflowContainer*, Aws::Utils::EnumParseOverflowContainer*)
EnumParseOverflowContainer.cpp.o:
00000001 T Aws::Utils::EnumParseOverflowContainer::StoreOverflow(int, std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, Aws::Allocator<char> > const&)
00000001 T Aws::Utils::EnumParseOverflowContainer::RetrieveOverflow(int) const

(shared)

$ objdump -TC ./Debug/libaws-cpp-sdk-core.so | grep EnumParseOverflowContainer
000c27c4 g DF .text 0000063c Base Aws::CheckAndSwapEnumOverflowContainer(Aws::Utils::EnumParseOverflowContainer*, Aws::Utils::EnumParseOverflowContainer*)
000e8934 w DF .text 00000064 Base Aws::Utils::EnumParseOverflowContainer* Aws::New<Aws::Utils::EnumParseOverflowContainer>(char const*)
0014a860 w DF .text 000000e4 Base Aws::Utils::EnumParseOverflowContainer::EnumParseOverflowContainer()
0014aa50 w DF .text 0000005c Base Aws::Utils::EnumParseOverflowContainer::~EnumParseOverflowContainer()
000e8998 w DF .text 00000044 Base void Aws::Delete<Aws::Utils::EnumParseOverflowContainer>(Aws::Utils::EnumParseOverflowContainer*)
001a8dc8 g DF .text 000003dc Base Aws::Utils::EnumParseOverflowContainer::StoreOverflow(int, std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, Aws::Allocator<char> > const&)
001a84c4 g DF .text 00000904 Base Aws::Utils::EnumParseOverflowContainer::RetrieveOverflow(int) const
$ objdump -TC ./Release/libaws-cpp-sdk-core.so | grep EnumParseOverflowContainer
00087c39 g DF .text 00000030 Base Aws::CheckAndSwapEnumOverflowContainer(Aws::Utils::EnumParseOverflowContainer*, Aws::Utils::EnumParseOverflowContainer*)
000cd091 g DF .text 00000220 Base Aws::Utils::EnumParseOverflowContainer::StoreOverflow(int, std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, Aws::Allocator<char> > const&)
000ccd75 g DF .text 0000031c Base Aws::Utils::EnumParseOverflowContainer::RetrieveOverflow(int) const

Any ideas, @Amonster_LMBR? :confused:

Thanks for sharing this! I’ve sent this over to my peers to take a look. Will update you on answers ASAP!

Any updates? I’d love to do some performance testing on mobile devices :frowning:

Hi @Twolewis,

It looks as if the AWS core library isn’t getting included in the linker command. Could you verify this by either looking at the task dump when the command fails or running your build command with “–zones=runner” included (note: you may need to be quick to capture the temp response file before it’s deleted with this option)?

Hi @Twolewis, my apologies for the delay. I do see the AWS core library hidden in the linker command. Given that, it now may be a link order issue though I’m not quite sure why it would manifest itself now. Do you have any other AWS gems enabled besides CloudGemFramework mentioned the linker command? I would like to see what the bare minimum is to reproduce this issue locally so I can get to the bottom of it.

Hi @Twolewis, I just wanted to let you know that I was able to reproduce the link error with the list of gems you provided. I’ll report back as soon as I figure out what’s going on!

6015-build-out.txt (403 KB)build-out.txtHi @Scott@AGS -

Here’s the tail end of the task dump (ommitted all of the .o files, etc preceding the library options)

-lAzGameFramework -lEMotionFXStaticLib -lGem.CloudGemFramework.StaticLibrary.6fc787a982184217a5a553ca24676cfa.v1.1.1 -lAzFramework -lGridMate -lGridMateForTools -lCryAction_AutoFlowNode -lAzCore -lAkMemoryMgr -lAkMusicEngine -lAkSoundEngine -lAkStreamMgr -lAkCompressorFX -lAkConvolutionReverbFX -lAkDelayFX -lAkExpanderFX -lAkFlangerFX -lAkGainFX -lAkGuitarDistortionFX -lAkHarmonizerFX -lAkMatrixReverbFX -lAkMeterFX -lAkParametricEQFX -lAkPeakLimiterFX -lAkPitchShifterFX -lAkRecorderFX -lAkRoomVerbFX -lAkStereoDelayFX -lAkTimeStretchFX -lAkTremoloFX -lAkAudioInputSource -lAkSilenceSource -lAkSineSource -lAkSynthOne -lAkToneSource -lAkSoundSeedImpactFX -lAkSoundSeedWind -lAkSoundSeedWoosh -lCrankcaseAudioREVModelPlayerFX -lAkVorbisDecoder -lMcDSPFutzBoxFX -lMcDSPLimiterFX -lfreetype2 -llz4 -ltomcrypt -ltommath -lexpat -lzlib -lmd5 -llzma -llzss -laws-cpp-sdk-core -lcurl -lssl -lcrypto -lz -laws-cpp-sdk-cognito-identity -laws-cpp-sdk-identity-management -laws-cpp-sdk-lambda -laws-cpp-sdk-gamelift -llua -Wl,-Bdynamic -lc:\\Amazon\\Lumberyard\\1.11.1.0\\dev\\Code -lJ:/work/Android/NDK\\platforms\\android-21\\arch-arm\\usr\\lib -lJ:/work/Android/NDK\\sources\\cxx-stl\\llvm-libc++\\libs\\armeabi-v7a -lc:\\Amazon\\Lumberyard\\1.11.1.0\\dev\\Code\\SDKs -lc:\\Amazon\\Lumberyard\\1.11.1.0\\dev\\Code\\Tools\\CryCommonTools -lc:\\Amazon\\Lumberyard\\1.11.1.0\\dev\\Code\\Tools\\HLSLCrossCompiler\\lib\\android-armeabi-v7a -lc:\\Amazon\\Lumberyard\\1.11.1.0\\dev\\Code\\SDKs\\AWSNativeSDK\\lib\\android\\ndk_r12\\android-21\\armeabi-v7a\\clang-3.8\\Release -landroid -lc -llog -ldl -lc++_shared -lOpenSLES -lAzCore -lHLSLcc -lGLESv2 -lEGL -lm -lGLESv1_CM -laws-cpp-sdk-gamelift'

I see -lAzCore in there, but I don’t see the AWS core lib specified anywhere. Attached is the full output if you want to take a look -

hi @Scott@AGS - any luck with this one?

Here you go - list of all the gems I have enabled:

    {
"GemListFormatVersion": 2,
"Gems": [
{
"Path": "Gems/EMotionFX",
"Uuid": "044a63ea67d04479aa5daf62ded9d9ca",
"Version": "0.1.0",
"_comment": "EMotionFX"
},
{
"Path": "MyGame/Gem",
"Uuid": "0cc9caf722af45e69b2fefa913212db3",
"Version": "0.1.0"
},
{
"Path": "Gems/LyShine",
"Uuid": "0fefab3f13364722b2eab3b96ce2bf20",
"Version": "0.1.0",
"_comment": "LyShine"
},
{
"Path": "Gems/CloudCanvasCommon",
"Uuid": "102e23cf4c4c4b748585edbce2bbdc65",
"Version": "0.1.0",
"_comment": "CloudCanvasCommon"
},
{
"Path": "Gems/LegacyGameInterface",
"Uuid": "3108b261962e44b6a0c1c036c693bca2",
"Version": "1.0.0",
"_comment": "LegacyGameInterface"
},
{
"Path": "Gems/CryLegacy",
"Uuid": "352fef7706634c92814c587e84d7165a",
"Version": "0.1.0",
"_comment": "CryLegacy"
},
{
"Path": "Gems/Maestro",
"Uuid": "3b9a978ed6f742a1acb99f74379a342c",
"Version": "0.1.0",
"_comment": "Maestro"
},
{
"Path": "Gems/CertificateManager",
"Uuid": "659cffff33b14a10835bafc6ea623f98",
"Version": "0.0.1",
"_comment": "CertificateManager"
},
{
"Path": "Gems/CloudGemFramework/v1",
"Uuid": "6fc787a982184217a5a553ca24676cfa",
"Version": "1.1.1",
"_comment": "CloudGemFramework"
},
{
"Path": "Gems/GameLift",
"Uuid": "76de765796504906b73be7365a9bff06",
"Version": "2.0.0",
"_comment": "GameLift"
},
{
"Path": "Gems/PhysicsEntities",
"Uuid": "99ea531451fc4f64a5a9fe8f385e8a76",
"Version": "0.1.0",
"_comment": "PhysicsEntities"
},
{
"Path": "Gems/Camera",
"Uuid": "f910686b6725452fbfc4671f95f733c6",
"Version": "0.1.0",
"_comment": "Camera"
},
{
"Path": "Gems/LmbrCentral",
"Uuid": "ff06785f7145416b9d46fde39098cb0c",
"Version": "0.1.0",
"_comment": "LmbrCentral"
}
]
}

Hope that helps!

Hi @Twolewis,

I was able to find the problem and it was indeed a link order issue with the AWS core library. Adding the following to Tools/build/waf-1.7.13/lmbrwaflib/lumberyard_sdks.py should patch the problem.

    @feature('cshlib', 'cxxshlib')
@before_method('propagate_uselib_vars')
def link_aws_sdk_core_after_android(self):
platform = self.env['PLATFORM']
if not ('android' in platform and self.bld.spec_monolithic_build()):
return
if 'AWS_CPP_SDK_CORE' in self.uselib:
self.uselib = [ uselib for uselib in self.uselib if uselib != 'AWS_CPP_SDK_CORE' ]
self.uselib.append('AWS_CPP_SDK_CORE')

Let me know if you are still seeing an issue after applying the patch.

Hi @Scott@AGS - that did it, I’m able to link now! Cheers!

@Scott@AGS, did this patch ever make it into 1.17? Can we get this into the next release?

I’m pushing to get this into 1.18… sorry for the wait!