реклама на сайте
подробности

 
 
> IAR 5.x, позиционно-независимый код для Cortex, Вот к чему привел отказ от UBROF
VslavX
сообщение Mar 24 2010, 20:51
Сообщение #1


embarrassed systems engineer
*****

Группа: Свой
Сообщений: 1 083
Регистрация: 24-10-05
Из: Осокорки
Пользователь №: 10 038



Был у меня такой код, начиная еще с 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-шным объектником - выясним, это только ассемблер кривой или линкер тоже.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 15:22
Рейтинг@Mail.ru


Страница сгенерированна за 0.01379 секунд с 7
ELECTRONIX ©2004-2016