When generating position-independent code (SVR4
PIC) for use in cris-axis-linux-gnu shared libraries, symbol
suffixes are used to specify what kind of run-time symbol lookup
will be used, expressed in the object as different
relocation types. Usually, all absolute symbol values
must be located in a table, the global offset table,
leaving the code position-independent; independent of values of
global symbols and independent of the address of the code. The
suffix modifies the value of the symbol, into for example an
index into the global offset table where the real symbol value
is entered, or a PC-relative value, or a value relative to the
start of the global offset table. All symbol suffixes start
with the character :
(omitted in the list below). Every
symbol use in code or a read-only section must therefore have a
PIC suffix to enable a useful shared library to be created.
Usually, these constructs must not be used with an additive
constant offset as is usually allowed, i.e. no 4 as in
symbol + 4
is allowed. This restriction is checked at
link-time, not at assembly-time.
GOT
R_CRIS_32_GOT
. Example: move.d
[$r0+extsym:GOT],$r9
GOT16
GOT
, but the value is a 16-bit index into the
global offset table. The corresponding relocation is
R_CRIS_16_GOT
. Example: move.d
[$r0+asymbol:GOT16],$r10
PLT
R_CRIS_32_PLT_PCREL
.
Example: add.d fnname:PLT,$pc
PLTG
R_CRIS_32_PLT_GOTREL
. Example: move.d
fnname:PLTG,$r3
GOTPLT
PLT
, but the value of the symbol is a 32-bit
index into the global offset table. This is somewhat of a mix
between the effect of the GOT
and the PLT
suffix;
the difference to GOT
is that there will be a procedure
linkage table entry created, and that the symbol is assumed to
be a function entry and will be resolved by the run-time
resolver as with PLT
. The relocation is
R_CRIS_32_GOTPLT
. Example: jsr
[$r0+fnname:GOTPLT]
GOTPLT16
GOTPLT
giving a 16-bit value. Its
relocation name is R_CRIS_16_GOTPLT
. Example: jsr
[$r0+fnname:GOTPLT16]
GOTOFF
R_CRIS_32_GOTREL
.
Example: move.d [$r0+localsym:GOTOFF],r3