[英]Error during Cross-compiling C code with Dynamic libraries
我有两个文件:
库文件
#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 arch)上导出我的程序:
导出 LD_LIBRARY_PATH=
pwd
arm-none-linux-gnueabi-gcc -c -fpic lib.c
arm-none-linux-gnueabi-gcc -shared -lc -o lib.so lib.o
arm-none-linux-gnueabi-gcc main.c -ldl -o main
adb push main /system/app
在我的智能手机上的正确文件夹上执行 ./main 的结果只是:
./主要:未找到
即使我的文件就在那里!
我在交叉编译过程中遗漏了什么吗? 有什么帮助吗? 我正在使用 CodeSourcery 的交叉编译器,它适用于没有 .so 库的静态程序。 谢谢
编辑:正如 Igor 在下面所说,这是一个链接器问题。 此命令修复它:
arm-none-linux-gnueabi-gcc -o test main.c -Wl,--dynamic-linker=/system/bin/linker -ldl
就我而言,我需要其他库,因为在 /system/lib/ 中没有很多 .so 文件。
“未找到”消息不是指共享对象,而是指动态链接器。 Linux 使用/lib/ld-linux.so.2
(或/lib64/ld-linux-x86-64.so.2
for 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
开关一起使用--dynamic-linker
器,但可能存在其他差异。 例如,Android 使用称为仿生的精简 libc 实现,它可能缺少您的程序所依赖的功能,或者具有不同的行为。
在为 Android 编译程序时,您应该使用 NDK 或其他面向 Android 的工具链。 即使它基于 Linux 内核,差异也足够大,以至于针对 Linux 的工具链是不够的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.