VslavX 0 24 марта, 2010 Опубликовано 24 марта, 2010 · Жалоба Был у меня такой код, начиная еще с ARM v3.11: rseg test:CODE(4) code16 //________________________________________________________________ // extern func1 extern func2 extern func3 tab_entry: dc32 func1 - tab_entry dc32 func2 - tab_entry dc32 func3 - tab_entry Смысл этого фрагмента в том что данная табличка размещалась в начале некоторого позиционно-независимого кода и указывала на набор точек входа в модуле, в итоге данный модуль мог быть загружен динамически по любому адресу без выполнения relocation и из него могли быть вызваны функции func1(), func2(), etc (ессно, через специальные thunks). Выражения типа sym1-sym2 прекрасно версиями 4.x компилировались в нечто, что позволяло линкеру по этому "нечто" вычислить реальное значение выражения в момент линковки и заполнить нужное поле результатом. Причем, для объектного формата UBROF эти выражения могли быть очень сложными, включая все арифметические операции. А вот в версии 5.x такое сделать уже нельзя - там ELF используется. Есть какие-нибудь идея, как решить такую проблему? ЕМНИП (могу и ошибиться - случай специфический не везде такое было надо), очень многие ассемблеры/линкеры (не ELF-нутые) с которыми я работал за последние 20 лет допускали вычитание перемещаемых символов и если у них база была общая, то линкер успешно разрешал выражение, а тут вот такая засада. Upd: Почитал я описание ELF - для него переместить разницу двух символов + константа вообще без всяких проблем, только что попробовал AS GCC 4.1 (там кода нет - одни данные) - нормально такой фрагмент откомпилировал и никаких матюков "Expression is too complex". Так что, описаная проблема - это исключительно кривизна IAR-овского ассемблера - для него это "too complex". Попробую слинковать с получившимся GCC-шным объектником - выясним, это только ассемблер кривой или линкер тоже. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться