Thank you!
I isolated issue but can't understand why it is working in one case and not working in other case :0
So, first we can lookup symbols to ensure that swift_addNewDSOImage symbol really exists (in libswiftCore.so.):
nm -a swiftrt.o
U
00000000 t
00000000 t $a.0
00000130 t $d.1
00000000 a SwiftRT-ELF.cpp
00000000 t _ZL23swift_image_constructorv
00000000 b _ZN12_GLOBAL__N_18sectionsE
U __start_swift5_assocty
U __start_swift5_fieldmd
U __start_swift5_protocol_conformances
U __start_swift5_protocols
U __start_swift5_reflstr
U __start_swift5_replace
U __start_swift5_type_metadata
U __start_swift5_typeref
U __stop_swift5_assocty
U __stop_swift5_fieldmd
U __stop_swift5_protocol_conformances
U __stop_swift5_protocols
U __stop_swift5_reflstr
U __stop_swift5_replace
U __stop_swift5_type_metadata
U __stop_swift5_typeref
U swift_addNewDSOImage
nm -a libswiftSwiftOnoneSupport.so
U swift_addNewDSOImage
nm -a libswiftCore.so
003c01a4 T swift_addNewDSOImage
Then we can compile Swift source code:
/EDITED/armv7a-macos/swift/usr/bin/swift -frontend -c \
-primary-file /EDITED/Temp/hello.swift \
-target armv7-none-linux-android -disable-objc-interop \
-Xcc -I/EDITED/armv7a-macos/ndk/sysroot/usr/include \
-Xcc -DDEPLOYMENT_TARGET_ANDROID -Xcc -DDEPLOYMENT_RUNTIME_SWIFT \
-color-diagnostics -module-name hello \
-o /EDITED/Temp/hello.o
file /EDITED/Temp/hello.o
# Prints
/EDITED/Temp/hello.o: ELF 32-bit LSB relocatable, ARM, EABI5 version 1 (SYSV), not stripped
Then we can run swift-autolink-extract tool.
/EDITED/armv7a-macos/swift/usr/bin/swift-autolink-extract \
/EDITED/Temp/hello.o \
-o /EDITED/Temp/hello.autolink
cat /EDITED/Temp/hello.autolink
# Prints
-lswiftSwiftOnoneSupport
-lswiftCore
Then we can launch linker.
/EDITED/armv7a-macos/ndk/bin/../lib/gcc/arm-linux-androideabi/4.9.x/../../../../arm-linux-androideabi/bin/ld.gold \
--sysroot=/EDITED/armv7a-macos/ndk/bin/../sysroot \
-pie -X --enable-new-dtags --eh-frame-hdr -m armelf_linux_eabi -dynamic-linker /system/bin/linker \
-o /EDITED/Temp/hello \
/EDITED/armv7a-macos/ndk/bin/../sysroot/usr/lib/../lib/crtbegin_dynamic.o \
-L/EDITED/armv7a-macos/ndk/lib64/clang/7.0.2/lib/linux/arm \
-L/EDITED/armv7a-macos/ndk/bin/../lib/gcc/arm-linux-androideabi/4.9.x/armv7-a \
-L/EDITED/armv7a-macos/ndk/bin/../lib/gcc/arm-linux-androideabi/4.9.x/../../../../arm-linux-androideabi/lib/../lib/armv7-a \
-L/EDITED/armv7a-macos/ndk/bin/../sysroot/usr/lib/../lib \
-L/EDITED/armv7a-macos/ndk/bin/../lib/gcc/arm-linux-androideabi/4.9.x/../../../../arm-linux-androideabi/lib/armv7-a \
-L/EDITED/armv7a-macos/ndk/bin/../sysroot/usr/lib \
/EDITED/armv7a-macos/swift/usr/lib/swift/android/armv7/swiftrt.o \
/EDITED/Temp/hello.o \
-L/EDITED/armv7a-macos/swift/usr/lib/swift/android \
-lswiftSwiftOnoneSupport -lswiftCore \
-v -lstdc++ -lm -lgcc -lgcc -ldl -lc -lgcc -lgcc -ldl \
/EDITED/armv7a-macos/ndk/bin/../sysroot/usr/lib/../lib/crtend_android.o
# As result error:
/EDITED/armv7a-macos/swift/usr/lib/swift/android/armv7/swiftrt.o:SwiftRT-ELF.cpp:function swift_image_constructor(): error: undefined reference to 'swift_addNewDSOImage'
But if we specifying full path to SO-files, then liker works well.
/EDITED/armv7a-macos/ndk/bin/../lib/gcc/arm-linux-androideabi/4.9.x/../../../../arm-linux-androideabi/bin/ld.gold \
--sysroot=/EDITED/armv7a-macos/ndk/bin/../sysroot \
-pie -X --enable-new-dtags --eh-frame-hdr -m armelf_linux_eabi -dynamic-linker /system/bin/linker \
-o /EDITED/Temp/hello \
/EDITED/armv7a-macos/ndk/bin/../sysroot/usr/lib/../lib/crtbegin_dynamic.o \
-L/EDITED/armv7a-macos/ndk/lib64/clang/7.0.2/lib/linux/arm \
-L/EDITED/armv7a-macos/ndk/bin/../lib/gcc/arm-linux-androideabi/4.9.x/armv7-a \
-L/EDITED/armv7a-macos/ndk/bin/../lib/gcc/arm-linux-androideabi/4.9.x/../../../../arm-linux-androideabi/lib/../lib/armv7-a \
-L/EDITED/armv7a-macos/ndk/bin/../sysroot/usr/lib/../lib \
-L/EDITED/armv7a-macos/ndk/bin/../lib/gcc/arm-linux-androideabi/4.9.x/../../../../arm-linux-androideabi/lib/armv7-a \
-L/EDITED/armv7a-macos/ndk/bin/../sysroot/usr/lib \
/EDITED/armv7a-macos/swift/usr/lib/swift/android/armv7/swiftrt.o \
/EDITED/Temp/hello.o \
/EDITED/armv7a-macos/swift/usr/lib/swift/android/libswiftCore.so \
/EDITED/armv7a-macos/swift/usr/lib/swift/android/libswiftSwiftOnoneSupport.so \
-v -lstdc++ -lm -lgcc -lgcc -ldl -lc -lgcc -lgcc -ldl \
/EDITED/armv7a-macos/ndk/bin/../sysroot/usr/lib/../lib/crtend_android.o
file /EDITED/Temp/hello
# Prints
/EDITED/Temp/hello: ELF 32-bit LSB pie executable ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /system/bin/linker, with debug_info, not stripped
Difference in two linker invocations is following:
--- untitled
+++ (clipboard)
@@ -11,7 +11,7 @@
-L/EDITED/armv7a-macos/ndk/bin/../sysroot/usr/lib \
/EDITED/armv7a-macos/swift/usr/lib/swift/android/armv7/swiftrt.o \
/EDITED/Temp/hello.o \
-/EDITED/armv7a-macos/swift/usr/lib/swift/android/libswiftCore.so \
-/EDITED/armv7a-macos/swift/usr/lib/swift/android/libswiftSwiftOnoneSupport.so \
+-L/EDITED/armv7a-macos/swift/usr/lib/swift/android \
+-lswiftSwiftOnoneSupport -lswiftCore \
-v -lstdc++ -lm -lgcc -lgcc -ldl -lc -lgcc -lgcc -ldl \
/EDITED/armv7a-macos/ndk/bin/../sysroot/usr/lib/../lib/crtend_android.o
What can be the reason why ld.gold linker from Android NDK can't find symbols if Shared Objects specified not with a full path?
UPDATE: Linker shows same error even if options -lswiftSwiftOnoneSupport -lswiftCore not passed at all. Looks like linker not really using Shared Objects specified with -l option.
UPDATE 2: Order of passing libraries matters.
# Works
cd /EDITED/armv7a/Hello && /EDITED/armv7a-macos/ndk/bin/clang++ -fuse-ld=gold \
-B /EDITED/armv7a-macos/ndk/bin -pie -target armv7-none-linux-androideabi \
/EDITED/armv7a-macos/swift/usr/lib/swift/android/armv7/swiftrt.o \
/EDITED/armv7a/Hello/hello-main.o \
-l/EDITED/armv7a-macos/swift/usr/lib/swift/android/libswiftCore.so \
-l/EDITED/armv7a-macos/swift/usr/lib/swift/android/libswiftSwiftOnoneSupport.so \
--target=armv7-none-linux-android \
-o /EDITED/armv7a/Hello/hello
# Not working
cd /EDITED/armv7a/Hello && /EDITED/armv7a-macos/ndk/bin/clang++ -fuse-ld=gold \
-B /EDITED/armv7a-macos/ndk/bin -pie -target armv7-none-linux-androideabi \
/EDITED/armv7a-macos/swift/usr/lib/swift/android/armv7/swiftrt.o \
/EDITED/armv7a/Hello/hello-main.o \
-l/EDITED/armv7a-macos/swift/usr/lib/swift/android/libswiftSwiftOnoneSupport.so \
-l/EDITED/armv7a-macos/swift/usr/lib/swift/android/libswiftCore.so \
--target=armv7-none-linux-android \
-o /EDITED/armv7a/Hello/hello
/EDITED/armv7a-macos/swift/usr/lib/swift/android/armv7/swiftrt.o:SwiftRT-ELF.cpp:function swift_image_constructor(): error: undefined reference to 'swift_addNewDSOImage'
clang70++: error: linker command failed with exit code 1 (use -v to see invocation)
Super strange why libswiftCore.so needs to be passed before libswiftSwiftOnoneSupport.so.