Перейти к содержанию
    

IAR 5.x, позиционно-независимый код для Cortex

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...