2012-01-05 3 views
0

다른 공유 라이브러리 (.so)에서 호출 프로세스에 의해로드 된 공유 라이브러리를 확인할 수 있습니까? 거기에는 명령 줄 도구가 있지만 C++ 코드에서 이러한 검사를 수행 할 수 있습니까?로드 된 공유 라이브러리를 Linux/Android의 다른 공유 라이브러리에서 확인하십시오.

어떻게 든 Android 애플리케이션에 의해로드 된 네이티브 공유 라이브러리 목록을 가져와야하지만 Java 코드에서는 가능하지 않습니다.

답변

2

/proc/<pid>/maps 파일이나 호출 프로세스에 대해서만 /proc/self/maps을 사용할 수 있습니다. '.so'로 끝나는 줄은 링크 된 공유 라이브러리 용입니다. 해킹이지만 작동해야합니다. 한 라이브러리를 여러 번 매핑 할 수 있으므로 반복을 건너 뛸 필요가 있습니다.

좋은 소식 : 당신은 자바에서 할 수 있습니다. 아래의 코드는 현재 프로세스의 공유 라이브러리를 logcat에 출력합니다.

try { 
    Set<String> libs = new HashSet<String>(); 
    String mapsFile = "/proc/self/maps"; 
    BufferedReader reader = new BufferedReader(new FileReader(mapsFile)); 
    String line; 
    while ((line = reader.readLine()) != null) { 
     if (line.endsWith(".so")) { 
      int n = line.lastIndexOf(" "); 
      libs.add(line.substring(n + 1)); 
     } 
    } 
    Log.d("Ldd", libs.size() + " libraries:"); 
    for (String lib : libs) { 
     Log.d("Ldd", lib); 
    } 
} catch (FileNotFoundException e) { 
    // Do some error handling... 
} catch (IOException e) { 
    // Do some error handling... 
} 

내 장치에 출력된다 : 또한

D/Ldd  (11286): 55 libraries: 
D/Ldd  (11286): /system/lib/libc.so 
D/Ldd  (11286): /system/lib/libdbus.so 
D/Ldd  (11286): /system/lib/librpc.so 
D/Ldd  (11286): /system/lib/libEGL.so 
D/Ldd  (11286): /system/lib/libstagefright_color_conversion.so 
D/Ldd  (11286): /system/lib/libmedia.so 
D/Ldd  (11286): /system/lib/libemoji.so 
D/Ldd  (11286): /system/lib/libcrypto.so 
D/Ldd  (11286): /system/lib/libstagefright_avc_common.so 
D/Ldd  (11286): /system/lib/libnativehelper.so 
D/Ldd  (11286): /system/lib/libskiagl.so 
D/Ldd  (11286): /system/lib/libopencore_player.so 
D/Ldd  (11286): /system/lib/libjpeg.so 
D/Ldd  (11286): /system/lib/libsurfaceflinger_client.so 
D/Ldd  (11286): /system/lib/libstagefright.so 
D/Ldd  (11286): /system/lib/libdrm1.so 
D/Ldd  (11286): /system/lib/libdvm.so 
D/Ldd  (11286): /system/lib/libwebcore.so 
D/Ldd  (11286): /system/lib/libGLESv1_CM.so 
D/Ldd  (11286): /system/lib/libhardware.so 
D/Ldd  (11286): /system/lib/libexif.so 
D/Ldd  (11286): /system/lib/libgps.so 
D/Ldd  (11286): /system/lib/liblog.so 
D/Ldd  (11286): /system/lib/libexpat.so 
D/Ldd  (11286): /system/lib/libopencore_common.so 
D/Ldd  (11286): /system/lib/libbluedroid.so 
D/Ldd  (11286): /system/lib/libm.so 
D/Ldd  (11286): /system/lib/libicui18n.so 
D/Ldd  (11286): /system/lib/libomx_amrenc_sharedlibrary.so 
D/Ldd  (11286): /system/lib/libwpa_client.so 
D/Ldd  (11286): /system/lib/libstdc++.so 
D/Ldd  (11286): /system/lib/libandroid_runtime.so 
D/Ldd  (11286): /system/lib/libz.so 
D/Ldd  (11286): /system/lib/libETC1.so 
D/Ldd  (11286): /system/lib/libsonivox.so 
D/Ldd  (11286): /system/lib/libstlport.so 
D/Ldd  (11286): /system/lib/libutils.so 
D/Ldd  (11286): /system/lib/libicudata.so 
D/Ldd  (11286): /system/lib/libsqlite.so 
D/Ldd  (11286): /system/lib/libhardware_legacy.so 
D/Ldd  (11286): /system/lib/libpixelflinger.so 
D/Ldd  (11286): /system/lib/libvorbisidec.so 
D/Ldd  (11286): /system/lib/libstagefright_amrnb_common.so 
D/Ldd  (11286): /system/lib/libcutils.so 
D/Ldd  (11286): /system/lib/libui.so 
D/Ldd  (11286): /system/lib/libmedia_jni.so 
D/Ldd  (11286): /system/lib/libomx_sharedlibrary.so 
D/Ldd  (11286): /system/lib/libcamera_client.so 
D/Ldd  (11286): /system/lib/libskia.so 
D/Ldd  (11286): /system/lib/libopencore_net_support.so 
D/Ldd  (11286): /system/lib/libnetutils.so 
D/Ldd  (11286): /system/lib/libbinder.so 
D/Ldd  (11286): /system/lib/libssl.so 
D/Ldd  (11286): /system/lib/libicuuc.so 
D/Ldd  (11286): /system/lib/libGLESv2.so 

