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

вопрос по секциям в GNU

Программирую на GCC под AVR32.

В моем процессоре ОЗУ начинается с 0-го адреса, Flash начинается с адреса 0x80000000.

В самом начале ОЗУ (с адреса 0) создаю секцию ".exception", в которой находится таблица векторов прерывания. Эта таблица заполняется в коде, т.е. мне нужно, чтобы секция ".exception" только занимала место, но не была загружаемой.

Помещаю структуру в секцию следующим образом:

EXCEPTION_TABLE __attribute__ ((section (".exception"))) ptrEventTable;

 

В скрипте линкера секция описана так:

   /*секция exception*/
  .exception : 
  { 
    _evba = .;
    *(.exception) 
  } >INTRAM AT>INTRAM :INTRAM_FROM_CODE

Причем INTRAM_FROM_CODE я объявлял и как PT_LOAD, и как PT_NULL.

В любом случае в .elf файле секция включается с такими атрибутами:

  2 .exception    00000104  00000000  00000000  00000c00  2**2
                  CONTENTS, ALLOC, LOAD, DATA

И соответственно попадает в прошивку (с атрибутом PT_NULL дополнительно выдается warning: "allocated section `.exception' not in segment").

Как сделать так, чтобы секция имела только атрибут ALLOC и не попадала в прошивку? Секция .bss, описанная в скрипте линкера аналогичным образом, имеет только атрибут ALLOC, где это задано мне не понятно.

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


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

Секция .bss, описанная в скрипте линкера аналогичным образом, имеет только атрибут ALLOC, где это задано мне не понятно.
Похоже это вбито в компилятор на генетическом уровне. Обзовите секцию как .bss.exception и вставьте ее описание в скрипте до описания остальной части .bss

 

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


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

Похоже это вбито в компилятор на генетическом уровне. Обзовите секцию как .bss.exception и вставьте ее описание в скрипте до описания остальной части .bss

 

Спасибо за ответ, до такого трюка я уже сам догадался, просто интересно можно ли сделать произвольную секцию незагружаемой? Во всяком случае в gnu ассемблере есть соответствующие директивы, типа

  .section  .exception, "a", @nobits

Но их наличие/отсутствие на тип создаваемой секции не влияет.

 

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


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

NOLOAD?

    .noinit (NOLOAD) :
    {
        PROVIDE (__noinit_start = .);
        *(.noinit*)
        PROVIDE (__noinit_end = .);
    } > RAM

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


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

NOLOAD?

 

Да, действительно, спасибо. Надо бы еще раз документацию на ld перечитать.

 

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


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

Похоже это вбито в компилятор на генетическом уровне. Обзовите секцию как .bss.exception и вставьте ее описание в скрипте до описания остальной части .bss

в том то вся и прелесть GCC что на генетическом уровне вбита идея - "принципиально ничего не прописано - сам прописывай как тебе нада".

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


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

в том то вся и прелесть GCC что на генетическом уровне вбита идея - "принципиально ничего не прописано - сам прописывай как тебе нада".

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

"ignoring changed section attributes for .bss". Т.е. в GNU есть ряд правил, которые нигде не прописываются, а их надо просто знать.

 

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


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

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

"ignoring changed section attributes for .bss". Т.е. в GNU есть ряд правил, которые нигде не прописываются, а их надо просто знать.

в этом случае Вы правы, но этот же компиллер не запрещает вообще не использовать секции .text .data .bss - используйте свои.

я посмотрю детально на счет "ignoring changed section attributes for .bss", мож ключик есть для кастомного восприятия стандартных секций

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


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

Гм, вопрос по секциям elfa. Есть в исполняемом файле след секции:

.text
.init
.fini
.text.__do_global_dtors_aux
.text.frame_dummy
.text.__do_global_ctors_aux

 

Из них только первая является моим кодом, остальное компилятор сам создает. Можно ли удалить эти секции из исполняемого файла и как это сделать?

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


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

Из стандартного makefile от WinAVR:

# Create final output files (.hex, .eep) from ELF output file.
%.hex: %.elf
    @echo
    @echo $(MSG_FLASH) $@
    $(OBJCOPY) -O $(FORMAT) -R .eeprom -R .fuse -R .lock -R .signature $< $@

Делаем умозрительное заключение, что -R означает удалить секцию.

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


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

Можно ли удалить эти секции из исполняемого файла и как это сделать?
Удалить-то можно, но будет ли программа после этого работать? .init - скорее всего используется стартап-кодом. .text.__do_global_ctors_aux - видимо вызов конструкторов глобальных объектов. Если используете C++ - то она нужна. .text.__do_global_dtors_aux - видимо вызов деструкторов глобальных объектов. Если нет выхода из main() - то она точно не нужна.

 

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


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

Делаем умозрительное заключение, что -R означает удалить секцию.

 

Спасибо, будем пробывать.

 

Удалить-то можно, но будет ли программа после этого работать? .init - скорее всего используется стартап-кодом.

Инициализация жестко прописана в моем коде, поэтому я не уверен, что .init, созданный компилятором не будет нарушать работу программы.

Изменено пользователем Konkere

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


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

Инициализация жестко прописана в моем коде, поэтому я не уверен, что .init, созданный компилятором не будет нарушать работу программы.
Подход оригинальный, но ненаказуемый. И все же хотелось бы услышать, чем плоха стандартная инициализация переменных? Как минимум два ее плюса я знаю - она занимает минимальное место в памяти программ и выполняется достаточно быстро (быстрее разве что пересылка DMA). А вот недостатки?

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


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

Подход оригинальный, но ненаказуемый. И все же хотелось бы услышать, чем плоха стандартная инициализация переменных? Как минимум два ее плюса я знаю - она занимает минимальное место в памяти программ и выполняется достаточно быстро (быстрее разве что пересылка DMA). А вот недостатки?

 

В данном случае речь идет об инициализации регистров процессорра mips. И любой лишний код может вызвать исключение и прекращение работы процессора, что нехорошо :smile3009:

 

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


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

Сергей Вам говорит не о "инициализации регистров процессора", а о инициализации "С, С++ контекста" - это совершенно разные понятия.

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


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

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

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

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

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

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

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

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

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

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