elfcode.h

This commit is contained in:
Ken Raeburn 1993-06-02 21:24:35 +00:00
parent cef91d759c
commit 7050286db6
5 changed files with 875 additions and 270 deletions

View File

@ -1,3 +1,67 @@
Tue Jun 1 04:15:57 1993 Ken Raeburn (raeburn@kr-pc.cygnus.com)
* elf.c: New file, for word-size independent code.
* elfcode.h (elf_hash): Moved to there, renamed bfd_elf_hash.
* Makefile.in: Include elf.o in standard objects.
* bfd-in.h (CAT3): Define here.
* libaout.h, libelf.h: Not here.
* libelf.h (struct strtab): Define here.
(bfd_elf_locate_sh): Declare here.
* elfcode.h (struct strtab): Definition deleted.
* reloc.c (enum bfd_reloc_code_real): Added HPPA_PCREL_CALL_12.
* Makefile.in: Make "all", not "bfd.h", be the default target.
(stmp-bfd.h): New target; prevents rebuilding world if bfd.h
hasn't really changed.
Tue May 25 12:15:15 1993 Michael Meissner (meissner@osf.org)
* elfcode.h (elf_hash): Provide elf standard hash function.
(various): Key off of the machines use_rela_p field to determine
whether to use REL or RELA relocations.
(elf_swap_reloc_out, elf_swap_reloc_in): New functions.
(elf_make_sections): Allocate a pointer to hold all data for a
given section, and copy each fragment into the data region.
Update the section's pointer with the REL implicit addends if the
machine uses REL relocation.
* elf32-i386.c (elf_bfd_reloc_type_lookup): Rename to
elf_i386_bfd_reloc_type_lookup, and use cpp to map the name back
into was elf32-target.h expects.
(elf_info_to_howto): Rename to elf_i386_info_to_howto.
(elf_i386_bfd_reloc_type_lookup): Add relocation support.
(elf_i386_info_to_howto): Add minimal relocation support.
* libelf.h (elf_backend_data): Add use_rela_p, elf_64_p,
elf_info_to_howto_rel fields.
* elf32-target.h (elf_bed): Add support for new fields in
elf_backend_data.
Sun May 30 16:38:24 1993 Peter Hoogenboom (hoogen@fast.cs.utah.edu)
* elf32-hppa.c: Add symbol extension section support, fix
relocation howto table, add stub generation support.
* elf32-hppa.h: Add symbol extension section support, fix
relocation howto table, add stub generation support.
* elfcode.h (bfd_elf_locate_sh): New function to locate ELF
section header.
(bfd_add_to_strtab):
(elf_idx_of_sym):
(elf_compute_section_file_positions):
(elf_write_object_contents):
(elf_get_sect_thunk):
* hppa.c (sign_ext): Reimplement.
* hppa.c (round_down,round,round_up,L,R,LS,RS,LD,RD,LR,RR): Make
these functions static.
Tue Jun 1 14:40:41 1993 Per Bothner (bothner@rtl.cygnus.com)
* Makefile.in (bfd.h): Move closer to headers - and after 'all'!

464
bfd/elf32-hppa.h Normal file
View File