필요한 PID가 android.os.Process.myPid()함으로써 얻어 질 수있는 경우.

+0

하지만 어떻게 코드에서 사용할 수 있습니까? 명령 줄 도구를 호출하는 것처럼 보입니다 ... – vitakot

+0

아니요,이 작업을 위해 명령 줄 도구가 필요하지 않습니다. 나는 나의 대답을 업데이트했다. –

+0

좋은 예! 하지만 그것은 내게 오류를 보여줍니다 : 메서드 myPid()는 프로세스 유형에 대해 정의되지 않았습니다 ... – vitakot

0

WRT java. 질문에서 .so에 ldd을 호출하는 프로세스를 시작하십시오. 표준 출력에서 ​​출력을 캡처 및 출력 처리 :

Process process = Runtime.getRuntime().exec("ldd a.so"); 
StreamGobbler outputGobbler = new StreamGobbler(process.getInputStream()); 
outputGobbler.start(); 
process.waitFor(); 
String result = outputGobbler.buffer; 

클래스 정의에 대한 StreamGobbler에 정액 게시물을 참조하십시오. String buffer 변수를 추가하고이 행을 System.out.println(type + ">" + line);으로 바꾸고 이전 링크의 클래스 정의에서 buffer = buffer + line+"\n";으로 바꿉니다. 분명히 두 번째 인수를 생성자에 전달했습니다.

class StreamGobbler extends Thread 
{ 
    InputStream is; 
    String buffer; 

    StreamGobbler(InputStream is) 
    { 
     this.is = is; 
     this.buffer = ""; 
    } 

    public void run() 
    { 
     try 
     { 
      InputStreamReader isr = new InputStreamReader(is); 
      BufferedReader br = new BufferedReader(isr); 
      String line=null; 
      while ((line = br.readLine()) != null) 
       buffer += line+"\n";  
      } catch (IOException ioe) 
       { 
       ioe.printStackTrace(); 
       } 
    } 
} 
+0

안타깝게도 표준 (수정되지 않은) 안드로이드 시스템에는'ldd' 명령이 없습니다. –

+0

'nm'은 어떻습니까? – ajshower

+0

'nm'도 없습니다. grep이나 find 또는 대부분의 다른 표준 유닉스 도구조차 없다. 에뮬레이터에서 확인할 수 있습니다. –

관련 문제