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:
Co oznacza "nie nadaje się obraz znaleziony" i "() Błąd 1 mmap" oznaczają komunikaty o błędach?
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.).
Czy próbowałeś na innym urządzeniu? –
Co to za różnica? – freakboy3742
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. –