|
Стартап и скрипт линкера из CMSIS для Sourcery CodeBench |
|
|
|
Jun 6 2013, 08:09
|
Профессионал
    
Группа: Участник
Сообщений: 1 040
Регистрация: 3-01-07
Пользователь №: 24 061

|
Всем привет! Помогите разобраться, пожалуйста. Стартап и скрипт взял из CMSIS 3.01 (\Device\ARM\ARMCM3\Source\GCC): gcc_arm.ld, startup_ARMCM3.S (приложил к теме). Подцепляю к простейшему тестовому проекту. При сборке линкер ругался сначала на отсутствие libnosys.a (ее действительно нет в дистрибе компилятора) - убрал ее из списка в скрипте. Ошибка пропала. Но так и не нашел, что это за либа, для чего нужна и почему ее нет... Потом линкер ругался на отсутствие "_start". Странно, откуда эта метка в стартапе и почему так называется? Поставил вместо нее "main" - все собралось. Ошибок нет. Но осадок сомнения остался - уже две ошибки в этих двух файлах... кто знает, что там еще? Надеялся, что все заработает "из коробки". Пока не зашивал, не уверен в работоспособности, будем пробовать. Насколько можно верить этим файлам? Что еще в них придется корректировать (ну, кроме размеров RAM, ROM, размеров стека и кучи)?
Прикрепленные файлы
GCC.zip ( 3.82 килобайт )
Кол-во скачиваний: 14
--------------------
Благодарю заранее!
|
|
|
|
|
 |
Ответов
|
Jun 12 2013, 14:58
|
Профессионал
    
Группа: Участник
Сообщений: 1 040
Регистрация: 3-01-07
Пользователь №: 24 061

