2014-06-18 3 views
2

나는 이걸로 머리카락을 꺼내 ​​왔습니다. 나는 Ubuntu 12.04 64-bit에서 개발 중이다. V8이 내장 된 기본 Android 앱을 만들었지 만 컴퓨터를 재부팅 한 후에 V8과 더 이상 연결되지 않습니다. 나는 ndk를 다시 설치하고 V8을 재 컴파일하려고 시도했지만 아무 소용이 없다. 링커가 정적 라이브러리를 포함하지만 심볼을 찾지 못하는 것처럼 보입니다. 나는 nm으로 확인했는데 기호가 거기에있는 것처럼 보였다. 특히Android NDK 링크 V8 정적 라이브러리 : 심볼을 찾을 수 없지만 그곳에 있습니다.

$ ndk-build V=1 
rm -f ./libs/armeabi/lib*.so ./libs/armeabi-v7a/lib*.so ./libs/armeabi-v7a-hard/lib*.so ./libs/mips/lib*.so ./libs/x86/lib*.so 
rm -f ./libs/armeabi/gdbserver ./libs/armeabi-v7a/gdbserver ./libs/armeabi-v7a-hard/gdbserver ./libs/mips/gdbserver ./libs/x86/gdbserver 
rm -f ./libs/armeabi/gdb.setup ./libs/armeabi-v7a/gdb.setup ./libs/armeabi-v7a-hard/gdb.setup ./libs/mips/gdb.setup ./libs/x86/gdb.setup 
[armeabi] Compile++ thumb: native-activity <= main.cpp 
/home/schooten/bin/packages/android-ndk-r9d/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/bin/arm-linux-androideabi-g++ -MMD -MP -MF ./obj/local/armeabi/objs/native-activity/main.o.d -fpic -ffunction-sections -funwind-tables -fstack-protector -no-canonical-prefixes -march=armv5te -mtune=xscale -msoft-float -fno-exceptions -fno-rtti -mthumb -Os -g -DNDEBUG -fomit-frame-pointer -fno-strict-aliasing -finline-limit=64 -Ijni/include -I/home/schooten/bin/packages/android-ndk-r9d/sources/android/native_app_glue -I/home/schooten/bin/packages/android-ndk-r9d/sources/cxx-stl/system/include -Ijni -DANDROID -Wa,--noexecstack -Wformat -Werror=format-security  -I/home/schooten/bin/packages/android-ndk-r9d/platforms/android-9/arch-arm/usr/include -c jni/main.cpp -o ./obj/local/armeabi/objs/native-activity/main.o 
[armeabi] Compile thumb : android_native_app_glue <= android_native_app_glue.c 
/home/schooten/bin/packages/android-ndk-r9d/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc -MMD -MP -MF ./obj/local/armeabi/objs/android_native_app_glue/android_native_app_glue.o.d -fpic -ffunction-sections -funwind-tables -fstack-protector -no-canonical-prefixes -march=armv5te -mtune=xscale -msoft-float -mthumb -Os -g -DNDEBUG -fomit-frame-pointer -fno-strict-aliasing -finline-limit=64 -I/home/schooten/bin/packages/android-ndk-r9d/sources/android/native_app_glue -DANDROID -Wa,--noexecstack -Wformat -Werror=format-security -I/home/schooten/bin/packages/android-ndk-r9d/platforms/android-9/arch-arm/usr/include -c /home/schooten/bin/packages/android-ndk-r9d/sources/android/native_app_glue/android_native_app_glue.c -o ./obj/local/armeabi/objs/android_native_app_glue/android_native_app_glue.o 
[armeabi] StaticLibrary : libandroid_native_app_glue.a 
rm -f obj/local/armeabi/libandroid_native_app_glue.a 
/home/schooten/bin/packages/android-ndk-r9d/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/bin/arm-linux-androideabi-ar crsD ./obj/local/armeabi/libandroid_native_app_glue.a ./obj/local/armeabi/objs/android_native_app_glue/android_native_app_glue.o 
[armeabi] StaticLibrary : libstdc++.a 
rm -f obj/local/armeabi/libstdc++.a 
/home/schooten/bin/packages/android-ndk-r9d/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/bin/arm-linux-androideabi-ar crsD ./obj/local/armeabi/libstdc++.a 
[armeabi] SharedLibrary : libnative-activity.so 
/home/schooten/bin/packages/android-ndk-r9d/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/bin/arm-linux-androideabi-g++ -Wl,-soname,libnative-activity.so -shared --sysroot=/home/schooten/bin/packages/android-ndk-r9d/platforms/android-9/arch-arm ./obj/local/armeabi/objs/native-activity/main.o ./obj/local/armeabi/libandroid_native_app_glue.a jni/lib/libv8_libbase.arm.a jni/lib/libv8_nosnapshot.a jni/lib/libv8_base.a jni/lib/libstlport_static.a ./obj/local/armeabi/libstdc++.a -lgcc -no-canonical-prefixes -Wl,--no-undefined -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now -L/home/schooten/bin/packages/android-ndk-r9d/platforms/android-9/arch-arm/usr/lib -llog -landroid -lEGL -lGLESv1_CM -llog -lstdc++ -lc -lm -o ./obj/local/armeabi/libnative-activity.so 
/home/schooten/bin/packages/android-ndk-r9d/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: ./obj/local/armeabi/objs/native-activity/main.o: in function __clearColor(v8::FunctionCallbackInfo<v8::Value> const&):jni/main.cpp:88: error: undefined reference to 'v8::Value::Int32Value() const' 
/home/schooten/bin/packages/android-ndk-r9d/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: ./obj/local/armeabi/objs/native-activity/main.o: in function __clearColor(v8::FunctionCallbackInfo<v8::Value> const&):jni/main.cpp:89: error: undefined reference to 'v8::Value::Int32Value() const' 
/home/schooten/bin/packages/android-ndk-r9d/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: ./obj/local/armeabi/objs/native-activity/main.o: in function __clearColor(v8::FunctionCallbackInfo<v8::Value> const&):jni/main.cpp:90: error: undefined reference to 'v8::Value::Int32Value() const' 
/home/schooten/bin/packages/android-ndk-r9d/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: ./obj/local/armeabi/objs/native-activity/main.o: in function __clearColor(v8::FunctionCallbackInfo<v8::Value> const&):jni/main.cpp:91: error: undefined reference to 'v8::Value::Int32Value() const' 
/home/schooten/bin/packages/android-ndk-r9d/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: ./obj/local/armeabi/objs/native-activity/main.o: in function run_javascript(char*):jni/main.cpp:101: error: undefined reference to 'v8::Isolate::New()' 
/home/schooten/bin/packages/android-ndk-r9d/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: ./obj/local/armeabi/objs/native-activity/main.o: in function run_javascript(char*):jni/include/v8.h:4045: error: undefined reference to 'v8::Isolate::Enter()' 
/home/schooten/bin/packages/android-ndk-r9d/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: ./obj/local/armeabi/objs/native-activity/main.o: in function run_javascript(char*):jni/main.cpp:104: error: undefined reference to 'v8::HandleScope::HandleScope(v8::Isolate*)' 
/home/schooten/bin/packages/android-ndk-r9d/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: ./obj/local/armeabi/objs/native-activity/main.o: in function run_javascript(char*):jni/main.cpp:108: error: undefined reference to 'v8::ObjectTemplate::New(v8::Isolate*)' 
/home/schooten/bin/packages/android-ndk-r9d/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: ./obj/local/armeabi/objs/native-activity/main.o: in function run_javascript(char*):jni/main.cpp:110: error: undefined reference to 'v8::ObjectTemplate::New(v8::Isolate*)' 
/home/schooten/bin/packages/android-ndk-r9d/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: ./obj/local/armeabi/objs/native-activity/main.o: in function run_javascript(char*):jni/main.cpp:112: error: undefined reference to 'v8::String::NewFromUtf8(v8::Isolate*, char const*, v8::String::NewStringType, int)' 
... etc ... 

