2015-02-27 23 views
5

Mam bibliotekę C, która jest używana w aplikacji na iOS. Ta biblioteka używa dlopen(), aby uzyskać dostęp do funkcji rozszerzenia. Kod działa poprawnie na symulatorze iOS (w trybach 32-bitowym i 64-bitowym); Jednakże gdy uruchomię samego kodu na rzeczywiste iPhone5s (ARM64), pojawia się następujący błąd:Jak diagnozować awarie w dlopen() na urządzeniach z systemem 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 

O ile mogę zrozumieć, czy plik istnieje i jest znaleźć pomyślnie. To nie tylko problem kompilacji dla złej architektury; lipo -info doniesienia, że ​​time.so brzmi:

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

i file raporty time.so jako Mach-O 64-bit bundle.

dwa pytania mam:

  1. Co oznacza "nie nadaje się obraz znaleziony" i "() Błąd 1 mmap" oznaczają komunikaty o błędach?

  2. Jak poprawić (a nawet zdiagnozować), co się tutaj dzieje? Przeszedłem przez kod C, a wywołanie dlopen() kończy się niepowodzeniem z wartością zwracaną NULL i ustawieniem komunikatu o błędzie, więc przejście przez kod nie da mi więcej informacji.

(jako tło, - Próbuję portu Pythonie iOS; wywołanie dlopen() służy do ładowania natywnych modułów kodu time.so jest jednym z tych modułów.).

+1

Czy próbowałeś na innym urządzeniu? –

+0

Co to za różnica? – freakboy3742

+0

Wygląda na to, że 'mmap()' próbuje uzyskać dostęp do konkretnego adresu, naprawdę nic o tym nie wiem, ale przeczytałem, że w tego typu urządzeniach dostęp do zakodowanego adresu poprawia wydajność lub coś w tym rodzaju. –

Odpowiedz

0

Pytanie 1: Co oznacza "nie nadaje się obraz znalazł

[Odpowiedź] Próbowałeś ustawić LD_LIBRARY_PATH eksportowej lub ustawić -rpath zamiast

Pytanie 2: Co oznacza" (mmap) błąd 1" oznaczają komunikaty o błędach.

[Odpowiedź]

Jeden poz sibility: Zasadniczo kluczowym zadaniem dlopena jest ustalenie mapowania pamięci między biblioteką w pliku dyskowym na systemową pamięć RAM.

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

oznacza, że ​​system operacyjny będzie mapować plik do wirtualnego adresu pamięci 0x101CE4000 (który jest wyrównany strona) i rozmiar to rozmiar 4 stron (16384 bajtów).

ponieważ taka próba się nie udała, podejrzewam, że wolna pamięć w systemie pamięci RAM wystarcza do przeniesienia mapowania.

Inna możliwość:

mmap stosowane w dlopen może użyć MAP_FIXED flagę zrobić mapowanie więc możliwe jest, że kończy się z warunkiem, że jądro wybrać wirtualny adres do mmaped ale jego majątek jest nie wykonywalny.

Od strony człowieka w mmap:

„Na prot argumentem prosi o PROT_EXEC ale odwzorowany teren należący do pliku w systemie plików, który został zamontowany no-exec”

Jeśli możesz zmienić plik dlopen(), po prostu usuń flagę MAP_FIXED, jeśli jest.

W sumie warto zrozumieć, jaka jest wartość błędu (nie wartość zwracana) ustawiona za pomocą mmap(). Możesz to zrobić za pomocą "strace", które pokazuje, dlaczego wywołanie systemowe nie powiodło się.

1

Napotkałem ten sam problem. Kiedy I dlopen tworzy framework, Xcode mówi: dlopen mmap() error 1.

Upewnij się, że wykonałeś , zaaplikował framework i aplikację hosta o tej samej tożsamości.