Jump to content

    
misyachniy

Размещение переменной по не выровненному адресу в ROM

Recommended Posts

Понадобилось наложить заплатку на бинарник. Дизассемблировал, подправил, что нужно, но не работает.

Оказалось нужно подправить данные в функции 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 получает поток байт путем ассемблирования файла или какой нибудь утилитой и вопрос не решаем на уровне исходных текстов?

 

 

Share this post


Link to post
Share on other sites
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

Всё нормально компилит.  :unknw:

 

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-битные выходные типы данных.

Share this post


Link to post
Share on other sites
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

 

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.