使用动态库交叉编译C代码时出错



我有两个文件:

lib.c

#include<stdio.h>
void hi() {
  printf("Hi i'm a library function in lib.son");
} 

和main.c

#include<stdio.h>
#include<dlfcn.h>
/* based on Jeff Scudder's code */
int main() {
  void *SharedObjectFile;
  void (*hi)();
  // Load the shared libary;
  SharedObjectFile = dlopen("./lib.so", RTLD_LAZY);
  // Obtain the address of a function in the shared library.
  ciao = dlsym(SharedObjectFile, "hi");
  // Use the dynamically loaded function.
  (*hi)();
  dlclose(SharedObjectFile);
}

我尝试使用以下命令构建一个可执行文件:

export LD_LIBRARY_PATH=pwd

gcc-c-fpic lib.c

gcc-shared-lc-o lib.so lib.o

gcc main.c-ldl

而且效果很好。然后我尝试使用以下命令在Android上导出我的程序(Nexus One,带有ARM-v7-0a arch):

export LD_LIBRARY_PATH=pwd

arm none linux gneabi gcc-c-fpic lib.c

arm none linux gneabi gcc-shared-lc-o lib.so lib.o

arm none linux gneabi gcc main.c-ldl-o main

adb推送主/系统/应用

执行的结果/我智能手机上正确文件夹上的主要内容只是:

/main:找不到

即使我的文件就在那里!

在交叉编译过程中我是否遗漏了什么?有什么帮助吗?我使用的是CodeSourcery的交叉编译器,它适用于没有.so库的静态程序。感谢

编辑:正如Igor下面所说,这是一个链接器问题。这个命令修复了它:

arm none linux gneabi gcc-o test main.c-Wl,--动态链接器=/system/bin/linker-ldl

就我而言,我需要其他库,因为在/system/lib/中没有太多.so文件。

"未找到"消息不是指共享对象,而是指动态链接器。Linux使用/lib/ld-linux.so.2(或用于x64的/lib64/ld-linux-x86-64.so.2),而Android使用/bin/linker。您可以检查程序使用readelf -l的动态加载器,例如:

Program Headers:
  Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align
  PHDR           0x000034 0x08048034 0x08048034 0x00100 0x00100 R E 0x4
  INTERP         0x000134 0x08048134 0x08048134 0x00013 0x00013 R   0x1
      [Requesting program interpreter: /lib/ld-linux.so.2]

您可以指定一个链接器与ld的--dynamic-linker开关一起使用,但可能还有其他区别。例如,Android使用了一个名为bionic的精简libc实现,它可能缺少程序所依赖的功能,或者具有不同的行为。

在为Android编译程序时,您应该使用NDK或其他针对Android的工具链。尽管它是基于Linux内核的,但差异足够大,以Linux为目标的工具链是不够的。

相关内容

  • 没有找到相关文章

最新更新