Czy ARM (nie Thumb) w ogóle obsługuje WinPhone8?
Stoję przed dziwnym problemem, trochę podobnym doto. Mam natywny projekt DLL Windows Phone 8, głównie C ++, ale ze źródłem ARM. Źródło jest w trybie ARM (tj. Nie Thumb). C ++ jest skompilowany do Thumb.
Aplikacja ulega awarii, gdy C ++ próbuje wywołać procedurę składania. Polecenie wywołania w demontażu to BLX z natychmiastowym przesunięciem - powinno bezwarunkowo przełączyć tryb z powrotem na ARM, ale jakoś nie.
Mam szczegóły wyjątku. Kod wyjątku to 0xc000001d (nieprawidłowa operacja), a wartość komputera w strukturze kontekstu awarii to 0x696d5985. To niemożliwe w obu trybach - jest źle wyrównane, bit zero to jeden. Instrukcja BLX idzie1b f0 0c eb
- jeśli rozszyfrujesz, jest to dwuczęściowy BLX w stylu Thumb w porządku, z przesunięciem 4-stopniowym. Flaga T w kontekście awarii to SET (CPSR = 0x60000010).
Nie mam urządzenia, ale dziennik awarii testera beta jest dość rozstrzygający. Mam rekord dziennika debugowania tuż przed wywołaniem do złożenia. Potem katastrofa.
EDYTOWAĆ:związane z . Twierdzą jednak, że sam asembler (armasm
) tłumaczy ARM na Thumb. W moim przypadku tak nie jest - przynajmniej nie statycznie. DLL zawiera prawidłowy kod ARM, jak określono w źródle zespołu (CODE32
).
EDYCJA: wypróbowano z nieco inną sekwencją skoku:
ldr r12, target
and r12, r12, #0xfffffffe ; To be sure
bx r12 ;BX to a register with a cleared 0th bit. Doesn't get any more explicit than that.
Ten sam wynik. Wygląda na to, że gdzieś w Sklepie zachodzi jakieś dziwne morfowanie kodu lub sam system przechwytuje przełączniki trybu i zapobiega im.
Morfowanie kodu można prawdopodobnie wykryć przez zrzucenie części pliku wykonywalnego do dziennika awarii wraz z pozostałymi danymi o awarii. Ale co mogę zrobić z zakłóceniami systemu operacyjnego, z wyjątkiem konwersji na cały kod na Thumb? To nie tylko rekompiluje.
EDIT for dwelch: sekwencja wywołująca w skompilowanym kodzie C wygląda następująco:
.text:1000A35E MOV R2, #g_Host ;Three parameters
.text:1000A366 MOV R1, R5
.text:1000A368 MOV R0, R6
.text:1000A36A BLX Func ; Code bytes 1B F0 0C EB
BLX natychmiastowy adres HAS, aby przełączyć tryb. To nie jest warunkowebx register
. Cel wywołania jest głupi:
.text:10025984 B Func_Impl
A adres awarii jest taki plus jeden: 5985.
Jest to demontaż skompilowanej biblioteki DLL, ale nie mam gwarancji, że jest to dokładnie to, co wykonuje się na urządzeniu. Użytkownik w połączonym wątku MSDN twierdził, że spojrzał na demontażw debuggerze i zobaczyłem Thumb, gdzie powinien być ARM. Microsoft, IIRC, posiada patent na modyfikację kodu aplikacjiw drodze od wydawcy do urządzenia; to może być powód.