реклама на сайте
подробности

 
 
> Позиционно независимый код.
VictorsProg
сообщение Oct 26 2016, 09:26
Сообщение #1





Группа: Участник
Сообщений: 6
Регистрация: 8-10-16
Пользователь №: 93 664



Доброго времени суток.

Помогите разобраться с 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


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


Прикрепленные файлы
Прикрепленный файл  load_so_electronix.7z ( 3.91 килобайт ) Кол-во скачиваний: 6
 
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 5)
_4afc_
сообщение Oct 26 2016, 09:38
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 262
Регистрация: 13-10-05
Из: Санкт-Петербург
Пользователь №: 9 565



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

Если сомневаетесь - перенесите этот массив данных (23с-2а4) в другую область и дизасемблируйте там.
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Oct 26 2016, 12:05
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



А какое отношение имеет PIC к ARM? Вы веткой ошиблись?
А если брать в общем, то относительная адресация была изобретена задолго до PIC.
В частности x51 позволяет писать таким образом. Да и во многих других тоже. AVR позволяет.
Обычно используется мнемоника типа $+xx, что значит смещение относительно счётчика команд.
В AVR ассемблере PC+xx.
Это всё актуально для ассемблера. Для Си, тем более на железе, как правило неактуально.
Компилятор сам раскладывает по адресам. Может быть актуально, если вы откомпилированный кусок впоследствии планируете переместить в другую область памяти. Ну, как бы возможно, но как-то не помню, чтобы использовалось.
Для ПК есть 2 варианта решения такой задачи. Прямой способ, с перемещаемым кодом, и способ с таблицей переходов. То есть впереди проги размещена таблица адресов, которые указывают прямые переходы. ОС перед запуском проги корректирует прямые адреса на смещение относительно стартового адреса.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Oct 26 2016, 12:30
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(SasaVitebsk @ Oct 26 2016, 15:05) *
А какое отношение имеет PIC к ARM? Вы веткой ошиблись?

PIC - это Position Independent Code.

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

Да, и расположена там не функция b1(), а veneer для её вызова.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Oct 26 2016, 14:40
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(_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?
Go to the top of the page
 
+Quote Post
AVI-crak
сообщение Oct 26 2016, 16:38
Сообщение #6


Частый гость
**

Группа: Участник
Сообщений: 182
Регистрация: 16-10-15
Пользователь №: 88 894



Первая ссылка из гугла http://pyviy.blogspot.ru/2010/12/gcc.html
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 18:10
Рейтинг@Mail.ru


Страница сгенерированна за 0.01393 секунд с 7
ELECTRONIX ©2004-2016