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

Android 静态链接的二进制文件需要共享库libnss,android,arm,glibc,codesourcery,linaro,Android,Arm,Glibc,Codesourcery,Linaro,我使用linaro和codesourcery工具链为android交叉编译,即使在提供了-static之后,我仍然发现问题似乎来自glibc动态链接libnss_*库 这是我的密码 #include <sys/types.h> #include <pwd.h> int main(){ struct passwd *pw = getpwnam("root"); return 0; } 经过扫描,它得到了如下输出 11455 uname(0xf6ffeb70

我使用linaro和codesourcery工具链为android交叉编译,即使在提供了
-static
之后,我仍然发现问题似乎来自glibc动态链接
libnss_*库

这是我的密码

#include <sys/types.h>
#include <pwd.h>

int main(){
   struct passwd *pw = getpwnam("root");
   return 0;
}
经过扫描,它得到了如下输出


11455 uname(0xf6ffeb70)=0
11455 brk(空)=0x0006d000
11455 brk(0x0006dd00)=0x0006dd00
11455 brk(0x0008ed00)=0x0008ed00
11455 brk(0x0008f000)=0x0008f000
11455插座(1526337,0,0445504319244)=3
11455 connect(3,0xF6FFEA30110)=-1 errno=2(无此类文件或目录)
11455关闭(3)=0
11455插座(1526337,0,1445504,0)=3
11455 connect(3,0xF6FFEB50110)=-1 errno=2(无此类文件或目录)
11455关闭(3)=0
11455打开(“/etc/nsswitch.conf”,O|RDONLY | O|u CLOEXEC)=3
11455 fcntl64(3,F_GETFD)=1
11455 fstat64(3,0xf6ffeb78)=0
11455 mmap2(空,4096,保护读取|保护写入,映射私有|映射匿名,-1,0)=0xf67fe000
11455读取(3,0xF67FE0004096)=513
11455读取(3,0xF67FE0004096)=0
11455关闭(3)=0
11455 munmap(0xF67FE0004096)=0
11455打开(“/etc/ld.so.cache”,O|RDONLY | O|u CLOEXEC)=3
11455 fstat64(3,0xf6ffe450)=0
11455 mmap2(空,88624,保护读取,映射私有,3,0)=0xf67e9000
11455关闭(3)=0
11455访问(“/etc/ld.so.nohwcap”,F_OK)=-1 errno=2(没有这样的文件或目录)
11455 open(“/lib/arm-linux-gnueabihf/libnss_-compat.so.2”,O|RDONLY | O|u-CLOEXEC)=-1 errno=2(没有这样的文件或目录)
11455 stat64(“/lib/arm-linux-gnueabihf”,0xf6ffe488)=-1 errno=2(没有这样的文件或目录)
11455 open(“/usr/lib/arm linux gnueabihf/libnss_compat.so.2”,O|RDONLY | O|CLOEXEC)=-1 errno=2(没有这样的文件或目录)
11455 stat64(“/usr/lib/arm-linux-gnueabihf”,0xf6ffe488)=-1 errno=2(没有这样的文件或目录)
11455 open(“/lib/libnss_compat.so.2”,O|RDONLY | O|u CLOEXEC)=-1 errno=2(没有这样的文件或目录)
11455 stat64(“/lib”,0xf6ffe488)=0
11455 open(“/usr/lib/libnss_compat.so.2”,O|RDONLY | O|u CLOEXEC)=-1 errno=2(没有这样的文件或目录)
11455 stat64(“/usr/lib”,0xf6ffe488)=0
11455 munmap(0xF67E900088624)=0
11455出口组(0)
我如何能够静态链接所有动态必需的库,或者我需要交叉编译glibc


嗯,我不赞成使用NDK,因为我试图交叉编译nginx,但它会在访问本地主机时执行:8080 nginx没有响应。Android几乎是一个使用Linux内核的不同操作系统,因此,除了为Android构建本机二进制文件外,您不能真正使用其他工具链

例如,从您的战略来看,Android不会将库置于
lib
/usr/lib
之下,而是
/system/lib
之下


关于动态链接,您可能不应该在调用编译器时传递
-lc
,而应该传递静态库。

即使在使用
-static
时,glibc仍将使用
dlopen
来使用本地库进行DNS之类的操作

恐怕你不能阻止它这样做;事情就是这样。尝试在Android上使用基于glibc的Linux工具链可能是错误的(尽管如果您选择,您当然可以将glibc安装到Android中——比如说,安装到chroot中,或者使用可选的
-Wl,-rpath
-Wl,--dynamic linker
设置)

请注意,传递
-lc
通常是多余的(尽管我很惊讶您不必传递
-ldl
才能使链接工作)


我建议您使用一个真正的Android工具链,配置为使用仿生C库,并使用它。GoogleNDK可以使用,Linaro也可以使用(他们同时使用Android和Linux,所以请确保使用正确的NDK)。所有的工具链都使用GCC,所以你应该不会有问题知道如何使用它。

我的系统中安装了NDK,但由于仿生的支持有限,我只能使用glibc well linaro工具链不支持armv4或armv5te cpu,即使在通过
march=armv5te
之后,它也只是忽略了,当我试图交叉编译phpIn时,我需要传递
-ldl
,阅读
-rpath
-dynamic linker
,并尝试将glibc安装到您的设备中。那么您首先就不需要
-static
。通常,将
libc
目录从CodeSourcery工具链复制到您的设备上就足够了(您不需要所有的子目录)。请注意,这些是GPL库,因此如果您分发它们,那么如果有人要求,您还需要将源代码放在手边。
arm-linux-gnueabihf-gcc -static  pwnam_test.c -lc -o pwtest