[parisc-linux] -fPIC position independent code on parisc

Randolph Chung Randolph Chung <randolph@tausq.org>
Sun, 27 Apr 2003 13:12:19 -0700


> but what exactly is position independent code?

it's exactly what it says, it will work no matter at what position
the code is loaded.

e.g.:

non-PIC
>     18          ldil LR'.LC0,%r19
>     19          ldo RR'.LC0(%r19),%r26
>     20          bl printf,%r2

This loads the address of .LC0 (your string) relative to a fixed address
into r26 (arg0). The address is resolved statically at link time, so
if the code is moved to a different starting address, the address will 
be wrong.

PIC:
>     21          addil LT'.LC0,%r19
>     22          ldw RT'.LC0(%r1),%r1
>     23          copy %r1,%r26
>     24          bl printf,%r2

This calculates the offset of .LC0 relative to the linkage table pointer
(r19) by creating a GOT entry. The linkage table pointer is assigned 
value at runtime based on where the dynamic loader loads the code into 
memory, so the load will always point to the the right place wherever 
it is loaded. 

When you have a shared library, different programs that are linked
against the library may load it at different offsets, so the code must 
be position independent for it to work.

HTH
randolph
-- 
Randolph Chung
Debian GNU/Linux Developer, hppa/ia64 ports
http://www.tausq.org/