1

ここで問題を提供した後でも見つけたlinaroとcodesourceryツールチェーンを使用してAndroid用にクロスコンパイルしていまし-staticたが、glibc dynamic link から発生しているよう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にアクセスするとnginxが応答しません:8080

4

2 に答える 2

3

-staticglibc を使用する場合でも、dlopenDNS などのためにローカル ライブラリを使用します。

残念ながら、これをやめることはできません。それはそのままです。Android 用に glibc ベースの Linux ツールチェーンを使用しようとするのは、おそらく間違ったことです (ただし、必要に応じて glibc を Android にインストールすることはできますが、chroot などに、または別-Wl,-rpath-Wl,--dynamic-linker設定を使用して)。

パスは通常冗長であることに注意してください(ただし、リンクを機能させるため-lcにパスする必要がなかったことに驚いています)。-ldl

Bionic C ライブラリで動作するように構成された実際の Android ツールチェーンを入手し、それを使用することをお勧めします。Google NDK が動作し、Linaro も動作します (Android と Linux の両方に対応しているため、正しいものを入手してください)。すべてのツールチェーンは GCC を使用するため、使用方法を理解するのに問題はありません。

于 2014-03-18T10:04:06.880 に答える
0

Android は Linux カーネルを使用するほぼ別の OS であるため、 NDK以外のツールチェーンを使用して Android 用のネイティブ バイナリをビルドすることはできません。

たとえば、strace から、Android はライブラリをlibor /usr/libbutの下に置きません/system/lib

動的リンクについては、-lcコンパイラを呼び出すときに静的ライブラリを渡すのではなく、渡す必要があります。

于 2014-03-17T11:34:50.430 に答える