Кажись разобрался. Это же V003 у него RAM всего-то 2 Кб (0x800).
При любом раскладе PROVIDE( __global_pointer$ = . + 0x800) __global_pointer$ уже вываливается за границы RAM, потому видимо и не работает.
Тут можно просто в gp записать середину RAM и gp уже может дотянуться до любого угла RAM т.е. PROVIDE( __global_pointer$ = (ORIGIN(RAM) + LENGTH(RAM)/2)).