2015-02-27 19 views
5

Ho una libreria C che viene utilizzata in un'app iOS. Questa libreria utilizza dlopen() per accedere alla funzionalità di estensione. Il codice funziona perfettamente con il simulatore iOS (in entrambe le modalità a 32 e 64 bit); tuttavia, quando si esegue lo stesso codice su un iPhone5s reali (ARM64), ottengo il seguente errore:Come diagnosticare errori in dlopen() su dispositivi iOS

dlopen(/private/var/mobile/Containers/Bundle/Application/EDEAE282-AE96-45CA-9A4F-D70EE532FB93/foobar.app/lib/time.so, 2): no suitable image found. Did find: 
    /private/var/mobile/Containers/Bundle/Application/EDEAE282-AE96-45CA-9A4F-D70EE532FB93/foobar.app/lib/time.so: mmap() error 1 at address=0x101CE4000, size=0x00004000 segment=__TEXT in Segment::map() mapping /private/var/mobile/Containers/Bundle/Application/EDEAE282-AE96-45CA-9A4F-D70EE532FB93/foobar.app/lib/time.so 

Per quanto posso capire, il file esiste ed è in fase di trovato con successo. Non è solo un problema di essere compilato per l'architettura sbagliata; lipo -info rapporti che time.so è:

Non-fat file: time.so is architecture: arm64 

e file rapporti time.so come Mach-O 64-bit bundle.

Le due domande che ho:

  1. Che cosa significa la "Nessuna immagine adatto found" e ") Errore 1 mmap (" messaggi di errore significa?

  2. Come si corregge (o si diagnostica) cosa sta succedendo qui? Ho passato il codice C e la chiamata dlopen() ha esito negativo con un valore di ritorno di NULL, e l'impostazione del messaggio di errore, quindi passare il codice non mi darà ulteriori informazioni.

(come sfondo, - sto cercando di porto Python per iOS, la chiamata a dlopen() viene utilizzato per caricare i moduli di codice nativo time.so è uno di quei moduli.).

+1

Hai provato su un altro dispositivo? –

+0

Che differenza farà? – freakboy3742

+0

Sembra che 'mmap()' stia cercando di accedere a un indirizzo specifico, non so davvero nulla su di esso ma ho letto che in questo tipo di dispositivi a volte l'accesso a un indirizzo codificato migliora le prestazioni o qualcosa del genere. –

risposta

0

Domanda 1: Che cosa significa la "Nessuna immagine adatto trovato

[risposta] Avete provato a impostare export LD_LIBRARY_PATH o impostare -rpath invece

Domanda 2: Che cosa significa il" mmap () errore 1" messaggi di errore medio.

[risposta]

una pos sibilità: Fondamentalmente, il punto chiave di dlopen è stabilire la mappatura della memoria tra la libreria in un file su disco nella RAM di sistema.

" mmap() error 1 at address=0x101CE4000, size=0x00004000 "

significa che OS mappare il file in un indirizzo di memoria virtuale 0x101CE4000 (che è la pagina allineata) e la dimensione è di 4 pagine formato (16384 byte).

poiché tale tentativo non è riuscito, ho il sospetto che la memoria libera nella ram del sistema sia sufficiente per eseguire la mappatura.

Altra possibilità:

la mmap utilizzato in dlopen potrebbe utilizzare MAP_FIXED bandiera per fare la mappatura per cui è possibile che finisce con una condizione che un kernel scegliere un indirizzo virtuale per essere mmaped ma la sua proprietà è non eseguibile.

Dalla pagina man in mmap:

"L'argomento prot chiede PROT_EXEC ma la zona mappata appartiene a un file su un file system che è stato montato non-exec"

Se è possibile modificare il file dlopen(), basta rimuovere il flag MAP_FIXED se presente.

In sintesi, è interessante capire qual è il valore dell'errore (non il valore restituito) impostato tramite mmap(). Puoi farlo usando "strace" che mostrerebbe perché la chiamata di sistema è fallita.

1

Ho riscontrato lo stesso problema. Quando I dlopen un framework, Xcode dice dlopen mmap() error 1.

Assicurati di avere singolato l'app framework e host con la stessa identità.