реклама на сайте
подробности

 
 
> Не понимаю окончательно работу GNU линкера, Секция линкуется, но мне не понятно, почему,
haker_fox
сообщение Jan 9 2012, 09:05
Сообщение #1


Познающий...
******

Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



Здравствуйте, уважаемые коллеги!
Решил углубить знания по линкеру. Нужно rolleyes.gif Имеется следующий код
CODE
.section     .text
.code 32


    LDR        PC,        =0x40004000


.section    .data
data1:        .word    0x89ABCDEF

.section    .bss
bss1:        .word    0

.section    .fox, "ax"
    NOP
    NOP
    NOP
    NOP
    BX        LR

и скрипт линкера
CODE
MEMORY
{
    RAM(RW)        :    org = 0x40000000, len = 32K
    RAMOV(RW)    :    org = 0x40004000, len = 4K
}

SECTIONS
{
    .text : { *.(text) } > RAM
    .data : { *.( data ) } > RAM
    .bss  : { *.( bss ) } > RAM
    
    .fox  : { *(.fox .fox*) } > RAMOV
    
}

Трансляция кода идет следующим образом
CODE
arm-kgp-elf-as -mcpu=arm7tdmi-s test.s -o test.o
arm-kgp-elf-ld test.o -o test.elf -Ttest.ld

В этом случае все собирается отлично. В эльфе все необходимые секции.
Стоит секцию .fox пометить только флагом "x" в исходнике на языке ассемблера, как она перестает линковаться. Я не понимаю почему это происходит? Документация говорить, что флаг "a" - это перемещаемая (allocatable) секция.
Но нигде не могу найти описания, для чего секции дается такой статус? Почему секцию просто нельзя пометить "xw", например? Да, стандартные секции .text, .data и .bss линкуются всегда...
Буду благодарен за любую информацию!

З.Ы. МК LPC2468.
Спасибо!


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
ReAl
сообщение Jan 15 2012, 07:59
Сообщение #2


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Посмотрите в скрипте линкера имена bss_start и подобное.
Наставьте своего, например, my_section_start
В С-файле:
Код
extern unsigned char my_section_start;
void *my_section_start_p = &my_section_start; // это и будет адрес начала секции


Тут немного про это. Только на украинсокм (если бы ждал наличия времени на переводы, то вообще не выложил бы). Но код говорит сам за себя.
http://real.kiev.ua/2011/05/01/vykorystannya-sektsij-v-gcc/


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 15 2012, 08:32
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (ReAl @ Jan 15 2012, 09:59) *
CODE
extern unsigned char my_section_start;
void *my_section_start_p = &my_section_start; // это и будет адрес начала секции
Я в последнее время стал писать
CODE
extern uint8_t my_section_start[];
extern uint8_t my_section_end[];

for(uint8_t * ptr = my_section_start; ptr < my_section_end; ++ptr)
{

}



--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
ReAl
сообщение Jan 15 2012, 15:08
Сообщение #4


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Хм, что-то в этом есть. И с точки зрения удобства использования (без & на каждый чих), и с точки «зрения в корень», ибо секция как таковая представляет собой массив :-)
Спасибо.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 30th July 2025 - 12:30
Рейтинг@Mail.ru


Страница сгенерированна за 0.01402 секунд с 7
ELECTRONIX ©2004-2016