|
Вопросы по Вашему скрипту. Зачем вообще придумали так много разных секций? Где узнать назначение каждой секции? Секции .text, .data, .bss, .isr_vector понятно для чего. .ARM.exidx для чего? Код /* higher address of the user mode stack */ PROVIDE ( _estack = ALIGN(ORIGIN(RAM) + LENGTH(RAM) - 8 ,8) ); Зачем тут PROVIDE()? Если в программе уже определен символ _estack, то линкер использует его. А если символ не определен, но есть ссылки на него, то линкер сам создаст этот символ. Так? Не понял что тут с выравниванием и зачем так... Код .isr_vector : { . = ALIGN(4); KEEP(*(.isr_vector)) . = ALIGN(4); } > FLASH Зачем тут эти выравнивания? Зачем вообще во всем скрипте так много выравниваний? KEEP(), как я понимаю, нужен для того, чтобы при линковке с --gc-sections линкер не отбросил секцию .isr_vector? Не совсем понятно как он чистит мусор. Код ._usrstack : { . = ALIGN(4); _susrstack = .; . = . + _Minimum_Stack_Size; . = ALIGN(4); _eusrstack = .; } >RAM _Minimum_Stack_Size, это размер стека? _susrstack и _eusrstack могут использоваться программой для отслеживания переполнения стека? Код /* remove the debugging information from the standard libraries */ DISCARD : { libc.a ( * ) libm.a ( * ) libgcc.a ( * ) } Как я понимаю, все входные секции, перечисленные в выходной секции DISCARD не попадают в выходной файл. Здесь - все секции из перечисленных файлов. А почему в комментарии это названо отладочной информацией? Что-то я не понимаю, мы же используем эти библиотеки, а если мы их используем, то не мешает ли выше перечисленное?! Или получается так, что ранее мы уже включили все нужное нам из этих библиотек в выходной файл (секции .text, .data, .bss) и все что остается - нам не нужно? Код /* Stabs debugging sections. */ .stab 0 : { *(.stab) } ... Почему мы все располагаем по адресу "0"?
--------------------
Благодарю заранее!
|
|
|
|
|
Jun 12 2013, 18:45
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Ничего себе, сколько вопросов  Сразу предупреждаю, так глубоко я не копал, так что не на все вопросы у меня есть ответы. Цитата(koluna @ Jun 12 2013, 20:58)  Зачем вообще придумали так много разных секций? Где узнать назначение каждой секции? Секции .text, .data, .bss, .isr_vector понятно для чего. .ARM.exidx для чего? Это что-то связанное с обработкой исключений. Хотя мы отключаем эту обработку, всё равно что-то иногда пролазит. Короче, без этой секции какой-то из линкеров не собирал. Цитата(koluna @ Jun 12 2013, 20:58)  Код /* higher address of the user mode stack */ PROVIDE ( _estack = ALIGN(ORIGIN(RAM) + LENGTH(RAM) - 8 ,8) ); Зачем тут PROVIDE()? Если в программе уже определен символ _estack, то линкер использует его. А если символ не определен, но есть ссылки на него, то линкер сам создаст этот символ. Так? Не понял что тут с выравниванием и зачем так... Да, так. Если мы сильно захотим, то можем в программе задать свой адрес для _estack. Выравнивание на 8 байт - это требование ARM EABI. Без этого бывают трудноуловимые глюки. Цитата(koluna @ Jun 12 2013, 20:58)  Зачем тут эти выравнивания? Зачем вообще во всем скрипте так много выравниваний? KEEP(), как я понимаю, нужен для того, чтобы при линковке с --gc-sections линкер не отбросил секцию .isr_vector? Не совсем понятно как он чистит мусор. Выравнивания полезны  Я не помню, зачем они в каждом конкретном случае, но хуже от них точно не будет. Лично наблюдал приличное уменьшение времени переключения контекста scmRTOS при добавлении выравнивания функции переключения контекста. Мусор чистит очень просто. То, что KEEP - оставляет, далее строит дерево вызовов. Всё, что не вызывается из того, что KEEP - выкидывается. Цитата(koluna @ Jun 12 2013, 20:58)  Код ._usrstack : { . = ALIGN(4); _susrstack = .; . = . + _Minimum_Stack_Size; . = ALIGN(4); _eusrstack = .; } >RAM _Minimum_Stack_Size, это размер стека? _susrstack и _eusrstack могут использоваться программой для отслеживания переполнения стека? Здесь простейшая проверка, что перед _eusrstack у нас останется _Minimum_Stack_Size свободного места. Если не останется, то линкер ругнётся. Цитата(koluna @ Jun 12 2013, 20:58)  Как я понимаю, все входные секции, перечисленные в выходной секции DISCARD не попадают в выходной файл. Здесь - все секции из перечисленных файлов. А почему в комментарии это названо отладочной информацией? Что-то я не понимаю, мы же используем эти библиотеки, а если мы их используем, то не мешает ли выше перечисленное?! Или получается так, что ранее мы уже включили все нужное нам из этих библиотек в выходной файл (секции .text, .data, .bss) и все что остается - нам не нужно? Да, всё полезное из этих файлов мы уже забрали выше. Цитата(koluna @ Jun 12 2013, 20:58)  Код /* Stabs debugging sections. */ .stab 0 : { *(.stab) } ... Почему мы все располагаем по адресу "0"? Тут ничего не скажу, не знаю. Этот кусок есть во всех скриптах, которые я видел, поэтому он, наверное, нужен
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Jun 13 2013, 07:40
|
Профессионал
    
Группа: Участник
Сообщений: 1 040
Регистрация: 3-01-07
Пользователь №: 24 061

