gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 12:37:40 51 4
gpt4 key购买 nike

我有两个文件:

库文件

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

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

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-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 的结果是:

./main: not found

即使我的文件就在那里!

我在交叉编译过程中遗漏了什么吗?有什么帮助吗?我使用的是 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 用于 x64),而 Android 使用 /bin/链接器。您可以使用 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 的工具链是不够的。

关于android - 使用动态库交叉编译 C 代码时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14939101/

51 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com