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

gcc asm, как взять адрес переменной в другой секции

          .section    section1, "ax", %progbits
          .arm
          ldr     pc, var

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

 

Error: internal_relocation (type: OFFSET_IMM) not fixed up

 

Собственно чяднт, и как это умудряется делать иар?

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


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

Пробовал - не работает. Если это чтото меняет, на всякий случай скажу, что myfunction - свихендлер

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


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

Пробовал - не работает. Если это чтото меняет, на всякий случай скажу, что myfunction - свихендлер

Что не работает? Не компилируется? или myfunction не работает?

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


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

Собственно чяднт, и как это умудряется делать иар?

Если я что-то в чём-то, то

          .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

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


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

Что не работает? Не компилируется? или myfunction не работает?

 

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

 

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

 

ldr r0, =var

offset: dcd var

 

чет типа такого.

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


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

места под первую секцию ровно на одну комманду.

Невозможно уместить в 4 байта загрузку произвольно расположенной переменной, так как сам адрес переменной уже занимает 4 байта.

Если я правильно понял задачу...

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


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

Невозможно уместить в 4 байта загрузку произвольно расположенной переменной, так как сам адрес переменной уже занимает 4 байта.

Если я правильно понял задачу...

 

> ldr pc, var

иар создаёт 4х байтовый опкод

 

> b myfunc

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

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


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

Вот как, например, в стартапе CW делается:

 

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

 

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

 

далее объявление в этой же секции

swi_handler_address:

.word swi_handler

 

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

 

swi_handler:

b swi_handler

 

З.Ы. Это gcc

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


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

...

 

Прикол в том что я не могу в секции где 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

 

То работает, но не вариант, там адреса могут быть разные :(

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

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


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

Кароче это баг gas`а, я нашёл то место где gas должен такому случаю присвоить релок BFD_RELOC_ARM_LDR_PC_G0, а не генерить ошибку, напишу разрабам...

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


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

> ldr pc, var

иар создаёт 4х байтовый опкод

 

> b myfunc

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

Ни та, ни другая инструкция не позволяет обратиться к произвольному адресу. Обе упомянутые Вами инструкции используют относительную адресацию. Команда ldr использует 12-битное смещение относительно содержимого базового регистра. Команда b использует 24-битное смещение относительно содержимого регистра pc.

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


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

Ни та, ни другая инструкция не позволяет обратиться к произвольному адресу. Обе упомянутые Вами инструкции используют относительную адресацию. Команда ldr использует 12-битное смещение относительно содержимого базового регистра. Команда b использует 24-битное смещение относительно содержимого регистра pc.

Ну дык и упомянули бы команду bx r0, например, которая оперирует R0. Но здесь то нужно не это.

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


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

Ни та, ни другая инструкция не позволяет обратиться к произвольному адресу. Обе упомянутые Вами инструкции используют относительную адресацию. Команда ldr использует 12-битное смещение относительно содержимого базового регистра. Команда b использует 24-битное смещение относительно содержимого регистра pc.

 

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

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


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

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

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

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

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

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

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

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

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

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