는,이 라인은 *로 .a 파일이 포함되어 있는지 알려줍니다 :

/home/schooten/bin/packages/android-ndk-r9d/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/bin/arm-linux-androideabi-g++ -Wl,-soname,libnative-activity.so -shared --sysroot=/home/schooten/bin/packages/android-ndk-r9d/platforms/android-9/arch-arm ./obj/local/armeabi/objs/native-activity/main.o ./obj/local/armeabi/libandroid_native_app_glue.a jni/lib/libv8_libbase.arm.a jni/lib/libv8_nosnapshot.a jni/lib/libv8_base.a jni/lib/libstlport_static.a ./obj/local/armeabi/libstdc++.a -lgcc -no-canonical-prefixes -Wl,--no-undefined -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now -L/home/schooten/bin/packages/android-ndk-r9d/platforms/android-9/arch-arm/usr/lib -llog -landroid -lEGL -lGLESv1_CM -llog -lstdc++ -lc -lm -o ./obj/local/armeabi/libnative-activity.so 

내 Android.mk의 외모 나 ndk_build을 실행하면

, 나는 다음과 같은 출력을 얻을 이렇게 :

LOCAL_PATH := $(call my-dir) 

include $(CLEAR_VARS) 
LOCAL_MODULE   := stlport 
LOCAL_MODULE_FILENAME := stlport_static 
LOCAL_SRC_FILES := lib/libstlport_static.a 
include $(PREBUILT_STATIC_LIBRARY) 

