I think the problem is this:

Code:
108.   .Lj16:
109.    .long U_P$MAIN_SMAP+4
110.   .Lj19:
111.    .long U_P$MAIN_SMAP+4
.Lj16 correctly points to smap, but if I look at the code, .Lj19 should point to blocklayer, because the value is stored in a pointer loaded from .Lj19. I also don't know why the compiler decides to copy two bytes instead of 1 word.