В общем решил попробовать IAR 5.x, тем более что он уже собирает код не в какую-то там самодеятельность(*.r79), а в самые обычные *.a, которые можно скормить и другому линкеру... Но тут меня ждала неожиданность. Теперь в IAR нужно задавать диапазоны адресов RAM и ROM, и относительные переходы он делает относительно заданного адреса. А мне нужен "обычный" эльф, который можно загрузить в произвольный участок рамы, сделать релокации и запускить. В IAR 4.x можно было сконфигурировать линкер, чтобы он делал относительные переходы с использованием динамической секции, тут же ее вовсе нет в получаемом эльфе.
Поковырявшись нашел ключи --ropi и --rwpi для компилятора, что вроде как решает проблему, но ругается на некоторые конструкции и генерирует просто отвратительный код. Вместо того, чтобы использовать динамические релокации, он превращает банальный LDR r0, =0x34(который можно было бы сделать и относительным) в несколько строк операчий с регистром PC
Так вот, может кто знает как заставить его генерировать "правильные" эльфы?