У меня есть 4 файла, которые я хочу связать с помощью компоновщика Android NDK: DemoAppMain.o
, swiftrt.o
, libswiftSwiftOnoneSupport.so
, libswiftCore.so
.
Вот символы внутри файлов Swift:
nm -a swiftrt.o
U swift_addNewDSOImage
nm -a libswiftSwiftOnoneSupport.so
U swift_addNewDSOImage
nm -a libswiftCore.so
003c01a4 T swift_addNewDSOImage
Запуск компоновщика:
/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/DemoApp \
/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/DemoAppMain.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
В результате ошибка:
/EDITED/armv7a-macos/swift/usr/lib/swift/android/armv7/swiftrt.o:SwiftRT-ELF.cpp:function swift_image_constructor():
error: undefined reference to 'swift_addNewDSOImage'
Но когда я указываю полный путь к SO-файлам, он работает:
/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/DemoApp \
/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/DemoAppMain.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/DemoApp
Отпечатки
/EDITED/Temp/DemoApp: ELF 32-bit LSB pie executable ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /system/bin/linker, with debug_info, not stripped
Разница в двух вызовах компоновщика заключается в следующем:
# Not working
-L/EDITED/armv7a-macos/swift/usr/lib/swift/android \
-lswiftSwiftOnoneSupport -lswiftCore \
# Works
/EDITED/armv7a-macos/swift/usr/lib/swift/android/libswiftCore.so \
/EDITED/armv7a-macos/swift/usr/lib/swift/android/libswiftSwiftOnoneSupport.so \
В чем может быть причина, по которой компоновщик ld.gold
из Android NDK не может найтисимволы, если для общих объектов указано , а не с полным путем?
Спасибо!
ОБНОВЛЕНИЕ : компоновщик показывает ту же ошибку, даже если параметры-lswiftSwiftOnoneSupport -lswiftCore
не прошло вообще.Похоже, что компоновщик на самом деле не использует общие объекты, указанные с опцией -l
.
ОБНОВЛЕНИЕ 2 : порядок передачи библиотек имеет значение.
# 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)
Очень страннопочему libswiftCore.so
необходимо передать до libswiftSwiftOnoneSupport.so
.