Kenwood HP 9000 Personal Computer User Manual


 
268 Chapter 7
Position-Independent Code
Generating Position-Independent Code
When building shared libraries and incomplete executables, the linker
modifies the plabel calculation (produced by the compilers in both
shared libraries and incomplete executables) to load the contents of a
DLT entry, which is built for each symbol associated with a
CODE_PLABEL fixup.
In shared libraries and incomplete executables, a plabel value is the
address of a PLT entry for the target routine, rather than a procedure
address; therefore $$dyncall must be used when calling a routine with
a procedure label. The linker sets the second-to-last bit in the procedure
label to flag this as a special PLT procedure label. The $$dyncall
routine checks this bit to determine which type of procedure label has
been passed, and calls the target procedure accordingly.
In order to generate a procedure label that can be used for shared
libraries and incomplete executables, assembly code must specify that a
procedure address is being taken (and that a plabel is wanted) by using
the P' assembler fixup mode. For example, to generate an assembly
plabel, the following sequence must be used:
LDIL LP'function,%r1
LDO RP'function(%r1), %r22
; Now to call the routine
BL $$dyncall, %r31 ; r22 is the input register for $$dyncall
COPY %r31, %r2
This code sequence generates the necessary PLABEL fixups that the
linker needs in order to generate the proper procedure label. The
dyncall millicode routine in /usr/lib/milli.a must be used to call a
procedure using this type of procedure label; that is, a BL or BV will not
work).