2017-10-08 108 views
0

我想用下面的代码动态加载SO文件。 SO文件是从包含此SO库的x86和arm版本的apk中提取的(使用单C#dll的打包文件)。使用dlopen动态加载x86的android.so文件,错误与未定义的符号

void * mono = dlopen("./libmonodroid_bundle_app.so", RTLD_LAZY); 
if(!mono){ 
    cerr << "Cannot Load Library. Error: " << dlerror() << '\n'; 
    return -1; 
} 

运行我的程序时,我首先得到了以下错误:

Cannot Load Library. Error: /usr/lib/i386-linux-gnu/libc.so

这是由于我的libc.so文件是一个链接脚本,它尝试读取它作为一个实际的SO文件。

如果我手动复制libc.so使用:sudo cp /lib/i386-linux-gnu/ld-linux.so.2 libc.so它的工作原理。然后我就找到liblog.so我做了一个x86版,也++的libstdc所以

现在,我终于得到了所有这些库调用dlopen的时候,我得到了以下错误:

Cannot Load Library Error: /libmonodroid_bundle.app.so undefined symbol: __sF

在哪里是未定义的符号?我可以编辑.so文件通过IDA删除它,但我怀疑它不能正常工作。

的.so文件我想下面调用是否有帮助的

LDD输出:

ldd -r -v libmonodroid_bundle_app.so 
    linux-gate.so.1 => (0xb77fd000) 
    libc.so => /usr/lib/i386-linux-gnu/libc.so (0xb6de2000) 
    libm.so => /usr/lib/i386-linux-gnu/libm.so (0xb6d8c000) 
    libdl.so => /usr/lib/i386-linux-gnu/libdl.so (0xb6d85000) 
    liblog.so => /usr/lib/i386-linux-gnu/liblog.so (0xb6d83000) 
    libz.so => /usr/lib/i386-linux-gnu/libz.so (0xb6d66000) 
    libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb6bac000) 
    /lib/ld-linux.so.2 (0x80009000) 
undefined symbol: __sF (./libmonodroid_bundle_app.so) 

    Version information: 
    /usr/lib/i386-linux-gnu/libm.so: 
     ld-linux.so.2 (GLIBC_PRIVATE) => /lib/ld-linux.so.2 
     libc.so.6 (GLIBC_2.1.3) => /lib/i386-linux-gnu/libc.so.6 
     libc.so.6 (GLIBC_2.0) => /lib/i386-linux-gnu/libc.so.6 
     libc.so.6 (GLIBC_PRIVATE) => /lib/i386-linux-gnu/libc.so.6 
    /usr/lib/i386-linux-gnu/libdl.so: 
     ld-linux.so.2 (GLIBC_PRIVATE) => /lib/ld-linux.so.2 
     libc.so.6 (GLIBC_PRIVATE) => /lib/i386-linux-gnu/libc.so.6 
     libc.so.6 (GLIBC_2.1.3) => /lib/i386-linux-gnu/libc.so.6 
     libc.so.6 (GLIBC_2.1) => /lib/i386-linux-gnu/libc.so.6 
     libc.so.6 (GLIBC_2.0) => /lib/i386-linux-gnu/libc.so.6 
    /usr/lib/i386-linux-gnu/libz.so: 
     libc.so.6 (GLIBC_2.1) => /lib/i386-linux-gnu/libc.so.6 
     libc.so.6 (GLIBC_2.1.3) => /lib/i386-linux-gnu/libc.so.6 
     libc.so.6 (GLIBC_2.4) => /lib/i386-linux-gnu/libc.so.6 
     libc.so.6 (GLIBC_2.0) => /lib/i386-linux-gnu/libc.so.6 
     libc.so.6 (GLIBC_2.3.4) => /lib/i386-linux-gnu/libc.so.6 
    /lib/i386-linux-gnu/libc.so.6: 
     ld-linux.so.2 (GLIBC_2.3) => /lib/ld-linux.so.2 
     ld-linux.so.2 (GLIBC_PRIVATE) => /lib/ld-linux.so.2 
     ld-linux.so.2 (GLIBC_2.1) => /lib/ld-linux.so.2 

编辑:下面是来自IDA将extern表,可以看到__sF不指向任何事情很奇怪。

https://i.imgur.com/spI9Lu3.png

回答

1

看来你正试图在GNU/Linux系统,它使用的glibc上使用这是对仿生的libc(Android版)编译的二进制。这两个C库不兼容。

我不会说你不可能做你正在尝试的东西,但是实现你的目标并不像复制一些文件那么简单。您需要一个自定义动态链接器和一个将仿生libc调用转换为glibc调用(或原始系统调用)的垫片。

+0

谢谢。我最终反编译文件并以另一种方式提取文件 – rolls