performance. The link editor arranges for the Nth PLT entry to point to the Nth branch;
res_N
–
res_0
is four times the index into the
.rela.plt
section for the
corresponding R_JUMP_SLOT relocation.
The dynamic linker initializes GOT[1] to a unique identifier for each library and GOT[2]
to the address of the runtime resolver routine. In order for the two loads
in
.PLTresolve
to share the same
%hiadj
,
_GLOBAL_OFFSET_TABLE_
must be
aligned to a 16-byte boundary.
The runtime resolver receives the original function arguments in
r4
through
r7
, the
shared library identifier from GOT[1] in
r14
, and the relocation index times four in
r15
. The resolver updates the corresponding PLT GOT entry so that the PLT entry
transfers control directly to the target in the future, and then transfers control to the
target.
In shared objects, the
call
and
jmpi
instructions can not be used because the library
load address is not known at link time. Calls to functions outside the current shared
object must pass through the GOT. The program loads function addresses using
%call
, and the link editor may arrange for such entries to be lazily bound. Because
PLT entries are only used for lazy binding, shared object PLTs are smaller, as shown
below.
Example 27. Shared Object PLT
.PLTn:
orhi r15, r0, %hiadj(index * 4)
addi r15, r15, %lo(index * 4)
br .PLTresolve
Example 28. Initial PLT Entry
.PLTresolve:
nextpc r14
orhi r13, r0, %hiadj(_GLOBAL_OFFSET_TABLE_)
add r13, r13, r14
ldw r14, %lo(_GLOBAL_OFFSET4)(r13)
ldw r13, %lo(_GLOBAL_OFFSET8)(r13)
jmp r13
If the initial PLT entry is out of range, the resolver can be inline, because it is only one
instruction longer than a long branch, as shown below.
Example 29. Initial PLT Entry Out of Range
.PLTn:
orhi r15, r0, %hiadj(index * 4)
addi r15, r15, %lo(index * 4)
nextpc r14
orhi r13, r0, %hiadj(_GLOBAL_OFFSET_TABLE_)
add r13, r13, r14
ldw r14, %lo(_GLOBAL_OFFSET4)(r13)
ldw r13, %lo(_GLOBAL_OFFSET8)(r13)
jmp r13
7.9.6.4. Linux Program Interpreter
The program interpreter is /lib/ld.so.1.
7. Application Binary Interface
NII-PRG | 2018.04.18
Nios II Processor Reference Guide
166