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

Некорректный размер .bin

On 11/23/2023 at 8:36 PM, jcxz said:

Ну вот - почти повторяет мой пример: Секция ".noinit", но почему-то имеет инициализатор. Но не может быть инициализирована startup-кодом при старте программы. Из-за этого видимо ей был присвоен атрибут RO, и она была помечена как "должна присутствовать в образе прошивки". И добавлена туда.

Но вот интересно, что в 10-ой версии GCC сборка идет иначе.

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


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

Just now, jcxz said:

Значит ещё чего-то не хватает. В IAR нужно было бы добавить префикс __no_init. Но в GCC - не знаю.

А что скрывается за __attribute__?

это спецификатор GCC

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


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

On 11/23/2023 at 8:39 PM, jcxz said:

Значит ещё чего-то не хватает. В IAR нужно было бы добавить префикс __no_init. Но в GCC - не знаю.

А что скрывается за __attribute__?

__attribute__((section(".noinit"))) uint8_t test;

Говорит, чтобы эту переменную поместить в указанную секцию.

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


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

2 minutes ago, dimka76 said:

Но вот интересно, что в 10-ой версии GCC сборка идет иначе.

В 10.3.1

В 10.2.1 тоже самое

только что проверил

 

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


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

1 минуту назад, MKdemiurg сказал:

это спецификатор GCC

А если написать как в IAR? с __no_init

Должен быть какой-то атрибут, типа __no_init IAR.

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


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

On 11/23/2023 at 8:42 PM, jcxz said:

А если написать как в IAR? с __no_init

GCC таких словей не знает :sarcastic:

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


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

Да пофиг на атрибуты секции rwx. Надо линкеру в скрипте сказать, что эту секцию не загружать. В случае с .bss это автоматом, видимо, происходит - компилятор и линкер знают про неё. Для .noinit кроме названия (линкеру пофиг на него должно быть) ничего не говорит, что её надо игнорить.

4 минуты назад, jcxz сказал:

А если написать как в IAR? с __no_init

Это расширение IAR и только IAR. Для совмесиимости лучше наоборот в iar писать __attribute__.

4 минуты назад, jcxz сказал:

Должен быть какой-то атрибут, типа __no_init IAR.

В коде нет, в скрипте линкера всё.

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


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

On 11/23/2023 at 8:41 PM, MKdemiurg said:

В 10.3.1

В 10.2.1 тоже самое

только что проверил

 

Попробуйте 

.noinit :
  {
    /* place all symbols in input sections that start with .noinit */
    KEEP(*(*.noinit*))
  } > NOINIT

заменить на 

 .noinit (NOLOAD):
  {
    /* place all symbols in input sections that start with .noinit */
    KEEP(*(*.noinit*))
  } > NOINIT

 

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


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

4 минуты назад, VladislavS сказал:

Да пофиг на атрибуты.

Я выше пример приводил, где видно что изменение только одних атрибутов секции приводит к перемещению секции из региона FLASH в регион RAM.

Ни командный файл компоновщика ничего другое не менялись.

Так что - не пофиг.

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


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

Бред какой то

2 minutes ago, VladislavS said:

Да пофиг на атрибуты. Надо линкеру в скрипте сказать, что эту секцию не загружать. В случае с .bss это автоматом, видимо, происходит - компилятор и линкер знают про неё. Для .noinit кроме названия (линкеру пофиг на него должно быть) ничего не говорит, что её надо игнорить.

Это расширение IAR и только IAR. Для совмесиимости лучше наоборот в iar писать __attribute__.

В коде нет, в скрипте линкера всё.

не работает ( NO LOAD)

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


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

1 минуту назад, MKdemiurg сказал:

не работает ( NO LOAD)

В исходнике ведь наверное есть и другие переменные ".noinit"? Посмотрите как они описаны.

И куда попадают по .map.

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


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

Перемещение и выкидывание это разные вещи. Компилятор может rom->ram по разным критериям перекидывать. Ради скорости, например.

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


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

On 11/23/2023 at 8:49 PM, jcxz said:

Я выше пример приводил, где видно что изменение только одних атрибутов секции приводит к перемещению секции из региона FLASH в регион RAM.

Ни командный файл компоновщика ничего другое не менялись.

Так что - не пофиг.

Вы приводили пример для другого компилятора.

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


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

Извиняюсь

(NO LOAD)  работает

 

Не ту конфигурацию билдил.

Всем большое спасибо.

Вообще странно, что это компиляторо зависимое поведение.

Получается, что с 10.3 версии в тулчейне прописано, что такое NO INIT

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


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

10 минут назад, dimka76 сказал:

Вы приводили пример для другого компилятора

Дело даже не в компиляторе. На уровне языка можно только предполагать где что будет размещено. А дальше можно чем-то управлять ключами, чем-то скриптом линкера. Всё  implementation dependent, так вроде в стандарте языка сказано.

6 минут назад, MKdemiurg сказал:

Вообще странно, что это компиляторо зависимое поведение

Ничего странного. Стандарт языка не определяет как оно под капотом должно работать. Что-то в gcc поменяли в очередной версии. Бывает.

Более того, то что .noinit ведёт себя как обычная непривилегированная секция, в отличии от .bss, очень даже правильно. 

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


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

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

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

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

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

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

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

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

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

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