У меня нет опыта использования общих библиотек, но у нас была эта проблема с нашим программным обеспечением, и мы нашли три различных способа решения этой проблемы.
Возможно, проще всего включить расширенный режим при использовании компилятора Metrowerks, но я не совсем уверен, что это работает. Этот специальный режим позволяет вам получать доступ к определенным постоянным глобальным данным при вызове из неглобального запуска. Тем не менее, есть много предостережений при использовании этого подхода. Кроме того, я не подтвердил, что расширенный режим разрешает межсегментные переходы наверняка. Там есть белая книга, написанная Беном Комби, которая подробно объясняет, как использовать расширенный режим. Он называется «Поддержка расширенного режима в Palm OS». Я не смог найти его в Интернете, поэтому я разместил копию на своем сайте: http://www.normsoft.com/tim/technical/Codewarrior_Expanded_Mode.pdf
Другим более сложным вариантом является загрузка глобалов самостоятельно и указатель на них в A5. Чтобы сделать это, вы должны изменить (или продублировать) код запуска Metrowerks, который загружает глобальные переменные, а затем вызвать этот измененный код при получении неглобального запуска. Metrowerks включает полный исходный код этой части среды выполнения, поэтому вы можете сделать это довольно легко, хотя часть этого кода довольно загадочна. Мы успешно использовали эту технику в одной версии Pocket Tunes для доступа к глобальным и неограниченному количеству сегментов при вызове из неглобального кода запуска. Обязательно восстановите A5 при возврате из кода запуска.
Последний вариант - переместить весь (или часть) код в PNOlets. Это может быть проблемой, потому что вы должны сегментировать свой код в 68K и PNO, что может быстро стать кошмаром для обслуживания. Мы также успешно использовали этот метод, но поддержка кода взаимодействия была ужасной. В итоге мы переместили весь наш код в PNOlet с помощью загрузчика PEAL, который действительно хорошо работает с большим кодом, поскольку он автоматически сегментирует код на куски по 64 КБ и запускает код ARM на месте. Однако это очень большое усилие, потому что разработка PNOlet не очень хорошо поддерживается в ARM, поэтому вы должны самостоятельно обеспечить большую низкоуровневую поддержку (например, громкие вызовы для вызова каждой функции API).