vova7890 0 27 февраля, 2012 Опубликовано 27 февраля, 2012 · Жалоба .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 0 27 февраля, 2012 Опубликовано 27 февраля, 2012 · Жалоба b myfunction Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vova7890 0 27 февраля, 2012 Опубликовано 27 февраля, 2012 · Жалоба Пробовал - не работает. Если это чтото меняет, на всякий случай скажу, что myfunction - свихендлер Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DmitryM 0 27 февраля, 2012 Опубликовано 27 февраля, 2012 · Жалоба Пробовал - не работает. Если это чтото меняет, на всякий случай скажу, что myfunction - свихендлер Что не работает? Не компилируется? или myfunction не работает? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ReAl 0 27 февраля, 2012 Опубликовано 27 февраля, 2012 · Жалоба Собственно чяднт, и как это умудряется делать иар? Если я что-то в чём-то, то .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 0 27 февраля, 2012 Опубликовано 27 февраля, 2012 · Жалоба Что не работает? Не компилируется? или myfunction не работает? Компилируется но не работает. Там у меня патчится свихендлер, и места под первую секцию ровно на одну комманду. b main вроде как раз и занимает 4 байта, но почему-то не работает свихендлер, из за чего аппарат уходит в аут, точнее даже возможно в вечный цикд или гдето повис, хз. ReAl, ldr r0, =var не катит, она какого-то фига разворачивается на 8 байт. А именно гцц делает примерно так: ldr r0, =var offset: dcd var чет типа такого. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alx2 0 28 февраля, 2012 Опубликовано 28 февраля, 2012 · Жалоба места под первую секцию ровно на одну комманду. Невозможно уместить в 4 байта загрузку произвольно расположенной переменной, так как сам адрес переменной уже занимает 4 байта. Если я правильно понял задачу... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vova7890 0 28 февраля, 2012 Опубликовано 28 февраля, 2012 · Жалоба Невозможно уместить в 4 байта загрузку произвольно расположенной переменной, так как сам адрес переменной уже занимает 4 байта. Если я правильно понял задачу... > ldr pc, var иар создаёт 4х байтовый опкод > b myfunc гцц создаёт 4х байтовый опкод Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DmitryM 0 28 февраля, 2012 Опубликовано 28 февраля, 2012 · Жалоба Вот как, например, в стартапе CW делается: секция вектора: ldr pc, [pc, #swi_handler_address - . - 8] /* swi handler */ далее объявление в этой же секции swi_handler_address: .word swi_handler а далее в другой секции уже swi_handler: b swi_handler З.Ы. Это gcc Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vova7890 0 28 февраля, 2012 Опубликовано 28 февраля, 2012 (изменено) · Жалоба ... Прикол в том что я не могу в секции где 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 То работает, но не вариант, там адреса могут быть разные :( Изменено 28 февраля, 2012 пользователем vova7890 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vova7890 0 28 февраля, 2012 Опубликовано 28 февраля, 2012 · Жалоба Кароче это баг gas`а, я нашёл то место где gas должен такому случаю присвоить релок BFD_RELOC_ARM_LDR_PC_G0, а не генерить ошибку, напишу разрабам... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alx2 0 29 февраля, 2012 Опубликовано 29 февраля, 2012 · Жалоба > ldr pc, var иар создаёт 4х байтовый опкод > b myfunc гцц создаёт 4х байтовый опкод Ни та, ни другая инструкция не позволяет обратиться к произвольному адресу. Обе упомянутые Вами инструкции используют относительную адресацию. Команда ldr использует 12-битное смещение относительно содержимого базового регистра. Команда b использует 24-битное смещение относительно содержимого регистра pc. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DmitryM 0 29 февраля, 2012 Опубликовано 29 февраля, 2012 · Жалоба Ни та, ни другая инструкция не позволяет обратиться к произвольному адресу. Обе упомянутые Вами инструкции используют относительную адресацию. Команда ldr использует 12-битное смещение относительно содержимого базового регистра. Команда b использует 24-битное смещение относительно содержимого регистра pc. Ну дык и упомянули бы команду bx r0, например, которая оперирует R0. Но здесь то нужно не это. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vova7890 0 29 февраля, 2012 Опубликовано 29 февраля, 2012 · Жалоба Ни та, ни другая инструкция не позволяет обратиться к произвольному адресу. Обе упомянутые Вами инструкции используют относительную адресацию. Команда ldr использует 12-битное смещение относительно содержимого базового регистра. Команда b использует 24-битное смещение относительно содержимого регистра pc. ну правильно, а шоб оно создало верный относительный адрес нужна статическая релокация, которую gas не указывает, а матерится. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться