Ich kompiliere einige ausführbare Dateien für Android 5.0, da es erfordert, dass ausführbare Dateien PIE
sind. Ich konnte es neu kompilieren für ARM
mit nur einige Argumente hinzugefügt, während (mit Standalone-Toolchain) konfigurieren:GCC: -static und -pie sind inkompatibel für x86?
export CFLAGS="-I/softdev/arm-libs/include -fPIE"
export CPPLAGS="$CPPFLAGS -fPIE"
export CXXLAGS="$CXXFLAGS -fPIE"
export LDFLAGS="-L/softdev/arm-libs/lib -static -fPIE -pie"
kein Fehler für ARM:
configure:3406: arm-linux-androideabi-gcc -o conftest -I/softdev/arm-libs/include -fPIE -L/softdev/arm-libs/lib -static -fPIE -pie conftest.c >&5
configure:3410: $? = 0
Aber ich konnte nicht das gleiche für x86
zu tun wie ich bin immer Fehler:
export CFLAGS="-I/softdev/x86-libs/include -fPIE"
export CPPLAGS="$CPPFLAGS -fPIE"
export CXXLAGS="$CXXFLAGS -fPIE"
export LDFLAGS="-L/softdev/x86-libs/lib -static -fPIE -pie"
Fehler:
configure:3336: i686-linux-android-gcc -I/softdev/x86-libs/include -fPIE -L/softdev/x86-libs/lib -static -fPIE -pie conftest.c >&5
/softdev/x86-toolchain-gcc4.8/bin/../lib/gcc/i686-linux-android/4.8/../../../../i686-linux-android/bin/ld: fatal error: -pie and -static are incompatible
collect2: error: ld returned 1 exit status
configure:3340: $? = 1
Ich brauche ausführbare Dateien, die statisch verknüpft werden. Was ist los und wie kann ich es beheben?
PS. Auch versucht x86 Standalone-Toolchain aus Android NDK R9D und R10C mit:
./make-standalone-toolchain.sh --toolchain=x86-4.8 --arch=x86 --install-dir=/softdev/x86-toolchain-gcc4.8-r9d --ndk-dir=/softdev/android-ndk-r9d/ --system=darwin-x86_64
Ian, Autor von "Gold" Linker sagt: https://sourceware.org/ml/binutils/2012-02/msg00247.html „* On GNU/Linux Eine PIE ist nur eine ausführbare, gemeinsam genutzte Bibliothek. Wie würden Sie eine statisch verknüpfte PIE implementieren? * "Und https://sourceware.org/ml/binutils/2012-02/msg00249.html" * Aber Verknüpfung mit - Kuchen erzeugt wirklich nur eine geteilte Bibliothek. Und eine gemeinsame Bibliothek erfordert ld.so. * ". Wahrscheinlich haben Sie auf ARM nicht die echte statische Binärdatei, sondern binäre mit ld.so-Interpreter. Testen Sie auch x86_64. Sie können Ihre Bibliotheken statisch verknüpfen, aber verwenden Sie dynamic libc (verwenden Sie nicht die Option -static). – osgx
Ich bin mir nicht sicher, wie es intern funktioniert, aber zumindest kann ich für ARM mit beiden Argumenten kompilieren und kann nicht auf X86. Kompiliert mit "-static" -Datei ist 1,7 MB und ohne es (Test auf x86) ist nur 400 KB. So macht es mir das Gefühl, "static" funktioniert auch wenn "-pie" – 4ntoine
Verwenden Sie 'file -k', um den Binär-Typ zu überprüfen, und' readelf -l', um INTERP-Abschnitt von ELF zu überprüfen (wenn Sie einen haben, es ist nicht die echte statische Binärdatei) und 'ldd', um verknüpfte Bibliotheken zu prüfen. Ich denke, Ihr Arm binär kann nicht wirklich statisch binär sein. – osgx