Llamada de función indirecta utiliza dirección impar

Cuando el GCC 4.7.3 (20121207) para ARM Cortex-M3 toma la dirección de una función, no obtiene la dirección exacta de la función. Puedo ver un off-by-one en ese puntero.

// assume at address 0x00001204;
int foo() {
  return 42;
}

void bar() {
  int(*p)() = &foo;  // p = 0x1205;
  p();               // executed successfully
  foo();             // assembly: "bl 0x00001204;"
}

Aunque el puntero apunta a una dirección impar, la ejecución es exitosa. Yo esperaría una excepción en este punto. ¿Por qué se necesita esa dirección extraña y por qué no duele?

Editar

losSO articulo describe una diferencia entre el modo pulgar y ARM. ¿Por qué ese desplazamiento no es visible cuando la función se llama directamente aunque la CPU está en el mismo modo?¿Debería mantenerse la dirección impar o sería difícil restablecer el bit 0? (lo que no pude ver hasta ahora)

Respuestas a la pregunta(1)

Su respuesta a la pregunta