Chapter 7 263
Position-Independent Code
Generating Position-Independent Code
Generating Position-Independent Code
To be position-independent, object code must restrict all references to
code and data to either PC-relative or indirect references, where all
indirect references are collected in a single linkage table that can be
initialized on a per-process basis by dld.sl.
Register 19 (%r19) is the designated pointer to the linkage table. The
linker generates stubs that ensure %r19 always points to the correct
value for the target routine and that handle the inter-space calls needed
to branch between shared libraries.
The linker generates an import stub for each external reference to a
routine. The call to the routine is redirected to branch to the import stub,
which obtains the target routine address and the new linkage table
pointer value from the current linkage table; it then branches to an
export stub for the target routine. In 32-bit mode, the linker generates an
export stub for each externally visible routine in a shared library or
program file. The export stub is responsible for trapping the return from
the target routine in order to handle the inter-space call required
between shared libraries and program files.
NOTE The 64-bit mode linker does not require or support export stubs.
Shown below is the PIC code generated for import and export stubs. Note
that this code is generated automatically by the linker; you don't have to
generate the stubs yourself.
;Import Stub (Incomplete Executable)
X': ADDIL L'lt_ptr+ltoff,%dp ; get procedure entry point
LDW R'lt_ptr+ltoff(%r1),%r21
LDW R'lt_ptr+ltoff+4(%r1),%r19 ; get new r19 value.
LDSID (%r21),%r1
MTSP %r1,%sr0
BE 0(%sr0,%r21) ; branch to target
STW %rp,-24(%sp) ; save rp
;Import Stub (Shared Library)
X': ADDIL L'ltoff,%r19 ; get procedure entry point
LDW R'ltoff(%r1),%r21
LDW R'ltoff+4(%r1),%r19 ; get new r19 value
LDSID (%r21),%r1
MTSP %r1,%sr0
BE 0(%sr0,%r21) ; branch to target
STW %rp,-24(%sp) ; save rp
;Export Stub (Shared libs and Incomplete Executables)
X': BL,N X,%rp ; trap the return