Museum

Home

Lab Overview

Retrotechnology Articles

Online Manuals

⇒ reloc(4) — Digital UNIX 3.2c

Media Vault

Software Library

Restoration Projects

Artifacts Sought

Related Articles

as(1)

ld(1)

a.out(4)

syms(4)

scnhdr(4)

reloc(4)  —  File Formats

NAME

reloc − Relocation information for an object file

SYNOPSIS

#include  <reloc.h>

DESCRIPTION

Object files have one relocation entry for each relocatable reference in the text or data.  If relocation information is present, it will be in the following format. 

structreloc
{
  long       r_vaddr ;      /∗ (virtual) address of
                                reference ∗/
  unsigned   r_symndx ;     /∗ index into symbol table ∗/
  unsigned   r_type:8 ;     /∗ relocation type ∗/
  unsigned   r_extern:1 ;   /∗ if 1 symndx is an index
                               into the external table
                               the external table, else
                               symndx is a section #  ∗/
  unsigned   r_offset;6 ;   /∗ for R_OP_STORE, quad
                               based LE bit offset ∗/
  unsigned   r_reserved;11; /∗ Must be zero ∗/
  unsigned   r_size;6 ;     /∗ R_OP_STORE, bit size ∗/
} ; /∗ Relocation types ∗/
#define  R_ABS        0
#define  R_REFLONG    1
#define  R_REFQUAD    2
#define  R_GPREL32    3
#define  R_LITERAL    4
#define  R_LITUSE     5
#define  R_GPDISP     6
#define  R_BRADDR     7
#define  R_HINT       8
#define  R_SREL16     9  /∗ self relative 16 bit
                            offset ∗/
#define  R_SREL32     10 /∗ self relative 32 bit
                            offset ∗/
#define  R_SREL64     11 /∗ self relative 64-bit
                            offset ∗/
#define  R_OP_PUSH    12 /∗ stack[++tos] =
                            relocate(vaddr) ∗/
#define  R_OP_STORE   13 /∗ vaddr(r_offset:r_size =
                            stack[tos--] ∗/
#define  R_OP_PSUB    14 /∗ stack[tos] = stack[tos] -
                            relocate(vaddr) ∗/
#define  R_OP_PRSHIFT 15 /∗ stack[tos] = stack[tos] >>
                            relocate(vaddr) ∗/
#define  R_GPVALUE    16
/∗ Section numbers ∗/
#define  R_SN_NULL    0
#define  R_SN_TEXT    1
#define  R_SN_RDATA   2
#define  R_SN_DATA    3
#define  R_SN_SDATA   4
#define  R_SN_SBSS    5
#define  R_SN_BSS     6
#define  R_SN_INIT    7
#define  R_SN_LIT8    8
#define  R_SN_LIT4    9
#define  R_SN_XDATA   10
#define  R_SN_PDATE   11
#define  R_SN_FINI    12
#define  R_SN_LITA    13
#define  R_SN_ABS     14

The link editor (ld) reads each input section and performs relocation.  The relocation entries direct how references found within the input section are treated. 

If r_extern is zero then it is a local relocation entry and then r_symndx is a section number (R_SN_∗).  For these entries the starting address for the section referenced by the section number is used in place of an external symbol table entry’s value. 

For every external relocation (except R_ABS) a signed constant is added to the symbol’s virtual address that the relocation entry refers to.  This constant is assembled at the address being relocated. 

R_ABS A relocation has already been performed. 

R_REFLONG A 32-bit reference to the symbol’s virtual address. 

R_REFQUAD A 64-bit reference to the symbol’s virtual address. 

R_GPREL32 A 32-bit displacement from the global pointer to the symbol’s virtual address. 

R_LITERAL A reference to a literal in the literal address pool as an offset from the global pointer.  R_LITUSE Identifies usage of a lteral address previously loaded into a register.  The r_symndx field identifies the specific usage of the register.  See the Assembly Language Programmer’s Guide for more information. 

R_GPDISP Identifies an lda/ldah instruction pair that is used to initialize a procedure’s global-pointer register. The r_symndx contains a byte offset, which, when added to the r_vaddr field results in the address of the other instruction of the pair. 

R_BRADDR A 21-bit branch reference to the symbol’s virtual address. 

R_HINT A 14-bit jsr hint reference to the symbol’s virtual address. 

R_SREL16 A 16-bit self-relative reference to the symbol’s virtual address. 

R_SREL32 A 32-bit self-relative reference to the symbols’s virtual address. 

R_SREL64 A 64-bit self-relative reference to the symbol’s virtual address. 

R_OP_PUSH Push symbol’s virtual address on relocation expression stack. 

R_OP_STORE Pop value from the relocation expression stack and store at the symbol’s virtual address. The r_size field determines the number of bits stored. The r_offset field designates the bit offset from the symbol to the target. 

R_OP_PSUB Pop value from the relocation expression stack and subtract the symbol’s virtual address. The result is pushed on the relocation expression stack. 

R_OP_PRSHIFT Pop value from the relocation expression stack and shift right by the symbol’s value. The result is pushed on the relocation stack. 

R_GPVALUE Specifies a new gp value is to be used starting with the address specified by the r_vaddr field. The gp value is the sum of the optional header’s gp_value field and the r_symndx field.  The r_extern field must be zero. 

RELATED INFORMATION

as(1), ld(1), a.out(4), syms(4), scnhdr(4). 

Assembly Language Programmer’s Guide

Typewritten Software • bear@typewritten.org • Edmonds, WA 98026