|
|
 |
Ответов
|
Nov 12 2007, 06:36
|

Йа моск ;)
     
Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610

|
Особых проблем с изготовлением перемещаемого кода нет. В аттаче
elfloader.zip ( 8.08 килобайт )
Кол-во скачиваний: 109 собственно простенький загрузчик эльфов, изготовленных при помощи IAR4.x (про пятый - ниже). Сам загрузчик требует наличия функций fopen,fread,fclose,lseek,malloc,free,memset или zeromem, и специальной внешней функции IMB() - для выполнения прочистки кешей перед запуском. Для упрощения загрузчика .xcl-файл должен представлять из себя следующее: Код -carm
// Declare relocation areas for code, constants and data. -V(CODE)CODE_AREA,12 -V(DATA)DATA_AREA,12
// Place segments into the relocation areas -Z(CODE_AREA)ELFBEGIN,DATA_ID,START,CODE,DATA_C,INITTAB,DATA_Z,DATA_N=0-FFFFFFFF -Z(DATA_AREA)DATA_I=0-FFFFFFFF В линкере выставляем Output Format elf/dwarf, Format variant none, Config/Override default program entry/Entry label "main", Extra Options -ynpra Вызов функций, доступных для использования в исполняемых модулях, был сделан через swi. Описаны эти функции в файле swilib.h примерно таким методом: Код #pragma diag_suppress=Ta035 ... #pragma swi_number=10 __swi __arm int fopen(const char * cFileName, unsigned int iFileFlags, unsigned int iFileMode, unsigned int *ErrorNumber); ... Код собственно вызывателя функций по их адресам из SWI могу привести, он похож на swi_handler в исходниках библиотеки иара. Теперь собственно про пятый иар. Там конечно все уже в формате ELF, но штатный линкер не генерирует релокации. Попытка прикрутить ld от гнуся закончилась тем, что ld при генерации эльфа с релокациями просто эмитит ВСЕ релокации в выходной файл. Посему загрузчик надо дорабатывать, чтобы он понимал все возможные типы релокаций, а не только те, которые может генерить линкер от иара 4.x (этот линкер сразу обрабатывает все релокации, которые можно обработать при линковке, например BL внутри одной секции, это резко упрощает загрузчик). Ну или какой то промежуточный пререлокатор на хост-машине, который сделает это сам (но очень лениво писать  )
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
Nov 13 2007, 09:37
|
Местный
  
Группа: Участник*
Сообщений: 418
Регистрация: 20-08-07
Пользователь №: 29 930

