objective-c assembly arm mach-o otool

objective c - ¿Dirección de implementación de método incorrecta de otool para armv7?



objective-c assembly (1)

Constantemente obtengo un desplazamiento de 1 byte para la dirección de implementación del método mostrado por ''otool''.

Para un ejemplo ''otool -o'' da 0xe99d5 pero ''otool -tvV'' da:

+[NSError(SomeCategory) someMethod]: 000e99d4 b590 push {r4, r7, lr} 000e99d6 f6441184 movw r1, 0x4984 000e99da af01 add r7, sp, #4 000e99dc f2c0010a movt r1, 0xa

Entonces el método comienza en 0xe99d4. 0xe99d5 se ve mal, no alineado. Creo que ''otool'' funciona bien y no entiendo algunos aspectos de la implementación. ¿Cómo interpretar la salida?


Los núcleos ARM modernos tienen dos tipos de conjuntos de instrucciones. El original se llama modo de arm , donde cada instrucción tiene cuatro bytes y la más reciente se llama thumb2 (como puede suponer que ya ha pasado algunas iteraciones) donde las instrucciones pueden tener dos o cuatro bytes (el motivo de la introducción es la densidad del código) .

La CPU puede cambiar los modos cuando está haciendo una bifurcación y la forma de notificar a la CPU sobre el conjunto de instrucciones utilizado es configurando el bit menos significativo en la dirección de la instrucción que se debe saltar. Si es 0, la instrucción se interpretará como modo de arm ; si es 1, se interpretará como modo thumb .

Entonces, lo que está viendo es que su función está en el modo thumb2 , que podemos verificar al ver que consta de instrucciones de dos y cuatro bytes.