misyachniy 0 Posted January 14 · Report post Понадобилось наложить заплатку на бинарник. Дизассемблировал, подправил, что нужно, но не работает. Оказалось нужно подправить данные в функции IAR инициализации инициализированных переменных. Эта функция берет непрерывный поток байт и заполняет ОЗУ. Работает побайтно, если байт положительный (N), то копирует последующие N + 1 байты. Если отрицательное (-N) то копирует копирует один последующий байт N раз. Я думаю это класическая функция которая работает с прореженными списками, но название не нашел. Мне нужно в этот байт внести изменения, если я объявляю константу, то компилятор собирает проект правильно, если же я в списке вставляю переменную которая вычисляется наэтапе линковки, то линкер выдает ошибку. так вставляю: DCD gf_coef_slow такое сообщение получаю: Error[Lp002]: relocation failed: value out of range or illegal: 0x8004e48 Kind : R_ARM_ABS8[0x8] Location: 0x0800a225 "__iar_program_start" + 0x129 Module: main.o Section: 7 (.text) Offset: 0xa225 Target : 0x08004e48 "gf_coef_slow" Module: main.o Section: 6 (.text) Offset: 0x4e48 Error while running Linker 0x08004e48 - это адрес который вставляю 0x0800a225 - место в потоке байт где нужно разместить. Пробовал использовать BYTE1..BYTE4, SET и тд чтобы сохранить во временной переменой значение счетчика (0x08004e48) - не помогает. Знает ли кто, IAR получает поток байт путем ассемблирования файла или какой нибудь утилитой и вопрос не решаем на уровне исходных текстов? Quote Ответить с цитированием Share this post Link to post Share on other sites
jcxz 0 Posted January 14 · Report post 10 часов назад, misyachniy сказал: DCD gf_coef_slow Куда вставляете? SECTION .bss:DATA:NOROOT(3) gf_coef_slow DS32 0 SECTION .miscData:DATA:ROOT(2) DCD gf_coef_slow DC32 gf_coef_slow DC32 BYTE1 gf_coef_slow DC32 BYTE2 gf_coef_slow DC32 BYTE3 gf_coef_slow DC32 BYTE4 gf_coef_slow Всё нормально компилит. 10 часов назад, misyachniy сказал: Error[Lp002]: relocation failed: value out of range or illegal: 0x8004e48 Kind : R_ARM_ABS8[0x8] Видимо всё-таки Вы компилите не DCD gf_coef_slow, а DC8 BYTE1 gf_coef_slow или что-то подобное? На такое IAR-овский компоновщик ругается, думаю потому, что он не поддерживает 8- и 16-битные выходные типы данных. Quote Ответить с цитированием Share this post Link to post Share on other sites
misyachniy 0 Posted January 15 · Report post SECTION .miscData:DATA:ROOT(2) Выравнивает как раз на границу 4 байта IAR ASM рассматривает любое число как 32 битное, по этому можно константу разбить на байты вот так #define place_long(x) DCB x, (x>>8), (x>>16), (x>>24) А вот линкер не берет. Я разобрал поток байт на части и перепаковал их по другому, для подгонки смещения на 4 байта. Типа так // DCB -24 // DCB 0 DCB -12 // +2 лишних байта DCB 0 DCB -12 DCB 0 Quote Ответить с цитированием Share this post Link to post Share on other sites