|
Цитата(Rst7 @ Nov 12 2007, 09:36)  Особых проблем с изготовлением перемещаемого кода нет. В аттаче
elfloader.zip ( 8.08 килобайт )
Кол-во скачиваний: 109 собственно простенький загрузчик эльфов, изготовленных при помощи IAR4.x (про пятый - ниже). Сам загрузчик требует наличия функций fopen,fread,fclose,lseek,malloc,free,memset или zeromem, и специальной внешней функции IMB() - для выполнения прочистки кешей перед запуском. Для упрощения загрузчика .xcl-файл должен представлять из себя следующее: Код -carm
// Declare relocation areas for code, constants and data. -V(CODE)CODE_AREA,12 -V(DATA)DATA_AREA,12
// Place segments into the relocation areas -Z(CODE_AREA)ELFBEGIN,DATA_ID,START,CODE,DATA_C,INITTAB,DATA_Z,DATA_N=0-FFFFFFFF -Z(DATA_AREA)DATA_I=0-FFFFFFFF В линкере выставляем Output Format elf/dwarf, Format variant none, Config/Override default program entry/Entry label "main", Extra Options -ynpra Вызов функций, доступных для использования в исполняемых модулях, был сделан через swi. Описаны эти функции в файле swilib.h примерно таким методом: Код #pragma diag_suppress=Ta035 ... #pragma swi_number=10 __swi __arm int fopen(const char * cFileName, unsigned int iFileFlags, unsigned int iFileMode, unsigned int *ErrorNumber); ... Код собственно вызывателя функций по их адресам из SWI могу привести, он похож на swi_handler в исходниках библиотеки иара. Теперь собственно про пятый иар. Там конечно все уже в формате ELF, но штатный линкер не генерирует релокации. Попытка прикрутить ld от гнуся закончилась тем, что ld при генерации эльфа с релокациями просто эмитит ВСЕ релокации в выходной файл. Посему загрузчик надо дорабатывать, чтобы он понимал все возможные типы релокаций, а не только те, которые может генерить линкер от иара 4.x (этот линкер сразу обрабатывает все релокации, которые можно обработать при линковке, например BL внутри одной секции, это резко упрощает загрузчик). Ну или какой то промежуточный пререлокатор на хост-машине, который сделает это сам (но очень лениво писать  ) Мне все-таки кажется, что прежде чем обсуждать способы решения, надо для начала поставить правильно задачу. Иначе средства решения превращаются в самоцель и могут стать слишком сложными. А вот постановка задачи пока напрочь отметается... Зачем вообще делать в оверлеях перемещаемые секции? Мне кажется, что для решения большинства мыслимых для IAR задач вообще не стоит бодаться с перемещением и достаточно именно статических оверлеев, которые настроены на фиксированные адреса дозагрузки... А мы тут уже кинулись зачем-то разрешать задачку запуска любой ветки оверлея с произвольного адреса... Резонно спросить - а зачем это вообще нужно в достаточно простых встроенных приложениях?
|
|
|
|
Сообщений в этой теме
VladislavS EWARM. Cделать переход по известному адресу? Nov 8 2007, 12:56 Сергей Борщ Цитата(VladislavS @ Nov 8 2007, 14:56) EW... Nov 8 2007, 13:03 VladislavS Спасибо. Сработало. Как все просто когда знаешь... Nov 8 2007, 13:23 Rst7 Есть еще способ (без линкера):
((void(*)(void))0x... Nov 8 2007, 13:30 Николай Z Цитата(Rst7 @ Nov 8 2007, 16:30) Есть еще... Nov 8 2007, 14:25  Rst7 Цитата(Николай Z @ Nov 8 2007, 16:25) Дык... Nov 8 2007, 14:41   Николай Z Цитата(Rst7 @ Nov 8 2007, 17:41) А если э... Nov 8 2007, 15:09    Rst7 Цитата(Николай Z @ Nov 8 2007, 17:09) В т... Nov 8 2007, 15:23     VladislavS Цитата(Rst7 @ Nov 8 2007, 18:23) Представ... Nov 8 2007, 20:01    aaarrr Цитата(Николай Z @ Nov 8 2007, 18:09) В т... Nov 8 2007, 15:25     Николай Z Цитата(aaarrr @ Nov 8 2007, 18:25) Налили... Nov 8 2007, 16:33      aaarrr Цитата(Николай Z @ Nov 8 2007, 19:33) Нра... Nov 8 2007, 18:49       Сергей Борщ Цитата(aaarrr @ Nov 8 2007, 20:49) Насчет... Nov 8 2007, 19:36        aaarrr Цитата(Сергей Борщ @ Nov 8 2007, 22:36) О... Nov 8 2007, 23:03         Сергей Борщ Цитата(aaarrr @ Nov 9 2007, 01:03) По-мое... Nov 8 2007, 23:29          singlskv Цитата(Сергей Борщ @ Nov 9 2007, 02:29) P... Nov 9 2007, 00:24          aaarrr Цитата(Сергей Борщ @ Nov 9 2007, 02:29) Д... Nov 9 2007, 02:22           Николай Z Цитата(aaarrr @ Nov 9 2007, 05:22) ИМХО, ... Nov 9 2007, 09:56 VladislavS Если делать на классическом С, то что-то типа того... Nov 9 2007, 07:09 Rst7 Цитата(Николай Z @ Nov 9 2007, 11:56) Мог... Nov 9 2007, 11:23 Николай Z Цитата(Rst7 @ Nov 9 2007, 14:23) Давайте,... Nov 9 2007, 11:44  Rst7 Цитата(Николай Z @ Nov 9 2007, 13:44) А в... Nov 9 2007, 12:12   Николай Z Цитата(Rst7 @ Nov 9 2007, 15:12) Мне нрав... Nov 9 2007, 13:26    Rst7 Цитата(Николай Z @ Nov 9 2007, 15:26) Нра... Nov 9 2007, 13:30   Николай Z Цитата(Rst7 @ Nov 9 2007, 16:30) Видимо я... Nov 9 2007, 13:39 Rst7 Цитата(Николай Z @ Nov 9 2007, 15:39) Я н... Nov 9 2007, 13:46 Николай Z Цитата(Rst7 @ Nov 9 2007, 16:46) А теперь... Nov 9 2007, 16:23 zltigo Да расшумелись .
В общем случае несомненно (для ме... Nov 9 2007, 14:48 VladislavS Да ладно вам на пустом месте ругаться... Чтобы ник... Nov 9 2007, 17:53 Николай Z Цитата(VladislavS @ Nov 9 2007, 20:53) Да... Nov 9 2007, 20:27 VladislavS А меня вот заинтересовал вопрос перемещаемости код... Nov 10 2007, 05:56 Николай Z Цитата(VladislavS @ Nov 10 2007, 08:56) А... Nov 10 2007, 08:59 Сергей Борщ Цитата(VladislavS @ Nov 10 2007, 07:56) А... Nov 10 2007, 10:43  Николай Z Цитата(Сергей Борщ @ Nov 10 2007, 13:43) ... Nov 10 2007, 11:52   Сергей Борщ Цитата(Николай Z @ Nov 10 2007, 13:52) Я ... Nov 10 2007, 12:51    Николай Z Цитата(Сергей Борщ @ Nov 10 2007, 15:51) ... Nov 11 2007, 08:33  zltigo Цитата(Сергей Борщ @ Nov 10 2007, 12:43) ... Nov 10 2007, 13:04 zltigo Цитата(Rst7 @ Nov 12 2007, 08:36) Особых ... Nov 13 2007, 09:51  Николай Z Цитата(zltigo @ Nov 13 2007, 12:51) Знани... Nov 13 2007, 12:30   zltigo Цитата(Николай Z @ Nov 13 2007, 14:30) Да... Nov 13 2007, 12:49    Николай Z Цитата(zltigo @ Nov 13 2007, 15:49) Ну в ... Nov 14 2007, 09:23 Rst7 ЦитатаА мы тут уже кинулись зачем-то разрешать зад... Nov 14 2007, 06:57 alexander55 Цитата(Rst7 @ Nov 14 2007, 09:57) А тут н... Nov 14 2007, 07:14 VladislavS Не, вопрос я задал вполне конкретный и получил отв... Nov 15 2007, 20:49
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|