【问题标题】:Native libs cross compiled from ubuntu linux targeting arm (android)从针对 arm (android) 的 ubuntu linux 交叉编译的本机库
【发布时间】:2015-03-26 10:26:48
【问题描述】:

我正在试验从 ubuntu 交叉编译的原生库。我真正想要的是能够编译我的 c++ 库并在 Xamarin.Android 应用程序中使用它们。

首先,我有 arm gcc 编译器:arm-linux-gnueabi-gcc。我有一个简单的库(libmr.so),它有一个函数void Print();,可以在控制台上打印一些东西。我正在编译:

arm-linux-gnueabi-gcc -Wall -shared -o libmr.so mr.c

当使用file libmr.so 检查它时,一切似乎都很好。但是,当我将它包含在我的 android 应用程序中并尝试加载它时,就好像它不存在一样。我确定它在那里,路径绝对正确,因为我尝试从同一个文件夹加载另一个库 (libmonodroid.so) 并且它有效。

我尝试检查两个库以发现某种差异:

$ objdump -x libmr.so | grep NEEDED
      NEEDED               libc.so.6

$ objdump -x libmonodroid.so | grep NEEDED
      NEEDED               libc.so
      ... (in addition to other libs)

这是我发现两者之间的唯一区别。 libmonodroid.so 正确加载,但 libmr.so 就像它不存在一样。 (我使用dlopen 来加载一个库)

编辑:

我使用相同的工具链构建了一个可执行文件,给了我一个线索:

  • 与 libc 的静态链接:arm-linux-gnueabi-gcc -Wall -o hi source.c -static。将hi 推送到我的安卓设备并使用adb 执行它。结果:成功!
  • 与 libc 的动态链接:arm-linux-gnueabi-gcc -Wall -o hi source.c。结果:它甚至不存在!意思是./hi 给出了/system/bin/sh: ./hi: not found,尽管它绝对存在。

那么,看起来 libc 真的是罪魁祸首?也许我需要动态链接不是libc.so.6,而是libc.so,就像libmonodroid.so 正在做的那样?

【问题讨论】:

  • 使用 ndk 作为独立的工具链来构建你的 mr.c。 stackoverflow.com/a/5239573/1163019
  • @auselen 是的,我目前正在调查,看起来很有希望。将返回结果。

标签: android linux gcc shared-libraries


【解决方案1】:

检查this 寻找有同样问题的人。下载 ndk,有一个独立的工具链,用于构建在 android 上运行的本机库,您可以提取它(您不需要整个 ndk)。

【讨论】:

    【解决方案2】:

    我能够在 ubuntu 15.04 上使用这个 Makefile 在与我的 hi.c 相同的目录中运行一个基本应用程序:

    $ cat hi.c               # create hi.c with favorite editor
    #include <stdio.h>
    
    int main(int argc, char** argv) {
      int uid = getuid();
      int eid = geteuid();
      printf("Hello world\n");
      printf("You are uid: %d and eid; %d",  uid, eid);
      return 0;
    }
    
    $ cat Makefile                      # create two line Makefile
    CC=arm-linux-gnueabi-gcc
    LDFLAGS=-static
    
    $ make hi                           # build arm based hi executable file
    arm-linux-gnueabi-gcc   -static  hi.c   -o hi
    
    $ file hi                           # check file type
    hi: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), statically   linked, for GNU/Linux 2.6.32, BuildID[sha1]=17b65e60cdd32449ac237bfd1b8238bfa1d416a0, not stripped
    
    $ adb push hi /data/local/tmp          # copy to droid fon
    4403 KB/s (593252 bytes in 0.131s)
    
    $ adb shell /data/local/tmp/hi         # run hi executable
    adb shell /data/local/tmp/hi
    Hello world
    You are uid: 2000 and eid; 2000
    
    
    
    $ uname -a
    Linux lenny 3.19.0-28-generic #30-Ubuntu SMP Mon Aug 31 15:52:51 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
    

    请注意,我没有安装任何 NDK。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-03
      • 1970-01-01
      • 1970-01-01
      • 2011-08-04
      • 1970-01-01
      • 2015-10-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多