2014-11-22 13 views
6

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 
+1

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

+0

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

+0

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

Antwort

4

ich gerade tat Schnelltest mit der Brache in te.c:

int main(int argc, const char* argv[]) 
{ 
    return 0; 
} 

Lauf arm-linux-androideabi-gcc -o conftest -static -FPIE -pie te.c erzeugt keinen Fehler. Jedoch file -k conftest Ausgänge

conftest: ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV), dynamically linked (uses shared libs), not stripped 

readelf -l conftest Ausgänge Elf Dateityp ist DYN (Shared Objektdatei) Einsprungpunkt 0x500 sind 7-Programm-Header bei 52

Program Headers: 
    Type   Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align 
    PHDR   0x000034 0x00000034 0x00000034 0x000e0 0x000e0 R 0x4 
    INTERP   0x000114 0x00000114 0x00000114 0x00013 0x00013 R 0x1 
     [Requesting program interpreter: /system/bin/linker] 
... 

Die Anwesenheit des PHDR Position offset und INTERP-Header zeigen an, dass -pie im Armcompiler static automatisch static überschreibt. Warum das ist, weiß ich nicht, aber ich würde es als einen Fehler betrachten, dass keine Warnung gegeben wird, wenn -static und -pie zusammen verwendet werden. Stattdessen haben Programmierer wie Sie den falschen Eindruck, dass die beiden Optionen gemeinsam am Arm genutzt werden können.

Nur um den einzigen Unterschied im Verhalten hier zu verdeutlichen ist, dass der x86-Compiler Fehler beim Sehen sowohl --static und --pie, während die Arm-Version still --static ignoriert, wenn --pie angegeben wird. Wenn nur eines angegeben ist, ist das Verhalten für beide Compiler gleich.

+0

ok, also empfehlen Sie nur, das Argument "-static" zu entfernen? Kannst du bestätigen, dass es auch für x86 funktioniert? – 4ntoine

+0

@ 4toine Ich war unter dem Eindruck der x86 Version Fehler wenn und nur wenn beide gegeben sind, aber ich werde sehen, überprüfen Sie dies. Denken Sie daran, dass die Arm-Version nicht wirklich eine statische ausführbare Datei erstellt, wenn -pie oder -FPIE geliefert wird, sie beklagen sich einfach nicht darüber. – wheredidthatnamecomefrom

+0

@ 4ntoine nur die Antwort aktualisiert, um den Unterschied zu klären hoffentlich beantwortet Ihre Frage. Ansonsten bin ich mir nicht sicher, was gefragt wird. – wheredidthatnamecomefrom

-1

Das Google NDK-Tool enthält einige Informationen zur PIE-Nutzung. Besuchen build/core/build-binary.mk siehe Zeile 209. Dort heißt es:

# enable PIE for executable beyond certain API level, unless "-static"

Ich denke, es Linux dynamische Grenze Link Prinzip der ist. Da der Android-Interpreter (/ system/bin/linker) feststellt, welche in einer statischen verknüpften Datei zu ladende Adressdatei keinen Interpreter hat, wird die elf-Datei vom Linux-Kernel dem Speicher in eine feste Adresse zugeordnet. Hier ist ein Google issue

über diese Änderung zu diskutieren, wenn ich einen Fehler haben Sie es bitte herauszufinden :)

0

Wenn -gehen und -static beide zusammen gegeben werden, wird gcc unerwarteter Fehler ausgeben.

-gehen

Produzieren einer Position unabhängig ausführbarer auf Ziele, die sie unterstützen. Für vorhersagbare Ergebnisse müssen Sie beim Festlegen dieser Linkeroption auch dieselben Optionen angeben, die für die Kompilierung verwendet werden (-fpie, -fPIE oder Modell-Unteroptionen).

-gehen tatsächlich eine DYN Typ Elf Datei mit INTERP erstellen mit/system/bin/Linker

executable compiled with -pie

-static

Auf Systemen, die dynamische Verknüpfung unterstützen, verhindert dies mit dem gemeinsamen Verknüpfungs Bibliotheken. Auf anderen Systemen hat diese Option keine Wirkung.

-static eine EXEC Typ elf Datei ohne INTERP erstellen

+0

siehe auch https://sourceware.org/ml/binutils/2012-02/msg00252.html – ysf

Verwandte Themen