Доброго времени суток.
Помогите разобраться с 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
Я не понимаю, как этот код будет работать если его сместить в другой адрес?