2012-07-28 3 views
4

나는 안드로이드, 컴파일 링 및 링크가 일반적으로 매우 새롭다. 내 문제와 관련하여 어떤 세부 사항이 중요한지 알지 못하므로 모든 것을 알려 드리겠습니다. 이상하거나 잘못 표시된 것이 있으면 알려주십시오.안드로이드와 libssl 함수에 대한 정의되지 않은 참조 NDK

나는 libcrypto.so 및 libssl.so 라이브러리를 Android-NDK에 구축했습니다. 나는 openssl.so (와 openssl.so는 libssl.so의 함수를 사용한다)에서 함수를 사용하는 원시 코드를 작성했다. 내가 구글에서 검색하고 나와 같은 문제를 가진 사람을 발견

./obj/local/armeabi/objs/pki_send/pki_send.o: In function `main': 
/home/android/nativeserver/jni/pki_send.c:27: undefined reference to `RSA_generate_key' 
collect2: ld returned 1 exit status 
make: *** [obj/local/armeabi/pki_send] Error 1 

이 사람은 제외하고 그녀는 (동일한 기능을 호출 : 링크 할 때 코드는, 그러나 나는 "정의되지 않은 참조"오류가 발생 때문에 컴파일 Android 용 건물 아님) : http://ubuntuforums.org/showthread.php?t=1081028. 여기에 내 문제와 관련된 게시물을 인용 해 드리겠습니다.

When I remove an argument [to the function which causes the "undefined reference"] the compiler says that there's too few arguments and when I add an argument the compiler says there's too many arguments, so it seems like there is "some" kind of reference to the correct function. There's some linking going on wrongly perhaps?

나는 같은 행동을 발견했습니다. 그녀는 컴파일러에게 openssl 라이브러리를 사용하도록 지시하는 -lssl 설정으로 컴파일함으로써 문제를 해결했습니다. 내가 libssl에이 libcrypto에 의존하기 때문에 -lcrypto 그냥 안전을 위해 포함

LOCAL_LDLIBS += -lssl -lcrypto -ldl 

이에

LOCAL_LDLIBS += -ldl 

: 내가이 일을 위해, 나는이에서 Android.mk 파일에서 모듈을 변경 . 내가 NDK 빌드를 실행할 때 지금, 나는 다음과 같은 오류가 나타날 수 있습니다

/home/android/android-ndk-r8/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/../lib/gcc/arm-linux-androideabi/4.4.3/../../../../arm-linux-androideabi/bin/ld: cannot find -lssl 
collect2: ld returned 1 exit status 
make: *** [obj/local/armeabi/pki_send] Error 1 

이 오류는 "LD는"libssl.so 찾을 수 있음을 보여줍니다. 내 jni 디렉토리에는 libcrypto.so와 libssl.so가 있습니다. 이상적으로 "ld"의 검색 경로에 jni 디렉토리를 추가하는 방법을 찾고 싶었지만 이것을 이해할 수 없었다. 나는 libssl.so와 libcrypto.so를/android-ndk-r8/platforms/android-8/arch-arm/usr/lib 디렉토리에 추가함으로써이 문제를 해결하려고 시도했다. ("ld" 라이브러리). 내가 이런 짓을하면 내가 다시 NDK 빌드를 실행하고 "정의되지 않은 참조"오류 수신 : 여기에서

./obj/local/armeabi/objs/pki_send/pki_send.o: In function `main': 
/home/android/nativeserver/jni/pki_send.c:27: undefined reference to `RSA_generate_key' 
collect2: ld returned 1 exit status 
make: *** [obj/local/armeabi/pki_send] Error 1 

를, 내가 진행하는 방법에 대한 단서입니다. 것이 중요 그냥 경우

가 여기 내 Android.mk 파일의 코드입니다 :

LOCAL_PATH := $(call my-dir) 
APP_PLATFORM := android-8 

include $(CLEAR_VARS) 

LOCAL_MODULE := crypto 
LOCAL_SRC_FILES := libcrypto.so 
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/../include/ 

include $(PREBUILT_SHARED_LIBRARY) 

include $(CLEAR_VARS) 

LOCAL_MODULE := ssl 
LOCAL_SRC_FILES := libssl.so 
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/../include/ 

include $(PREBUILT_SHARED_LIBRARY) 

include $(CLEAR_VARS) 

LOCAL_SRC_FILES := pki_send.c 
LOCAL_MODULE := pki_send 
LOCAL_SHARED_LIBRARIES := ssl crypto 
LOCAL_LDLIBS += -lssl -lcrypto -ldl 

LOCAL_MODULE_TAGS := optional 

include $(BUILD_EXECUTABLE) 

편집 : 뭔가 내가 추가하는 것을 잊었다 : 나는 libcrypto.so 내 네이티브 코드에서 함수를 사용할 때, 코드가 컴파일되어 잘 링크됩니다. libcrypto.so에있는 모든 함수를 사용할 수있는 것으로 보입니다. 그러나 문제를 일으키는 함수는 libssl.so에 있습니다. 이것은 중요하거나 중요하지 않을 수 있습니다.

답변

8

나는이 문제를 해결했다. 내가 호출하고 있던 "RSA_generate_key"함수는 libcrypto.so의 더 이상 사용되지 않는 버전에만 존재합니다. "RSA_generate_key_ex"를 사용하는 최신 버전을 사용하고있었습니다. 나는 libcrypto.so에 readelf를 수행하여이 문제를 발견 :

$ ./arm-linux-androideabi-readelf -all ~/nativeserver/jni/libcrypto.so |grep RSA_generate 
    679: 00089239 992 FUNC GLOBAL DEFAULT 7 RSA_generate_key_ex 
10334: 00089239 992 FUNC GLOBAL DEFAULT 7 RSA_generate_key_ex 

이유를 RSA_generate_key 라이브러리가없는 경우에도 OpenSSL을/rsa.h의 헤더 파일에 있기 때문에 아직 컴파일 된 프로그램이 이유.

관련 문제