Dopler 0 15 сентября, 2010 Опубликовано 15 сентября, 2010 · Жалоба Программирую на 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, где это задано мне не понятно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 122 15 сентября, 2010 Опубликовано 15 сентября, 2010 · Жалоба Секция .bss, описанная в скрипте линкера аналогичным образом, имеет только атрибут ALLOC, где это задано мне не понятно.Похоже это вбито в компилятор на генетическом уровне. Обзовите секцию как .bss.exception и вставьте ее описание в скрипте до описания остальной части .bss Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Dopler 0 15 сентября, 2010 Опубликовано 15 сентября, 2010 · Жалоба Похоже это вбито в компилятор на генетическом уровне. Обзовите секцию как .bss.exception и вставьте ее описание в скрипте до описания остальной части .bss Спасибо за ответ, до такого трюка я уже сам догадался, просто интересно можно ли сделать произвольную секцию незагружаемой? Во всяком случае в gnu ассемблере есть соответствующие директивы, типа .section .exception, "a", @nobits Но их наличие/отсутствие на тип создаваемой секции не влияет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 14 15 сентября, 2010 Опубликовано 15 сентября, 2010 · Жалоба NOLOAD? .noinit (NOLOAD) : { PROVIDE (__noinit_start = .); *(.noinit*) PROVIDE (__noinit_end = .); } > RAM Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Dopler 0 15 сентября, 2010 Опубликовано 15 сентября, 2010 · Жалоба NOLOAD? Да, действительно, спасибо. Надо бы еще раз документацию на ld перечитать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
klen 1 16 сентября, 2010 Опубликовано 16 сентября, 2010 · Жалоба Похоже это вбито в компилятор на генетическом уровне. Обзовите секцию как .bss.exception и вставьте ее описание в скрипте до описания остальной части .bss в том то вся и прелесть GCC что на генетическом уровне вбита идея - "принципиально ничего не прописано - сам прописывай как тебе нада". Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Dopler 0 16 сентября, 2010 Опубликовано 16 сентября, 2010 · Жалоба в том то вся и прелесть GCC что на генетическом уровне вбита идея - "принципиально ничего не прописано - сам прописывай как тебе нада". Ну это не совсем так, все же какие-то базовые постулаты в компилятор зашиты (у опытных разработчиков они уже в подкорке, а меня по началу ставили в тупик). Например, та же секция .bss уж точно генерируется автоматически и все параметры ей присваиваются автоматически. Более того ничего с ней сделать компилятор не дает, вылезает варнинг "ignoring changed section attributes for .bss". Т.е. в GNU есть ряд правил, которые нигде не прописываются, а их надо просто знать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
klen 1 16 сентября, 2010 Опубликовано 16 сентября, 2010 · Жалоба Ну это не совсем так, все же какие-то базовые постулаты в компилятор зашиты (у опытных разработчиков они уже в подкорке, а меня по началу ставили в тупик). Например, та же секция .bss уж точно генерируется автоматически и все параметры ей присваиваются автоматически. Более того ничего с ней сделать компилятор не дает, вылезает варнинг "ignoring changed section attributes for .bss". Т.е. в GNU есть ряд правил, которые нигде не прописываются, а их надо просто знать. в этом случае Вы правы, но этот же компиллер не запрещает вообще не использовать секции .text .data .bss - используйте свои. я посмотрю детально на счет "ignoring changed section attributes for .bss", мож ключик есть для кастомного восприятия стандартных секций Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Konqere 0 26 ноября, 2010 Опубликовано 26 ноября, 2010 · Жалоба Гм, вопрос по секциям elfa. Есть в исполняемом файле след секции: .text .init .fini .text.__do_global_dtors_aux .text.frame_dummy .text.__do_global_ctors_aux Из них только первая является моим кодом, остальное компилятор сам создает. Можно ли удалить эти секции из исполняемого файла и как это сделать? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg_spb 0 26 ноября, 2010 Опубликовано 26 ноября, 2010 · Жалоба Из стандартного 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 означает удалить секцию. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 122 26 ноября, 2010 Опубликовано 26 ноября, 2010 · Жалоба Можно ли удалить эти секции из исполняемого файла и как это сделать?Удалить-то можно, но будет ли программа после этого работать? .init - скорее всего используется стартап-кодом. .text.__do_global_ctors_aux - видимо вызов конструкторов глобальных объектов. Если используете C++ - то она нужна. .text.__do_global_dtors_aux - видимо вызов деструкторов глобальных объектов. Если нет выхода из main() - то она точно не нужна. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Konqere 0 28 ноября, 2010 Опубликовано 28 ноября, 2010 (изменено) · Жалоба Делаем умозрительное заключение, что -R означает удалить секцию. Спасибо, будем пробывать. Удалить-то можно, но будет ли программа после этого работать? .init - скорее всего используется стартап-кодом. Инициализация жестко прописана в моем коде, поэтому я не уверен, что .init, созданный компилятором не будет нарушать работу программы. Изменено 28 ноября, 2010 пользователем Konkere Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 122 28 ноября, 2010 Опубликовано 28 ноября, 2010 · Жалоба Инициализация жестко прописана в моем коде, поэтому я не уверен, что .init, созданный компилятором не будет нарушать работу программы.Подход оригинальный, но ненаказуемый. И все же хотелось бы услышать, чем плоха стандартная инициализация переменных? Как минимум два ее плюса я знаю - она занимает минимальное место в памяти программ и выполняется достаточно быстро (быстрее разве что пересылка DMA). А вот недостатки? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Konqere 0 29 ноября, 2010 Опубликовано 29 ноября, 2010 · Жалоба Подход оригинальный, но ненаказуемый. И все же хотелось бы услышать, чем плоха стандартная инициализация переменных? Как минимум два ее плюса я знаю - она занимает минимальное место в памяти программ и выполняется достаточно быстро (быстрее разве что пересылка DMA). А вот недостатки? В данном случае речь идет об инициализации регистров процессорра mips. И любой лишний код может вызвать исключение и прекращение работы процессора, что нехорошо :smile3009: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg_spb 0 29 ноября, 2010 Опубликовано 29 ноября, 2010 · Жалоба Сергей Вам говорит не о "инициализации регистров процессора", а о инициализации "С, С++ контекста" - это совершенно разные понятия. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться