diff options
Diffstat (limited to 'bfd/elf32-hppa.h')
-rw-r--r-- | bfd/elf32-hppa.h | 344 |
1 files changed, 88 insertions, 256 deletions
diff --git a/bfd/elf32-hppa.h b/bfd/elf32-hppa.h index dadc411..188f6c6 100644 --- a/bfd/elf32-hppa.h +++ b/bfd/elf32-hppa.h @@ -4,7 +4,7 @@ in the Stratus FTX/Golf Object File Format (SED-1762) dated November 19, 1992. - Copyright (C) 1990-1991 Free Software Foundation, Inc. + Copyright (C) 1990, 91, 92, 93, 94 Free Software Foundation, Inc. Written by: @@ -33,248 +33,97 @@ #include "libelf.h" #include "libhppa.h" +#include "elf/hppa.h" /* ELF/HPPA relocation types */ typedef enum { - /* 9.3.4. Address relocation types - These relocation types do simple base + offset relocations. - - By convention, relocation type zero is always "no relocation", - while type one is 32-bit word relocation. */ - - R_HPPA_NONE, /* - - */ - R_HPPA_32, /* Symbol + Addend 32 */ - R_HPPA_11, /* Symbol + Addend 11 */ - R_HPPA_14, /* Symbol + Addend 11 */ - R_HPPA_17, /* Symbol + Addend 11 */ - R_HPPA_L21, /* L (Symbol, Addend) 21 */ - R_HPPA_R11, /* R (Symbol, Addend) 11 */ - R_HPPA_R14, /* R (Symbol, Addend) 14 */ - R_HPPA_R17, /* R (Symbol, Addend) 17 */ - R_HPPA_LS21, /* LS(Symbol, Addend) 21 */ - R_HPPA_RS11, /* RS(Symbol, Addend) 11 */ - R_HPPA_RS14, /* RS(Symbol, Addend) 14 */ - R_HPPA_RS17, /* RS(Symbol, Addend) 17 */ - R_HPPA_LD21, /* LD(Symbol, Addend) 21 */ - R_HPPA_RD11, /* RD(Symbol, Addend) 11 */ - R_HPPA_RD14, /* RD(Symbol, Addend) 14 */ - R_HPPA_RD17, /* RD(Symbol, Addend) 17 */ - R_HPPA_LR21, /* LR(Symbol, Addend) 21 */ - R_HPPA_RR14, /* RR(Symbol, Addend) 14 */ - R_HPPA_RR17, /* RR(Symbol, Addend) 17 */ - - /* 9.3.5. GOTOFF address relocation types - - The Global Offset Table (GOT) is a table of pointers to data, but - its address can also be used as a base pointer to address data, - similar to the way the DP is used in HP/UX. The expression - calculation yields a signed offset of an address from the GOT. */ - - R_HPPA_GOTOFF_11, /* Symbol - GOT + Addend 11 */ - R_HPPA_GOTOFF_14, /* Symbol - GOT + Addend 14 */ - R_HPPA_GOTOFF_L21, /* L (Sym - GOT, Addend) 21 */ - R_HPPA_GOTOFF_R11, /* R (Sym - GOT, Addend) 11 */ - R_HPPA_GOTOFF_R14, /* R (Sym - GOT, Addend) 14 */ - R_HPPA_GOTOFF_LS21, /* LS(Sym - GOT, Addend) 21 */ - R_HPPA_GOTOFF_RS11, /* RS(Sym - GOT, Addend) 11 */ - R_HPPA_GOTOFF_RS14, /* RS(Sym - GOT, Addend) 14 */ - R_HPPA_GOTOFF_LD21, /* LD(Sym - GOT, Addend) 21 */ - R_HPPA_GOTOFF_RD11, /* RD(Sym - GOT, Addend) 11 */ - R_HPPA_GOTOFF_RD14, /* RD(Sym - GOT, Addend) 14 */ - R_HPPA_GOTOFF_LR21, /* LR(Sym - GOT, Addend) 21 */ - R_HPPA_GOTOFF_RR14, /* RR(Sym - GOT, Addend) 14 */ - - /* 9.3.6. Absolute call relocation types - - Relocations of function calls must be accompanied by parameter - relocation information. This information is carried in the ten - high-order bits of the addend field. The remaining 22 bits of - of the addend field are sign-extended to form the Addend. + /* Address relocation types + These relocation types do simple base + offset relocations. */ + + R_PARISC_NONE = 0x00, + R_PARISC_DIR32 = 0x01, + R_PARISC_DIR21L = 0x02, + R_PARISC_DIR17R = 0x03, + R_PARISC_DIR17F = 0x04, + R_PARISC_DIR14R = 0x06, + + /* PC-relative relocation types + Typically used for calls. + Note PCREL17C and PCREL17F differ only in overflow handling. + PCREL17C never reports a relocation error. + + When supporting argument relocations, function calls must be + accompanied by parameter relocation information. This information is + carried in the ten high-order bits of the addend field. The remaining + 22 bits of of the addend field are sign-extended to form the Addend. Note the code to build argument relocations depends on the addend being zero. A consequence of this limitation is GAS can not perform relocation reductions for function symbols. */ + R_PARISC_PCREL21L = 0x0a, + R_PARISC_PCREL17R = 0x0b, + R_PARISC_PCREL17F = 0x0c, + R_PARISC_PCREL17C = 0x0d, + R_PARISC_PCREL14R = 0x0e, + R_PARISC_PCREL14F = 0x0f, - R_HPPA_ABS_CALL_11, /* Symbol + Addend 11 */ - R_HPPA_ABS_CALL_14, /* Symbol + Addend 14 */ - R_HPPA_ABS_CALL_17, /* Symbol + Addend 17 */ - R_HPPA_ABS_CALL_L21, /* L (Symbol, Addend) 21 */ - R_HPPA_ABS_CALL_R11, /* R (Symbol, Addend) 11 */ - R_HPPA_ABS_CALL_R14, /* R (Symbol, Addend) 14 */ - R_HPPA_ABS_CALL_R17, /* R (Symbol, Addend) 17 */ - R_HPPA_ABS_CALL_LS21, /* LS(Symbol, Addend) 21 */ - R_HPPA_ABS_CALL_RS11, /* RS(Symbol, Addend) 11 */ - R_HPPA_ABS_CALL_RS14, /* RS(Symbol, Addend) 14 */ - R_HPPA_ABS_CALL_RS17, /* RS(Symbol, Addend) 17 */ - R_HPPA_ABS_CALL_LD21, /* LD(Symbol, Addend) 21 */ - R_HPPA_ABS_CALL_RD11, /* RD(Symbol, Addend) 11 */ - R_HPPA_ABS_CALL_RD14, /* RD(Symbol, Addend) 14 */ - R_HPPA_ABS_CALL_RD17, /* RD(Symbol, Addend) 17 */ - R_HPPA_ABS_CALL_LR21, /* LR(Symbol, Addend) 21 */ - R_HPPA_ABS_CALL_RR14, /* RR(Symbol, Addend) 14 */ - R_HPPA_ABS_CALL_RR17, /* RR(Symbol, Addend) 17 */ - - /* 9.3.7. PC-relative call relocation types - - PC-relative relocation calculates the difference between an address - and the location being relocated. This is most often used to - relocate pc-relative calls. They are otherwise identical to - their corresponding absolute call relocations. */ - - R_HPPA_PCREL_CALL_11, /* Symbol - PC + Addend 11 */ - R_HPPA_PCREL_CALL_14, /* Symbol - PC + Addend 14 */ - R_HPPA_PCREL_CALL_17, /* Symbol - PC + Addend 17 */ - R_HPPA_PCREL_CALL_12, /* Symbol - PC + Addend 12 */ - R_HPPA_PCREL_CALL_L21, /* L (Symbol - PC, Addend) 21 */ - R_HPPA_PCREL_CALL_R11, /* R (Symbol - PC, Addend) 11 */ - R_HPPA_PCREL_CALL_R14, /* R (Symbol - PC, Addend) 14 */ - R_HPPA_PCREL_CALL_R17, /* R (Symbol - PC, Addend) 17 */ - R_HPPA_PCREL_CALL_LS21, /* LS(Symbol - PC, Addend) 21 */ - R_HPPA_PCREL_CALL_RS11, /* RS(Symbol - PC, Addend) 11 */ - R_HPPA_PCREL_CALL_RS14, /* RS(Symbol - PC, Addend) 14 */ - R_HPPA_PCREL_CALL_RS17, /* RS(Symbol - PC, Addend) 17 */ - R_HPPA_PCREL_CALL_LD21, /* LD(Symbol - PC, Addend) 21 */ - R_HPPA_PCREL_CALL_RD11, /* RD(Symbol - PC, Addend) 11 */ - R_HPPA_PCREL_CALL_RD14, /* RD(Symbol - PC, Addend) 14 */ - R_HPPA_PCREL_CALL_RD17, /* RD(Symbol - PC, Addend) 17 */ - R_HPPA_PCREL_CALL_LR21, /* LR(Symbol - PC, Addend) 21 */ - R_HPPA_PCREL_CALL_RR14, /* RR(Symbol - PC, Addend) 14 */ - R_HPPA_PCREL_CALL_RR17, /* RR(Symbol - PC, Addend) 17 */ - - /* 9.3.8. Plabel relocation types - - Plabels are designed to allow code pointers to be passed between - spaces. - - Plabels are procedure markers. They are used to denote relocations - which involve procedures (call, loading the address of a procedure, - etc). They are necessary for the proper functioning of argument - relocations. The addend of the relocation should be either 0 (no - static link) or 2 (static link required). These relocations - correspond to the P%, LP% and RP% field selectors. */ - - R_HPPA_PLABEL_32, /* F(Plabel(Symbol,Addend),0) 32 */ - R_HPPA_PLABEL_11, /* F(Plabel(Symbol,Addend),0) 11 */ - R_HPPA_PLABEL_14, /* F(Plabel(Symbol,Addend),0) 14 */ - R_HPPA_PLABEL_L21, /* L(Plabel(Symbol,Addend),0) 21 */ - R_HPPA_PLABEL_R11, /* R(Plabel(Symbol,Addend),0) 11 */ - R_HPPA_PLABEL_R14, /* R(Plabel(Symbol,Addend),0) 14 */ - - /* 9.3.9. Data linkage table (DLT) relocation types + /* DP-relative relocation types. */ + R_PARISC_DPREL21L = 0x12, + R_PARISC_DPREL14R = 0x16, + R_PARISC_DPREL14F = 0x17, + + /* Data linkage table (DLT) relocation types SOM DLT_REL fixup requests are used to for static data references from position-independent code within shared libraries. They are similar to the GOT relocation types in some SVR4 implementations. */ - R_HPPA_DLT_32, /* F(DLTOFF) 32 */ - R_HPPA_DLT_11, /* F(DLTOFF) 11 */ - R_HPPA_DLT_14, /* F(DLTOFF) 14 */ - R_HPPA_DLT_L21, /* L(DLTOFF) 21 */ - R_HPPA_DLT_R11, /* R(DLTOFF) 11 */ - R_HPPA_DLT_R14, /* R(DLTOFF) 14 */ - - /* 9.3.10. Relocations for unwinder tables - - The unwinder table consists of a series of four-word entries, the - first two of which are a pair of code addresses. While it would be - possible to relocate this table using just R_HPPA_32, the amount of - relocation data resulting would be very large. To reduce that data, - the following relocation types have been defined. - - The first, R_HPPA_UNWIND_ENTRY, merely compresses two R_HPPA_32 - operations into one. It is designed for use in .rel-type - relocations, where the two 32-bit addends are taken from the unwind - section itself. - - The second, which is designed for use in .rela-type relocations, is - designed to relocate an entire unwinder table with one relocation - entry. It has the effect of multiple R_HPPA_UNWIND_ENTRY - relocations applied to successive unwinder table entries. The - number of entries to be relocated is given in the r_addend field of - the relocation entry. The rest of the relocation entry is used in - a normal way--r_offset is the offset of the first unwind entry in - the section, while ELF32_R_SYM(r_info) is the code section that all - the code addresses should be relocated from. - - Why can't we use begin/end markers + unwind description bits like - som? FIXME! */ - - R_HPPA_UNWIND_ENTRY, /* "128" */ - R_HPPA_UNWIND_ENTRIES, /* Addend * "128" */ - - /* 9.3.11. Relocation types for complex expressions - - New-format SOM fixups support complex expressions by spreading - the parts of the expression across multiple entries. ELF for - HPPA will have a similar mechanism, although support for it may - be optional. There are two main reasons for defining it: first, - the need to translate complex SOM fixup expressions to ELF, and - second, to cover combinations of expression, field and format not - available with other relocation types. - - ELF expression relocation entries are interpreted as postfix-form - expressions. They may be evaluated using a push-down stack. - - Usually, the addend field of these expression relocation entries is - unused, with the following exceptions: - - R_HPPA_PUSH_CONST: The addend field contains the constant. - - R_HPPA_PUSH_PROC: The high-order 10 bits of the addend field - contain parameter relocation information. The rest ofthe addend - field is unused. - - R_HPPA_LSHIFT, R_HPPA_ARITH_RSHIFT and R_HPPA_LOGIC_RSHIFT: - The addend field normally gives the amount to shift. - However, if that amount is zero, the shift amount is - popped from the top of the stack prior to popping the - amount to be shifted. */ - - R_HPPA_PUSH_CONST, /* push Addend - - */ - R_HPPA_PUSH_PC, /* push PC + Addend - - */ - R_HPPA_PUSH_SYM, /* push Symbol + Addend - - */ - R_HPPA_PUSH_GOTOFF, /* push Symbol - GOT + Addend - - */ - R_HPPA_PUSH_ABS_CALL, /* push Symbol + Addend - - */ - R_HPPA_PUSH_PCREL_CALL, /* push Symbol - PC + Addend - - */ - R_HPPA_PUSH_PLABEL, /* push Plabel(Symbol) - - */ - R_HPPA_MAX, /* pop A and B, push max(B,A) - - */ - R_HPPA_MIN, /* pop A and B, push min(B,A) - - */ - R_HPPA_ADD, /* pop A and B, push B + A - - */ - R_HPPA_SUB, /* pop A and B, push B - A - - */ - R_HPPA_MULT, /* pop A and B, push B * A - - */ - R_HPPA_DIV, /* pop A and B, push B / A - - */ - R_HPPA_MOD, /* pop A and B, push B % A - - */ - R_HPPA_AND, /* pop A and B, push B & A - - */ - R_HPPA_OR, /* pop A and B, push B | A - - */ - R_HPPA_XOR, /* pop A and B, push B ^ A - - */ - R_HPPA_NOT, /* pop A, push ~A - - */ - R_HPPA_LSHIFT, /* pop A, push A << Addend - - */ - R_HPPA_ARITH_RSHIFT, /* pop A, push A >> Addend - - */ - R_HPPA_LOGIC_RSHIFT, /* pop A, push A >> Addend - - */ - R_HPPA_EXPR_F, /* pop A, push A + Addend F - */ - R_HPPA_EXPR_L, /* pop A, push L(A,Addend) L - */ - R_HPPA_EXPR_R, /* pop A, push R(A,Addend) R - */ - R_HPPA_EXPR_LS, /* pop A, push LS(A,Addend) LS - */ - R_HPPA_EXPR_RS, /* pop A, push RS(A,Addend) RS - */ - R_HPPA_EXPR_LD, /* pop A, push LD(A,Addend) LD - */ - R_HPPA_EXPR_RD, /* pop A, push RD(A,Addend) RD - */ - R_HPPA_EXPR_LR, /* pop A, push LR(A,Addend) LR - */ - R_HPPA_EXPR_RR, /* pop A, push RR(A,Addend) RR - */ - R_HPPA_EXPR_32, /* pop - 32 */ - R_HPPA_EXPR_21, /* pop - 21 */ - R_HPPA_EXPR_11, /* pop - 11 */ - R_HPPA_EXPR_14, /* pop - 14 */ - R_HPPA_EXPR_17, /* pop - 17 */ - R_HPPA_EXPR_12, /* pop - 12 */ - R_HPPA_STUB_CALL_17, /* Symbol + Addend - 17 */ - R_HPPA_UNIMPLEMENTED /* N/A */ + R_PARISC_DLTREL21L = 0x1a, + R_PARISC_DLTREL14R = 0x1e, + R_PARISC_DLTREL14F = 0x1f, + + /* DLT indirect relocation types */ + R_PARISC_DLTIND21L = 0x22, + R_PARISC_DLTIND14R = 0x26, + R_PARISC_DLTIND14F = 0x27, + + /* Base relative relocation types. Ugh. These imply lots of state */ + R_PARISC_SETBASE = 0x28, + R_PARISC_BASEREL32 = 0x29, + R_PARISC_BASEREL21L = 0x2a, + R_PARISC_BASEREL17R = 0x2b, + R_PARISC_BASEREL17F = 0x2c, + R_PARISC_BASEREL14R = 0x2e, + R_PARISC_BASEREL14F = 0x2f, + + /* Segment relative relocation types. */ + R_PARISC_TEXTREL32 = 0x31, + R_PARISC_DATAREL32 = 0x39, + + /* Plabel relocation types. */ + R_PARISC_PLABEL32 = 0x41, + R_PARISC_PLABEL21L = 0x42, + R_PARISC_PLABEL14R = 0x46, + + /* PLT relocations. */ + R_PARISC_PLTIND21L = 0x82, + R_PARISC_PLTIND14R = 0x86, + R_PARISC_PLTIND14F = 0x87, + + /* Misc relocation types. */ + R_PARISC_COPY = 0x88, + R_PARISC_GLOB_DAT = 0x89, + R_PARISC_JMP_SLOT = 0x8a, + R_PARISC_RELATIVE = 0x8b, + R_PARISC_STUB_CALL_17 = 0x8c, + R_PARISC_UNIMPLEMENTED, } elf32_hppa_reloc_type; -#define ELF_HOWTO_TABLE_SIZE R_HPPA_UNIMPLEMENTED + 1 -#define N_HPPA_RELOCS R_HPPA_UNIMPLEMENTED + 1 +#define ELF_HOWTO_TABLE_SIZE R_PARISC_UNIMPLEMENTED + 1 +#define N_PARISC_RELOCS R_PARISC_UNIMPLEMENTED + 1 /* Define groups of basic relocations. FIXME: These should be the only basic relocations created by GAS. The rest @@ -285,40 +134,28 @@ elf32_hppa_reloc_type; as appropriate. This allows GAS to share much more code between the two target object formats. */ -#define R_HPPA R_HPPA_32 -#define R_HPPA_GOTOFF R_HPPA_GOTOFF_11 -#define R_HPPA_ABS_CALL R_HPPA_ABS_CALL_11 -#define R_HPPA_PCREL_CALL R_HPPA_PCREL_CALL_11 -#define R_HPPA_PLABEL R_HPPA_PLABEL_32 -#define R_HPPA_DLT R_HPPA_DLT_32 -#define R_HPPA_UNWIND R_HPPA_UNWIND_ENTRY -#define R_HPPA_COMPLEX R_HPPA_PUSH_CONST -#define R_HPPA_COMPLEX_PCREL_CALL R_HPPA_PUSH_CONST + 1 -#define R_HPPA_COMPLEX_ABS_CALL R_HPPA_PUSH_CONST + 2 - -/* HPPA Section types */ -#define SHT_HPPA_SYMEXTN SHT_LOPROC - -/* HPPA Symbol types */ -#define STT_HPPA_PLABEL STT_LOPROC +#define R_HPPA_NONE R_PARISC_NONE +#define R_HPPA R_PARISC_DIR32 +#define R_HPPA_GOTOFF R_PARISC_DPREL21L +#define R_HPPA_PCREL_CALL R_PARISC_PCREL21L /* HPPA symbol table extension entry types */ enum elf32_hppa_symextn_types { - HPPA_SXT_NULL, - HPPA_SXT_SYMNDX, - HPPA_SXT_ARG_RELOC, + PARISC_SXT_NULL, + PARISC_SXT_SYMNDX, + PARISC_SXT_ARG_RELOC, }; /* These macros compose and decompose the value of a symextn entry: - entry_type = ELF32_HPPA_SX_TYPE(word); - entry_value = ELF32_HPPA_SX_VAL(word); - word = ELF32_HPPA_SX_WORD(type,val); */ + entry_type = ELF32_PARISC_SX_TYPE(word); + entry_value = ELF32_PARISC_SX_VAL(word); + word = ELF32_PARISC_SX_WORD(type,val); */ -#define ELF32_HPPA_SX_TYPE(p) ((p) >> 24) -#define ELF32_HPPA_SX_VAL(p) ((p) & 0xFFFFFF) -#define ELF32_HPPA_SX_WORD(type,val) (((type) << 24) + (val & 0xFFFFFF)) +#define ELF32_PARISC_SX_TYPE(p) ((p) >> 24) +#define ELF32_PARISC_SX_VAL(p) ((p) & 0xFFFFFF) +#define ELF32_PARISC_SX_WORD(type,val) (((type) << 24) + (val & 0xFFFFFF)) /* The following was added facilitate implementation of the .hppa_symextn section. This section is built after the symbol table is built in the @@ -329,7 +166,7 @@ enum elf32_hppa_symextn_types /* Number of "hand-made" target specific sections. */ #define ELF_TC_FAKE_SECTIONS 1 -#define SYMEXTN_SECTION_NAME ".hppa_symextn" +#define SYMEXTN_SECTION_NAME ".PARISC.symext" /* FIXME. Are these external? (For example used by GAS?). If so the names need to change to avoid namespace pollution, if not they should @@ -343,9 +180,6 @@ struct symext_chain typedef struct symext_chain symext_chainS; -void elf_hppa_tc_symbol - PARAMS ((bfd *, elf_symbol_type *, int, symext_chainS **, symext_chainS **)); - elf32_hppa_reloc_type **hppa_elf_gen_reloc_type PARAMS ((bfd *, elf32_hppa_reloc_type, int, int)); @@ -354,6 +188,4 @@ asymbol * hppa_look_for_stubs_in_section int *, struct bfd_link_info *)); void elf_hppa_final_processing PARAMS ((void)); -void elf_hppa_tc_make_sections PARAMS ((bfd *, symext_chainS *)); - #endif /* _ELF32_HPPA_H */ |