V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
BoarBoar
V2EX  ›  程序员

求教大佬 android 的.so 动态库可以在 x86 服务器上使用吗?

  •  
  •   BoarBoar · 2020-07-24 23:06:24 +08:00 · 2126 次点击
    这是一个创建于 1590 天前的主题,其中的信息可能已经有所发展或是发生改变。
    手里现在有个需求,要在服务器后台调用一个 android 上的.so 库,无源码。
    file 信息如下:
    ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV), dynamically linked, BuildID[sha1]=6b2cd1284f8f05d1211ed0e215cc75ed92aef256, stripped

    服务器搭建了 qemu-arm 环境,先后用 cgo 和 c 写了调用程序,用 arm-linux-gnueabi-gcc 编译,都调用失败。
    报错 No such file or directory 。
    但是自己写个 demo 用 arm-linux-gnueabi-gcc 编译成.so 库就可以。
    请教大佬问题到底出在哪呢
    9 条回复    2020-07-27 20:53:26 +08:00
    billccn
        1
    billccn  
       2020-07-25 03:46:50 +08:00
    你这个信息太少,至少把你调用的代码和命令行放出来。尝试用`ld`把你这个库静态连进你调用代码它报什么错呢?
    ciaoly
        2
    ciaoly  
       2020-07-25 09:10:46 +08:00 via Android
    可能是这个安卓的动态链接库又依赖了其它库吧。
    Deffi
        3
    Deffi  
       2020-07-25 09:23:31 +08:00
    要看 so 库内部有没有做运行环境检测,比如只支持自家 App 内调用。还有 so 也是分 CPU 架构的
    wcavell
        4
    wcavell  
       2020-07-25 11:49:26 +08:00 via iPhone
    你可以试一下 unidbg
    BoarBoar
        5
    BoarBoar  
    OP
       2020-07-25 12:21:55 +08:00
    @billccn 调用代码是这样的
    char* ttEncrypt(char* bArr, int i)
    {
    void* handle;
    typedef char* (*FPTR)(char*,int);

    handle = dlopen("./libEncryptor.so", RTLD_LAZY);
    if (handle == NULL)
    fprintf(stderr,"Error:failed to load libary.\n");
    char *error = dlerror();
    if (error != NULL)
    {
    fprintf(stderr,"%s\n",error);
    //return;
    }

    FPTR fptr = (FPTR)dlsym(handle, "ttEncrypt");

    char* result = (*fptr)(bArr,i);


    return result;
    }
    BoarBoar
        6
    BoarBoar  
    OP
       2020-07-25 12:24:44 +08:00
    发不了太长的回复见谅


    编译指令一开始 go 用的 CGO_ENABLED=1 GOOS=linux GOARCH=arm CC=arm-linux-gnueabi-gcc go build,指定 LDFLAGS: -ldl 。后来用 c 就是 arm-linux-gnueabi-gcc -o load load.c -ldl 。
    我之前没接触过相关,编译指令都是 gg 来的
    BoarBoar
        7
    BoarBoar  
    OP
       2020-07-25 12:28:24 +08:00
    依赖是这些
    Shared library: [liblog.so]
    Shared library: [libc.so]
    Shared library: [libm.so]
    Shared library: [libstdc++.so]
    Shared library: [libdl.so]
    BoarBoar
        8
    BoarBoar  
    OP
       2020-07-25 12:28:48 +08:00
    @wcavell 谢谢 在看了 看上去好像不错
    BoarBoar
        9
    BoarBoar  
    OP
       2020-07-27 20:53:26 +08:00
    多谢各位回复,搞定了。
    c 的交叉编译对于无经验者来说坑实在太多了,最后还是用了 unidbg 这个开源包,用 java 单独写了个服务
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2033 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 00:54 · PVG 08:54 · LAX 16:54 · JFK 19:54
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.