Rekompiluję niektóre pliki wykonywalne dla systemu Android 5.0, ponieważ wymagają one, aby pliki wykonywalne miały numer PIE
. Udało mi się skompilować go ARM
z tylko dodanie kilku argumentów podczas konfigurowania (z autonomicznym toolchain):GCC: -static i -pie są niezgodne dla 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"
Brak błędu dla 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
ale byłem w stanie zrobić to samo dla x86
jak ja dostaję błąd:
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"
błąd:
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
Potrzebuję plików wykonywalnych do statycznego powiązania. Co jest nie tak i jak mogę to naprawić?
PS. Próbowałem też za pomocą autonomicznego x86 toolchain z Android R9d NDK i R10C:
./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 łącznikiem "złoto" mówi: https://sourceware.org/ml/binutils/2012-02/msg00247.html „* Na GNU/Linux a PIE to po prostu wykonywalna biblioteka współdzielona. W jaki sposób byś zaimplementował statycznie połączoną PIE? * "I https://sourceware.org/ml/binutils/2012-02/msg00249.html" * Ale łączenie z - ciasto naprawdę generuje wspólną bibliotekę, a wspólna biblioteka wymaga pliku ld.so. * ". Prawdopodobnie na ARM nie będziesz miał prawdziwego statycznego binarnego, ale binarnego z ld.so interpreter. Przetestuj także x86_64. Możesz połączyć swoje biblioteki statycznie, ale używaj dynamicznej biblioteki libc (nie używaj opcji '-static'). – osgx
Nie jestem pewien, jak to działa wewnętrznie, ale przynajmniej mogę skompilować dla ARM z obu argumentów i nie można na X86. Skompilowany z "-static" plik jest 1,7mb i bez niego (test na x86) jest tylko 400KB. Więc czuję, że "-statyczny" działa, nawet jeśli ma "-pie" – 4ntoine
Użyj 'file -k', aby sprawdzić typ binarny, i' readelf -l', aby sprawdzić sekcję INTERP ELF (jeśli ją posiadasz, nie jest prawdziwym statycznym plikiem binarnym), a 'ldd' sprawdza łączone biblioteki. Myślę, że twoje binarne ramię może nie być prawdziwym statycznym binarnym. – osgx