Android NDK: objcopy --rename-sym не работает (необходимо переименовать функцию в файле.so)

Я не могу получить objcopy --rename-sym за работой.

В новом проекте Android я создал каталог jni и файл stub.c:

#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

(Есть ссылки:

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?

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 это, и использование:

$ ./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

Соответствующая часть таблицы ASCII:

  ! " # $ % & ' ( ) * + , - . / 
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,

Другие вопросы по тегам