|
вопрос по секциям в GNU, как сделать секцию не загружаемой |
|
|
|
Sep 15 2010, 07:11
|
Местный
  
Группа: Свой
Сообщений: 437
Регистрация: 23-04-05
Из: Таганрог
Пользователь №: 4 425

|
Программирую на 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, где это задано мне не понятно.
|
|
|
|
|
Sep 15 2010, 08:19
|
Местный
  
Группа: Свой
Сообщений: 437
Регистрация: 23-04-05
Из: Таганрог
Пользователь №: 4 425

|
Цитата(Сергей Борщ @ Sep 15 2010, 12:14)  Похоже это вбито в компилятор на генетическом уровне. Обзовите секцию как .bss.exception и вставьте ее описание в скрипте до описания остальной части .bss Спасибо за ответ, до такого трюка я уже сам догадался, просто интересно можно ли сделать произвольную секцию незагружаемой? Во всяком случае в gnu ассемблере есть соответствующие директивы, типа Код .section .exception, "a", @nobits Но их наличие/отсутствие на тип создаваемой секции не влияет.
|
|
|
|
|
Sep 15 2010, 09:02
|
Местный
  
Группа: Свой
Сообщений: 437
Регистрация: 23-04-05
Из: Таганрог
Пользователь №: 4 425

|
Цитата(AHTOXA @ Sep 15 2010, 12:43)  NOLOAD? Да, действительно, спасибо. Надо бы еще раз документацию на ld перечитать.
|
|
|
|
|
Sep 16 2010, 14:48
|
Местный
  
Группа: Свой
Сообщений: 437
Регистрация: 23-04-05
Из: Таганрог
Пользователь №: 4 425

|
Цитата(klen @ Sep 16 2010, 14:12)  в том то вся и прелесть GCC что на генетическом уровне вбита идея - "принципиально ничего не прописано - сам прописывай как тебе нада". Ну это не совсем так, все же какие-то базовые постулаты в компилятор зашиты (у опытных разработчиков они уже в подкорке, а меня по началу ставили в тупик). Например, та же секция .bss уж точно генерируется автоматически и все параметры ей присваиваются автоматически. Более того ничего с ней сделать компилятор не дает, вылезает варнинг "ignoring changed section attributes for .bss". Т.е. в GNU есть ряд правил, которые нигде не прописываются, а их надо просто знать.
|
|
|
|
|
Sep 16 2010, 16:24
|

бессмертным стать можно тремя способами
    
Группа: Свой
Сообщений: 1 405
Регистрация: 9-05-06
Из: Москва
Пользователь №: 16 912

|
Цитата(Dopler @ Sep 16 2010, 18:48)  Ну это не совсем так, все же какие-то базовые постулаты в компилятор зашиты (у опытных разработчиков они уже в подкорке, а меня по началу ставили в тупик). Например, та же секция .bss уж точно генерируется автоматически и все параметры ей присваиваются автоматически. Более того ничего с ней сделать компилятор не дает, вылезает варнинг "ignoring changed section attributes for .bss". Т.е. в GNU есть ряд правил, которые нигде не прописываются, а их надо просто знать. в этом случае Вы правы, но этот же компиллер не запрещает вообще не использовать секции .text .data .bss - используйте свои. я посмотрю детально на счет "ignoring changed section attributes for .bss", мож ключик есть для кастомного восприятия стандартных секций
|
|
|
|
|
Nov 26 2010, 10:19
|
Участник

Группа: Участник
Сообщений: 17
Регистрация: 14-01-10
Из: Снежинск
Пользователь №: 54 791

|
Гм, вопрос по секциям elfa. Есть в исполняемом файле след секции: Код .text .init .fini .text.__do_global_dtors_aux .text.frame_dummy .text.__do_global_ctors_aux Из них только первая является моим кодом, остальное компилятор сам создает. Можно ли удалить эти секции из исполняемого файла и как это сделать?
|
|
|
|
|
Nov 28 2010, 20:46
|
Участник

Группа: Участник
Сообщений: 17
Регистрация: 14-01-10
Из: Снежинск
Пользователь №: 54 791

|
Цитата(demiurg_spb @ Nov 26 2010, 17:19)  Делаем умозрительное заключение, что -R означает удалить секцию. Спасибо, будем пробывать. Цитата(Сергей Борщ @ Nov 26 2010, 18:41)  Удалить-то можно, но будет ли программа после этого работать? .init - скорее всего используется стартап-кодом. Инициализация жестко прописана в моем коде, поэтому я не уверен, что .init, созданный компилятором не будет нарушать работу программы.
Сообщение отредактировал Konkere - Nov 28 2010, 20:46
|
|
|
|
|
Nov 29 2010, 06:38
|
Участник

Группа: Участник
Сообщений: 17
Регистрация: 14-01-10
Из: Снежинск
Пользователь №: 54 791

|
Цитата(Сергей Борщ @ Nov 29 2010, 03:14)  Подход оригинальный, но ненаказуемый. И все же хотелось бы услышать, чем плоха стандартная инициализация переменных? Как минимум два ее плюса я знаю - она занимает минимальное место в памяти программ и выполняется достаточно быстро (быстрее разве что пересылка DMA). А вот недостатки? В данном случае речь идет об инициализации регистров процессорра mips. И любой лишний код может вызвать исключение и прекращение работы процессора, что нехорошо
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|