我什至在使用linaro和codesourcery工具链为android进行交叉编译时,即使在提供-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) = 011455 brk(NULL) = 0x0006d00011455 brk(0x0006dd00) = 0x0006dd0011455 brk(0x0008ed00) = 0x0008ed0011455 brk(0x0008f000) = 0x0008f00011455 socket(1,526337,0,0,445504,319244) = 311455 connect(3,0xf6ffea30,110) = -1 errno=2 (No such file or directory)11455 close(3) = 011455 socket(1,526337,0,1,445504,0) = 311455 connect(3,0xf6ffeb50,110) = -1 errno=2 (No such file or directory)11455 close(3) = 011455 open("/etc/nsswitch.conf",O_RDONLY|O_CLOEXEC) = 311455 fcntl64(3,F_GETFD) = 111455 fstat64(3,0xf6ffeb78) = 011455 mmap2(NULL,4096,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANONYMOUS,-1,0) = 0xf67fe00011455 read(3,0xf67fe000,4096) = 51311455 read(3,0xf67fe000,4096) = 011455 close(3) = 011455 munmap(0xf67fe000,4096) = 011455 open("/etc/ld.so.cache",O_RDONLY|O_CLOEXEC) = 311455 fstat64(3,0xf6ffe450) = 011455 mmap2(NULL,88624,PROT_READ,MAP_PRIVATE,3,0) = 0xf67e900011455 close(3) = 011455 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) = 011455 open("/usr/lib/libnss_compat.so.2",O_RDONLY|O_CLOEXEC) = -1 errno=2 (No such file or directory)11455 stat64("/usr/lib",0xf6ffe488) = 011455 munmap(0xf67e9000,88624) = 011455 exit_group(0)
我如何能够静态链接所有动态所需的库,或者我需要交叉编译glibc?
好吧,我不赞成使用NDK,因为我试图以某种方式交叉编译nginx来执行它,但是在访问localhost:8080时nginx不会响应
最佳答案
即使使用-static
,glibc仍将使用dlopen
将本地库用于DNS之类的事情。
恐怕您不能阻止它这样做。就是这样。尝试将基于glibc的Linux工具链用于Android可能是错误的事情(尽管您当然可以选择将glibc安装到Android中(例如,选择chroot或使用其他-Wl,-rpath
和-Wl,--dynamic-linker
设置)) 。
请注意,传递-lc
通常是多余的(尽管令您惊讶的是,您不必传递-ldl
即可使链接正常工作)。
我建议您获得一个真正的Android工具链,并将其配置为与Bionic C库一起使用,并使用它。 Google NDK可以使用,而Linaro也可以使用(他们同时使用Android和Linux,因此请确保您使用的是正确的)。所有工具链都使用GCC,因此您应该毫无疑问地了解如何使用它。