|
Цитата(AHTOXA @ Jun 12 2013, 22:45)  Ничего себе, сколько вопросов  Сразу предупреждаю, так глубоко я не копал, так что не на все вопросы у меня есть ответы. Я посмотрел на скрипт внимательно, почитал доку на линкер и понял, что надо позадавать еще вопросов  Цитата Это что-то связанное с обработкой исключений. Хотя мы отключаем эту обработку, всё равно что-то иногда пролазит. Короче, без этой секции какой-то из линкеров не собирал. Зачем вообще она нужна для ARM? Почему ее полностью не отключат изначально? Или тулчейн один и на мелкие процы, и на крупные процы, а на крупных обработка исключений в ходу, в отличие от мелких? Цитата Да, так. Если мы сильно захотим, то можем в программе задать свой адрес для _estack. Ууу... что, может понадобиться? Цитата Выравнивание на 8 байт - это требование ARM EABI. Без этого бывают трудноуловимые глюки. Ветку почитаем, спасибо. Пруфлинк можно про выравнивание, пожалуйста? Цитата Выравнивания полезны  Я не помню, зачем они в каждом конкретном случае, но хуже от них точно не будет. Дырки в памяти образуются  И большое количество команд выравнивания вводит в ступор: не понимаешь для чего это и почему именно так и нужно ли вообще... А хочется все понимать... Цитата Лично наблюдал приличное уменьшение времени переключения контекста scmRTOS при добавлении выравнивания функции переключения контекста. Может, связано с выборкой команд? Ну там... ARM-инструкции (32 бита), THUMB-инструкции (16 бит)... т. е., адрес расположеня должен почему-то быть кратным 4 или 2 байтам... Цитата Мусор чистит очень просто. То, что KEEP - оставляет, далее строит дерево вызовов. Всё, что не вызывается из того, что KEEP - выкидывается. Т. е., то, на что есть ссылки в коде и то, что обрамлено KEEP оставляется, все остальное - выкидывается? Цитата Здесь простейшая проверка, что перед _eusrstack у нас останется _Minimum_Stack_Size свободного места. Если не останется, то линкер ругнётся. Код ._usrstack : { . = ALIGN(4); _susrstack = .; . = . + _Minimum_Stack_Size; . = ALIGN(4); _eusrstack = .; } >RAM Как я понимаю, эта секция - последнее, что будет размещено в RAM. И, если не хватит места для ее размещения, то линкер об этом сообщит? Фактически мы проверям (на этапе линковки), что размер стека будет не менее чем _Minimum_Stack_Size? А во время выполнения программы?  Стек ведь может переполниться... Цитата Да, всё полезное из этих файлов мы уже забрали выше. Как я понимаю, это влияет на размер бинаря. А еще что на размер влияет? Встречал где-то, что многие сталкиваются с "раздуванием" бинаря при использовании Си++, но сам пока не изучал вопрос.
--------------------
Благодарю заранее!
|
|
|
|
Сообщений в этой теме
koluna Стартап и скрипт линкера из CMSIS для Sourcery CodeBench Jun 6 2013, 08:09 Непомнящий Евгений Я в свое время сам писал и скрипт и стартап. Чем-т... Jun 6 2013, 08:22 koluna Цитата(Непомнящий Евгений @ Jun 6 2013, 12... Jun 6 2013, 08:42 koluna Кто-нибудь выскажет свое мнение?
Или мир разделилс... Jun 6 2013, 11:58 _Артём_ Цитата(koluna @ Jun 6 2013, 14:58) И нет ... Jun 6 2013, 17:32  koluna Цитата(_Артём_ @ Jun 6 2013, 21:32) Скрип... Jun 6 2013, 18:27  AHTOXA Попробуйте скрипты и стартап от scmRTOS. Я точно з... Jun 6 2013, 18:29 koluna AHTOXA, спасибо большое!
Но мне хотелось бы вс... Jun 7 2013, 10:59 koluna AHTOXA, есть вопросы по Вашему стартапу, прошу пом... Jun 7 2013, 14:44 AHTOXA Цитата(koluna @ Jun 7 2013, 20:44) Строки... Jun 7 2013, 16:59  koluna Цитата(AHTOXA @ Jun 7 2013, 20:59) Это пе... Jun 7 2013, 19:53   AHTOXA Цитата(koluna @ Jun 8 2013, 01:53) Кстати... Jun 7 2013, 21:39    koluna Цитата(AHTOXA @ Jun 8 2013, 01:39) Да. Ли... Jun 10 2013, 12:41     AHTOXA Цитата(koluna @ Jun 10 2013, 18:41) Кстат... Jun 10 2013, 18:56      koluna Цитата(AHTOXA @ Jun 10 2013, 22:56) Ну ма... Jun 11 2013, 07:46   AHTOXA Цитата(koluna @ Jun 13 2013, 13:40) Зачем... Jun 13 2013, 08:36   Непомнящий Евгений Цитата(koluna @ Jun 13 2013, 11:40) Зачем... Jun 13 2013, 08:43 koluna Вот здесь зачем выравнивание перед таблицей вектор... Jun 13 2013, 18:41 Сергей Борщ QUOTE (koluna @ Jun 13 2013, 21:41) Вот з... Jun 13 2013, 19:12  Terminator Цитата(Сергей Борщ @ Jun 14 2013, 02:12) ... Jun 14 2013, 01:51  koluna Цитата(Сергей Борщ @ Jun 13 2013, 23:12) ... Jun 14 2013, 13:41 AHTOXA Цитата(koluna @ Jun 14 2013, 00:41) Вот з... Jun 13 2013, 19:48  koluna Цитата(AHTOXA @ Jun 13 2013, 23:48) Ох, д... Jun 14 2013, 18:25   AHTOXA Цитата(koluna @ Jun 15 2013, 00:25) Ааа..... Jun 14 2013, 19:19    koluna Цитата(AHTOXA @ Jun 14 2013, 23:19) Начал... Jun 15 2013, 10:27     AHTOXA Цитата(koluna @ Jun 15 2013, 16:27) Недов... Jun 15 2013, 10:57      koluna Цитата(AHTOXA @ Jun 15 2013, 14:57) Давай... Jun 15 2013, 19:56       AHTOXA Цитата(koluna @ Jun 16 2013, 01:56) Как я... Jun 15 2013, 20:26        koluna Цитата(AHTOXA @ Jun 16 2013, 00:26) Нет. ... Jun 16 2013, 07:25         AHTOXA Цитата(koluna @ Jun 16 2013, 13:25) Так, ... Jun 16 2013, 10:00 Сергей Борщ QUOTE (AHTOXA @ Jun 13 2013, 22:48) А чем... Jun 14 2013, 19:50 AHTOXA Цитата(Сергей Борщ @ Jun 15 2013, 01:50) ... Jun 15 2013, 05:43 Сергей Борщ QUOTE (AHTOXA @ Jun 15 2013, 13:57) Но у ... Jun 15 2013, 22:03 AHTOXA Цитата(Сергей Борщ @ Jun 16 2013, 04:03) ... Jun 15 2013, 22:33  Сергей Борщ QUOTE (AHTOXA @ Jun 16 2013, 01:33) 128 с... Jun 15 2013, 23:15   AHTOXA Цитата(Сергей Борщ @ Jun 16 2013, 05:15) ... Jun 16 2013, 19:48 koluna О счетчике позиций.
Может быть вот это:
Код__exid... Jun 17 2013, 14:51 Сергей Борщ QUOTE (koluna @ Jun 17 2013, 17:51) было ... Jun 18 2013, 07:54  AHTOXA Вот ведь дилемма... С одной стороны, "возможн... Jun 18 2013, 08:46 koluna Не совсем разобрался с адресацией: абсолютная и от... Jun 18 2013, 11:02 AHTOXA Цитата(koluna @ Jun 18 2013, 17:02) Вот в... Jun 18 2013, 13:00 koluna Цитата(AHTOXA @ Jun 18 2013, 17:00) Нет. ... Jun 18 2013, 13:25 AHTOXA Цитата(koluna @ Jun 18 2013, 19:25) Знаю.... Jun 18 2013, 16:58  koluna Цитата(AHTOXA @ Jun 18 2013, 20:58) А фиг... Jun 18 2013, 17:43   AHTOXA Да, всё так. Jun 18 2013, 17:54   Сергей Борщ QUOTE (koluna @ Jun 18 2013, 20:43) Вот и... Jun 18 2013, 18:34 koluna Пока так и не понял, "--gc-sections" раб... Jun 18 2013, 15:52 koluna Мучает меня вопрос по секциям все-таки...
.init_... Jun 18 2013, 18:37 AHTOXA Цитата(koluna @ Jun 19 2013, 00:37) .init... Jun 18 2013, 19:44  koluna Цитата(AHTOXA @ Jun 18 2013, 23:44) Можно... Jun 19 2013, 07:41   AHTOXA Цитата(koluna @ Jun 19 2013, 13:41) Наско... Jun 19 2013, 08:04    koluna Цитата(AHTOXA @ Jun 19 2013, 12:04) Емним... Jun 19 2013, 09:44     Сергей Борщ QUOTE (koluna @ Jun 19 2013, 12:44) Кстат... Jun 19 2013, 10:02      koluna Понятно, спасибо.
А с деструкторами все-таки что?... Jun 19 2013, 12:31       Сергей Борщ QUOTE (koluna @ Jun 19 2013, 15:31) А с д... Jun 19 2013, 13:11 koluna Судя по всему для EABI, по аналогии с конструктора... Jun 19 2013, 14:10 koluna Что такое common-символы (секция COMMON)?
Из доки ... Jun 19 2013, 18:30 koluna И все-таки хотелось бы немного поговорить и о скри... Jun 20 2013, 16:26 koluna Посмотрел у себя файлы crt* в папках компилятора:
... Jun 21 2013, 20:50
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|