as: CRIS-Pic

 
 9.8.4.2 Symbols in position-independent code
 ............................................
 
 When generating position-independent code (SVR4 PIC) for use in
 cris-axis-linux-gnu or crisv32-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'
 
      Attaching this suffix to a symbol in an instruction causes the
      symbol to be entered into the global offset table.  The value is a
      32-bit index for that symbol into the global offset table.  The
      name of the corresponding relocation is 'R_CRIS_32_GOT'.  Example:
      'move.d [$r0+extsym:GOT],$r9'
 
 'GOT16'
 
      Same as for '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'
 
      This suffix is used for function symbols.  It causes a _procedure
      linkage table_, an array of code stubs, to be created at the time
      the shared object is created or linked against, together with a
      global offset table entry.  The value is a pc-relative offset to
      the corresponding stub code in the procedure linkage table.  This
      arrangement causes the run-time symbol resolver to be called to
      look up and set the value of the symbol the first time the function
      is called (at latest; depending environment variables).  It is only
      safe to leave the symbol unresolved this way if all references are
      function calls.  The name of the relocation is
      'R_CRIS_32_PLT_PCREL'.  Example: 'add.d fnname:PLT,$pc'
 
 'PLTG'
 
      Like PLT, but the value is relative to the beginning of the global
      offset table.  The relocation is 'R_CRIS_32_PLT_GOTREL'.  Example:
      'move.d fnname:PLTG,$r3'
 
 'GOTPLT'
 
      Similar to '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'
 
      A variant of 'GOTPLT' giving a 16-bit value.  Its relocation name
      is 'R_CRIS_16_GOTPLT'.  Example: 'jsr [$r0+fnname:GOTPLT16]'
 
 'GOTOFF'
 
      This suffix must only be attached to a local symbol, but may be
      used in an expression adding an offset.  The value is the address
      of the symbol relative to the start of the global offset table.
      The relocation name is 'R_CRIS_32_GOTREL'.  Example: 'move.d
      [$r0+localsym:GOTOFF],r3'