@ -0,0 +1,464 @@
/* ELF32/HPPA relocation support
This file contains ELF32/HPPA relocation support as specified
in the Stratus FTX/Golf Object File Format (SED-1762) dated
November 19, 1992.
*/
/*
Copyright (C) 1990-1991 Free Software Foundation, Inc.
Written by:
Center for Software Science
Department of Computer Science
University of Utah
This file is part of BFD, the Binary File Descriptor library.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
#ifndef _ELF32_HPPA_H
#define _ELF32_HPPA_H
#include "libelf.h"
/* 9.3.3. Parameter relocation information */
/* As mentioned previously, relocations of calls must be accompanied */
/* by parameter relocation information, indicating which registers the */
/* first for parameter words, and the return value, are located in. */
/* This information accompanies the R_HPPA_ABS_CALL.., */
/* R_HPPA_PCREL_CALL... and R_HPPA_PUSH_PROC relocation types, */
/* described below. The information is kept in the high-order 10 bits */
/* of Elf32_rela.r_addend, while the low-order 22 bits are a signed */
/* constant to be used in calculating the call target. The following */
/* macros are used to extract and combine these data in r_addend. */
#define ELF32_HPPA_R_ARG_RELOC(a) (((a) >> 22) & 0x3FF)
#define ELF32_HPPA_R_CONSTANT(a) ((((Elf32_Sword)(a)) << 10) >> 10)
#define ELF32_HPPA_R_ADDEND(r,c) (((r) << 22) + ((c) & 0x3FFFFF))
/* ELF/HPPA relocation types */
/* name expression format */
/* -------------------------------------------------------------- */
typedef enum
{
/* 9.3.4. Address relocation types */
/* These relocation types do simple base+offset relocations, and are */
/* normally used for absolute references to data. */
/* 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. */
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. */
/* As with the ABS_CALL relocation types, the ten high-order bits of */
/* the addend field carry parameter relocation information, while */
/* the low-order 22 bits are sign-extended to form the Addend. */
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 *//* #69 */
/* 9.3.8. Plabel relocation types */
/* Plabels are designed to allow code pointers to be passed between */
/* spaces. 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. [Description is incomplete] */
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 */
/* 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. */
/* [Prose to come] */
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 */
/* As described above, 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. */
R_HPPA_UNWIND_ENTRY, /* "128" */
R_HPPA_UNWIND_ENTRIES, /* Addend * "128" */
/* 9.3.11. Relocation types for complex expressions */
/* As described above, 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 of */
/* the 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. */
/* name expression fld/fmt */
/* ------------------------------------------------------------------- */
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_UNIMPLEMENTED /* N/A */
} elf32_hppa_reloc_type;
#define ELF_HOWTO_TABLE_SIZE R_HPPA_UNIMPLEMENTED + 1
#define N_HPPA_RELOCS R_HPPA_UNIMPLEMENTED + 1
/* Groups of relocations. Serves as an expression type. */
#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
enum hppa_reloc_field_selector_type
{
R_HPPA_FSEL = 0x0,
R_HPPA_LSSEL = 0x1,
R_HPPA_RSSEL = 0x2,
R_HPPA_LSEL = 0x3,
R_HPPA_RSEL = 0x4,
R_HPPA_LDSEL = 0x5,
R_HPPA_RDSEL = 0x6,
R_HPPA_LRSEL = 0x7,
R_HPPA_RRSEL = 0x8,
R_HPPA_PSEL = 0x9, /* P' : procedure address for shlib's */
R_HPPA_LPSEL = 0xa, /* LP' : L' for procedure addresses */
R_HPPA_RPSEL = 0xb, /* RP' : R' for procedure addresses */
R_HPPA_TSEL = 0xc, /* T' : DLT-relative offset for shlib's */
R_HPPA_LTSEL = 0xd, /* LT' : L' for DLT-relative offsets */
R_HPPA_RTSEL = 0xe /* RT' : R' for DLT-relative offsets */
};
#define N_HPPA_FIELD_SELECTORS 15
/* for compatibility */
enum hppa_reloc_field_selector_type_alt
{
e_fsel = R_HPPA_FSEL,
e_lssel = R_HPPA_LSSEL,
e_rssel = R_HPPA_RSSEL,
e_lsel = R_HPPA_LSEL,
e_rsel = R_HPPA_RSEL,
e_ldsel = R_HPPA_LDSEL,
e_rdsel = R_HPPA_RDSEL,
e_lrsel = R_HPPA_LRSEL,
e_rrsel = R_HPPA_RRSEL,
e_psel = R_HPPA_PSEL, /* P' : procedure address for shlib's */
e_lpsel = R_HPPA_LPSEL, /* LP' : L' for procedure addresses */
e_rpsel = R_HPPA_RPSEL, /* RP' : R' for procedure addresses */
e_tsel = R_HPPA_TSEL, /* T' : DLT-relative offset for shlib's */
e_ltsel = R_HPPA_LTSEL, /* LT' : L' for DLT-relative offsets */
e_rtsel = R_HPPA_RTSEL /* RT' : R' for DLT-relative offsets */
};
/* PA-RISC OPCODES */
#define get_opcode(insn) ((insn) & 0xfc000000) >> 26
/* XXX: this list is incomplete */
#define LDO 0x0d
#define LDB 0x10
#define LDH 0x11
#define LDW 0x12
#define LDWM 0x13
#define STB 0x18
#define STH 0x19
#define STW 0x1a
#define STWM 0x1b
#define COMICLR 0x24
#define SUBI 0x25
#define SUBIO 0x25
#define ADDIT 0x2c
#define ADDITO 0x2c
#define ADDI 0x2d
#define ADDIO 0x2d
#define LDIL 0x08
#define ADDIL 0x0a
#define MOVB 0x32
#define MOVIB 0x33
#define COMBT 0x20
#define COMBF 0x22
#define COMIBT 0x21
#define COMIBF 0x23
#define ADDBT 0x28
#define ADDBF 0x2a
#define ADDIBT 0x29
#define ADDIBF 0x2b
#define BVB 0x30
#define BB 0x31
#define BL 0x3a
#define BLE 0x39
#define BE 0x38
#ifdef __STDC__
elf32_hppa_reloc_type **hppa_elf_gen_reloc_type (bfd * abfd, elf32_hppa_reloc_type base_type, int format, int field);
#else
elf32_hppa_reloc_type **hppa_elf_gen_reloc_type ();
#endif
/*
* HPPA Section types
*/
#define SHT_HPPA_SYMEXTN SHT_LOPROC
/*
* HPPA Symbol types
*/
#define STT_HPPA_PLABEL STT_LOPROC
/*
* HPPA symbol table extension entry types
*/
#define HPPA_SXT_NULL 0x00
#define HPPA_SXT_SYMNDX 0x01
#define HPPA_SXT_ARG_RELOC 0x02
/*
* 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);
* Se.hppa_se_info = ELF32_HPPA_SE_INFO(arg_reloc)
*/
#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))
/* The following was added facilitate implementation of the .hppa_symextn
section. This section is built after the symbol table is built in the
elf_write_object_contents routine (called from bfd_close). It is built
so late because it requires information that is not known until
the symbol and string table sections have been allocated, and
the symbol table has been built. */
#define ELF_TC_FAKE_SECTIONS 1 /* # of "hand_made" tc-specific sections */
#define SYMEXTN_SECTION_NAME ".hppa_symextn"
extern void EXFUN (elf_hppa_tc_symbol, (bfd *, elf32_symbol_type *, int));
extern void EXFUN (elf_hppa_tc_make_sections, (bfd *, PTR));
typedef Elf32_Word symext_entryS;
struct symext_chain
{
symext_entryS entry;
struct symext_chain *next;
};
typedef struct symext_chain symext_chainS;
extern symext_chainS *symext_rootP;
extern symext_chainS *symext_lastP;
#endif /* _ELF32_HPPA_H */

