在与动态库交叉编译的C代码错误(Error during Cross-compiling C cod

2019-07-20 02:21发布

我有两个文件:

lib.c

#include<stdio.h>

void hi() {
  printf("Hi i'm a library function in lib.so\n");
} 

和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);
}

我已经试过用下面的命令来建立一个可执行文件:

出口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弓):

出口LD_LIBRARY_PATH = pwd

手臂-NONE-Linux的gnueabi-GCC -c -fpic lib.c

手臂-NONE-Linux的gnueabi-GCC -shared -lc -o lib.so lib.o

臂无-Linux的gnueabi-GCC的main.c -ldl -o主

ADB推主/系统/应用程序

在智能手机上正确的文件夹执行./main的结果就是:

./main:未找到

即使我的文件就在那里!

我错过了在交叉编译过程什么? 任何帮助吗? 我使用CodeSourcery的交叉编译器,它可以很好地用于没有。所以图书馆的静态程序。 谢谢

编辑 :作为伊戈尔下面指出,这是一个连接问题。 此命令修复它:

臂-NONE-Linux的gnueabi-GCC -o测试的main.c -Wl, - 动态接头= /系统/ bin中/接头-ldl

在我的非常情况下,我需要其他库,因为在/系统/ lib中/有没有很多.so文件。

Answer 1:

在“未找到”消息指的不是共享对象,而是动态连接器。 Linux使用/lib/ld-linux.so.2 (或/lib64/ld-linux-x86-64.so.2针对x64),而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使用一个精简的libc实现所谓的仿生,它可能会丢失,你的程序所需的功能,或有不同的行为。

为Android编译程序时,应使用NDK或其他Android系统的有针对性的工具链。 虽然它是基于Linux内核,差别足够大,使得Linux的定位工具链是不够的。



文章来源: Error during Cross-compiling C code with Dynamic libraries