2013-01-20 4 views
3

LD_PRELOAD가 최신 Android 버전에서 지원되는지 궁금합니다. 4.0 ICS의시 Android 4.2 - LD_PRELOAD 지원 여부

은 아니었다, 그리고 문서에 (NDK 워드 프로세서/SYSTEM-ISSUES.html)는 여전히있다 :

No support for LD_LIBRARY_PATH, LD_PRELOAD, RTLD_LOCAL and many other options. 

그러나 며칠 전 내 안드로이드에 LD_LIBRARY_PATH를 사용했다 4.2 Galaxy Nexus가 작동했습니다 (!).

미리 감사드립니다.

+0

을 나는 일에 그 중 하나를 받고 불러올 수 있지만, 하나는 당신이 그것으로 할 계획 무엇을 궁금해 - 일반 안드로이드 작동시, 간부는() 정말 그렇게이 사용되지 않습니다 그러한 설정이 효과를 발휘할 수있는 많은 기회가 아닙니다. 명확하게 알고 싶으면 소스를 확인하거나 링커 바이너리에서 문자열을 실행하거나 테스트하십시오. –

+0

전에 LD_PRELOAD를 사용 해 본 적이 없지만 안드로이드에서 이렇게 할 수 있을지 궁금합니다. http://www.linuxjournal.com/article/7795 –

+0

하지만 무엇을 사용합니까? 적절한 Android 코드를 다루는 경우 jni 라이브러리를 기존 프로세스에로드합니다.이 경우 대체 함수를 먼저로드하면됩니다. 대부분의 시스템 라이브러리는 미리로드되어 있으므로주의해야합니다. 당신이 작성한 코드의 첫 번째 줄이 나오기 전에. 링커 사전로드 변수가 실제로 적용되는 경우는 실제로 바이너리를 실행하는 경우입니다. 유닉스 전통에서 안드로이드보다 더 많이 운영합니다. –

답변

0

일반적으로 LD_LIBRARY_PATH은 공학용 빌드 (a.k.a.routed devices)에서 꽤 오랫동안 작업 해 왔습니다. 문제는 로더가 변경 되었기 때문에 프로덕션 빌드에 도움이되지 않지만 앱 환경이 안전하기 때문입니다.

+0

흠 네, 저의 장치는 루틴입니다. 이것은 또한 "모든"라우팅 된 장치에 LD_LIBRARY_PATH (또는 더 나은 LD_PRELOAD)가 있다고 가정 할 수 있습니까? 내 앱이 뿌리깊은 장치 (슬프게도)가 필요하다는 것을 이미 인정했습니다. 이미 슬픈 것처럼 - LD_PRELOAD가 작동하는지조차 알지 못합니다. –

+0

AOSP 바이오닉/링커/linker.c를 보면,'LD_PRELOAD'는 파싱되지 않습니다. 동일한 것은 LD_LIBRARY_PATH에 대한 변경 사항이 루트 된 모든 장치의 로더에 의해 존중된다는 것을 가정 할 수 있음을 증명합니다. https://groups.google.com/forum/?fromgroups=#!topic/android-ndk/m6OddFQINxs 및 https://groups.google.com/forum/?fromgroups=#!topic/android-ndk/2iy4zeyoVKU를 참조하십시오. . 근본적으로, LD_LIBRARY_PATH는 루핑 된 장치에서만 제어 할 수있는 로더 (또는 사용자가 신경 쓸 경우 프로세스)가 시작될 때 구문 분석됩니다. –

+0

답변 해 주셔서 감사합니다. 자, 내가 이걸로 뭔가를 할 수 있는지 봐야 해 :) –

5

공식적인 NDK-r9d 문서는 여전히 동일하지만 LD_PRELOAD는 루팅 된 장치에서 작동 함이 밝혀졌습니다. 실행

adb shell 
setprop wrap.com.xyz.yourapp LD_PRELOAD=/path/to/your/library.so 
stop 
start 

라이브러리를 장치에 푸시 한 후 함수의 대체 정의를 제공하기 위해 ANDROID-19 에뮬레이터에서 성공적으로 시도했습니다.

체크 아웃이 링크 - http://cedricvb.be/post/intercepting-android-native-library-calls/

+0

나를 위해 너무 늦었다. 그러나 확실히 좋은 힌트와 흥미 롭다. :) –

+1

굉장한 대답. 특성 값이 91 문자보다 커서는 안되는 점이 한 가지 있습니다 ... 따라서 경로/to/your/library.so가 짧아야합니다 (특히 여러 라이브러리가 필요한 경우). – JonnyBoy