2014-11-20 6 views
10

Possiamo abilitare la torta (cioè Eseguibili indipendenti dalla posizione) per le librerie condivise in android-ndk r10c? E se sì allora come si fa?Possiamo abilitare la torta (ad esempio Eseguibili indipendenti dalla posizione) per le librerie condivise in android-ndk r10c?

Ho letto che dovremmo usare PIC per le librerie dinamiche e PIE per l'eseguibile ma sembra che Android NDK non supporti il ​​PIC.

ho cercato consentendo bandiera -pie in LDFLAGS, ma sto ottenendo seguente errore:

/android-ndk-r10c/platforms/android-19/arch-arm/usr/lib/crtbegin_dynamic.o: 
    in function _start:crtbrand.c(.text+0x8c): error: undefined reference to 'main' 

Aiutarlo prego a risolvere questo come ho letto che Google mandato PIE nelle prossime versioni di Android in modo che io voglio la mia app è compatibile con ANDROID-L +.

+0

Se possibile, mostrare un richiamo di esempio del compilatore e l'invocazione del linker. – jww

risposta

11

La vera storia breve è, se si stanno costruendo librerie condivise (al contrario di file eseguibili), non è necessario fare nulla. Le librerie che funzionano su versioni precedenti di Android continueranno a funzionare bene - nulla è cambiato in Android 5.0 rispetto a questo.

La storia quasi altrettanto breve, se si stanno costruendo eseguibili con Android.mk e con targeting per Android 4.1+, i flag necessari devono essere già aggiunti automaticamente.

L'intera storia: Il motivo per cui non si riesce quando si tenta di aggiungere il flag -pie a LDFLAGS per le librerie, è che questo flag è solo per gli eseguibili, non per le librerie. Quando si creano librerie condivise, il flag del compilatore -fPIC (durante la creazione di singoli file oggetto, se si esegue manualmente il compilatore - Android.mk e ndk-build si occupano automaticamente di questo) potrebbe essere necessario su alcune architetture, ma si noterà che è necessario perché il linker rifiuterà di produrre una libreria condivisa se è necessaria e non l'hai impostata. Quindi, se hai un problema lo saprai già perché non riuscirà a costruire - se lo hai realizzato con successo non hai alcun problema.

Analogamente durante la creazione di file eseguibili, è necessario aggiungere -fPIE durante la creazione dei file oggetto e -fPIE -pie quando si collegano i file eseguibili. Android.mk e ndk-build si prenderanno cura di questo automaticamente, se il tuo APP_PLATFORM è Android-16 (Android 4.1) o superiore. Ecco il grande trucco: gli eseguibili creati con -pie funzionano solo su Android-16 o versioni successive, mentre gli eseguibili creati senza -pie non funzionano su Android-21 (Android 5.0). Quindi, qui c'è un periodo di prova, da Android 4.1 a 4.4 verrà eseguito qualsiasi eseguibile, mentre occorrerà esplicitamente una versione senza -pie per le versioni precedenti e un'altra versione con -pie per quelle più recenti.

Se è necessario indirizzare le versioni Android precedenti alla 4.1, vedere https://stackoverflow.com/a/26422855/3115956 per una spiegazione su come creare facilmente due versioni del file eseguibile.

+0

Grazie per la risposta. Innanzitutto la mia app dovrebbe supportare Android 4.1 in poi, quindi posso usare -pie senza problemi. Non ho alcun eseguibile ma ho un paio di librerie condivise. Ho anche pensato che la Torta fosse obbligatoria solo per l'eseguibile, ma basta controllare questo link http://vinsol.com/blog/2014/08/19/compiling-native-libraries-for-android-l/ dove si dice che noi dovrebbe abilitare la torta per le librerie. – ssk

+0

Quasi - dice che dovresti abilitare il PIC per le librerie, non il PIE. Se si crea un eseguibile basato su altre librerie statiche, è necessario aver creato tali librerie con -fPIC (altrimenti si creerebbe un errore durante la creazione dell'eseguibile). Se crei solo le librerie condivise, avresti bisogno dello stesso (e se non lo fai, riceverai un errore quando lo colleghi). Quindi, per reiterare, se usi solo librerie condivise e nessun file eseguibile, stai bene e non hai bisogno di cambiare nulla rispetto a questo. – mstorsjo

+0

grazie a mstorsjo. Fatto :) – ssk

2

Can we enable pie (i.e. Position Independent Executables) for shared libraries in android-ndk r10c?

PIE è stato introdotto in Android 4.1/android-16 (vedi Android <uses-sdk>), ma era facoltativa. Vedi Security Enhancements in Android 1.5 through 4.1. Quindi penso che dipenda meno dalla versione NDK e più dalla versione Android.

Quando si tenta di eseguire il codice PIE su Android 4.0 o inferiore, ottengo un segfault in /system/bin/linker. Questo è con un HTC Evo 4G. Il tuo chilometraggio può variare, a seconda di quanto sia robusto il link/loader fornito dall'OEM. Vedi anche Is PIE (Position-independent executable) for main executables supported in Android 4.0 (ICS)?

Ora, la PIE è richiesta per Android 5.0 e versioni successive. Vedi anche Security Enhancements in Android 5.0.

Se si tenta di compilare/collegamento per Android 5.0/android-21 (vedere Android <uses-sdk>) e senza Torta, verrà visualizzato un errore di collegamento. Vedi anche Position Independent Executables and Android Lollipop.


Can we enable pie ... for shared libraries in android-ndk

E una parola veloce sul ovvio (una volta che sai su di esso). PIC è leggermente diverso da PIE. Si utilizza PIE su programmi eseguibili e PIC su oggetti condivisi.

Se si sta costruendo un eseguibile e oggetto condiviso dallo stesso insieme di sorgenti e file oggetto, quindi si può usare PIC perché PIC funziona sia (lo stesso non è vero PIE) . Vedi anche Position Independent Executables and Android Lollipop.


And if yes then how to do it?

È possibile compilare e collegare un eseguibile torta in uno dei due modi. Innanzitutto, compila tutto con -fPIE e collega con -pie. Il secondo è quello di compilare tutto con -fPIC e il collegamento con -pie.

Se si sta costruendo un eseguibile e oggetto condiviso dallo stesso insieme di sorgenti e file oggetto, quindi si può usare PIC perché PIC funziona sia (lo stesso non è vero PIE) . Vedi anche Position Independent Executables and Android Lollipop.