include $(CLEAR_VARS) 
LOCAL_MODULE   := v8_base 
LOCAL_MODULE_FILENAME := v8_base_static 
LOCAL_SRC_FILES := lib/libv8_base.a 
include $(PREBUILT_STATIC_LIBRARY) 

include $(CLEAR_VARS) 
LOCAL_MODULE   := v8_nosnapshot 
LOCAL_MODULE_FILENAME := v8_nosnapshot_static 
LOCAL_SRC_FILES := lib/libv8_nosnapshot.a 
include $(PREBUILT_STATIC_LIBRARY) 

include $(CLEAR_VARS) 
LOCAL_MODULE   := v8_libbase 
LOCAL_MODULE_FILENAME := v8_libbase_static 
LOCAL_SRC_FILES := lib/libv8_libbase.arm.a 
include $(PREBUILT_STATIC_LIBRARY) 

include $(CLEAR_VARS) 
LOCAL_MODULE := native-activity 
LOCAL_SRC_FILES := main.cpp 
LOCAL_LDLIBS := -llog -landroid -lEGL -lGLESv1_CM 
LOCAL_STATIC_LIBRARIES := android_native_app_glue v8_libbase v8_nosnapshot v8_base stlport 
LOCAL_C_INCLUDES := $(LOCAL_PATH)/include 
include $(BUILD_SHARED_LIBRARY) 

$(call import-module,android/native_app_glue) 

LOCAL_STATIC_LIBRARIES 주문은 실험적으로 결정되었습니다. 나는 그것을 더 많이 보았지만 아무 소용이 없었다. 심지어 LOCAL_WHOLE_STATIC_LIBRARIES 시도했습니다. nm :

arm-linux-gnueabi-nm jni/lib/libv8_base.a | grep Int32Value 
     U _ZNK2v85Value10Int32ValueEv 
00000000 T _ZNK2v85Value10Int32ValueEv 
     U _ZNK2v85Value10Int32ValueEv 

arm-linux-gnueabi-nm jni/lib/libv8_base.a | grep Utf8Value 
00000000 T _ZN2v86String9Utf8ValueC1ENS_6HandleINS_5ValueEEE 
00000000 T _ZN2v86String9Utf8ValueC2ENS_6HandleINS_5ValueEEE 
00000000 T _ZN2v86String9Utf8ValueD1Ev 
00000000 T _ZN2v86String9Utf8ValueD2Ev 
     U _ZN2v86String9Utf8ValueC1ENS_6HandleINS_5ValueEEE 
     U _ZN2v86String9Utf8ValueD1Ev 
     U _ZN2v86String9Utf8ValueC1ENS_6HandleINS_5ValueEEE 
     U _ZN2v86String9Utf8ValueD1Ev 
     U _ZN2v86String9Utf8ValueC1ENS_6HandleINS_5ValueEEE 
     U _ZN2v86String9Utf8ValueD1Ev 
     U _ZN2v86String9Utf8ValueC1ENS_6HandleINS_5ValueEEE 
     U _ZN2v86String9Utf8ValueD1Ev 
     U _ZN2v86String9Utf8ValueC1ENS_6HandleINS_5ValueEEE 
     U _ZN2v86String9Utf8ValueD1Ev 

나는 munging에 전문가가 아니지만, 거기에있는 것으로 보입니다. 값은 모두 0이지만, 이것이 정상이라고 생각합니다.

그래서 저는 링커가 정적 라이브러리를 이해하지 못하고 자동으로 실패했다고 생각했습니다.
그러나 링커가 심볼을 선택하지 않는 이유는 어떻게 확인합니까?

답변

4

나는 친구의 도움으로 마침내 그것을 고쳤다. 먼저 V8을 공유 라이브러리로 연결하려고 시도한 해결 방법을 시도했는데, 이는 NDK native activity interface I'm using turned out to be incompatible with loading additional shared objects이기 때문에 잘 풀리지 않았습니다.

내 정적 라이브러리에는 두 가지 문제가 있습니다. 가장 중요한 첫 번째 점은 V8에 의해 구축 된 정적 라이브러리가 링크에 적합하지 않다는 것입니다. 다음을 사용하여 확인할 수 있습니다 :

ar x [static_library.a] 

