我正在使用linaro和codesourcery工具链进行交叉编译,我发现即使提供-static
这里的问题似乎来自glibc动态链接libnss_* libraries
。
这是我的代码
#include <sys/types.h>
#include <pwd.h>
int main(){
struct passwd *pw = getpwnam("root");
return 0;
}
运行以下命令
arm-linux-gnueabihf-gcc -static pwnam_test.c -lc -o pwtest
在对它产生后,得到了以下输出
11455 uname(0xf6ffeb70) = 0
11455 brk(NULL) = 0x0006d000
11455 brk(0x0006dd00) = 0x0006dd00
11455 brk(0x0008ed00) = 0x0008ed00
11455 brk(0x0008f000) = 0x0008f000
11455 socket(1,526337,0,0,445504,319244) = 3
11455 connect(3,0xf6ffea30,110) = -1 errno=2 (No such file or directory)
11455 close(3) = 0
11455 socket(1,526337,0,1,445504,0) = 3
11455 connect(3,0xf6ffeb50,110) = -1 errno=2 (No such file or directory)
11455 close(3) = 0
11455 open("/etc/nsswitch.conf",O_RDONLY|O_CLOEXEC) = 3
11455 fcntl64(3,F_GETFD) = 1
11455 fstat64(3,0xf6ffeb78) = 0
11455 mmap2(NULL,4096,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANONYMOUS,-1,0) = 0xf67fe000
11455 read(3,0xf67fe000,4096) = 513
11455 read(3,0xf67fe000,4096) = 0
11455 close(3) = 0
11455 munmap(0xf67fe000,4096) = 0
11455 open("/etc/ld.so.cache",O_RDONLY|O_CLOEXEC) = 3
11455 fstat64(3,0xf6ffe450) = 0
11455 mmap2(NULL,88624,PROT_READ,MAP_PRIVATE,3,0) = 0xf67e9000
11455 close(3) = 0
11455 access("/etc/ld.so.nohwcap",F_OK) = -1 errno=2 (No such file or directory)
11455 open("/lib/arm-linux-gnueabihf/libnss_compat.so.2",O_RDONLY|O_CLOEXEC) = -1 errno=2 (No such file or directory)
11455 stat64("/lib/arm-linux-gnueabihf",0xf6ffe488) = -1 errno=2 (No such file or directory)
11455 open("/usr/lib/arm-linux-gnueabihf/libnss_compat.so.2",O_RDONLY|O_CLOEXEC) = -1 errno=2 (No such file or directory)
11455 stat64("/usr/lib/arm-linux-gnueabihf",0xf6ffe488) = -1 errno=2 (No such file or directory)
11455 open("/lib/libnss_compat.so.2",O_RDONLY|O_CLOEXEC) = -1 errno=2 (No such file or directory)
11455 stat64("/lib",0xf6ffe488) = 0
11455 open("/usr/lib/libnss_compat.so.2",O_RDONLY|O_CLOEXEC) = -1 errno=2 (No such file or directory)
11455 stat64("/usr/lib",0xf6ffe488) = 0
11455 munmap(0xf67e9000,88624) = 0
11455 exit_group(0)
我怎么能静态链接所有动态需要的库或我需要交叉编译glibc?
好吧,我不赞成使用NDK,因为我试图以某种方式交叉编译nginx但是在访问localhost时:8080 nginx没有响应
答案 0 :(得分:2)
即使您使用-static
,glibc仍会使用dlopen
将本地库用于DNS等。
我担心你不能阻止它这样做;它只是它的方式。尝试在Android上使用基于glibc的Linux工具链可能是错误的做法(尽管如果你选择的话,你当然可以将glibc安装到Android中 - 比如chroot,或者替代-Wl,-rpath
和{{1设置)。
请注意,传递-Wl,--dynamic-linker
通常是多余的(尽管我很惊讶您没有通过-lc
来使链接正常工作)。
我建议您使用真正的Android工具链,配置为使用Bionic C库,并使用它。谷歌NDK将工作,林纳罗也可以做(他们同时做Android和Linux,所以确保你得到正确的)。所有工具链都使用GCC,因此您可以毫无困难地确定如何使用它。
答案 1 :(得分:0)
Android几乎是使用Linux内核的不同操作系统,所以你不能真正使用其他工具链而不是NDK为Android构建原生二进制文件。
例如,您的strace,Android不会将库放在lib
或/usr/lib
下,而是/system/lib
。
关于动态链接,您可能不应该传递-lc
,而是在调用编译器时传递静态库。