Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: gcc asm, как взять адрес переменной в другой секции
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > GNU/OpenSource средства разработки
vova7890
Код
          .section    section1, "ax", %progbits
          .arm
          ldr     pc, var

           .section    section2, "ax", %progbits
var:     .int    myfunction


Error: internal_relocation (type: OFFSET_IMM) not fixed up

Собственно чяднт, и как это умудряется делать иар?
DmitryM
b myfunction
vova7890
Пробовал - не работает. Если это чтото меняет, на всякий случай скажу, что myfunction - свихендлер
DmitryM
Цитата(vova7890 @ Feb 27 2012, 16:12) *
Пробовал - не работает. Если это чтото меняет, на всякий случай скажу, что myfunction - свихендлер

Что не работает? Не компилируется? или myfunction не работает?
ReAl
Цитата(vova7890 @ Feb 27 2012, 13:31) *
Собственно чяднт, и как это умудряется делать иар?

Если я что-то в чём-то, то
Код
          .section    section1, "ax", %progbits
          .arm
          ldr     pc, =myfunction
Что эквивалентно
Код
          .section    section1, "ax", %progbits
          .arm
          ldr     pc, var
                  ...
var:     .int    myfunction ; должно лежать недалеко от команды ldr => уж точно не в другой секции

А если нужен адрес именно переменной, а не той функции, то
Код
          .section    section1, "ax", %progbits
          .arm
          ldr     r0, =var; само создаст неподалёку ячейку с .int myfunction

           .section    section2, "ax", %progbits
var:     .int    myfunction
vova7890
Цитата(DmitryM @ Feb 27 2012, 18:58) *
Что не работает? Не компилируется? или myfunction не работает?


Компилируется но не работает. Там у меня патчится свихендлер, и места под первую секцию ровно на одну комманду. b main вроде как раз и занимает 4 байта, но почему-то не работает свихендлер, из за чего аппарат уходит в аут, точнее даже возможно в вечный цикд или гдето повис, хз.

ReAl, ldr r0, =var не катит, она какого-то фига разворачивается на 8 байт. А именно гцц делает примерно так:

ldr r0, =var
offset: dcd var

чет типа такого.
alx2
Цитата(vova7890 @ Feb 27 2012, 23:46) *
места под первую секцию ровно на одну комманду.

Невозможно уместить в 4 байта загрузку произвольно расположенной переменной, так как сам адрес переменной уже занимает 4 байта.
Если я правильно понял задачу...
vova7890
Цитата(alx2 @ Feb 28 2012, 07:22) *
Невозможно уместить в 4 байта загрузку произвольно расположенной переменной, так как сам адрес переменной уже занимает 4 байта.
Если я правильно понял задачу...


> ldr pc, var
иар создаёт 4х байтовый опкод

> b myfunc
гцц создаёт 4х байтовый опкод
DmitryM
Вот как, например, в стартапе CW делается:

секция вектора:

ldr pc, [pc, #swi_handler_address - . - 8] /* swi handler */

далее объявление в этой же секции
swi_handler_address:
.word swi_handler

а далее в другой секции уже

swi_handler:
b swi_handler

З.Ы. Это gcc
vova7890
Цитата(DmitryM @ Feb 28 2012, 13:41) *
...


Прикол в том что я не могу в секции где ldr pc ещё что нибудь обьявить, места нету.
Иар сгенерил такой вот опкод F4F01FE5

Код
FSWI_PATCH2:A13A5328; ===========================================================================
FSWI_PATCH2:A13A5328
FSWI_PATCH2:A13A5328; Segment type: Pure code
FSWI_PATCH2:A13A5328                 AREA FSWI_PATCH2, CODE, READWRITE, ALIGN=0
FSWI_PATCH2:A13A5328            ; ORG 0xA13A5328
FSWI_PATCH2:A13A5328                 CODE32
FSWI_PATCH2:A13A5328 main_jumper     DCD swi_handler    ; DATA XREF: FSWI_PATCH1:A13A5414r
FSWI_PATCH2:A13A5328; FSWI_PATCH2   ends
FSWI_PATCH2:A13A5328
FSWI_PATCH1:A13A5414; ---------------------------------------------------------------------------
FSWI_PATCH1:A13A5414; ===========================================================================
FSWI_PATCH1:A13A5414
FSWI_PATCH1:A13A5414; Segment type: Pure code
FSWI_PATCH1:A13A5414                 AREA FSWI_PATCH1, CODE, READWRITE, ALIGN=0
FSWI_PATCH1:A13A5414            ; ORG 0xA13A5414
FSWI_PATCH1:A13A5414                 CODE32
FSWI_PATCH1:A13A5414                 LDR     PC, =swi_handler
FSWI_PATCH1:A13A5414; FSWI_PATCH1   ends
FSWI_PATCH1:A13A5414


Если сделать тупо
Код
    .section    FSWI_PATCH1, "ax", %progbits
    .int 0xE51FF0F4


То работает, но не вариант, там адреса могут быть разные sad.gif
vova7890
Кароче это баг gas`а, я нашёл то место где gas должен такому случаю присвоить релок BFD_RELOC_ARM_LDR_PC_G0, а не генерить ошибку, напишу разрабам...
alx2
Цитата(vova7890 @ Feb 28 2012, 11:49) *
> ldr pc, var
иар создаёт 4х байтовый опкод

> b myfunc
гцц создаёт 4х байтовый опкод

Ни та, ни другая инструкция не позволяет обратиться к произвольному адресу. Обе упомянутые Вами инструкции используют относительную адресацию. Команда ldr использует 12-битное смещение относительно содержимого базового регистра. Команда b использует 24-битное смещение относительно содержимого регистра pc.
DmitryM
Цитата(alx2 @ Feb 29 2012, 07:46) *
Ни та, ни другая инструкция не позволяет обратиться к произвольному адресу. Обе упомянутые Вами инструкции используют относительную адресацию. Команда ldr использует 12-битное смещение относительно содержимого базового регистра. Команда b использует 24-битное смещение относительно содержимого регистра pc.

Ну дык и упомянули бы команду bx r0, например, которая оперирует R0. Но здесь то нужно не это.
vova7890
Цитата(alx2 @ Feb 29 2012, 07:46) *
Ни та, ни другая инструкция не позволяет обратиться к произвольному адресу. Обе упомянутые Вами инструкции используют относительную адресацию. Команда ldr использует 12-битное смещение относительно содержимого базового регистра. Команда b использует 24-битное смещение относительно содержимого регистра pc.


ну правильно, а шоб оно создало верный относительный адрес нужна статическая релокация, которую gas не указывает, а матерится.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.