2014-04-11 8 views
1

objcopy --rename-sym을 사용할 수 없습니다.android NDK : objcopy --rename-sym가 작동하지 않습니다 (.so 파일에서 함수의 이름을 바꿔야 함)

#include <jni.h> 
#include "dlog.h" 

jint JNI_OnLoad(JavaVM* vm, void* reserved) { 
DLOG("~~~~~~~~~~~~~~~~~~~~~~~ JNI_OnLoad ~~~~~~~~~~~~~~~~~~~~~~~~~"); 
    return JNI_VERSION_1_6; 
} 
int myfunc() { return 0; } 

명령 ~/an/ndk-build -j 4는 말한다 :

[armeabi-v7a] Install  : libTest.so => libs/armeabi-v7a/libTest.so 
[armeabi] Install  : libTest.so => libs/armeabi/libTest.so 
[x86] Install  : libTest.so => libs/x86/libTest.so 
[mips] Install  : libTest.so => libs/mips/libTest.so 

(이 있습니다 링크 :

새로운 안드로이드 프로젝트에서

, 나는 디렉토리 JNI 및 파일 stub.c을 만들었습니다
an -> ~/android-ndk-r9d/ 
ax -> android-ndk-r9d/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86/bin/ 
ay -> ~/android-ndk-r9d/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86/bin/ 

)

은 그 때 나는

~/ax/arm-linux-androideabi-objcopy --redefine-sym myfunc=ourfunc libTest.so libTest-x.so 

을하고 동일한 libTest-x.so를 얻을. 나는 물론 같은 결과로 ~/ay/*objcopy을 시도했다. 오류 메시지가 표시되지 않습니다. 그리고 myfunc()이 여전히 존재하며 ourfunc()이 없습니다.

.so 파일의 함수 이름을 어떻게 바꿉니 까?

+0

.so 파일에서 비슷한 테스트를 시도했지만 성공하지 못했습니다. 그러나 ndk objcopy를 사용하여 .o 파일에서 일반 (vs 동적) 심볼의 이름을 바꿀 수있었습니다. 따라서 동적 기호 *에 대해서는 지원되지 않을 수 있습니다. http://sourceware.org/ml/binutils/2006-03/msg00005.html 일반적으로 binutils에서 지원되지 않을 수도 있음을 제안합니다. 누군가가 추가하려고했지만 실패했습니다. –

+0

같은 길이의 대체 이름을 사용하도록 요구 사항을 조정할 수 있다면, 필자가 알지 못하는 필수 정렬이없는 한'sed'가 트릭을 할 수 있습니다. –

답변

1

길이를 변경하지 않고 해시 값을 변경하지 않고 이름을 바꿀 수있는 가장 쉬운 방법은 이름을 변경하는 것입니다. 같은 해시 값을 유지

조금 까다 롭습니다, 당신은 이해하는 것이 얼마나 elf_hash() 작품 ::

elfhash.c :

#include <stdio.h> 

unsigned long 
elf_hash(const unsigned char *name) 
{ 
    unsigned long h = 0 , g ; 
    while (*name) 
    { 
     h = (h << 4) + * name ++ ; 
     if (g = h & 0xf0000000) { 
      h ^= g >> 24 ; 
     } 
     h &= ~g ; 
    } 
    return h ; 
} 

int main(int argc, char**argv) { 
    char* name = argv[1]; 
    printf("[%s]\n",name); 
    unsigned long hash = elf_hash(name); 
    printf("0x%lx\n",hash); 
    return 0; 
} 

[[편집이 : 새 버전이
에있다 https://github.com/18446744073709551615/reDroid/blob/master/hosttools/elfhash.c

]

gcc을 (동일한 해시 이름을 찾으면) 및 사용은 : ASCII 테이블의

$ ./a.out myFunc 
[myFunc] 
0x74ddc43 
$ ./a.out myFums 
[myFums] 
0x74ddc43 
$ ./a.out myFuoC# Note: a different hash value 
[myFuoC] 
0x74ddc33 
$ ./a.out myFupC 
[myFupC] 
0x74ddc43 

관련 부분은 다음과 같습니다

! " # $ % & ' () * + , - ./
0 1 2 3 4 5 6 7 8 9 : ; <=> ? 
@ A B C D E F G H I J K L M N O 
P Q R S T U V W X Y Z [ \ ]^_ 
` a b c d e f g h i j k l m n o 
p q r s t u v w x y z { | } ~ 

다음 중 하나

sed s/myFunc/myFums/g <libStuff.so >libStufx.so 

또는 설명서 hexedit libStuff.so로 대체합니다.

+0

그러나 이름 길이를 늘려야한다면 어떨까요? – max