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

2020-07-24 23:06:24 +08:00
 BoarBoar
手里现在有个需求,要在服务器后台调用一个 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 库就可以。
请教大佬问题到底出在哪呢
2114 次点击
所在节点    程序员
9 条回复
billccn
2020-07-25 03:46:50 +08:00
你这个信息太少,至少把你调用的代码和命令行放出来。尝试用`ld`把你这个库静态连进你调用代码它报什么错呢?
ciaoly
2020-07-25 09:10:46 +08:00
可能是这个安卓的动态链接库又依赖了其它库吧。
Deffi
2020-07-25 09:23:31 +08:00
要看 so 库内部有没有做运行环境检测,比如只支持自家 App 内调用。还有 so 也是分 CPU 架构的
wcavell
2020-07-25 11:49:26 +08:00
你可以试一下 unidbg
BoarBoar
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
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
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
2020-07-25 12:28:48 +08:00
@wcavell 谢谢 在看了 看上去好像不错
BoarBoar
2020-07-27 20:53:26 +08:00
多谢各位回复,搞定了。
c 的交叉编译对于无经验者来说坑实在太多了,最后还是用了 unidbg 这个开源包,用 java 单独写了个服务

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/692920

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX