2017-10-08 2 views
0

과 함께 오류가 발생합니다. 다음 코드로 SO 파일을 동적으로로드하려고합니다. SO 파일은 x86 라이브러리가 포함 된 apk (이 파일은 모노 C# dll로 압축 된 파일)에서 추출되었습니다.dlopen을 사용하여 x86 android .so 파일을 동적으로로드합니다. 정의되지 않은 심볼

Cannot Load Library. Error: /usr/lib/i386-linux-gnu/libc.so

이것은 링커 스크립트 인 내 libc.so 파일에 기인하고 실제 SO 파일로 읽을 시도 : 내 프로그램을 실행할 때

void * mono = dlopen("./libmonodroid_bundle_app.so", RTLD_LAZY); 
if(!mono){ 
    cerr << "Cannot Load Library. Error: " << dlerror() << '\n'; 
    return -1; 
} 

내가 먼저 다음과 같은 오류가 발생했습니다 .

수동으로 libc.so를 복사하는 경우 : sudo cp /lib/i386-linux-gnu/ld-linux.so.2 libc.so 작동합니다. .

Cannot Load Library Error: /libmonodroid_bundle.app.so undefined symbol: __sF

: I는 또한

지금 그렇게하면 libstdC++ 마침내 dlopen을 호출 할 때 나는 다음과 같은 오류가 모든 라이브러리를 가지고, 내가 한 어떤 liblog.so의 86 버전을 찾아야했다 정의되지 않은 기호입니까? IDA를 통해 .so 파일을 제거하기 위해 .so 파일을 편집 할 수는 있지만 제대로 작동하지 않을 것으로 생각됩니다.

내가 그 도움이된다면 아래의 전화를 시도하고있는 .so를 파일의

LDD 출력 :

ldd -r -v libmonodroid_bundle_app.so 
    linux-gate.so.1 => (0xb77fd000) 
    libc.so => /usr/lib/i386-linux-gnu/libc.so (0xb6de2000) 
    libm.so => /usr/lib/i386-linux-gnu/libm.so (0xb6d8c000) 
    libdl.so => /usr/lib/i386-linux-gnu/libdl.so (0xb6d85000) 
    liblog.so => /usr/lib/i386-linux-gnu/liblog.so (0xb6d83000) 
    libz.so => /usr/lib/i386-linux-gnu/libz.so (0xb6d66000) 
    libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb6bac000) 
    /lib/ld-linux.so.2 (0x80009000) 
undefined symbol: __sF (./libmonodroid_bundle_app.so) 

    Version information: 
    /usr/lib/i386-linux-gnu/libm.so: 
     ld-linux.so.2 (GLIBC_PRIVATE) => /lib/ld-linux.so.2 
     libc.so.6 (GLIBC_2.1.3) => /lib/i386-linux-gnu/libc.so.6 
     libc.so.6 (GLIBC_2.0) => /lib/i386-linux-gnu/libc.so.6 
     libc.so.6 (GLIBC_PRIVATE) => /lib/i386-linux-gnu/libc.so.6 
    /usr/lib/i386-linux-gnu/libdl.so: 
     ld-linux.so.2 (GLIBC_PRIVATE) => /lib/ld-linux.so.2 
     libc.so.6 (GLIBC_PRIVATE) => /lib/i386-linux-gnu/libc.so.6 
     libc.so.6 (GLIBC_2.1.3) => /lib/i386-linux-gnu/libc.so.6 
     libc.so.6 (GLIBC_2.1) => /lib/i386-linux-gnu/libc.so.6 
     libc.so.6 (GLIBC_2.0) => /lib/i386-linux-gnu/libc.so.6 
    /usr/lib/i386-linux-gnu/libz.so: 
     libc.so.6 (GLIBC_2.1) => /lib/i386-linux-gnu/libc.so.6 
     libc.so.6 (GLIBC_2.1.3) => /lib/i386-linux-gnu/libc.so.6 
     libc.so.6 (GLIBC_2.4) => /lib/i386-linux-gnu/libc.so.6 
     libc.so.6 (GLIBC_2.0) => /lib/i386-linux-gnu/libc.so.6 
     libc.so.6 (GLIBC_2.3.4) => /lib/i386-linux-gnu/libc.so.6 
    /lib/i386-linux-gnu/libc.so.6: 
     ld-linux.so.2 (GLIBC_2.3) => /lib/ld-linux.so.2 
     ld-linux.so.2 (GLIBC_PRIVATE) => /lib/ld-linux.so.2 
     ld-linux.so.2 (GLIBC_2.1) => /lib/ld-linux.so.2 

편집 : 아무것도 가리 키지 않는 여기 IDA에서 통근 테이블과 그 __sF를 볼 수있는 이상하다.

https://i.imgur.com/spI9Lu3.png

답변

1

당신의 glibc를 사용하는 GNU/리눅스 시스템에서 (안드로이드 용) 슈퍼맨의 libc에 대해 컴파일 된 바이너리를 사용하려고하는 것 같다. 이 두 C 라이브러리는 호환되지 않습니다.

나는 당신이 시도하고있는 것을하는 것이 불가능하다고 말하지 않을 것이지만, 당신의 목표를 달성하는 것은 몇 가지 파일을 복사하는 것만 큼 간단하지 않습니다. Bionic libc 호출을 glibc 호출 (또는 원시 시스템 호출)로 변환하는 사용자 정의 동적 링커와 심이 필요합니다.

+0

감사합니다. 파일을 디 컴파일하고 다른 방법으로 파일 압축을 풀었습니다. – rolls

관련 문제