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

@ -38,7 +38,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
#include <sys/dir.h>
#include <signal.h>
#include <machine/reg.h>
#include <sys/user.h> /* After a.out.h */
#include <sys/user.h> /* After a.out.h */
#include <sys/file.h>
#include <errno.h>
@ -70,10 +70,11 @@ 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 header f;
struct som_exec_auxhdr e;
};
struct container
{
struct header f;
struct som_exec_auxhdr e;
};
static bfd_target *
hppa_object_setup (abfd, file_hdrp, aux_hdrp)
@ -87,17 +88,19 @@ hppa_object_setup (abfd, file_hdrp, aux_hdrp)
asection *text, *data, *bss;
rawptr = (struct container *) bfd_zalloc (abfd, sizeof (struct container));
if (rawptr == NULL) {
bfd_error = no_memory;
return 0;
}
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) {
bfd_error = no_memory;
return 0;
}
if (rawptr1 == NULL)
{
bfd_error = no_memory;
return 0;
}
abfd->tdata.hppa_data = rawptr1;
obj_file_hdr (abfd) = &rawptr->f;
obj_aux_hdr (abfd) = &rawptr->e;
@ -113,17 +116,17 @@ hppa_object_setup (abfd, file_hdrp, aux_hdrp)
bfd_get_start_address (abfd) = aux_hdrp->exec_entry;
obj_pa_symbols (abfd) = (hppa_symbol_type *)NULL;
obj_pa_symbols (abfd) = (hppa_symbol_type *) NULL;
bfd_get_symcount (abfd) = file_hdrp->symbol_total;
bfd_default_set_arch_mach(abfd, bfd_arch_hppa, 0);
bfd_default_set_arch_mach (abfd, bfd_arch_hppa, 0);
/* create the sections. This is raunchy, but bfd_close wants to reclaim
them */
text = bfd_make_section(abfd, ".text");
data = bfd_make_section(abfd, ".data");
bss = bfd_make_section(abfd, ".bss");
text = bfd_make_section (abfd, ".text");
data = bfd_make_section (abfd, ".data");
bss = bfd_make_section (abfd, ".bss");
text->_raw_size = aux_hdrp->exec_tsize;
data->_raw_size = aux_hdrp->exec_dsize;
@ -133,23 +136,23 @@ hppa_object_setup (abfd, file_hdrp, aux_hdrp)
data->flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS);
bss->flags = SEC_ALLOC;
/* The virtual memory addresses of the sections */
text->vma = aux_hdrp->exec_tmem;
data->vma = aux_hdrp->exec_dmem;
bss->vma = aux_hdrp->exec_bfill;
/* The file offsets of the sections */
text->filepos = aux_hdrp->exec_tfile;
data->filepos = aux_hdrp->exec_dfile;
/* The file offsets of the relocation info */
text->rel_filepos = 0;
data->rel_filepos = 0;
/* The file offsets of the string table and symbol table. */
obj_sym_filepos (abfd) = file_hdrp->symbol_location;
/* The virtual memory addresses of the sections */
text->vma = aux_hdrp->exec_tmem;
data->vma = aux_hdrp->exec_dmem;
bss->vma = aux_hdrp->exec_bfill;
/* The file offsets of the sections */
text->filepos = aux_hdrp->exec_tfile;
data->filepos = aux_hdrp->exec_dfile;
/* The file offsets of the relocation info */
text->rel_filepos = 0;
data->rel_filepos = 0;
/* The file offsets of the string table and symbol table. */
obj_sym_filepos (abfd) = file_hdrp->symbol_location;
bfd_get_symcount (abfd) = file_hdrp->symbol_total;
obj_str_filepos (abfd) = file_hdrp->symbol_strings_location;
obj_str_filepos (abfd) = file_hdrp->symbol_strings_location;
obj_stringtab_size (abfd) = file_hdrp->symbol_strings_size;
return abfd->xvec;
@ -174,11 +177,11 @@ make_unique_section (abfd, name, num)
sect = bfd_make_section (abfd, name);
while (!sect)
{
sprintf(altname, "%s-%d", name, num++);
sprintf (altname, "%s-%d", name, num++);
sect = bfd_make_section (abfd, altname);
}
newname = bfd_alloc (abfd, strlen(sect->name) + 1);
newname = bfd_alloc (abfd, strlen (sect->name) + 1);
strcpy (newname, sect->name);
sect->name = newname;
@ -199,7 +202,7 @@ setup_sections (abfd, file_hdr)
char *space_strings;
int space_index;
/* First, read in space names */
/* First, read in space names */
space_strings = alloca (file_hdr->space_strings_size);
if (!space_strings)
@ -222,7 +225,7 @@ setup_sections (abfd, file_hdr)
/* Read the space dictionary element */
if (bfd_seek (abfd, file_hdr->space_location
+ space_index * sizeof space, SEEK_SET) < 0)
+ space_index * sizeof space, SEEK_SET) < 0)
return 0;
if (bfd_read (&space, 1, sizeof space, abfd) != sizeof space)
return 0;
@ -237,15 +240,15 @@ setup_sections (abfd, file_hdr)
/* Now, read in the first subspace for this space */
if (bfd_seek (abfd, file_hdr->subspace_location
+ space.subspace_index * sizeof subspace,
SEEK_SET) < 0)
+ space.subspace_index * sizeof subspace,
SEEK_SET) < 0)
return 0;
if (bfd_read (&subspace, 1, sizeof subspace, abfd) != sizeof subspace)
return 0;
/* Seek back to the start of the subspaces for loop below */
if (bfd_seek (abfd, file_hdr->subspace_location
+ space.subspace_index * sizeof subspace,
SEEK_SET) < 0)
+ space.subspace_index * sizeof subspace,
SEEK_SET) < 0)
return 0;
/* Setup the section flags as appropriate (this is somewhat bogus, as
@ -277,7 +280,7 @@ setup_sections (abfd, file_hdr)
/* Make a section out of this subspace */
subspace_asect = make_unique_section (abfd, subspace.name.n_name,
space.subspace_index + subspace_index);
space.subspace_index + subspace_index);
if (!subspace_asect)
return 0;
@ -297,10 +300,10 @@ setup_sections (abfd, file_hdr)
/* Setup the sizes for the space section based upon the info in the
last subspace of the space. */
space_asect->_cooked_size = (subspace.subspace_start - space_asect->vma)
+ subspace.subspace_length;
+ subspace.subspace_length;
space_asect->_raw_size = (subspace.file_loc_init_value
- space_asect->filepos)
+ subspace.initialization_length;
+ subspace.initialization_length;
}
}
@ -311,7 +314,7 @@ hppa_object_p (abfd)
struct header file_hdr;
struct som_exec_auxhdr aux_hdr;
if (bfd_read ((PTR) &file_hdr, 1, FILE_HDR_SIZE, abfd) != FILE_HDR_SIZE)
if (bfd_read ((PTR) & file_hdr, 1, FILE_HDR_SIZE, abfd) != FILE_HDR_SIZE)
return 0;
if (!_PA_RISC_ID (file_hdr.system_id))
@ -322,7 +325,7 @@ hppa_object_p (abfd)
switch (file_hdr.a_magic)
{
case RELOC_MAGIC: /* I'm not really sure about all of these types... */
case RELOC_MAGIC: /* I'm not really sure about all of these types... */
case EXEC_MAGIC:
case SHARE_MAGIC:
case DEMAND_MAGIC:
@ -345,19 +348,19 @@ hppa_object_p (abfd)
return 0;
}
if (bfd_read ((PTR) &aux_hdr, 1, AUX_HDR_SIZE, abfd) != AUX_HDR_SIZE)
if (bfd_read ((PTR) & aux_hdr, 1, AUX_HDR_SIZE, abfd) != AUX_HDR_SIZE)
bfd_error = wrong_format;
if (!setup_sections (abfd, &file_hdr))
return 0;
return hppa_object_setup(abfd, &file_hdr, &aux_hdr);
return hppa_object_setup (abfd, &file_hdr, &aux_hdr);
}
static boolean
DEFUN(hppa_mkobject,(abfd),
bfd *abfd)
{
DEFUN (hppa_mkobject, (abfd),
bfd * abfd)
{
fprintf (stderr, "hppa_mkobject unimplemented\n");
fflush (stderr);
abort ();
@ -365,8 +368,8 @@ DEFUN(hppa_mkobject,(abfd),
}
boolean
DEFUN(hppa_write_object_contents,(abfd),
bfd *abfd)
DEFUN (hppa_write_object_contents, (abfd),
bfd * abfd)
{
fprintf (stderr, "hppa_write_object_contents unimplemented\n");
fflush (stderr);
@ -424,15 +427,15 @@ static asymbol *
hppa_make_empty_symbol (abfd)
bfd *abfd;
{
hppa_symbol_type *new =
(hppa_symbol_type *)bfd_zalloc (abfd, sizeof (hppa_symbol_type));
hppa_symbol_type *new =
(hppa_symbol_type *) bfd_zalloc (abfd, sizeof (hppa_symbol_type));
new->symbol.the_bfd = abfd;
return &new->symbol;
}
static void
hppa_print_symbol (ignore_abfd, afile, symbol, how)
static void
hppa_print_symbol (ignore_abfd, afile, symbol, how)
bfd *ignore_abfd;
PTR afile;
asymbol *symbol;
@ -464,7 +467,7 @@ hppa_set_section_contents (abfd, section, location, offset, count)
{
fprintf (stderr, "hppa_set_section_contents unimplimented\n");
fflush (stderr);
abort();
abort ();
return false;
}
@ -477,7 +480,7 @@ hppa_set_arch_mach (abfd, arch, machine)
fprintf (stderr, "hppa_set_arch_mach unimplemented\n");
fflush (stderr);
/* Allow any architecture to be supported by the hppa backend */
return bfd_default_set_arch_mach(abfd, arch, machine);
return bfd_default_set_arch_mach (abfd, arch, machine);
}
static boolean
@ -499,8 +502,8 @@ hppa_find_nearest_line (abfd, section, symbols, offset, filename_ptr,
static int
hppa_sizeof_headers (abfd, reloc)
bfd *abfd;
boolean reloc;
bfd *abfd;
boolean reloc;
{
fprintf (stderr, "hppa_sizeof_headers unimplemented\n");
fflush (stderr);
@ -546,19 +549,19 @@ hppa_core_file_p (abfd)
int val;
struct corehead core_header;
val = bfd_read ((void *)&core_header, 1, sizeof core_header, abfd);
val = bfd_read ((void *) &core_header, 1, sizeof core_header, abfd);
if (val <= 0)
break;
switch (core_header.type)
{
case CORE_KERNEL:
case CORE_FORMAT:
bfd_seek (abfd, core_header.len, SEEK_CUR); /* Just skip this */
bfd_seek (abfd, core_header.len, SEEK_CUR); /* Just skip this */
break;
case CORE_EXEC:
{
struct proc_exec proc_exec;
bfd_read ((void *)&proc_exec, 1, core_header.len, abfd);
bfd_read ((void *) &proc_exec, 1, core_header.len, abfd);
strncpy (core_command (abfd), proc_exec.cmd, MAXCOMLEN + 1);
}
break;
@ -566,9 +569,9 @@ hppa_core_file_p (abfd)
{
struct proc_info proc_info;
core_regsec (abfd) = make_bfd_asection (abfd, ".reg",
SEC_ALLOC+SEC_HAS_CONTENTS,
SEC_ALLOC + SEC_HAS_CONTENTS,
core_header.len,
(int)&proc_info - (int)&proc_info.hw_regs,
(int) &proc_info - (int) &proc_info.hw_regs,
2);
bfd_read (&proc_info, 1, core_header.len, abfd);
core_signal (abfd) = proc_info.sig;
@ -578,7 +581,7 @@ hppa_core_file_p (abfd)
break;
case CORE_DATA:
core_datasec (abfd) = make_bfd_asection (abfd, ".data",
SEC_ALLOC+SEC_LOAD+SEC_HAS_CONTENTS,
SEC_ALLOC + SEC_LOAD + SEC_HAS_CONTENTS,
core_header.len,
core_header.addr,
2);
@ -588,7 +591,7 @@ hppa_core_file_p (abfd)
break;
case CORE_STACK:
core_stacksec (abfd) = make_bfd_asection (abfd, ".stack",
SEC_ALLOC+SEC_LOAD+SEC_HAS_CONTENTS,
SEC_ALLOC + SEC_LOAD + SEC_HAS_CONTENTS,
core_header.len,
core_header.addr,
2);
@ -626,93 +629,105 @@ hppa_core_file_failing_signal (abfd)
/* ARGSUSED */
static boolean
hppa_core_file_matches_executable_p (core_bfd, exec_bfd)
hppa_core_file_matches_executable_p (core_bfd, exec_bfd)
bfd *core_bfd, *exec_bfd;
{
return true; /* FIXME, We have no way of telling at this point */
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;
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;
*r = (((x & 4) >> 2) | ((x & 3) << 1)) & 7;
}
unsigned int assemble_12(x,y)
unsigned int x,y;
unsigned int
assemble_12 (x, y)
unsigned int x, y;
{
return ( ( ( y & 1 ) << 11 ) | ( ( x & 1 ) << 10 ) | ( ( x & 0x7fe ) >> 1) ) & 0xfff;
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;
unsigned int *x, *y;
{
*y = ( as12 & 0x800 ) >> 11;
*x = ( ( as12 & 0x3ff ) << 1 ) | ( ( as12 & 0x400 ) >> 10 );
*y = (as12 & 0x800) >> 11;
*x = ((as12 & 0x3ff) << 1) | ((as12 & 0x400) >> 10);
}
unsigned long assemble_17(x,y,z)
unsigned int x,y,z;
unsigned long
assemble_17 (x, y, z)
unsigned int x, y, z;
{
unsigned long temp;
temp = ( ( z & 1 ) << 16 ) |
( ( x & 0x1f ) << 11 ) |
( ( y & 1 ) << 10 ) |
( ( y & 0x7fe ) >> 1);
temp = ((z & 1) << 16) |
((x & 0x1f) << 11) |
((y & 1) << 10) |
((y & 0x7fe) >> 1);
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;
unsigned int *x, *y, *z;
{
*z = ( as17 & 0x10000 ) >> 16;
*x = ( as17 & 0x0f800 ) >> 11;
*y = ( ( ( as17 & 0x00400 ) >> 10 ) | ( ( as17 & 0x3ff ) << 1 ) ) & 0x7ff;
*z = (as17 & 0x10000) >> 16;
*x = (as17 & 0x0f800) >> 11;
*y = (((as17 & 0x00400) >> 10) | ((as17 & 0x3ff) << 1)) & 0x7ff;
}
unsigned long assemble_21(x)
unsigned long
assemble_21 (x)
unsigned int x;
{
unsigned long temp;
temp = ( ( x & 1 ) << 20 ) |
( ( x & 0xffe ) << 8 ) |
( ( x & 0xc000 ) >> 7 ) |
( ( x & 0x1f0000 ) >> 14 ) |
( ( x & 0x003000 ) >> 12 );
temp = ((x & 1) << 20) |
((x & 0xffe) << 8) |
((x & 0xc000) >> 7) |
((x & 0x1f0000) >> 14) |
((x & 0x003000) >> 12);
return temp & 0x1fffff;
}
void dis_assemble_21(as21,x)
unsigned int as21,*x;
void
dis_assemble_21 (as21, x)
unsigned int as21, *x;
{
unsigned long temp;
temp = ( as21 & 0x100000 ) >> 20;
temp |= ( as21 & 0x0ffe00 ) >> 8;
temp |= ( as21 & 0x000180 ) << 7;
temp |= ( as21 & 0x00007c ) << 14;
temp |= ( as21 & 0x000003 ) << 12;
temp = (as21 & 0x100000) >> 20;
temp |= (as21 & 0x0ffe00) >> 8;
temp |= (as21 & 0x000180) << 7;
temp |= (as21 & 0x00007c) << 14;
temp |= (as21 & 0x000003) << 12;
*x = temp;
}
unsigned long sign_ext(x,len)
unsigned int x,len;
#if 0
unsigned long
sign_ext (x, len)
unsigned int x, len;
{
unsigned int sign;
unsigned int result;
@ -721,22 +736,32 @@ unsigned long sign_ext(x,len)
i = 0;
len_ones = 0;
while ( i < len ) {
len_ones = (len_ones << 1) | 1;
i++;
}
while (i < len)
{
len_ones = (len_ones << 1) | 1;
i++;
}
sign = (x >> (len-1)) & 1;
sign = (x >> (len - 1)) & 1;
if ( sign )
result = ( ~0 ^ len_ones ) | ( len_ones & x );
if (sign)
result = (~0 ^ len_ones) | (len_ones & x);
else
result = len_ones & x;
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,40 +769,44 @@ static unsigned int ones(n)
i = 0;
len_ones = 0;
while ( i < n ) {
len_ones = (len_ones << 1) | 1;
i++;
}
while (i < n)
{
len_ones = (len_ones << 1) | 1;
i++;
}
return len_ones;
}
void sign_unext(x,len,result)
unsigned int x,len;
void
sign_unext (x, len, result)
unsigned int x, len;
unsigned int *result;
{
unsigned int len_ones;
len_ones = ones(len);
len_ones = ones (len);
*result = x & len_ones;
}
unsigned long low_sign_ext(x,len)
unsigned int x,len;
unsigned long
low_sign_ext (x, len)
unsigned int x, len;
{
unsigned int temp1,temp2;
unsigned int temp1, temp2;
unsigned int len_ones;
len_ones = ones(len);
len_ones = ones (len);
temp1 = ( x & 1 ) << (len-1);
temp2 = ( ( x & 0xfffffffe ) & len_ones ) >> 1;
return sign_ext( (temp1 | temp2),len);
temp1 = (x & 1) << (len - 1);
temp2 = ((x & 0xfffffffe) & len_ones) >> 1;
return sign_ext ((temp1 | temp2), len);
}
void low_sign_unext(x,len,result)
unsigned int x,len;
void
low_sign_unext (x, len, result)
unsigned int x, len;
unsigned int *result;
{
unsigned int temp;
@ -786,14 +815,14 @@ void low_sign_unext(x,len,result)
unsigned int one_bit_at_len;
unsigned int len_ones;
len_ones = ones(len);
one_bit_at_len = 1 << (len-1);
len_ones = ones (len);
one_bit_at_len = 1 << (len - 1);
sign_unext(x,len,&temp);
sign_unext (x, len, &temp);
sign = temp & one_bit_at_len;
sign >>= (len-1);
sign >>= (len - 1);
rest = temp & ( len_ones ^ one_bit_at_len );
rest = temp & (len_ones ^ one_bit_at_len);
rest <<= 1;
*result = rest | sign;
@ -801,177 +830,177 @@ void low_sign_unext(x,len,result)
/* These work when 'y' is a power of two only. */
long
round_down(x,y)
long x,y;
static long
round_down (x, y)
long x, y;
{
return x & ~(y-1);
return x & ~(y - 1);
}
long
round(x,y)
long x,y;
static long
round (x, y)
long x, y;
{
return (x + y/2) & ~(y-1);
return (x + y / 2) & ~(y - 1);
}
long
round_up(x,y)
long x,y;
static long
round_up (x, y)
long x, y;
{
return x - (x | ~(y-1));
return x - (x | ~(y - 1));
}
/* L(Symbol, Addend): */
/* round_down (Symbol + Addend, 2048) */
long
L(Symbol, Addend)
static long
L (Symbol, Addend)
{
return (round_down(Symbol + Addend, 2048)) >> 11;
return (round_down (Symbol + Addend, 2048)) >> 11;
}
/* R(Symbol, Addend): */
/* Symbol + Addend - round_down (Symbol + Addend, 2048) */
long
R(Symbol, Addend)
static long
R (Symbol, Addend)
{
return Symbol + Addend - round_down (Symbol + Addend, 2048);
return Symbol + Addend - round_down (Symbol + Addend, 2048);
}
/* LS(Symbol, Addend): */
/* round (Symbol + Addend, 2048) */
long
LS(Symbol, Addend)
static long
LS (Symbol, Addend)
{
return round (Symbol + Addend, 2048);
return round (Symbol + Addend, 2048);
}
/* RS(Symbol, Addend): */
/* Symbol + Addend - round (Symbol + Addend, 2048) */
long
RS(Symbol, Addend)
static long
RS (Symbol, Addend)
{
return Symbol + Addend - round (Symbol + Addend, 2048);
return Symbol + Addend - round (Symbol + Addend, 2048);
}
/* LD(Symbol, Addend): */
/* round_up (Symbol + Addend, 2048) */
long
LD(Symbol, Addend)
static long
LD (Symbol, Addend)
{
return (round_up (Symbol + Addend, 2048)) >> 11;
return (round_up (Symbol + Addend, 2048)) >> 11;
}
/* RD(Symbol, Addend): */
/* Symbol + Addend - round_up (Symbol + Addend, 2048) */
long
RD(Symbol, Addend)
static long
RD (Symbol, Addend)
{
return Symbol + Addend - round_up (Symbol + Addend, 2048);
return Symbol + Addend - round_up (Symbol + Addend, 2048);
}
/* LR(Symbol, Addend): */
/* round_down (Symbol, 2048) + round (Addend, 8192) */
long
LR(Symbol, Addend)
static long
LR (Symbol, Addend)
{
return (round_down (Symbol, 2048) + round (Addend, 8192)) >> 11;
return (round_down (Symbol, 2048) + round (Addend, 8192)) >> 11;
}
/* RR(Symbol, Addend): */
/* Symbol - round_down (Symbol, 2048) + */
/* Addend - round (Addend, 8192) */
long
RR(Symbol, Addend)
static long
RR (Symbol, Addend)
{
return Symbol
- round_down (Symbol, 2048)
+ Addend - round (Addend, 8192);
return Symbol
- round_down (Symbol, 2048)
+ Addend - round (Addend, 8192);
}
unsigned long
DEFUN(hppa_field_adjust, (value,constant_value,r_field),
unsigned long value AND
unsigned long constant_value AND
unsigned short r_field)
DEFUN (hppa_field_adjust, (value, constant_value, r_field),
unsigned long value AND
unsigned long constant_value AND
unsigned short r_field)
{
unsigned long init_value = value;
value += constant_value;
switch (r_field) {
case e_fsel: /* F : no change */
break;
unsigned long init_value = value;
value += constant_value;
switch (r_field)
{
case e_fsel: /* F : no change */
break;
case e_lssel: /* LS : if (bit 21) then add 0x800
case e_lssel: /* LS : if (bit 21) then add 0x800
arithmetic shift right 11 bits */
if ( value & 0x00000400 )
value += 0x800;
value = (value & 0xfffff800) >> 11;
BFD_ASSERT(value == LS(init_value,constant_value));
break;
if (value & 0x00000400)
value += 0x800;
value = (value & 0xfffff800) >> 11;
BFD_ASSERT (value == LS (init_value, constant_value));
break;
case e_rssel: /* RS : Sign extend from bit 21 */
if ( value & 0x00000400 )
value |= 0xfffff800;
else
value &= 0x7ff;
BFD_ASSERT(value == RS(init_value,constant_value));
break;
case e_rssel: /* RS : Sign extend from bit 21 */
if (value & 0x00000400)
value |= 0xfffff800;
else
value &= 0x7ff;
BFD_ASSERT (value == RS (init_value, constant_value));
break;
case e_lsel: /* L : Arithmetic shift right 11 bits */
value = (value & 0xfffff800) >> 11;
BFD_ASSERT(value == L(init_value,constant_value));
break;
case e_lsel: /* L : Arithmetic shift right 11 bits */
value = (value & 0xfffff800) >> 11;
BFD_ASSERT (value == L (init_value, constant_value));
break;
case e_rsel: /* R : Set bits 0-20 to zero */
value = value & 0x7ff;
BFD_ASSERT(value == R(init_value,constant_value));
break;
case e_rsel: /* R : Set bits 0-20 to zero */
value = value & 0x7ff;
BFD_ASSERT (value == R (init_value, constant_value));
break;
case e_ldsel: /* LD : Add 0x800, arithmetic shift
case e_ldsel: /* LD : Add 0x800, arithmetic shift
right 11 bits */
value += 0x800;
value = (value & 0xfffff800) >> 11;
BFD_ASSERT(value == LD(init_value,constant_value));
break;
value += 0x800;
value = (value & 0xfffff800) >> 11;
BFD_ASSERT (value == LD (init_value, constant_value));
break;
case e_rdsel: /* RD : Set bits 0-20 to one */
value |= 0xfffff800;
BFD_ASSERT(value == RD(init_value,constant_value));
break;
case e_rdsel: /* RD : Set bits 0-20 to one */
value |= 0xfffff800;
BFD_ASSERT (value == RD (init_value, constant_value));
break;
case e_lrsel: /* LR : L with "rounded" constant */
value = value + ((constant_value + 0x1000) & 0xffffe000);
value = (value & 0xfffff800) >> 11;
BFD_ASSERT(value == LR(init_value,constant_value));
break;
case e_lrsel: /* LR : L with "rounded" constant */
value = value + ((constant_value + 0x1000) & 0xffffe000);
value = (value & 0xfffff800) >> 11;
BFD_ASSERT (value == LR (init_value, constant_value));
break;
case e_rrsel: /* RR : R with "rounded" constant */
value = value + ((constant_value + 0x1000) & 0xffffe000);
value = (value & 0x7ff) + constant_value - ((constant_value + 0x1000) & 0xffffe000);
BFD_ASSERT(value == RR(init_value,constant_value));
break;
case e_rrsel: /* RR : R with "rounded" constant */
value = value + ((constant_value + 0x1000) & 0xffffe000);
value = (value & 0x7ff) + constant_value - ((constant_value + 0x1000) & 0xffffe000);
BFD_ASSERT (value == RR (init_value, constant_value));
break;
default:
fprintf(stderr,"Unrecognized field_selector 0x%02x\n", r_field);
break;
}
default:
fprintf (stderr, "Unrecognized field_selector 0x%02x\n", r_field);
break;
}
return value;
}
/* End of miscellaneous support functions. */
#endif /* HOST_HPPAHPUX */
#ifdef HOST_HPPABSD
/* All the core file code for BSD needs to be rewritten cleanly. For
/* All the core file code for BSD needs to be rewritten cleanly. For
now we do not support core files under BSD. */
#define hppa_core_file_p _bfd_dummy_target
@ -1013,32 +1042,32 @@ bfd_target hppa_vec =
(HAS_RELOC | EXEC_P | /* object flags */
HAS_LINENO | HAS_DEBUG |
HAS_SYMS | HAS_LOCALS | DYNAMIC | WP_TEXT | D_PAGED),
(SEC_CODE|SEC_DATA|SEC_ROM|SEC_HAS_CONTENTS
|SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */
(SEC_CODE | SEC_DATA | SEC_ROM | SEC_HAS_CONTENTS
| SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */
/* leading_symbol_char: is the first char of a user symbol
/* leading_symbol_char: is the first char of a user symbol
predictable, and if so what is it */
0,
0,
' ', /* ar_pad_char */
16, /* ar_max_namelen */
3, /* minimum alignment */
_do_getb64, _do_getb_signed_64, _do_putb64,
_do_getb32, _do_getb_signed_32, _do_putb32,
_do_getb16, _do_getb_signed_16, _do_putb16, /* data */
_do_getb64, _do_getb_signed_64, _do_putb64,
_do_getb32, _do_getb_signed_32, _do_putb32,
_do_getb16, _do_getb_signed_16, _do_putb16, /* hdrs */
{ _bfd_dummy_target,
hppa_object_p, /* bfd_check_format */
bfd_generic_archive_p,
hppa_core_file_p,
},
3, /* minimum alignment */
_do_getb64, _do_getb_signed_64, _do_putb64,
_do_getb32, _do_getb_signed_32, _do_putb32,
_do_getb16, _do_getb_signed_16, _do_putb16, /* data */
_do_getb64, _do_getb_signed_64, _do_putb64,
_do_getb32, _do_getb_signed_32, _do_putb32,
_do_getb16, _do_getb_signed_16, _do_putb16, /* hdrs */
{_bfd_dummy_target,
hppa_object_p, /* bfd_check_format */
bfd_generic_archive_p,
hppa_core_file_p,
},
{
bfd_false,
hppa_mkobject,
hppa_mkobject,
_bfd_generic_mkarchive,
bfd_false
},
},
{
bfd_false,
hppa_write_object_contents,
@ -1046,7 +1075,7 @@ _do_getb64, _do_getb_signed_64, _do_putb64,
bfd_false,
},
#undef hppa
JUMP_TABLE(hppa),
JUMP_TABLE (hppa),
(PTR) 0
};

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));
@ -86,7 +108,7 @@ extern asymbol *bfd_elf32_make_empty_symbol PARAMS ((bfd *));
extern void bfd_elf32_print_symbol PARAMS ((bfd *, PTR, asymbol *,
bfd_print_symbol_type));
extern void bfd_elf32_get_symbol_info PARAMS ((bfd *, asymbol *,
symbol_info *));
symbol_info *));
extern alent *bfd_elf32_get_lineno PARAMS ((bfd *, asymbol *));
extern boolean bfd_elf32_set_arch_mach PARAMS ((bfd *, enum bfd_architecture,
unsigned long));
@ -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_ */