
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.217.2] |
![]() |
|
Сообщ.
#1
,
|
|
|
Link Error : MyFile.c: 'TodoSomething()' 16-bit code reference to 'MyFarMethod' is out of range.
В одном файле возникла такая ситуация, что при добавлении нескольких строк кода, любых и в любое место (например в какой-нить метод), то линковщик начинает выдавать одну и ту же ошибку, что метод TodoSomething() ссылается на блаблабла и т.д. Code Model у меня сейчас small, и менять я ее конечно не хочу. Подскажите из-за чего вообще проблема. Во время сборки исполняемого файла линковщику не удается уместить весь мой код в сегментах заданного размера (т.е. small)? Причем текст ошибки никак не зависит от того, какой код и в какое место файла я добавляю. Будет ли здесь оптимальным решением, сделать переходный метод в каком-нить более 'близком' файле, основное назначение которого будет только лишь в том чтобы перенаправлять запрос, поступивший от TodoSomething() в MyFarMethod(). Т.е. идея в том, что если для прыжка из TodoSomething() в MyFarMethod() линковщик не находит достаточного места в сегментах памяти, то решением будет перенести вызываемый метод в файл, с которым происходит частое взаимодействие. Если не прав, то подскажите, как решить проблему правильно. Спасибо. |
Сообщ.
#2
,
|
|
|
Цитата debugx @ Code Model у меня сейчас small, и менять я ее конечно не хочу. А в чём проблема? Поставьте smart или large и проблем не будет. small - все прыжки ближние (jsr и иже с ними), вылезают проблемы при прыжке выходящем за пределы минимального и максимального значения Int16 large - все прыжки дальние, вычисляется адрес функции, кладётся в стэк, затем делается rts - типа выход из процедуры с загрузкой адреса возврата из стэка в pc smart - комбинация указанных выше - где можно обойтись ближним прыжком - используется small, где дальний - large. Цитата debugx @ Будет ли здесь оптимальным решением, сделать переходный метод в каком-нить более 'близком' файле Можно попробовать перетасовать .с/.сpp файлы в сегменте (вкладка Segments, не Files!!!), при этом порядок линковки изменится и может получиться, что нужная функция "допрыгнет" до другой нужной функции коротким прыжком. |
Сообщ.
#3
,
|
|
|
Цитата Поставьте smart или large и проблем не будет. Прочитал вот эту переписку: http://www.mail-archive.com/palm-dev-forum@news.palmos.com/msg07110.html Правильно ли я понял, если перейти с модели памяти small на smart, то межсегментные прыжки все станут дальними, но при этом часть внутрисегментных прыжков также станет дальними. Если это так, не повлечет ли это за собой некоторую потерю в производительности. Ведь в этом случае есть смысл всё таки стараться использовать small model пока есть возможность, верно? |
Сообщ.
#4
,
|
|
|
Цитата debugx @ Правильно ли я понял, если перейти с модели памяти small на smart, то межсегментные прыжки все станут дальними Межсегментные прыжки при любой модели памяти всегда дальние, т.к. каждый сегмент кода находится в отдельном 'code' ресурсе, а ресурсы могут лежать в сторидже в разных местах. Цитата debugx @ но при этом часть внутрисегментных прыжков также станет дальними. Да, какая-то часть прыжков станет дальними. Цитата debugx @ Если это так, не повлечет ли это за собой некоторую потерю в производительности. Теоретически затраты на дальний прыжок, естественно, выше, т.к. количество asm-инструкций больше. На деле этого вообще не заметно. |