Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Позиционно независимый код.
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
VictorsProg
Доброго времени суток.

Помогите разобраться с PIC кодом.
На сколько я понял, адресно-независимый код (Position Independent Code, PIC) может быть
скопирован в любое место памяти без изменения и затем выполнен.

я написал маленький код
Код
#include "b1.h"
int aa;
int a1 (){
        int i =0;
        i=b1();
        i++;
        return i+aa;
}


Скомпилировал его
Код
so:
        $(CC)   -nostartfiles -pie -shared a1.c -o a1.so


Дизассемблер показал
что вызов функции b1() по конкретному адресу 250
Код
0000023c <.plt>:
23c:   e52de004        push    {lr}           ; (str lr, [sp, #-4]!)
240:   e59fe004        ldr     lr, [pc, #4]   ; 24c <a1-0x10>
244:   e08fe00e        add     lr, pc, lr
248:   e5bef008        ldr     pc, [lr, #8]!
24c:   000080f4        strdeq  r8, [r0], -r4
250:   e28fc600        add     ip, pc, #0, 12
254:   e28cca08        add     ip, ip, #8, 20 ; 0x8000
258:   e5bcf0f4        ldr     pc, [ip, #244]!; 0xf4

Disassembly of section .text:

0000025c <a1>:
25c:   e92d4800        push    {fp, lr}
260:   e28db004        add     fp, sp, #4
264:   e24dd008        sub     sp, sp, #8
268:   e3a03000        mov     r3, #0
26c:   e50b3008        str     r3, [fp, #-8]
[b] 270:   ebfffff6        bl      250 <a1-0xc>[/b]
274:   e50b0008        str     r0, [fp, #-8]
278:   e51b3008        ldr     r3, [fp, #-8]
27c:   e2833001        add     r3, r3, #1
280:   e50b3008        str     r3, [fp, #-8]
284:   e59f3018        ldr     r3, [pc, #24]  ; 2a4 <a1+0x48>
288:   e5932000        ldr     r2, [r3]
28c:   e51b3008        ldr     r3, [fp, #-8]
290:   e0823003        add     r3, r2, r3
294:   e1a00003        mov     r0, r3
298:   e24bd004        sub     sp, fp, #4
29c:   e8bd4800        pop     {fp, lr}
2a0:   e12fff1e        bx      lr
2a4:   00000000        andeq   r0, r0, r0


Я не понимаю, как этот код будет работать если его сместить в другой адрес?

_4afc_
Мне кажется переход не на 250, а на адрес <a1-0xc>.

Если сомневаетесь - перенесите этот массив данных (23с-2а4) в другую область и дизасемблируйте там.
SasaVitebsk
А какое отношение имеет PIC к ARM? Вы веткой ошиблись?
А если брать в общем, то относительная адресация была изобретена задолго до PIC.
В частности x51 позволяет писать таким образом. Да и во многих других тоже. AVR позволяет.
Обычно используется мнемоника типа $+xx, что значит смещение относительно счётчика команд.
В AVR ассемблере PC+xx.
Это всё актуально для ассемблера. Для Си, тем более на железе, как правило неактуально.
Компилятор сам раскладывает по адресам. Может быть актуально, если вы откомпилированный кусок впоследствии планируете переместить в другую область памяти. Ну, как бы возможно, но как-то не помню, чтобы использовалось.
Для ПК есть 2 варианта решения такой задачи. Прямой способ, с перемещаемым кодом, и способ с таблицей переходов. То есть впереди проги размещена таблица адресов, которые указывают прямые переходы. ОС перед запуском проги корректирует прямые адреса на смещение относительно стартового адреса.
aaarrr
Цитата(SasaVitebsk @ Oct 26 2016, 15:05) *
А какое отношение имеет PIC к ARM? Вы веткой ошиблись?

PIC - это Position Independent Code.

Цитата(_4afc_ @ Oct 26 2016, 12:38) *
Мне кажется переход не на 250, а на адрес <a1-0xc>.

Да, и расположена там не функция b1(), а veneer для её вызова.
jcxz
Цитата(_4afc_ @ Oct 26 2016, 12:38) *
Мне кажется переход не на 250, а на адрес <a1-0xc>.

Вообще-то прибавление 0x80f4 к PC не должно дать PC-12.
А в ячейке 0x24C лежит смещение относительно PC к некоей таблице, из которой и берётся целевой адрес b1().
А ТС-у - учить и учить систему команд чтобы не задавать глупых вопросов.

Цитата(aaarrr @ Oct 26 2016, 15:30) *
Да, и расположена там не функция b1(), а veneer для её вызова.

А откуда это видно что там именно veneer?
AVI-crak
Первая ссылка из гугла http://pyviy.blogspot.ru/2010/12/gcc.html
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.