View File

@ -54,8 +54,19 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
static CONST struct elf32_backend_data elf32_bed =
{
elf_info_to_howto,
ELF_ARCH,
#ifdef USE_REL
0, /* use_rela_p */
#else
1, /* use_rela_p */
#endif
0, /* elf_64_p */
ELF_ARCH, /* arch */
elf_info_to_howto, /* elf_info_to_howto */
#ifdef elf_info_to_howto_rel
elf_info_to_howto_rel, /* elf_info_to_howto_rel */
#else
0, /* elf_info_to_howto_rel */
#endif
};
#ifdef TARGET_BIG_SYM

View File

@ -70,7 +70,8 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
((__m_num) >= _PA_RISC1_1_ID && (__m_num) <= _PA_RISC_MAXID))
#endif /* _PA_RISC_ID */
struct container {
struct container
{
struct header f;
struct som_exec_auxhdr e;
};
@ -87,13 +88,15 @@ hppa_object_setup (abfd, file_hdrp, aux_hdrp)
asection *text, *data, *bss;
rawptr = (struct container *) bfd_zalloc (abfd, sizeof (struct container));
if (rawptr == NULL) {
if (rawptr == NULL)
{
bfd_error = no_memory;
return 0;
}
rawptr1 = (struct hppa_data_struct *) bfd_zalloc (abfd, sizeof (struct hppa_data_struct));
if (rawptr1 == NULL) {
if (rawptr1 == NULL)
{
bfd_error = no_memory;
return 0;
}
@ -632,29 +635,35 @@ hppa_core_file_matches_executable_p (core_bfd, exec_bfd)
return true; /* FIXME, We have no way of telling at this point */
}
#endif /* HOST_HPPAHPUX */
/* Miscellaneous Support Functions -- Control Structures and Functions
for the PA. */
unsigned int assemble_3(x)
unsigned int
assemble_3 (x)
unsigned int x;
{
return (((x & 1) << 2) | ((x & 6) >> 1)) & 7;
}
void dis_assemble_3(x,r)
void
dis_assemble_3 (x, r)
unsigned int x;
unsigned int *r;
{
*r = (((x & 4) >> 2) | ((x & 3) << 1)) & 7;
}
unsigned int assemble_12(x,y)
unsigned int
assemble_12 (x, y)
unsigned int x, y;
{
return (((y & 1) << 11) | ((x & 1) << 10) | ((x & 0x7fe) >> 1)) & 0xfff;
}
void dis_assemble_12(as12,x,y)
void
dis_assemble_12 (as12, x, y)
unsigned int as12;
unsigned int *x, *y;
{
@ -662,7 +671,8 @@ void dis_assemble_12(as12,x,y)
*x = ((as12 & 0x3ff) << 1) | ((as12 & 0x400) >> 10);
}
unsigned long assemble_17(x,y,z)
unsigned long
assemble_17 (x, y, z)
unsigned int x, y, z;
{
unsigned long temp;
@ -674,7 +684,8 @@ unsigned long assemble_17(x,y,z)
return temp & 0x1ffff;
}
void dis_assemble_17(as17,x,y,z)
void
dis_assemble_17 (as17, x, y, z)
unsigned int as17;
unsigned int *x, *y, *z;
{
@ -684,7 +695,8 @@ void dis_assemble_17(as17,x,y,z)
*y = (((as17 & 0x00400) >> 10) | ((as17 & 0x3ff) << 1)) & 0x7ff;
}
unsigned long assemble_21(x)
unsigned long
assemble_21 (x)
unsigned int x;
{
unsigned long temp;
@ -697,7 +709,8 @@ unsigned long assemble_21(x)
return temp & 0x1fffff;
}
void dis_assemble_21(as21,x)
void
dis_assemble_21 (as21, x)
unsigned int as21, *x;
{
unsigned long temp;
@ -711,7 +724,9 @@ void dis_assemble_21(as21,x)
*x = temp;
}
unsigned long sign_ext(x,len)
#if 0
unsigned long
sign_ext (x, len)
unsigned int x, len;
{
unsigned int sign;
@ -721,7 +736,8 @@ unsigned long sign_ext(x,len)
i = 0;
len_ones = 0;
while ( i < len ) {
while (i < len)
{
len_ones = (len_ones << 1) | 1;
i++;
}
@ -736,7 +752,16 @@ unsigned long sign_ext(x,len)
return result;
}
static unsigned int ones(n)
#endif
static unsigned long
sign_ext (x, len)
unsigned int x, len;
{
return (x << (32 - len)) >> (32 - len);
}
static unsigned int
ones (n)
int n;
{
unsigned int len_ones;
@ -744,7 +769,8 @@ static unsigned int ones(n)
i = 0;
len_ones = 0;
while ( i < n ) {
while (i < n)
{
len_ones = (len_ones << 1) | 1;
i++;
}
@ -752,7 +778,8 @@ static unsigned int ones(n)
return len_ones;
}
void sign_unext(x,len,result)
void
sign_unext (x, len, result)
unsigned int x, len;
unsigned int *result;
{
@ -763,7 +790,8 @@ void sign_unext(x,len,result)
*result = x & len_ones;
}
unsigned long low_sign_ext(x,len)
unsigned long
low_sign_ext (x, len)
unsigned int x, len;
{
unsigned int temp1, temp2;
@ -776,7 +804,8 @@ unsigned long low_sign_ext(x,len)
return sign_ext ((temp1 | temp2), len);
}
void low_sign_unext(x,len,result)
void
low_sign_unext (x, len, result)
unsigned int x, len;
unsigned int *result;
{
@ -801,21 +830,21 @@ void low_sign_unext(x,len,result)
/* These work when 'y' is a power of two only. */
long
static long
round_down (x, y)
long x, y;
{
return x & ~(y - 1);
}
long
static long
round (x, y)
long x, y;
{
return (x + y / 2) & ~(y - 1);
}
long
static long
round_up (x, y)
long x, y;
{
@ -825,7 +854,7 @@ long x,y;
/* L(Symbol, Addend): */
/* round_down (Symbol + Addend, 2048) */
long
static long
L (Symbol, Addend)
{
return (round_down (Symbol + Addend, 2048)) >> 11;
@ -834,7 +863,7 @@ L(Symbol, Addend)
/* R(Symbol, Addend): */
/* Symbol + Addend - round_down (Symbol + Addend, 2048) */
long
static long
R (Symbol, Addend)
{
return Symbol + Addend - round_down (Symbol + Addend, 2048);
@ -843,7 +872,7 @@ R(Symbol, Addend)
/* LS(Symbol, Addend): */
/* round (Symbol + Addend, 2048) */
long
static long
LS (Symbol, Addend)
{
return round (Symbol + Addend, 2048);
@ -852,7 +881,7 @@ LS(Symbol, Addend)
/* RS(Symbol, Addend): */
/* Symbol + Addend - round (Symbol + Addend, 2048) */
long
static long
RS (Symbol, Addend)
{
return Symbol + Addend - round (Symbol + Addend, 2048);
@ -861,7 +890,7 @@ RS(Symbol, Addend)
/* LD(Symbol, Addend): */
/* round_up (Symbol + Addend, 2048) */
long
static long
LD (Symbol, Addend)
{
return (round_up (Symbol + Addend, 2048)) >> 11;
@ -870,7 +899,7 @@ LD(Symbol, Addend)
/* RD(Symbol, Addend): */
/* Symbol + Addend - round_up (Symbol + Addend, 2048) */
long
static long
RD (Symbol, Addend)
{
return Symbol + Addend - round_up (Symbol + Addend, 2048);
@ -879,7 +908,7 @@ RD(Symbol, Addend)
/* LR(Symbol, Addend): */
/* round_down (Symbol, 2048) + round (Addend, 8192) */
long
static long
LR (Symbol, Addend)
{
return (round_down (Symbol, 2048) + round (Addend, 8192)) >> 11;
@ -889,7 +918,7 @@ LR(Symbol, Addend)
/* Symbol - round_down (Symbol, 2048) + */
/* Addend - round (Addend, 8192) */
long
static long
RR (Symbol, Addend)
{
return Symbol
@ -905,7 +934,8 @@ DEFUN(hppa_field_adjust, (value,constant_value,r_field),
{
unsigned long init_value = value;
value += constant_value;
switch (r_field) {
switch (r_field)
{
case e_fsel: /* F : no change */
break;
@ -968,7 +998,6 @@ DEFUN(hppa_field_adjust, (value,constant_value,r_field),
}
/* End of miscellaneous support functions. */
#endif /* HOST_HPPAHPUX */
#ifdef HOST_HPPABSD
/* All the core file code for BSD needs to be rewritten cleanly. For

View File

@ -25,44 +25,64 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
#include "elf/internal.h"
#include "elf/external.h"
#ifdef __STDC__
#define CAT3(a,b,c) a##b##c
#else
#define CAT3(a,b,c) a/**/b/**/c
#endif
#ifndef NAME
#if ARCH_SIZE==64
#ifndef NAME
#define NAME(x,y) CAT3(x,64_,y)
#endif
#else /* ARCH_SIZE==32 */
#ifndef NAME
#define NAME(x,y) CAT3(x,32_,y)
#endif
#endif
#define ElfNAME(X) NAME(Elf,X)
#define elfNAME(X) NAME(elf,X)
typedef struct
{
asymbol symbol;
NAME(Elf,Internal_Sym) internal_elf_sym;
NAME(Elf,External_Sym) native_elf_sym;
ElfNAME (Internal_Sym) internal_elf_sym;
ElfNAME (External_Sym) native_elf_sym;
/* these are used for the generation of .stabX symbols (?) */
short desc;
unsigned char type;
char other;
} NAME(elf,symbol_type);
union
{
unsigned int hppa_arg_reloc;
PTR any;
}
tc_data;
}
struct NAME(elf,backend_data) {
void (*elf_info_to_howto) PARAMS ((bfd *, arelent *,
NAME(Elf,Internal_Rela) *));
elfNAME (symbol_type);
/* Lacking nested functions and nested types, set up for mapping over
BFD sections to produce ELF sections. */
typedef struct
{
ElfNAME (Internal_Ehdr) * i_ehdr;
ElfNAME (Internal_Shdr) * i_shdrp;
struct strtab *shstrtab;
int symtab_section;
}
elf_sect_thunk;
struct elfNAME(backend_data)
{
int use_rela_p;
int elf_64_p;
enum bfd_architecture arch;
void (*elf_info_to_howto) PARAMS ((bfd *, arelent *,
ElfNAME (Internal_Rela) *));
void (*elf_info_to_howto_rel) PARAMS ((bfd *, arelent *,
ElfNAME (Internal_Rel) *));
/* @@ I really don't think this should be here. I don't know what
global_sym is supposed to be used for, but I doubt it's something
that would be considered global, e.g., if you've got a program
reading and writing many BFDs. My hunch is that it's specific to
the output BFD. If not, put a comment here explaining why. */
NAME(elf,symbol_type) *global_sym;
elfNAME (symbol_type) * global_sym;
};
extern bfd_target *bfd_elf32_object_p PARAMS ((bfd *));
@ -76,6 +96,8 @@ extern boolean bfd_elf32_core_file_matches_executable_p PARAMS ((bfd *,
extern boolean bfd_elf32_set_section_contents PARAMS ((bfd *, sec_ptr, PTR,
file_ptr,
bfd_size_type));
extern boolean elf_get_sect_thunk PARAMS ((bfd *, elf_sect_thunk *));
extern unsigned int bfd_elf32_get_symtab_upper_bound PARAMS ((bfd *));
extern unsigned int bfd_elf32_get_symtab PARAMS ((bfd *, asymbol **));
extern unsigned int bfd_elf32_get_reloc_upper_bound PARAMS ((bfd *, sec_ptr));
@ -96,9 +118,24 @@ extern boolean bfd_elf32_find_nearest_line PARAMS ((bfd *, asection *,
CONST char **,
unsigned int *));
extern int bfd_elf32_sizeof_headers PARAMS ((bfd *, boolean));
extern unsigned long elf_hash PARAMS ((CONST unsigned char *));
/* If the target doesn't have reloc handling written yet: */
extern void bfd_elf32_no_info_to_howto PARAMS ((bfd *, arelent *,
Elf32_Internal_Rela *));
#define get_elf_backend_data(abfd) \
((struct elfNAME (backend_data) *) (abfd)->xvec->backend_data)
struct strtab
{
char *tab;
int nentries;
int length;
};
extern struct elf32_internal_shdr *
bfd_elf_locate_sh PARAMS ((bfd *, struct strtab *,
struct elf32_internal_shdr *, CONST char *));
#endif /* _LIBELF_H_ */