静态链接二进制文件需要共享库libnss

时间:2014-03-17 11:09:13

标签: android arm glibc codesourcery linaro

我正在使用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没有响应

2 个答案:

答案 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,而是在调用编译器时传递静态库。