일반적으로 라이브러리에서 * .o 개체가 추출됩니다. 이 경우보고 :

`x' cannot be used on thin archives 

얇은 아카이브는 * .o 파일의 절대 경로에 대한 참조 집합이며 실제 내용은 없습니다. 그 이유는 내 빌드가 V8 빌드 트리에서 원래 * .o 파일을 이동하거나 삭제 한 지점에서 작동하지 않는 이유를 설명합니다. 이상하게도, 링커는 그것에 대해 침묵을 지켰다.

정적 라이브러리 생성은 현재 V8의 빌드 옵션이 아닙니다. 고맙게도 V8에서 적절한 정적 라이브러리를 생성하기위한 this guy has a patch.

처음으로 잘못된 파일을 복사했기 때문에 앱이 링크를 아직 만들지 않았습니다. 결과적으로 정적 라이브러리는 호스트 아키텍처 용으로 제작되었으므로 (이유는 묻지 않음) 실수로 해당 라이브러리를 복사했습니다.

file objectfile.o 

어떤 아키텍처인지 알고 싶습니다. 그래서 정적 라이브러리가 i386이고 팔이 아니라는 것을 알았습니다. 따라서 아키텍처가 일치하지 않아 링커가이 파일을 건너 뜁니다 (정적 라이브러리에서 아키텍처를 혼합 할 수 있음).

여기 Curu Wong의 패치를 기반으로 V8 3.27.28에 작성한 V8 패치가 있습니다. 나는이 패치를 저지하려고 노력할 것이다. 1 패치 :

~/Work/javascript/Engines/v8-trunk/tools/gyp$ diff -u v8.gyp.orig v8.gyp 
--- v8.gyp.orig 2014-06-18 21:09:59.368336736 +0200 
+++ v8.gyp 2014-06-18 21:12:20.264331660 +0200 
@@ -108,6 +108,7 @@ 
    { 
     'target_name': 'v8_snapshot', 
     'type': 'static_library', 
+  'standalone_static_library': 1, 
     'conditions': [ 
     ['want_separate_host_toolset==1', { 
      'toolsets': ['host', 'target'], 
@@ -180,6 +181,7 @@ 
    { 
     'target_name': 'v8_nosnapshot', 
     'type': 'static_library', 
+  'standalone_static_library': 1, 
     'dependencies': [ 
     'v8_base', 
     ], 
@@ -237,6 +239,7 @@ 
    { 
     'target_name': 'v8_base', 
     'type': 'static_library', 
+  'standalone_static_library': 1, 
     'dependencies': [ 
     'v8_libbase.<(v8_target_arch)', 
     ], 

패치 2 :

~/Work/javascript/Engines/v8-trunk/third_party/icu$ diff -u icu.gyp.orig icu.gyp 
--- icu.gyp.orig 2014-06-18 21:10:22.060335920 +0200 
+++ icu.gyp 2014-06-18 21:15:06.468325674 +0200 
@@ -56,6 +56,7 @@ 
     { 
      'target_name': 'icudata', 
      'type': 'static_library', 
+   'standalone_static_library': 1, 
      'defines': [ 
      'U_HIDE_DATA_SYMBOL', 
      ], 
@@ -141,6 +142,11 @@ 
     { 
      'target_name': 'icui18n', 
      'type': '<(component)', 
+   'conditions': [ 
+   [ 'component!="shared_library"', { 
+    'standalone_static_library': 1, 
+   }], 
+   ], 
      'sources': [ 
      '<@(icui18n_sources)', 
      ], 
@@ -241,6 +247,11 @@ 
     { 
      'target_name': 'icuuc', 
      'type': '<(component)', 
+   'conditions': [ 
+   [ 'component!="shared_library"', { 
+    'standalone_static_library': 1, 
+   }], 
+   ], 
      'sources': [ 
      '<@(icuuc_sources)', 
      ], 
+1

당신의 선생님이 보낸 신이다. 이것은 'standalone_static_library'와 완벽하게 작동했습니다. 1 또한 v8_libplatform 및 v8_libbase에 추가되었습니다. – GambitSunob

+0

@ Boris van Schooten : 'ar x'는 어떻게 사용 했습니까? Google은별로 도움이되지 않습니다. 내 자신의 정적 라이브러리로 당신과 비슷한 문제가 있습니다. 'ar x libMyLibrary.a'를 실행할 때 "Blah.o No such file or directory"오류가 발생합니다. 내 .a 파일은 .o 파일과 다른 위치에 있습니다.이 파일이 문제인지 아닌지는 알 수 없습니다. – SparkyNZ