2013-01-09 5 views
1

공유 라이브러리가 2 개 있습니다. lib1.solib2.so입니다. lib1.soAndroid : 동적 공유 라이브러리 공유

lib2.so에서 정의 된 일부의 기능을 포함한다. C 프로그램에서 나는 다음과 같은 호출을 사용 lib1.so로드 :

dlopen("lib1.so", RTLD_NOW); 

두 라이브러리는 현재 디렉토리에 제공됩니다. 내 프로그램은 데스크톱 리눅스 (Ubuntu, Debian)에서 작동하지만 Android에서는 작동하지 않습니다. Android에서 dlopen은 오류를 반환하고 종료됩니다. 설정하려고 시도 :

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:. 

하지만 도움이되지 않습니다.

Android에서이 코드가 작동하지 않는 이유는 완전히 혼란 스럽습니다. 안드로이드 동적 링커에서 좋은 문서를 찾을 수 없습니다. 그래서, 왜 작동하지 않는 지에 대한 설명이 없습니다.

세부 사항 :

  1. 안드로이드 리눅스 커널 2.6.35 armv7l
  2. objdump를가 libc.so 필요 lib1.so 표시와
  3. objdump를 보여줍니다 lib2.so 만
  4. 을 libc.so가 필요 lib2.so

답변

1

확인. 방금 해결책을 찾았습니다. lib1.so의 링커 옵션에 -lgcc를 추가하면 해결되었습니다. 컴파일러가 libgcc에서 특수 내장 함수에 대한 호출을 자동 생성 한 것처럼 보입니다. 또한 컴파일러는 memcpy에 대한 특수 호출을 자동으로 생성하기 때문에 -lc도 필요합니다.

0

프로젝트에 대한 확신이 없습니다. 하지만 System.loadLibrary를 사용하여 Service에서 라이브러리를로드하는 것이 더 좋습니다.)

System.loadLibrary (lib.so); 귀하의 경우에는 먼저 lib2.so를로드 한 다음 어떤 이유로 든 dlopen이 작동하지 않는 경우에만 lib1.so를로드하십시오.

1

dlerror에 전화하여 실제 문제가 무엇인지 찾으려고 시도 했습니까?

+0

dlerror() : 라이브러리를로드 할 수 없습니다. reloc_library [1311] : 23061 '__aeabi_fcmpgt'을 (를) 찾을 수 없습니다. – psihodelia

관련 문제