|
|
  |
gcc asm, как взять адрес переменной в другой секции |
|
|
|
Feb 27 2012, 11:31
|
Участник

Группа: Участник
Сообщений: 43
Регистрация: 19-11-10
Пользователь №: 61 026

|
Код .section section1, "ax", %progbits .arm ldr pc, var
.section section2, "ax", %progbits var: .int myfunction Error: internal_relocation (type: OFFSET_IMM) not fixed up Собственно чяднт, и как это умудряется делать иар?
|
|
|
|
|
Feb 27 2012, 13:12
|
Участник

Группа: Участник
Сообщений: 43
Регистрация: 19-11-10
Пользователь №: 61 026

|
Пробовал - не работает. Если это чтото меняет, на всякий случай скажу, что myfunction - свихендлер
|
|
|
|
|
Feb 27 2012, 18:40
|

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

|
Цитата(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
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Feb 27 2012, 18:46
|
Участник

Группа: Участник
Сообщений: 43
Регистрация: 19-11-10
Пользователь №: 61 026

|
Цитата(DmitryM @ Feb 27 2012, 18:58)  Что не работает? Не компилируется? или myfunction не работает? Компилируется но не работает. Там у меня патчится свихендлер, и места под первую секцию ровно на одну комманду. b main вроде как раз и занимает 4 байта, но почему-то не работает свихендлер, из за чего аппарат уходит в аут, точнее даже возможно в вечный цикд или гдето повис, хз. ReAl, ldr r0, =var не катит, она какого-то фига разворачивается на 8 байт. А именно гцц делает примерно так: ldr r0, =var offset: dcd var чет типа такого.
|
|
|
|
|
Feb 28 2012, 04:22
|

Местный
  
Группа: Участник
Сообщений: 340
Регистрация: 25-10-05
Из: Пермь, Россия
Пользователь №: 10 091

|
Цитата(vova7890 @ Feb 27 2012, 23:46)  места под первую секцию ровно на одну комманду. Невозможно уместить в 4 байта загрузку произвольно расположенной переменной, так как сам адрес переменной уже занимает 4 байта. Если я правильно понял задачу...
--------------------
Всего наилучшего, Alex Mogilnikov
|
|
|
|
|
Feb 28 2012, 06:49
|
Участник

Группа: Участник
Сообщений: 43
Регистрация: 19-11-10
Пользователь №: 61 026

|
Цитата(alx2 @ Feb 28 2012, 07:22)  Невозможно уместить в 4 байта загрузку произвольно расположенной переменной, так как сам адрес переменной уже занимает 4 байта. Если я правильно понял задачу... > ldr pc, var иар создаёт 4х байтовый опкод > b myfunc гцц создаёт 4х байтовый опкод
|
|
|
|
|
Feb 28 2012, 11:26
|
Участник

Группа: Участник
Сообщений: 43
Регистрация: 19-11-10
Пользователь №: 61 026

|
Цитата(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 То работает, но не вариант, там адреса могут быть разные
Сообщение отредактировал vova7890 - Feb 28 2012, 12:13
|
|
|
|
|
Feb 28 2012, 13:05
|
Участник

Группа: Участник
Сообщений: 43
Регистрация: 19-11-10
Пользователь №: 61 026

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

Местный
  
Группа: Участник
Сообщений: 340
Регистрация: 25-10-05
Из: Пермь, Россия
Пользователь №: 10 091

|
Цитата(vova7890 @ Feb 28 2012, 11:49)  > ldr pc, var иар создаёт 4х байтовый опкод
> b myfunc гцц создаёт 4х байтовый опкод Ни та, ни другая инструкция не позволяет обратиться к произвольному адресу. Обе упомянутые Вами инструкции используют относительную адресацию. Команда ldr использует 12-битное смещение относительно содержимого базового регистра. Команда b использует 24-битное смещение относительно содержимого регистра pc.
--------------------
Всего наилучшего, Alex Mogilnikov
|
|
|
|
|
Feb 29 2012, 14:16
|
Участник

Группа: Участник
Сообщений: 43
Регистрация: 19-11-10
Пользователь №: 61 026

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