1 /* BFD back-end for HP PA-RISC ELF files.
2 Copyright (C) 1990, 91, 92, 93, 94 Free Software Foundation, Inc.
6 Center for Software Science
7 Department of Computer Science
10 This file is part of BFD, the Binary File Descriptor library.
12 This program is free software; you can redistribute it and/or modify
13 it under the terms of the GNU General Public License as published by
14 the Free Software Foundation; either version 2 of the License, or
15 (at your option) any later version.
17 This program is distributed in the hope that it will be useful,
18 but WITHOUT ANY WARRANTY; without even the implied warranty of
19 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 GNU General Public License for more details.
22 You should have received a copy of the GNU General Public License
23 along with this program; if not, write to the Free Software
24 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
33 /* ELF32/HPPA relocation support
35 This file contains ELF32/HPPA relocation support as specified
36 in the Stratus FTX/Golf Object File Format (SED-1762) dated
40 #include "elf32-hppa.h"
42 #include "aout/aout64.h"
43 #include "hppa_stubs.h"
45 /* ELF/PA relocation howto entries */
47 static bfd_reloc_status_type hppa_elf_reloc
48 PARAMS ((bfd
*, arelent
*, asymbol
*, PTR
, asection
*, bfd
*, char **));
50 static reloc_howto_type elf_hppa_howto_table
[ELF_HOWTO_TABLE_SIZE
] =
52 /* 'bitpos' and 'abs' are obsolete */
53 /* type rs sz bsz pcrel bpos abs ovrf sf name */
54 /* 9.3.4. Address relocation types */
55 {R_HPPA_NONE
, 0, 3, 19, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_HPPA_NONE"},
56 {R_HPPA_32
, 0, 3, 32, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_HPPA_32"},
57 {R_HPPA_11
, 0, 3, 11, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_HPPA_11"},
58 {R_HPPA_14
, 0, 3, 14, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_HPPA_14"},
59 {R_HPPA_17
, 0, 3, 17, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_HPPA_17"},
60 {R_HPPA_L21
, 0, 3, 21, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_HPPA_L21"},
61 {R_HPPA_R11
, 0, 3, 11, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_HPPA_R11"},
62 {R_HPPA_R14
, 0, 3, 14, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_HPPA_R14"},
63 {R_HPPA_R17
, 0, 3, 17, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_HPPA_R17"},
64 {R_HPPA_LS21
, 0, 3, 21, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_HPPA_LS21"},
65 {R_HPPA_RS11
, 0, 3, 11, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_HPPA_RS11"},
66 {R_HPPA_RS14
, 0, 3, 14, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_HPPA_RS14"},
67 {R_HPPA_RS17
, 0, 3, 17, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_HPPA_RS17"},
68 {R_HPPA_LD21
, 0, 3, 21, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_HPPA_LD21"},
69 {R_HPPA_RD11
, 0, 3, 11, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_HPPA_RD11"},
70 {R_HPPA_RD14
, 0, 3, 14, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_HPPA_RD14"},
71 {R_HPPA_RD17
, 0, 3, 17, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_HPPA_RD17"},
72 {R_HPPA_LR21
, 0, 3, 21, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_HPPA_LR21"},
73 {R_HPPA_RR14
, 0, 3, 14, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_HPPA_RR14"},
74 {R_HPPA_RR17
, 0, 3, 17, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_HPPA_RR17"},
75 /* 9.3.5. GOTOFF address relocation types */
76 {R_HPPA_GOTOFF_11
, 0, 3, 11, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_HPPA_GOTOFF_11"},
77 {R_HPPA_GOTOFF_14
, 0, 3, 14, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_HPPA_GOTOFF_14"},
78 {R_HPPA_GOTOFF_L21
, 0, 3, 21, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_HPPA_GOTOFF_L21"},
79 {R_HPPA_GOTOFF_R11
, 0, 3, 11, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_HPPA_GOTOFF_R11"},
80 {R_HPPA_GOTOFF_R14
, 0, 3, 14, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_HPPA_GOTOFF_R14"},
81 {R_HPPA_GOTOFF_LS21
, 0, 3, 21, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_HPPA_GOTOFF_LS21"},
82 {R_HPPA_GOTOFF_RS11
, 0, 3, 11, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_HPPA_GOTOFF_RS11"},
83 {R_HPPA_GOTOFF_RS14
, 0, 3, 14, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_HPPA_GOTOFF_RS14"},
84 {R_HPPA_GOTOFF_LD21
, 0, 3, 21, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_HPPA_GOTOFF_LD21"},
85 {R_HPPA_GOTOFF_RD11
, 0, 3, 11, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_HPPA_GOTOFF_RD11"},
86 {R_HPPA_GOTOFF_RD14
, 0, 3, 14, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_HPPA_GOTOFF_RD14"},
87 {R_HPPA_GOTOFF_LR21
, 0, 3, 21, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_HPPA_GOTOFF_LR21"},
88 {R_HPPA_GOTOFF_RR14
, 0, 3, 14, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_HPPA_GOTOFF_RR14"},
89 /* 9.3.6. Absolute call relocation types */
90 {R_HPPA_ABS_CALL_11
, 0, 3, 11, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_HPPA_ABS_CALL_11"},
91 {R_HPPA_ABS_CALL_14
, 0, 3, 14, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_HPPA_ABS_CALL_14"},
92 {R_HPPA_ABS_CALL_17
, 0, 3, 17, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_HPPA_ABS_CALL_17"},
93 {R_HPPA_ABS_CALL_L21
, 0, 3, 21, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_HPPA_ABS_CALL_L21"},
94 {R_HPPA_ABS_CALL_R11
, 0, 3, 11, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_HPPA_ABS_CALL_R11"},
95 {R_HPPA_ABS_CALL_R14
, 0, 3, 14, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_HPPA_ABS_CALL_R14"},
96 {R_HPPA_ABS_CALL_R17
, 0, 3, 17, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_HPPA_ABS_CALL_R17"},
97 {R_HPPA_ABS_CALL_LS21
, 0, 3, 21, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_HPPA_ABS_CALL_LS21"},
98 {R_HPPA_ABS_CALL_RS11
, 0, 3, 11, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_HPPA_ABS_CALL_RS11"},
99 {R_HPPA_ABS_CALL_RS14
, 0, 3, 14, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_HPPA_ABS_CALL_RS14"},
100 {R_HPPA_ABS_CALL_RS17
, 0, 3, 17, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_HPPA_ABS_CALL_RS17"},
101 {R_HPPA_ABS_CALL_LD21
, 0, 3, 21, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_HPPA_ABS_CALL_LD21"},
102 {R_HPPA_ABS_CALL_RD11
, 0, 3, 11, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_HPPA_ABS_CALL_RD11"},
103 {R_HPPA_ABS_CALL_RD14
, 0, 3, 14, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_HPPA_ABS_CALL_RD14"},
104 {R_HPPA_ABS_CALL_RD17
, 0, 3, 17, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_HPPA_ABS_CALL_RD17"},
105 {R_HPPA_ABS_CALL_LR21
, 0, 3, 21, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_HPPA_ABS_CALL_LR21"},
106 {R_HPPA_ABS_CALL_RR14
, 0, 3, 14, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_HPPA_ABS_CALL_RR14"},
107 {R_HPPA_ABS_CALL_RR17
, 0, 3, 17, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_HPPA_ABS_CALL_RR17"},
108 /* 9.3.7. PC-relative call relocation types */
109 {R_HPPA_PCREL_CALL_11
, 0, 3, 11, true, 0, complain_overflow_signed
, hppa_elf_reloc
, "R_HPPA_PCREL_CALL_11"},
110 {R_HPPA_PCREL_CALL_14
, 0, 3, 14, true, 0, complain_overflow_signed
, hppa_elf_reloc
, "R_HPPA_PCREL_CALL_14"},
111 {R_HPPA_PCREL_CALL_17
, 0, 3, 17, true, 0, complain_overflow_signed
, hppa_elf_reloc
, "R_HPPA_PCREL_CALL_17"},
112 {R_HPPA_PCREL_CALL_12
, 0, 3, 12, true, 0, complain_overflow_signed
, hppa_elf_reloc
, "R_HPPA_PCREL_CALL_12"},
113 {R_HPPA_PCREL_CALL_L21
, 0, 3, 21, true, 0, complain_overflow_signed
, hppa_elf_reloc
, "R_HPPA_PCREL_CALL_L21"},
114 {R_HPPA_PCREL_CALL_R11
, 0, 3, 11, true, 0, complain_overflow_signed
, hppa_elf_reloc
, "R_HPPA_PCREL_CALL_R11"},
115 {R_HPPA_PCREL_CALL_R14
, 0, 3, 14, true, 0, complain_overflow_signed
, hppa_elf_reloc
, "R_HPPA_PCREL_CALL_R14"},
116 {R_HPPA_PCREL_CALL_R17
, 0, 3, 17, true, 0, complain_overflow_signed
, hppa_elf_reloc
, "R_HPPA_PCREL_CALL_R17"},
117 {R_HPPA_PCREL_CALL_LS21
, 0, 3, 21, true, 0, complain_overflow_signed
, hppa_elf_reloc
, "R_HPPA_PCREL_CALL_LS21"},
118 {R_HPPA_PCREL_CALL_RS11
, 0, 3, 11, true, 0, complain_overflow_signed
, hppa_elf_reloc
, "R_HPPA_PCREL_CALL_RS11"},
119 {R_HPPA_PCREL_CALL_RS14
, 0, 3, 14, true, 0, complain_overflow_signed
, hppa_elf_reloc
, "R_HPPA_PCREL_CALL_RS14"},
120 {R_HPPA_PCREL_CALL_RS17
, 0, 3, 17, true, 0, complain_overflow_signed
, hppa_elf_reloc
, "R_HPPA_PCREL_CALL_RS17"},
121 {R_HPPA_PCREL_CALL_LD21
, 0, 3, 21, true, 0, complain_overflow_signed
, hppa_elf_reloc
, "R_HPPA_PCREL_CALL_LD21"},
122 {R_HPPA_PCREL_CALL_RD11
, 0, 3, 11, true, 0, complain_overflow_signed
, hppa_elf_reloc
, "R_HPPA_PCREL_CALL_RD11"},
123 {R_HPPA_PCREL_CALL_RD14
, 0, 3, 14, true, 0, complain_overflow_signed
, hppa_elf_reloc
, "R_HPPA_PCREL_CALL_RD14"},
124 {R_HPPA_PCREL_CALL_RD17
, 0, 3, 17, true, 0, complain_overflow_signed
, hppa_elf_reloc
, "R_HPPA_PCREL_CALL_RD17"},
125 {R_HPPA_PCREL_CALL_LR21
, 0, 3, 21, true, 0, complain_overflow_signed
, hppa_elf_reloc
, "R_HPPA_PCREL_CALL_LR21"},
126 {R_HPPA_PCREL_CALL_RR14
, 0, 3, 14, true, 0, complain_overflow_signed
, hppa_elf_reloc
, "R_HPPA_PCREL_CALL_RR14"},
127 {R_HPPA_PCREL_CALL_RR17
, 0, 3, 17, true, 0, complain_overflow_signed
, hppa_elf_reloc
, "R_HPPA_PCREL_CALL_RR17"},
129 /* 9.3.8. Plabel relocation types */
130 {R_HPPA_PLABEL_32
, 0, 3, 32, false, 0, complain_overflow_signed
, hppa_elf_reloc
, "R_HPPA_PLABEL_32"},
131 {R_HPPA_PLABEL_11
, 0, 3, 11, false, 0, complain_overflow_signed
, hppa_elf_reloc
, "R_HPPA_PLABEL_11"},
132 {R_HPPA_PLABEL_14
, 0, 3, 14, false, 0, complain_overflow_signed
, hppa_elf_reloc
, "R_HPPA_PLABEL_14"},
133 {R_HPPA_PLABEL_L21
, 0, 3, 21, false, 0, complain_overflow_signed
, hppa_elf_reloc
, "R_HPPA_PLABEL_L21"},
134 {R_HPPA_PLABEL_R11
, 0, 3, 11, false, 0, complain_overflow_signed
, hppa_elf_reloc
, "R_HPPA_PLABEL_R11"},
135 {R_HPPA_PLABEL_R14
, 0, 3, 14, false, 0, complain_overflow_signed
, hppa_elf_reloc
, "R_HPPA_PLABEL_R14"},
137 /* 9.3.9. Data linkage table (DLT) relocation types */
138 {R_HPPA_DLT_32
, 0, 3, 32, false, 0, complain_overflow_signed
, hppa_elf_reloc
, "R_HPPA_DLT_32"},
139 {R_HPPA_DLT_11
, 0, 3, 11, false, 0, complain_overflow_signed
, hppa_elf_reloc
, "R_HPPA_DLT_11"},
140 {R_HPPA_DLT_14
, 0, 3, 14, false, 0, complain_overflow_signed
, hppa_elf_reloc
, "R_HPPA_DLT_14"},
141 {R_HPPA_DLT_L21
, 0, 3, 21, false, 0, complain_overflow_signed
, hppa_elf_reloc
, "R_HPPA_DLT_L21"},
142 {R_HPPA_DLT_R11
, 0, 3, 11, false, 0, complain_overflow_signed
, hppa_elf_reloc
, "R_HPPA_DLT_R11"},
143 {R_HPPA_DLT_R14
, 0, 3, 14, false, 0, complain_overflow_signed
, hppa_elf_reloc
, "R_HPPA_DLT_R14"},
145 /* 9.3.10. Relocations for unwinder tables */
146 {R_HPPA_UNWIND_ENTRY
, 0, 3, 32, true, 0, complain_overflow_signed
, hppa_elf_reloc
, "R_HPPA_UNWIND_ENTRY"},
147 {R_HPPA_UNWIND_ENTRIES
, 0, 3, 32, true, 0, complain_overflow_signed
, hppa_elf_reloc
, "R_HPPA_UNWIND_ENTRIES"},
149 /* 9.3.11. Relocation types for complex expressions */
150 {R_HPPA_PUSH_CONST
, 0, 3, 32, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_HPPA_PUSH_CONST"},
151 {R_HPPA_PUSH_PC
, 0, 3, 32, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_HPPA_PUSH_PC"},
152 {R_HPPA_PUSH_SYM
, 0, 3, 32, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_HPPA_PUSH_SYM"},
153 {R_HPPA_PUSH_GOTOFF
, 0, 3, 32, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_HPPA_PUSH_GOTOFF"},
154 {R_HPPA_PUSH_ABS_CALL
, 0, 3, 32, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_HPPA_PUSH_ABS_CALL"},
155 {R_HPPA_PUSH_PCREL_CALL
, 0, 3, 32, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_HPPA_PUSH_PCREL_CALL"},
156 {R_HPPA_PUSH_PLABEL
, 0, 3, 32, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_HPPA_PUSH_PLABEL"},
157 {R_HPPA_MAX
, 0, 3, 32, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_HPPA_MAX"},
158 {R_HPPA_MIN
, 0, 3, 32, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_HPPA_MIN"},
159 {R_HPPA_ADD
, 0, 3, 32, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_HPPA_ADD"},
160 {R_HPPA_SUB
, 0, 3, 32, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_HPPA_SUB"},
161 {R_HPPA_MULT
, 0, 3, 32, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_HPPA_MULT"},
162 {R_HPPA_DIV
, 0, 3, 32, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_HPPA_DIV"},
163 {R_HPPA_MOD
, 0, 3, 32, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_HPPA_MOD"},
164 {R_HPPA_AND
, 0, 3, 32, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_HPPA_AND"},
165 {R_HPPA_OR
, 0, 3, 32, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_HPPA_OR"},
166 {R_HPPA_XOR
, 0, 3, 32, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_HPPA_XOR"},
167 {R_HPPA_NOT
, 0, 3, 32, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_HPPA_NOT"},
168 {R_HPPA_LSHIFT
, 0, 3, 32, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_HPPA_LSHIFT"},
169 {R_HPPA_ARITH_RSHIFT
, 0, 3, 32, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_HPPA_ARITH_RSHIFT"},
170 {R_HPPA_LOGIC_RSHIFT
, 0, 3, 32, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_HPPA_LOGIC_RSHIFT"},
171 {R_HPPA_EXPR_F
, 0, 3, 32, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_HPPA_L"},
172 {R_HPPA_EXPR_L
, 0, 3, 32, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_HPPA_EXPR_L"},
173 {R_HPPA_EXPR_R
, 0, 3, 32, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_HPPA_EXPR_R"},
174 {R_HPPA_EXPR_LS
, 0, 3, 32, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_HPPA_EXPR_LS"},
175 {R_HPPA_EXPR_RS
, 0, 3, 32, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_HPPA_EXPR_RS"},
176 {R_HPPA_EXPR_LD
, 0, 3, 32, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_HPPA_EXPR_LD"},
177 {R_HPPA_EXPR_RD
, 0, 3, 32, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_HPPA_EXPR_RD"},
178 {R_HPPA_EXPR_LR
, 0, 3, 32, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_HPPA_EXPR_LR"},
179 {R_HPPA_EXPR_RR
, 0, 3, 32, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_HPPA_EXPR_RR"},
181 {R_HPPA_EXPR_32
, 0, 3, 32, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_HPPA_EXPR_32"},
182 {R_HPPA_EXPR_21
, 0, 3, 21, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_HPPA_EXPR_21"},
183 {R_HPPA_EXPR_11
, 0, 3, 11, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_HPPA_EXPR_11"},
184 {R_HPPA_EXPR_14
, 0, 3, 14, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_HPPA_EXPR_14"},
185 {R_HPPA_EXPR_17
, 0, 3, 17, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_HPPA_EXPR_17"},
186 {R_HPPA_EXPR_12
, 0, 3, 12, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_HPPA_EXPR_12"},
187 {R_HPPA_STUB_CALL_17
, 0, 3, 17, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_HPPA_STUB_CALL_17"},
188 {R_HPPA_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_dont
, NULL
, "R_HPPA_UNIMPLEMENTED"},
191 static symext_chainS
*symext_rootP
;
192 static symext_chainS
*symext_lastP
;
193 static boolean symext_chain_built
;
196 hppa_elf_rebuild_insn (abfd
, insn
, value
, r_type
, r_field
, r_format
)
200 unsigned short r_type
;
201 unsigned short r_field
;
202 unsigned short r_format
;
204 unsigned long const_part
; /* part of the instruction that does not change */
205 unsigned long rebuilt_part
;
213 const_part
= insn
& 0xffffe002;
214 dis_assemble_12 (value
, &w1
, &w
);
215 rebuilt_part
= (w1
<< 2) | w
;
216 return const_part
| rebuilt_part
;
223 const_part
= insn
& 0xffffe002;
224 dis_assemble_12 (value
, &w1
, &w
);
225 rebuilt_part
= (w1
<< 2) | w
;
226 return const_part
| rebuilt_part
;
230 const_part
= insn
& 0xffffc000;
231 low_sign_unext (value
, 14, &rebuilt_part
);
232 return const_part
| rebuilt_part
;
238 const_part
= insn
& 0xffe0e002;
239 dis_assemble_17 (value
, &w1
, &w2
, &w
);
240 rebuilt_part
= (w2
<< 2) | (w1
<< 16) | w
;
241 return const_part
| rebuilt_part
;
245 const_part
= insn
& 0xffe00000;
246 dis_assemble_21 (value
, &rebuilt_part
);
247 return const_part
| rebuilt_part
;
254 fprintf (stderr
, "Relocation problem : ");
256 "Unrecognized reloc type %d (fmt=%d,fld=%d), in module %s\n",
257 r_type
, r_format
, r_field
, abfd
->filename
);
263 hppa_elf_relocate_insn (abfd
, input_sect
,
264 insn
, address
, symp
, sym_value
, r_addend
,
265 r_type
, r_format
, r_field
, pcrel
)
267 asection
*input_sect
;
269 unsigned long address
;
273 unsigned short r_type
;
274 unsigned short r_format
;
275 unsigned short r_field
;
278 unsigned char opcode
= get_opcode (insn
);
293 constant_value
= HPPA_R_CONSTANT (r_addend
);
294 BFD_ASSERT (r_format
== 14);
297 sym_value
-= address
;
298 sym_value
= hppa_field_adjust (sym_value
, constant_value
, r_field
);
299 return hppa_elf_rebuild_insn (abfd
, insn
, sym_value
, r_type
, r_field
, r_format
);
302 case SUBI
: /* case SUBIO: */
303 case ADDIT
: /* case ADDITO: */
304 case ADDI
: /* case ADDIO: */
305 BFD_ASSERT (r_format
== 11);
307 constant_value
= HPPA_R_CONSTANT(r_addend
);
308 sym_value
= hppa_field_adjust (sym_value
, constant_value
, r_field
);
309 return hppa_elf_rebuild_insn (abfd
, insn
, sym_value
, r_type
, r_field
, r_format
);
313 BFD_ASSERT (r_format
== 21);
315 constant_value
= HPPA_R_CONSTANT (r_addend
);
316 sym_value
= hppa_field_adjust (sym_value
, constant_value
, r_field
);
317 return hppa_elf_rebuild_insn (abfd
, insn
, sym_value
, r_type
, r_field
, r_format
);
322 arg_reloc
= HPPA_R_ARG_RELOC (r_addend
);
324 BFD_ASSERT (r_format
== 17);
326 /* XXX computing constant_value is not needed??? */
327 constant_value
= assemble_17 ((insn
& 0x001f0000) >> 16,
328 (insn
& 0x00001ffc) >> 2,
330 /* @@ Assumes only 32 bits. */
331 constant_value
= (constant_value
<< 15) >> 15;
335 address
+ input_sect
->output_offset
336 + input_sect
->output_section
->vma
;
337 sym_value
= hppa_field_adjust (sym_value
, -8, r_field
);
340 sym_value
= hppa_field_adjust (sym_value
, constant_value
, r_field
);
342 return hppa_elf_rebuild_insn (abfd
, insn
, sym_value
>> 2, r_type
, r_field
, r_format
);
347 BFD_ASSERT (r_format
== 32);
348 constant_value
= HPPA_R_CONSTANT (r_addend
);
350 return hppa_field_adjust (sym_value
, constant_value
, r_field
);
355 "Unrecognized opcode 0x%02x (fmt=%x,field=%x)\n",
356 opcode
, r_format
, r_field
);
363 hppa_elf_relocate_unwind_table (abfd
, input_sect
,
364 data
, address
, symp
, sym_value
, r_addend
,
365 r_type
, r_format
, r_field
, pcrel
)
367 asection
*input_sect
;
369 unsigned long address
;
373 unsigned short r_type
;
374 unsigned short r_format
;
375 unsigned short r_field
;
378 bfd_byte
*hit_data
= address
+ (bfd_byte
*) (data
);
381 long relocated_value
;
384 BFD_ASSERT (r_format
== 32);
385 BFD_ASSERT (r_field
== e_fsel
);
388 case R_HPPA_UNWIND_ENTRY
:
389 start_offset
= bfd_get_32 (abfd
, hit_data
);
390 relocated_value
= hppa_field_adjust (sym_value
, start_offset
, r_field
);
391 bfd_put_32 (abfd
, relocated_value
, hit_data
);
393 hit_data
+= sizeof (unsigned long);
394 end_offset
= bfd_get_32 (abfd
, hit_data
);
395 relocated_value
= hppa_field_adjust (sym_value
, end_offset
, r_field
);
396 bfd_put_32 (abfd
, relocated_value
, hit_data
);
399 case R_HPPA_UNWIND_ENTRIES
:
400 for (i
= 0; i
< r_addend
; i
++, hit_data
+= 3 * sizeof (unsigned long))
402 unsigned int adjustment
;
403 start_offset
= bfd_get_32 (abfd
, hit_data
);
404 /* Stuff the symbol value into the first word */
405 /* of the unwind descriptor */
406 bfd_put_32 (abfd
, sym_value
, hit_data
);
407 adjustment
= sym_value
- start_offset
;
409 hit_data
+= sizeof (unsigned long);
410 end_offset
= adjustment
+ bfd_get_32 (abfd
, hit_data
);
411 bfd_put_32 (abfd
, end_offset
, hit_data
);
413 /* If this is not the last unwind entry, */
414 /* adjust the symbol value. */
415 if (i
+ 1 < r_addend
)
417 start_offset
= bfd_get_32 (abfd
, hit_data
+ 3 * sizeof (unsigned long));
418 sym_value
= start_offset
+ adjustment
;
425 "Unrecognized relocation type 0x%02x (fmt=%x,field=%x)\n",
426 r_type
, r_format
, r_field
);
430 /* Provided the symbol, returns the value reffed */
432 get_symbol_value (symbol
)
437 if (symbol
== (asymbol
*) NULL
)
439 else if (symbol
->section
== &bfd_com_section
)
445 relocation
= symbol
->value
+
446 symbol
->section
->output_section
->vma
+
447 symbol
->section
->output_offset
;
453 /* This function provides a pretty straight-forward mapping between a */
454 /* base relocation type, format and field into the relocation type */
455 /* that will be emitted in an object file. The only wrinkle in the */
456 /* mapping is that when the T, TR, TL, P, PR, or PL expression */
457 /* prefixes are involved, the type gets promoted to a *_GOTOFF_* */
458 /* relocation (in the case of T, TR, and TL) or a PLABEL relocation */
459 /* (in the case of P, PR, and PL). */
461 /* NOTE: XXX the T, TR, TL, P, PR, and PL expression prefixes are not */
465 hppa_elf_gen_reloc_error (base_type
, fmt
, field
)
466 elf32_hppa_reloc_type base_type
;
470 fprintf (stderr
, "undefined relocation: base=0x%x,fmt=0x%x,field=0x%x\n",
471 base_type
, fmt
, field
);
474 elf32_hppa_reloc_type
**
475 hppa_elf_gen_reloc_type (abfd
, base_type
, format
, field
)
477 elf32_hppa_reloc_type base_type
;
481 #define UNDEFINED hppa_elf_gen_reloc_error(base_type,format,field)
483 elf32_hppa_reloc_type
*finaltype
;
484 elf32_hppa_reloc_type
**final_types
;
487 final_types
= (elf32_hppa_reloc_type
**) bfd_alloc_by_size_t (abfd
, sizeof (elf32_hppa_reloc_type
*) * 2);
488 BFD_ASSERT (final_types
!= 0); /* FIXME */
490 finaltype
= (elf32_hppa_reloc_type
*) bfd_alloc_by_size_t (abfd
, sizeof (elf32_hppa_reloc_type
));
491 BFD_ASSERT (finaltype
!= 0); /* FIXME */
493 final_types
[0] = finaltype
;
494 final_types
[1] = NULL
;
496 #define final_type finaltype[0]
498 final_type
= base_type
;
509 final_type
= R_HPPA_11
;
512 final_type
= R_HPPA_R11
;
515 final_type
= R_HPPA_RS11
;
518 final_type
= R_HPPA_RD11
;
522 final_type
= R_HPPA_PLABEL_11
;
525 final_type
= R_HPPA_PLABEL_R11
;
528 final_type
= R_HPPA_DLT_11
;
531 final_type
= R_HPPA_DLT_R11
;
542 final_type
= base_type
;
553 final_type
= R_HPPA_R14
;
556 final_type
= R_HPPA_RS14
;
559 final_type
= R_HPPA_RD14
;
562 final_type
= R_HPPA_RR14
;
566 final_type
= R_HPPA_PLABEL_14
;
569 final_type
= R_HPPA_PLABEL_R14
;
572 final_type
= R_HPPA_DLT_14
;
575 final_type
= R_HPPA_DLT_R14
;
588 final_type
= base_type
;
596 final_type
= R_HPPA_17
;
599 final_type
= R_HPPA_R17
;
602 final_type
= R_HPPA_RS17
;
605 final_type
= R_HPPA_RD17
;
608 final_type
= R_HPPA_RR17
;
616 final_type
= base_type
;
624 final_type
= R_HPPA_L21
;
627 final_type
= R_HPPA_LS21
;
630 final_type
= R_HPPA_LD21
;
633 final_type
= R_HPPA_LR21
;
636 final_type
= R_HPPA_PLABEL_L21
;
639 final_type
= R_HPPA_PLABEL_L21
;
648 final_type
= base_type
;
656 final_type
= R_HPPA_32
;
659 final_type
= R_HPPA_PLABEL_32
;
662 final_type
= R_HPPA_DLT_32
;
666 final_type
= base_type
;
672 final_type
= base_type
;
683 final_type
= R_HPPA_GOTOFF_R11
;
686 final_type
= R_HPPA_GOTOFF_RS11
;
689 final_type
= R_HPPA_GOTOFF_RD11
;
692 final_type
= R_HPPA_GOTOFF_11
;
700 final_type
= base_type
;
706 final_type
= base_type
;
712 final_type
= R_HPPA_GOTOFF_R14
;
715 final_type
= R_HPPA_GOTOFF_RS14
;
718 final_type
= R_HPPA_GOTOFF_RD14
;
721 final_type
= R_HPPA_GOTOFF_RR14
;
724 final_type
= R_HPPA_GOTOFF_14
;
732 final_type
= base_type
;
738 final_type
= base_type
;
744 final_type
= R_HPPA_GOTOFF_L21
;
747 final_type
= R_HPPA_GOTOFF_LS21
;
750 final_type
= R_HPPA_GOTOFF_LD21
;
753 final_type
= R_HPPA_GOTOFF_LR21
;
762 final_type
= base_type
;
768 final_type
= base_type
;
772 final_type
= base_type
;
776 case R_HPPA_PCREL_CALL
:
783 final_type
= R_HPPA_PCREL_CALL_R11
;
786 final_type
= R_HPPA_PCREL_CALL_RS11
;
789 final_type
= R_HPPA_PCREL_CALL_RD11
;
792 final_type
= R_HPPA_PCREL_CALL_11
;
800 final_type
= base_type
;
806 final_type
= base_type
;
812 final_type
= R_HPPA_PCREL_CALL_R14
;
815 final_type
= R_HPPA_PCREL_CALL_RS14
;
818 final_type
= R_HPPA_PCREL_CALL_RD14
;
821 final_type
= R_HPPA_PCREL_CALL_RR14
;
824 final_type
= R_HPPA_PCREL_CALL_14
;
832 final_type
= base_type
;
840 final_type
= R_HPPA_PCREL_CALL_R17
;
843 final_type
= R_HPPA_PCREL_CALL_RS17
;
846 final_type
= R_HPPA_PCREL_CALL_RD17
;
849 final_type
= R_HPPA_PCREL_CALL_RR17
;
852 final_type
= R_HPPA_PCREL_CALL_17
;
860 final_type
= base_type
;
868 final_type
= R_HPPA_PCREL_CALL_L21
;
871 final_type
= R_HPPA_PCREL_CALL_LS21
;
874 final_type
= R_HPPA_PCREL_CALL_LD21
;
877 final_type
= R_HPPA_PCREL_CALL_LR21
;
886 final_type
= base_type
;
892 final_type
= base_type
;
896 final_type
= base_type
;
907 final_type
= R_HPPA_PLABEL_11
;
910 final_type
= R_HPPA_PLABEL_R11
;
914 final_type
= base_type
;
922 final_type
= R_HPPA_PLABEL_14
;
925 final_type
= R_HPPA_PLABEL_R14
;
929 final_type
= base_type
;
937 final_type
= R_HPPA_PLABEL_L21
;
941 final_type
= base_type
;
949 final_type
= R_HPPA_PLABEL_32
;
953 final_type
= base_type
;
959 final_type
= base_type
;
962 case R_HPPA_ABS_CALL
:
969 final_type
= R_HPPA_ABS_CALL_R11
;
972 final_type
= R_HPPA_ABS_CALL_RS11
;
975 final_type
= R_HPPA_ABS_CALL_RD11
;
978 final_type
= R_HPPA_ABS_CALL_11
;
986 final_type
= base_type
;
992 final_type
= base_type
;
998 final_type
= R_HPPA_ABS_CALL_R14
;
1001 final_type
= R_HPPA_ABS_CALL_RS14
;
1004 final_type
= R_HPPA_ABS_CALL_RD14
;
1007 final_type
= R_HPPA_ABS_CALL_RR14
;
1010 final_type
= R_HPPA_ABS_CALL_14
;
1018 final_type
= base_type
;
1026 final_type
= R_HPPA_ABS_CALL_R17
;
1029 final_type
= R_HPPA_ABS_CALL_RS17
;
1032 final_type
= R_HPPA_ABS_CALL_RD17
;
1035 final_type
= R_HPPA_ABS_CALL_RR17
;
1038 final_type
= R_HPPA_ABS_CALL_17
;
1046 final_type
= base_type
;
1054 final_type
= R_HPPA_ABS_CALL_L21
;
1057 final_type
= R_HPPA_ABS_CALL_LS21
;
1060 final_type
= R_HPPA_ABS_CALL_LD21
;
1063 final_type
= R_HPPA_ABS_CALL_LR21
;
1072 final_type
= base_type
;
1078 final_type
= base_type
;
1082 final_type
= base_type
;
1087 final_type
= R_HPPA_UNWIND_ENTRY
;
1089 case R_HPPA_COMPLEX
:
1090 case R_HPPA_COMPLEX_PCREL_CALL
:
1091 case R_HPPA_COMPLEX_ABS_CALL
:
1092 final_types
= (elf32_hppa_reloc_type
**) bfd_alloc_by_size_t (abfd
, sizeof (elf32_hppa_reloc_type
*) * 6);
1093 BFD_ASSERT (final_types
!= 0); /* FIXME */
1095 finaltype
= (elf32_hppa_reloc_type
*) bfd_alloc_by_size_t (abfd
, sizeof (elf32_hppa_reloc_type
) * 5);
1096 BFD_ASSERT (finaltype
!= 0); /* FIXME */
1098 for (i
= 0; i
< 5; i
++)
1099 final_types
[i
] = &finaltype
[i
];
1101 final_types
[5] = NULL
;
1103 finaltype
[0] = R_HPPA_PUSH_SYM
;
1105 if (base_type
== R_HPPA_COMPLEX
)
1106 finaltype
[1] = R_HPPA_PUSH_SYM
;
1107 else if (base_type
== R_HPPA_COMPLEX_PCREL_CALL
)
1108 finaltype
[1] = R_HPPA_PUSH_PCREL_CALL
;
1109 else /* base_type == R_HPPA_COMPLEX_ABS_CALL */
1110 finaltype
[1] = R_HPPA_PUSH_ABS_CALL
;
1112 finaltype
[2] = R_HPPA_SUB
;
1117 finaltype
[3] = R_HPPA_EXPR_F
;
1120 finaltype
[3] = R_HPPA_EXPR_L
;
1123 finaltype
[3] = R_HPPA_EXPR_R
;
1126 finaltype
[3] = R_HPPA_EXPR_LS
;
1129 finaltype
[3] = R_HPPA_EXPR_RS
;
1132 finaltype
[3] = R_HPPA_EXPR_LD
;
1135 finaltype
[3] = R_HPPA_EXPR_RD
;
1138 finaltype
[3] = R_HPPA_EXPR_LR
;
1141 finaltype
[3] = R_HPPA_EXPR_RR
;
1148 finaltype
[4] = R_HPPA_EXPR_11
;
1151 finaltype
[4] = R_HPPA_EXPR_12
;
1154 finaltype
[4] = R_HPPA_EXPR_14
;
1157 finaltype
[4] = R_HPPA_EXPR_17
;
1160 finaltype
[4] = R_HPPA_EXPR_21
;
1163 finaltype
[4] = R_HPPA_EXPR_32
;
1170 final_type
= base_type
;
1180 /* this function is in charge of performing all the HP PA relocations */
1181 static long global_value
;
1182 static long GOT_value
; /* XXX: need to calculate this! For HPUX, GOT == DP */
1183 static asymbol
*global_symbol
;
1184 static int global_sym_defined
;
1186 static bfd_reloc_status_type
1187 hppa_elf_reloc (abfd
, reloc_entry
, symbol_in
, data
, input_section
, output_bfd
,
1190 arelent
*reloc_entry
;
1193 asection
*input_section
;
1195 char **error_message
;
1199 unsigned long addr
= reloc_entry
->address
;
1200 bfd_byte
*hit_data
= addr
+ (bfd_byte
*) (data
);
1201 unsigned short r_type
= reloc_entry
->howto
->type
& 0xFF;
1202 unsigned short r_field
= e_fsel
;
1203 boolean r_pcrel
= reloc_entry
->howto
->pc_relative
;
1204 unsigned r_format
= reloc_entry
->howto
->bitsize
;
1205 long r_addend
= reloc_entry
->addend
;
1209 /* Partial linking - do nothing */
1210 reloc_entry
->address
+= input_section
->output_offset
;
1211 return bfd_reloc_ok
;
1214 /* If performing final link and the symbol we're relocating against
1215 is undefined, then return an error. */
1216 if (symbol_in
&& symbol_in
->section
== &bfd_und_section
)
1217 return bfd_reloc_undefined
;
1219 sym_value
= get_symbol_value (symbol_in
);
1221 /* Compute the value of $global$. */
1222 if (!global_sym_defined
)
1226 global_value
= (global_symbol
->value
1227 + global_symbol
->section
->output_section
->vma
1228 + global_symbol
->section
->output_offset
);
1229 GOT_value
= global_value
;
1230 global_sym_defined
++;
1234 /* Get the instruction word. */
1235 insn
= bfd_get_32 (abfd
, hit_data
);
1237 /* Relocate the value based on one of the basic relocation types
1239 basic_type_1: relocation is relative to $global$
1240 basic_type_2: relocation is relative to the current GOT
1241 basic_type_3: relocation is an absolute call
1242 basic_type_4: relocation is an PC-relative call
1243 basic_type_5: relocation is plabel reference
1244 basic_type_6: relocation is an unwind table relocation
1245 extended_type: unimplemented */
1252 /* Handle all the basic type 1 relocations. */
1255 goto do_basic_type_1
;
1258 goto do_basic_type_1
;
1261 goto do_basic_type_1
;
1264 goto do_basic_type_1
;
1267 goto do_basic_type_1
;
1270 goto do_basic_type_1
;
1273 goto do_basic_type_1
;
1276 goto do_basic_type_1
;
1279 goto do_basic_type_1
;
1282 goto do_basic_type_1
;
1285 goto do_basic_type_1
;
1288 goto do_basic_type_1
;
1291 goto do_basic_type_1
;
1294 goto do_basic_type_1
;
1297 goto do_basic_type_1
;
1300 goto do_basic_type_1
;
1303 goto do_basic_type_1
;
1306 goto do_basic_type_1
;
1311 insn
= hppa_elf_relocate_insn (abfd
, input_section
, insn
, addr
,
1312 symbol_in
, sym_value
, r_addend
,
1313 r_type
, r_format
, r_field
, r_pcrel
);
1316 /* Handle all the basic type 2 relocations. */
1317 case R_HPPA_GOTOFF_11
:
1319 goto do_basic_type_2
;
1320 case R_HPPA_GOTOFF_14
:
1322 goto do_basic_type_2
;
1323 case R_HPPA_GOTOFF_L21
:
1325 goto do_basic_type_2
;
1326 case R_HPPA_GOTOFF_R11
:
1328 goto do_basic_type_2
;
1329 case R_HPPA_GOTOFF_R14
:
1331 goto do_basic_type_2
;
1332 case R_HPPA_GOTOFF_LS21
:
1334 goto do_basic_type_2
;
1335 case R_HPPA_GOTOFF_RS11
:
1337 goto do_basic_type_2
;
1338 case R_HPPA_GOTOFF_RS14
:
1340 goto do_basic_type_2
;
1341 case R_HPPA_GOTOFF_LD21
:
1343 goto do_basic_type_2
;
1344 case R_HPPA_GOTOFF_RD11
:
1346 goto do_basic_type_2
;
1347 case R_HPPA_GOTOFF_RD14
:
1349 goto do_basic_type_2
;
1350 case R_HPPA_GOTOFF_LR21
:
1352 goto do_basic_type_2
;
1353 case R_HPPA_GOTOFF_RR14
:
1357 sym_value
-= GOT_value
;
1358 insn
= hppa_elf_relocate_insn (abfd
, input_section
, insn
, addr
,
1359 symbol_in
, sym_value
, r_addend
,
1360 r_type
, r_format
, r_field
, r_pcrel
);
1363 /* Handle all the basic type 3 relocations. */
1364 case R_HPPA_ABS_CALL_11
:
1366 goto do_basic_type_3
;
1367 case R_HPPA_ABS_CALL_14
:
1369 goto do_basic_type_3
;
1370 case R_HPPA_ABS_CALL_17
:
1372 goto do_basic_type_3
;
1373 case R_HPPA_ABS_CALL_L21
:
1375 goto do_basic_type_3
;
1376 case R_HPPA_ABS_CALL_R11
:
1378 goto do_basic_type_3
;
1379 case R_HPPA_ABS_CALL_R14
:
1381 goto do_basic_type_3
;
1382 case R_HPPA_ABS_CALL_R17
:
1384 goto do_basic_type_3
;
1385 case R_HPPA_ABS_CALL_LS21
:
1387 goto do_basic_type_3
;
1388 case R_HPPA_ABS_CALL_RS11
:
1390 goto do_basic_type_3
;
1391 case R_HPPA_ABS_CALL_RS14
:
1393 goto do_basic_type_3
;
1394 case R_HPPA_ABS_CALL_RS17
:
1396 goto do_basic_type_3
;
1397 case R_HPPA_ABS_CALL_LD21
:
1399 goto do_basic_type_3
;
1400 case R_HPPA_ABS_CALL_RD11
:
1402 goto do_basic_type_3
;
1403 case R_HPPA_ABS_CALL_RD14
:
1405 goto do_basic_type_3
;
1406 case R_HPPA_ABS_CALL_RD17
:
1408 goto do_basic_type_3
;
1409 case R_HPPA_ABS_CALL_LR21
:
1411 goto do_basic_type_3
;
1412 case R_HPPA_ABS_CALL_RR14
:
1414 goto do_basic_type_3
;
1415 case R_HPPA_ABS_CALL_RR17
:
1419 insn
= hppa_elf_relocate_insn (abfd
, input_section
, insn
, addr
,
1420 symbol_in
, sym_value
, r_addend
,
1421 r_type
, r_format
, r_field
, r_pcrel
);
1424 /* Handle all the basic type 4 relocations. */
1425 case R_HPPA_PCREL_CALL_11
:
1427 goto do_basic_type_4
;
1428 case R_HPPA_PCREL_CALL_14
:
1430 goto do_basic_type_4
;
1431 case R_HPPA_PCREL_CALL_17
:
1433 goto do_basic_type_4
;
1434 case R_HPPA_PCREL_CALL_L21
:
1436 goto do_basic_type_4
;
1437 case R_HPPA_PCREL_CALL_R11
:
1439 goto do_basic_type_4
;
1440 case R_HPPA_PCREL_CALL_R14
:
1442 goto do_basic_type_4
;
1443 case R_HPPA_PCREL_CALL_R17
:
1445 goto do_basic_type_4
;
1446 case R_HPPA_PCREL_CALL_LS21
:
1448 goto do_basic_type_4
;
1449 case R_HPPA_PCREL_CALL_RS11
:
1451 goto do_basic_type_4
;
1452 case R_HPPA_PCREL_CALL_RS14
:
1454 goto do_basic_type_4
;
1455 case R_HPPA_PCREL_CALL_RS17
:
1457 goto do_basic_type_4
;
1458 case R_HPPA_PCREL_CALL_LD21
:
1460 goto do_basic_type_4
;
1461 case R_HPPA_PCREL_CALL_RD11
:
1463 goto do_basic_type_4
;
1464 case R_HPPA_PCREL_CALL_RD14
:
1466 goto do_basic_type_4
;
1467 case R_HPPA_PCREL_CALL_RD17
:
1469 goto do_basic_type_4
;
1470 case R_HPPA_PCREL_CALL_LR21
:
1472 goto do_basic_type_4
;
1473 case R_HPPA_PCREL_CALL_RR14
:
1475 goto do_basic_type_4
;
1476 case R_HPPA_PCREL_CALL_RR17
:
1480 insn
= hppa_elf_relocate_insn (abfd
, input_section
, insn
, addr
,
1481 symbol_in
, sym_value
, r_addend
,
1482 r_type
, r_format
, r_field
, r_pcrel
);
1485 /* Handle all the basic type 5 relocations. */
1486 case R_HPPA_PLABEL_32
:
1487 case R_HPPA_PLABEL_11
:
1488 case R_HPPA_PLABEL_14
:
1490 goto do_basic_type_5
;
1491 case R_HPPA_PLABEL_L21
:
1493 goto do_basic_type_5
;
1494 case R_HPPA_PLABEL_R11
:
1495 case R_HPPA_PLABEL_R14
:
1498 insn
= hppa_elf_relocate_insn (abfd
, input_section
, insn
, addr
,
1499 symbol_in
, sym_value
, r_addend
,
1500 r_type
, r_format
, r_field
, r_pcrel
);
1503 /* Handle all basic type 6 relocations. */
1504 case R_HPPA_UNWIND_ENTRY
:
1505 case R_HPPA_UNWIND_ENTRIES
:
1506 hppa_elf_relocate_unwind_table (abfd
, input_section
, data
, addr
,
1507 symbol_in
, sym_value
, r_addend
,
1508 r_type
, r_format
, r_field
, r_pcrel
);
1509 return bfd_reloc_ok
;
1511 /* Handle the stack operations and similar braindamage. */
1512 case R_HPPA_PUSH_CONST
:
1513 case R_HPPA_PUSH_PC
:
1514 case R_HPPA_PUSH_SYM
:
1515 case R_HPPA_PUSH_GOTOFF
:
1516 case R_HPPA_PUSH_ABS_CALL
:
1517 case R_HPPA_PUSH_PCREL_CALL
:
1518 case R_HPPA_PUSH_PLABEL
:
1531 case R_HPPA_ARITH_RSHIFT
:
1532 case R_HPPA_LOGIC_RSHIFT
:
1536 case R_HPPA_EXPR_LS
:
1537 case R_HPPA_EXPR_RS
:
1538 case R_HPPA_EXPR_LD
:
1539 case R_HPPA_EXPR_RD
:
1540 case R_HPPA_EXPR_LR
:
1541 case R_HPPA_EXPR_RR
:
1542 case R_HPPA_EXPR_32
:
1543 case R_HPPA_EXPR_21
:
1544 case R_HPPA_EXPR_11
:
1545 case R_HPPA_EXPR_14
:
1546 case R_HPPA_EXPR_17
:
1547 case R_HPPA_EXPR_12
:
1548 fprintf (stderr
, "Relocation problem: ");
1549 fprintf (stderr
, "Unimplemented reloc type %d, in module %s\n",
1550 r_type
, abfd
->filename
);
1551 return bfd_reloc_notsupported
;
1553 /* This is a linker internal relocation. */
1554 case R_HPPA_STUB_CALL_17
:
1555 /* This relocation is for a branch to a long branch stub.
1556 Change instruction to a BLE,N. It may also be necessary
1557 to change interchange the branch and its delay slot.
1558 The original instruction stream is
1560 bl <foo>,r ; call foo using register r as
1561 ; the return pointer
1562 XXX ; delay slot instruction
1564 The new instruction stream will be:
1566 XXX ; delay slot instruction
1567 ble <foo_stub> ; call the long call stub for foo
1568 ; using r31 as the return pointer
1570 This braindamage is necessary because the compiler may put
1571 an instruction which uses %r31 in the delay slot of the original
1572 call. By changing the call instruction from a "bl" to a "ble"
1573 %r31 gets clobbered before the delay slot executes.
1575 We do not interchange the branch and delay slot if the delay
1576 slot was already nullified, or if the instruction in the delay
1577 slot modifies the return pointer to avoid an unconditional
1578 jump after the call returns (GCC optimization). */
1582 insn
= BLE_N_XXX_0_0
;
1583 bfd_put_32 (abfd
, insn
, hit_data
);
1584 r_type
= R_HPPA_ABS_CALL_17
;
1586 insn
= hppa_elf_relocate_insn (abfd
, input_section
, insn
,
1587 addr
, symbol_in
, sym_value
,
1588 r_addend
, r_type
, r_format
,
1593 unsigned long old_delay_slot_insn
= bfd_get_32 (abfd
, hit_data
+ 4);
1594 unsigned rtn_reg
= (insn
& 0x03e00000) >> 21;
1596 if (get_opcode (old_delay_slot_insn
) == LDO
)
1598 unsigned ldo_src_reg
= (old_delay_slot_insn
& 0x03e00000) >> 21;
1599 unsigned ldo_target_reg
= (old_delay_slot_insn
& 0x001f0000) >> 16;
1601 /* If the target of the LDO is the same as the return
1602 register then there is no reordering. We can leave the
1603 instuction as a non-nullified BLE in this case. */
1604 if (ldo_target_reg
== rtn_reg
)
1606 unsigned long new_delay_slot_insn
= old_delay_slot_insn
;
1608 BFD_ASSERT(ldo_src_reg
== ldo_target_reg
);
1609 new_delay_slot_insn
&= 0xfc00ffff;
1610 new_delay_slot_insn
|= ((31 << 21) | (31 << 16));
1611 bfd_put_32 (abfd
, new_delay_slot_insn
, hit_data
+ 4);
1613 r_type
= R_HPPA_ABS_CALL_17
;
1615 insn
= hppa_elf_relocate_insn (abfd
, input_section
, insn
,
1616 addr
, symbol_in
, sym_value
,
1617 r_addend
, r_type
, r_format
,
1619 bfd_put_32 (abfd
, insn
, hit_data
);
1620 return bfd_reloc_ok
;
1622 else if (rtn_reg
== 31)
1624 /* The return register is r31, so this is a millicode
1625 call. Do not perform any instruction reordering. */
1627 r_type
= R_HPPA_ABS_CALL_17
;
1629 insn
= hppa_elf_relocate_insn (abfd
, input_section
, insn
,
1630 addr
, symbol_in
, sym_value
,
1631 r_addend
, r_type
, r_format
,
1633 bfd_put_32 (abfd
, insn
, hit_data
);
1634 return bfd_reloc_ok
;
1638 /* Check to see if the delay slot instruction has a
1639 relocation. If so, we need to change the address
1640 field of it, because the instruction it relocates
1641 is going to be moved. */
1642 arelent
* next_reloc_entry
= reloc_entry
+1;
1644 if (next_reloc_entry
->address
== reloc_entry
->address
+ 4)
1645 next_reloc_entry
->address
-= 4;
1647 insn
= old_delay_slot_insn
;
1648 bfd_put_32 (abfd
, insn
, hit_data
);
1649 insn
= BLE_N_XXX_0_0
;
1650 bfd_put_32 (abfd
, insn
, hit_data
+ 4);
1651 r_type
= R_HPPA_ABS_CALL_17
;
1653 insn
= hppa_elf_relocate_insn (abfd
, input_section
, insn
,
1654 addr
+ 4, symbol_in
,
1655 sym_value
, r_addend
, r_type
,
1656 r_format
, r_field
, r_pcrel
);
1657 bfd_put_32 (abfd
, insn
, hit_data
+ 4);
1658 return bfd_reloc_ok
;
1661 else if (rtn_reg
== 31)
1663 /* The return register is r31, so this is a millicode call.
1664 Perform no instruction reordering in this case. */
1666 r_type
= R_HPPA_ABS_CALL_17
;
1668 insn
= hppa_elf_relocate_insn (abfd
, input_section
, insn
,
1669 addr
, symbol_in
, sym_value
,
1670 r_addend
, r_type
, r_format
,
1672 bfd_put_32 (abfd
, insn
, hit_data
);
1673 return bfd_reloc_ok
;
1677 /* Check to see if the delay slot instruction has a
1678 relocation. If so, we need to change its address
1679 field because the instruction it relocates is going
1681 arelent
* next_reloc_entry
= reloc_entry
+1;
1683 if (next_reloc_entry
->address
== reloc_entry
->address
+ 4)
1684 next_reloc_entry
->address
-= 4;
1686 insn
= old_delay_slot_insn
;
1687 bfd_put_32 (abfd
, insn
, hit_data
);
1688 insn
= BLE_N_XXX_0_0
;
1689 bfd_put_32 (abfd
, insn
, hit_data
+ 4);
1690 r_type
= R_HPPA_ABS_CALL_17
;
1692 insn
= hppa_elf_relocate_insn (abfd
, input_section
, insn
,
1693 addr
+ 4, symbol_in
, sym_value
,
1694 r_addend
, r_type
, r_format
,
1696 bfd_put_32 (abfd
, insn
, hit_data
+ 4);
1697 return bfd_reloc_ok
;
1703 *error_message
= (char *) "Unrecognized reloc";
1704 return bfd_reloc_dangerous
;
1707 /* Update the instruction word. */
1708 bfd_put_32 (abfd
, insn
, hit_data
);
1709 return (bfd_reloc_ok
);
1712 static const reloc_howto_type
*
1713 elf_hppa_reloc_type_lookup (arch
, code
)
1714 bfd_arch_info_type
*arch
;
1715 bfd_reloc_code_real_type code
;
1717 if ((int) code
< (int) R_HPPA_UNIMPLEMENTED
)
1719 BFD_ASSERT ((int) elf_hppa_howto_table
[(int) code
].type
== (int) code
);
1720 return &elf_hppa_howto_table
[(int) code
];
1723 return (reloc_howto_type
*) 0;
1726 #define bfd_elf32_bfd_reloc_type_lookup elf_hppa_reloc_type_lookup
1730 elf_hppa_tc_symbol (abfd
, symbolP
, sym_idx
)
1732 elf_symbol_type
*symbolP
;
1735 symext_chainS
*symextP
;
1736 unsigned int arg_reloc
;
1738 /* Only functions can have argument relocations. */
1739 if (!(symbolP
->symbol
.flags
& BSF_FUNCTION
))
1742 arg_reloc
= symbolP
->tc_data
.hppa_arg_reloc
;
1744 /* If there are no argument relocation bits, then no relocation is
1745 necessary. Do not add this to the symextn section. */
1749 symextP
= (symext_chainS
*) bfd_alloc (abfd
, sizeof (symext_chainS
) * 2);
1752 bfd_error
= no_memory
;
1753 abort(); /* FIXME */
1756 symextP
[0].entry
= ELF32_HPPA_SX_WORD (HPPA_SXT_SYMNDX
, sym_idx
);
1757 symextP
[0].next
= &symextP
[1];
1759 symextP
[1].entry
= ELF32_HPPA_SX_WORD (HPPA_SXT_ARG_RELOC
, arg_reloc
);
1760 symextP
[1].next
= NULL
;
1762 if (symext_rootP
== NULL
)
1764 symext_rootP
= &symextP
[0];
1765 symext_lastP
= &symextP
[1];
1769 symext_lastP
->next
= &symextP
[0];
1770 symext_lastP
= &symextP
[1];
1774 /* Accessor function for the list of symbol extension records. */
1775 symext_chainS
*elf32_hppa_get_symextn_chain()
1777 return symext_rootP
;
1780 static symext_entryS
*symextn_contents
;
1781 static unsigned int symextn_contents_real_size
;
1784 elf_hppa_tc_make_sections (abfd
, ignored
)
1788 symext_chainS
*symextP
;
1792 void hppa_elf_stub_finish (); /* forward declaration */
1793 asection
*symextn_sec
;
1795 hppa_elf_stub_finish (abfd
);
1797 if (symext_rootP
== NULL
)
1800 for (n
= 0, symextP
= symext_rootP
; symextP
; symextP
= symextP
->next
, ++n
)
1803 size
= sizeof (symext_entryS
) * n
;
1804 symextn_sec
= bfd_get_section_by_name (abfd
, SYMEXTN_SECTION_NAME
);
1805 if (symextn_sec
== (asection
*) 0)
1807 symextn_sec
= bfd_make_section (abfd
, SYMEXTN_SECTION_NAME
);
1808 bfd_set_section_flags (abfd
,
1810 SEC_HAS_CONTENTS
| SEC_LOAD
| SEC_ALLOC
| SEC_CODE
| SEC_READONLY
);
1811 symextn_sec
->output_section
= symextn_sec
;
1812 symextn_sec
->output_offset
= 0;
1813 bfd_set_section_alignment (abfd
, symextn_sec
, 2);
1815 symextn_contents
= (symext_entryS
*) bfd_alloc (abfd
, size
);
1816 if (!symextn_contents
)
1818 bfd_error
= no_memory
;
1819 abort(); /* FIXME */
1822 for (i
= 0, symextP
= symext_rootP
; symextP
; symextP
= symextP
->next
, ++i
)
1823 symextn_contents
[i
] = symextP
->entry
;
1824 symextn_contents_real_size
= size
;
1825 bfd_set_section_size (abfd
, symextn_sec
, symextn_contents_real_size
);
1830 /* Support for HP PA-RISC stub generation.
1834 Center for Software Science
1835 Department of Computer Science
1841 HP-PA calling conventions state:
1843 1. an argument relocation stub is required whenever the callee and
1844 caller argument relocation bits do not match exactly. The exception
1845 to this rule is if either the caller or callee argument relocation
1846 bit are 00 (do not relocate).
1848 2. The linker can optionally add a symbol record for the stub so that
1849 the stub can be reused. The symbol record will be the same as the
1850 original export symbol record, except that the relocation bits will
1851 reflect the input of the stub, the type would be STUB and the symbol
1852 value will be the location of the relocation stub.
1856 Stubs can be inserted *before* the section of the caller. The stubs
1857 can be treated as calls to code that manipulates the arguments.
1864 HPPA_STUB_ARG_RELOC
,
1865 HPPA_STUB_LONG_BRANCH
1869 elf32_hppa_get_sym_extn (abfd
, sym
, type
)
1874 /* This function finds the symbol extension record of the */
1875 /* specified type for the specified symbol. It returns the */
1876 /* value of the symbol extension record. */
1877 symext_entryS retval
;
1882 retval
= (symext_entryS
) 0;
1884 case HPPA_SXT_SYMNDX
:
1885 retval
= (symext_entryS
) 0; /* XXX: need to fix this */
1887 case HPPA_SXT_ARG_RELOC
:
1889 elf_symbol_type
*esymP
= (elf_symbol_type
*) sym
;
1891 retval
= (symext_entryS
) esymP
->tc_data
.hppa_arg_reloc
;
1894 /* This should never happen. */
1901 typedef struct elf32_hppa_stub_name_list_struct
1903 /* name of this stub */
1905 /* stub description for this stub */
1906 struct elf32_hppa_stub_description_struct
*stub_desc
;
1907 /* pointer into stub contents */
1909 /* size of this stub */
1911 /* next stub name entry */
1912 struct elf32_hppa_stub_name_list_struct
*next
;
1913 } elf32_hppa_stub_name_list
;
1915 typedef struct elf32_hppa_stub_description_struct
1917 struct elf32_hppa_stub_description_struct
*next
;
1918 bfd
*this_bfd
; /* bfd to which this stub applies */
1919 asection
*stub_sec
; /* stub section for this bfd */
1920 unsigned relocs_allocated_cnt
; /* count of relocations for this stub section */
1922 unsigned allocated_size
;
1923 int *stub_secp
; /* pointer to the next available location in the buffer */
1924 char *stub_contents
; /* contents of the stubs for this bfd */
1925 elf32_hppa_stub_name_list
*stub_listP
;
1926 struct bfd_link_info
*link_info
;
1928 elf32_hppa_stub_description
;
1930 static elf32_hppa_stub_description
*elf_hppa_stub_rootP
;
1932 /* Locate the stub section information for the given bfd. */
1933 static elf32_hppa_stub_description
*
1934 find_stubs (abfd
, stub_sec
)
1938 elf32_hppa_stub_description
*stubP
;
1940 for (stubP
= elf_hppa_stub_rootP
; stubP
; stubP
= stubP
->next
)
1942 if (stubP
->this_bfd
== abfd
1943 && stubP
->stub_sec
== stub_sec
)
1947 return (elf32_hppa_stub_description
*) NULL
;
1950 static elf32_hppa_stub_description
*
1951 new_stub (abfd
, stub_sec
, link_info
)
1954 struct bfd_link_info
*link_info
;
1956 elf32_hppa_stub_description
*stub
= find_stubs (abfd
, stub_sec
);
1961 stub
= (elf32_hppa_stub_description
*) bfd_zalloc (abfd
, sizeof (elf32_hppa_stub_description
));
1964 stub
->this_bfd
= abfd
;
1965 stub
->stub_sec
= stub_sec
;
1966 stub
->real_size
= 0;
1967 stub
->allocated_size
= 0;
1968 stub
->stub_contents
= NULL
;
1969 stub
->stub_secp
= NULL
;
1970 stub
->link_info
= link_info
;
1972 stub
->next
= elf_hppa_stub_rootP
;
1973 elf_hppa_stub_rootP
= stub
;
1977 bfd_error
= no_memory
;
1978 abort(); /* FIXME */
1984 /* Locate the stub by the given name. */
1985 static elf32_hppa_stub_name_list
*
1986 find_stub_by_name (abfd
, stub_sec
, name
)
1991 elf32_hppa_stub_description
*stub
= find_stubs (abfd
, stub_sec
);
1995 elf32_hppa_stub_name_list
*name_listP
;
1997 for (name_listP
= stub
->stub_listP
; name_listP
; name_listP
= name_listP
->next
)
1999 if (!strcmp (name_listP
->sym
->name
, name
))
2007 /* Locate the stub by the given name. */
2008 static elf32_hppa_stub_name_list
*
2009 add_stub_by_name(abfd
, stub_sec
, sym
, link_info
)
2013 struct bfd_link_info
*link_info
;
2015 elf32_hppa_stub_description
*stub
= find_stubs (abfd
, stub_sec
);
2016 elf32_hppa_stub_name_list
*stub_entry
;
2019 stub
= new_stub(abfd
, stub_sec
, link_info
);
2023 stub_entry
= (elf32_hppa_stub_name_list
*)
2024 bfd_zalloc (abfd
, sizeof (elf32_hppa_stub_name_list
));
2028 stub_entry
->size
= 0;
2029 stub_entry
->sym
= sym
;
2030 stub_entry
->stub_desc
= stub
;
2031 /* First byte of this stub is the pointer to
2032 the next available location in the stub buffer. */
2033 stub_entry
->stub_secp
= stub
->stub_secp
;
2034 if (stub
->stub_listP
)
2035 stub_entry
->next
= stub
->stub_listP
;
2037 stub_entry
->next
= NULL
;
2038 stub
->stub_listP
= stub_entry
;
2043 bfd_error
= no_memory
;
2044 abort(); /* FIXME */
2048 return (elf32_hppa_stub_name_list
*)NULL
;
2052 #define RETURN_VALUE 1
2054 #define NO_ARG_RELOC 0
2061 #define ARG_RELOC_ERR 7
2073 /* FP register in arg0/arg1. This value can only appear in the arg0 location. */
2075 /* FP register in arg2/arg3. This value can only appear in the arg2 location. */
2078 #define AR_WARN(type,loc) \
2079 fprintf(stderr,"WARNING: Illegal argument relocation: %s for %s\n", \
2080 reloc_type_strings[type],reloc_loc_strings[loc])
2082 static CONST
char *CONST reloc_type_strings
[] =
2084 "NONE", "GR->FR", "GR0,GR1->FR1", "GR2,GR3->FR3", "FR->GR", "FR->GR0,GR1", "FR->GR2,GR3", "ERROR"
2087 static CONST
char *CONST reloc_loc_strings
[] =
2089 "ARG0", "ARG1", "ARG2", "ARG3", "RETVAL"
2092 static CONST
char mismatches
[6][6] =
2093 { /* CALLEE NONE CALLEE GR CALLEE FR CALLEE FU CALLEE DBL01 CALLEE DBL23 */
2095 {NO_ARG_RELOC
, NO_ARG_RELOC
, NO_ARG_RELOC
, ARG_RELOC_ERR
, NO_ARG_RELOC
, NO_ARG_RELOC
},
2097 {NO_ARG_RELOC
, NO_ARG_RELOC
, R_TO_FR
, ARG_RELOC_ERR
, R01_TO_FR
, ARG_RELOC_ERR
},
2099 {NO_ARG_RELOC
, FR_TO_R
, NO_ARG_RELOC
, ARG_RELOC_ERR
, ARG_RELOC_ERR
},
2101 {ARG_RELOC_ERR
, ARG_RELOC_ERR
, ARG_RELOC_ERR
, ARG_RELOC_ERR
, ARG_RELOC_ERR
, ARG_RELOC_ERR
},
2103 {NO_ARG_RELOC
, FR_TO_R01
, NO_ARG_RELOC
, ARG_RELOC_ERR
, NO_ARG_RELOC
, ARG_RELOC_ERR
},
2105 {NO_ARG_RELOC
, FR_TO_R23
, NO_ARG_RELOC
, ARG_RELOC_ERR
, ARG_RELOC_ERR
, NO_ARG_RELOC
},
2108 static CONST
char retval_mismatches
[6][6] =
2109 { /* CALLEE NONE CALLEE GR CALLEE FR CALLEE FU CALLEE DBL01 CALLEE DBL23 */
2111 {NO_ARG_RELOC
, NO_ARG_RELOC
, NO_ARG_RELOC
, ARG_RELOC_ERR
, NO_ARG_RELOC
, NO_ARG_RELOC
},
2113 {NO_ARG_RELOC
, NO_ARG_RELOC
, FR_TO_R
, ARG_RELOC_ERR
, FR_TO_R01
, ARG_RELOC_ERR
},
2115 {NO_ARG_RELOC
, R_TO_FR
, NO_ARG_RELOC
, ARG_RELOC_ERR
, ARG_RELOC_ERR
, ARG_RELOC_ERR
},
2117 {ARG_RELOC_ERR
, ARG_RELOC_ERR
, ARG_RELOC_ERR
, ARG_RELOC_ERR
, ARG_RELOC_ERR
, ARG_RELOC_ERR
},
2119 {NO_ARG_RELOC
, R01_TO_FR
, NO_ARG_RELOC
, ARG_RELOC_ERR
, NO_ARG_RELOC
, ARG_RELOC_ERR
},
2121 {NO_ARG_RELOC
, R23_TO_FR
, NO_ARG_RELOC
, ARG_RELOC_ERR
, ARG_RELOC_ERR
, NO_ARG_RELOC
},
2125 type_of_mismatch (caller_bits
, callee_bits
, type
)
2133 return mismatches
[caller_bits
][callee_bits
];
2135 return retval_mismatches
[caller_bits
][callee_bits
];
2141 #define EXTRACT_ARBITS(ar,which) ((ar) >> (8-(which*2))) & 3
2143 #define NEW_INSTRUCTION(entry,insn) \
2145 *((entry)->stub_desc->stub_secp)++ = (insn); \
2146 (entry)->stub_desc->real_size += sizeof(int); \
2147 (entry)->size += sizeof(int); \
2148 bfd_set_section_size((entry)->stub_desc->this_bfd, \
2149 (entry)->stub_desc->stub_sec, \
2150 (entry)->stub_desc->real_size); \
2153 #define CURRENT_STUB_OFFSET(entry) \
2154 ((char *)(entry)->stub_desc->stub_secp \
2155 - (char *)(entry)->stub_desc->stub_contents - 4)
2157 static boolean stubs_finished
= false;
2160 hppa_elf_stub_finish (output_bfd
)
2163 elf32_hppa_stub_description
*stub_list
= elf_hppa_stub_rootP
;
2164 /* All the stubs have been built. Finish up building */
2165 /* stub section. Apply relocations to the section. */
2167 if ( stubs_finished
)
2170 for (; stub_list
; stub_list
= stub_list
->next
)
2172 if (stub_list
->real_size
)
2174 bfd
*stub_bfd
= stub_list
->this_bfd
;
2175 asection
*stub_sec
= bfd_get_section_by_name (stub_bfd
, ".hppa_linker_stubs");
2176 bfd_size_type reloc_size
;
2177 arelent
**reloc_vector
;
2179 BFD_ASSERT (stub_sec
== stub_list
->stub_sec
);
2180 reloc_size
= bfd_get_reloc_upper_bound (stub_bfd
, stub_sec
);
2181 reloc_vector
= (arelent
**) alloca (reloc_size
);
2183 BFD_ASSERT (stub_sec
);
2185 /* We are not relaxing the section, so just copy the size info */
2186 stub_sec
->_cooked_size
= stub_sec
->_raw_size
;
2187 stub_sec
->reloc_done
= true;
2190 if (bfd_canonicalize_reloc (stub_bfd
,
2193 output_bfd
->outsymbols
))
2196 for (parent
= reloc_vector
; *parent
!= (arelent
*) NULL
;
2199 char *err
= (char *) NULL
;
2200 bfd_reloc_status_type r
=
2201 bfd_perform_relocation (stub_bfd
,
2203 stub_list
->stub_contents
,
2204 stub_sec
, (bfd
*) NULL
, &err
);
2207 if (r
!= bfd_reloc_ok
)
2209 struct bfd_link_info
*link_info
= stub_list
->link_info
;
2213 case bfd_reloc_undefined
:
2214 if (! ((*link_info
->callbacks
->undefined_symbol
)
2216 bfd_asymbol_name (*(*parent
)->sym_ptr_ptr
),
2217 stub_bfd
, stub_sec
, (*parent
)->address
)))
2220 case bfd_reloc_dangerous
:
2221 if (! ((*link_info
->callbacks
->reloc_dangerous
)
2222 (link_info
, err
, stub_bfd
, stub_sec
,
2223 (*parent
)->address
)))
2226 case bfd_reloc_overflow
:
2228 if (! ((*link_info
->callbacks
->reloc_overflow
)
2230 bfd_asymbol_name (*(*parent
)->sym_ptr_ptr
),
2231 (*parent
)->howto
->name
,
2234 (*parent
)->address
)))
2238 case bfd_reloc_outofrange
:
2247 bfd_set_section_contents (output_bfd
,
2249 stub_list
->stub_contents
,
2251 stub_list
->real_size
);
2253 free (reloc_vector
);
2256 stubs_finished
= true;
2260 hppa_elf_stub_branch_reloc (stub_desc
, /* the bfd */
2261 output_bfd
, /* the output bfd */
2262 target_sym
, /* the target symbol */
2263 offset
) /* the offset within the stub buffer (pre-calculated) */
2264 elf32_hppa_stub_description
*stub_desc
;
2266 asymbol
*target_sym
;
2269 /* Allocate a new relocation entry. */
2273 if (stub_desc
->relocs_allocated_cnt
== stub_desc
->stub_sec
->reloc_count
)
2275 if (stub_desc
->stub_sec
->relocation
== NULL
)
2277 stub_desc
->relocs_allocated_cnt
= STUB_RELOC_INCR
;
2278 size
= sizeof (arelent
) * stub_desc
->relocs_allocated_cnt
;
2279 stub_desc
->stub_sec
->relocation
= (arelent
*) bfd_zmalloc (size
);
2283 stub_desc
->relocs_allocated_cnt
+= STUB_RELOC_INCR
;
2284 size
= sizeof (arelent
) * stub_desc
->relocs_allocated_cnt
;
2285 stub_desc
->stub_sec
->relocation
= (arelent
*) realloc (stub_desc
->stub_sec
->relocation
,
2288 if (!stub_desc
->stub_sec
->relocation
)
2290 bfd_error
= no_memory
;
2291 abort(); /* FIXME */
2295 /* Fill in the details. */
2296 relent
.address
= offset
;
2298 relent
.sym_ptr_ptr
= (asymbol
**) bfd_zalloc (stub_desc
->this_bfd
, sizeof (asymbol
*));
2299 BFD_ASSERT (relent
.sym_ptr_ptr
); /* FIXME */
2301 relent
.sym_ptr_ptr
[0] = target_sym
;
2302 relent
.howto
= bfd_reloc_type_lookup (stub_desc
->this_bfd
, R_HPPA_PCREL_CALL_17
);
2304 /* Save it in the array of relocations for the stub section. */
2306 memcpy (&stub_desc
->stub_sec
->relocation
[stub_desc
->stub_sec
->reloc_count
++],
2312 hppa_elf_stub_reloc (stub_desc
, /* the bfd */
2313 output_bfd
, /* the output bfd */
2314 target_sym
, /* the target symbol */
2315 offset
, /* the offset within the stub buffer (pre-calculated) */
2317 elf32_hppa_stub_description
*stub_desc
;
2319 asymbol
*target_sym
;
2321 elf32_hppa_reloc_type type
;
2323 /* Allocate a new relocation entry. */
2326 Elf_Internal_Shdr
*rela_hdr
;
2328 if (stub_desc
->relocs_allocated_cnt
== stub_desc
->stub_sec
->reloc_count
)
2330 if (stub_desc
->stub_sec
->relocation
== NULL
)
2332 stub_desc
->relocs_allocated_cnt
= STUB_RELOC_INCR
;
2333 size
= sizeof (arelent
) * stub_desc
->relocs_allocated_cnt
;
2334 stub_desc
->stub_sec
->relocation
= (arelent
*) bfd_zmalloc (size
);
2338 stub_desc
->relocs_allocated_cnt
+= STUB_RELOC_INCR
;
2339 size
= sizeof (arelent
) * stub_desc
->relocs_allocated_cnt
;
2340 stub_desc
->stub_sec
->relocation
= (arelent
*) realloc (stub_desc
->stub_sec
->relocation
,
2343 if (!stub_desc
->stub_sec
->relocation
)
2345 bfd_error
= no_memory
;
2346 abort(); /* FIXME */
2350 rela_hdr
= &elf_section_data(stub_desc
->stub_sec
)->rel_hdr
;
2351 rela_hdr
->sh_size
+= sizeof(Elf32_External_Rela
);
2353 /* Fill in the details. */
2354 relent
.address
= offset
;
2356 relent
.sym_ptr_ptr
= (asymbol
**) bfd_zalloc (stub_desc
->this_bfd
, sizeof (asymbol
*));
2357 BFD_ASSERT (relent
.sym_ptr_ptr
); /* FIXME */
2359 relent
.sym_ptr_ptr
[0] = target_sym
;
2360 relent
.howto
= bfd_reloc_type_lookup (stub_desc
->this_bfd
, type
);
2362 /* Save it in the array of relocations for the stub section. */
2364 memcpy (&stub_desc
->stub_sec
->relocation
[stub_desc
->stub_sec
->reloc_count
++],
2370 hppa_elf_build_arg_reloc_stub (abfd
, output_bfd
, link_info
, reloc_entry
,
2371 stub_types
, rtn_adjust
, data
)
2374 struct bfd_link_info
*link_info
;
2375 arelent
*reloc_entry
;
2380 asection
*stub_sec
= bfd_get_section_by_name (abfd
, ".hppa_linker_stubs");
2381 elf32_hppa_stub_description
*stub_desc
= find_stubs (abfd
, stub_sec
);
2382 asymbol
*stub_sym
= NULL
;
2383 asymbol
*target_sym
= reloc_entry
->sym_ptr_ptr
[0];
2384 asection
*output_text_section
= bfd_get_section_by_name (output_bfd
, ".text");
2386 char stub_sym_name
[128];
2387 elf32_hppa_stub_name_list
*stub_entry
;
2388 unsigned insn
= data
[0];
2390 /* Perform some additional checks on whether we should really do the
2391 return adjustment. For example, if the instruction is nullified
2392 or if the delay slot contains an instruction that modifies the return
2393 pointer, then the branch instructions should not be rearranged
2394 (rtn_adjust is false). */
2395 if (insn
& 2 || insn
== 0)
2399 unsigned delay_insn
= data
[1];
2401 if (get_opcode (delay_insn
) == LDO
2402 && (((insn
& 0x03e00000) >> 21) == ((delay_insn
& 0x001f0000) >> 16)))
2406 /* See if the proper stub entry has already been made. */
2409 BFD_ASSERT (stub_desc
== NULL
);
2410 stub_sec
= bfd_make_section (abfd
, ".hppa_linker_stubs");
2411 bfd_set_section_flags (abfd
,
2413 SEC_HAS_CONTENTS
| SEC_ALLOC
| SEC_LOAD
2414 | SEC_RELOC
| SEC_CODE
| SEC_READONLY
);
2415 stub_sec
->output_section
= output_text_section
->output_section
;
2416 stub_sec
->output_offset
= 0;
2417 bfd_set_section_alignment (abfd
, stub_sec
, 2);
2418 stub_desc
= new_stub (abfd
, stub_sec
, link_info
);
2421 /* Make the stub if we did not find one already. */
2423 stub_desc
= new_stub (abfd
, stub_sec
, link_info
);
2425 /* Allocate space to write the stub.
2426 FIXME. Why using realloc?!? */
2427 if (!stub_desc
->stub_contents
)
2429 stub_desc
->allocated_size
= STUB_BUFFER_INCR
;
2430 stub_desc
->stub_contents
= (char *) malloc (STUB_BUFFER_INCR
);
2431 if (!stub_desc
->stub_contents
)
2433 bfd_error
= no_memory
;
2437 else if ((stub_desc
->allocated_size
- stub_desc
->real_size
) < STUB_MAX_SIZE
)
2439 stub_desc
->allocated_size
= stub_desc
->allocated_size
+ STUB_BUFFER_INCR
;
2440 stub_desc
->stub_contents
= (char *) realloc (stub_desc
->stub_contents
,
2441 stub_desc
->allocated_size
);
2444 stub_desc
->stub_secp
2445 = (int *) (stub_desc
->stub_contents
+ stub_desc
->real_size
);
2447 sprintf (stub_sym_name
,
2448 "_stub_%s_%02d_%02d_%02d_%02d_%02d_%s",
2449 reloc_entry
->sym_ptr_ptr
[0]->name
,
2450 stub_types
[0], stub_types
[1], stub_types
[2],
2451 stub_types
[3], stub_types
[4],
2452 rtn_adjust
? "RA" : "");
2453 stub_entry
= find_stub_by_name (abfd
, stub_sec
, stub_sym_name
);
2457 stub_sym
= stub_entry
->sym
;
2458 /* Redirect the original relocation from the old symbol (a function)
2459 to the stub (the stub calls the function). Should we need to
2460 change the relocation type? */
2461 reloc_entry
->sym_ptr_ptr
= (asymbol
**) bfd_zalloc (stub_desc
->this_bfd
,
2462 sizeof (asymbol
*));
2463 if (!reloc_entry
->sym_ptr_ptr
)
2465 bfd_error
= no_memory
;
2468 reloc_entry
->sym_ptr_ptr
[0] = stub_sym
;
2469 if (reloc_entry
->howto
->type
!= R_HPPA_PLABEL_32
2470 && (get_opcode(insn
) == BLE
2471 || get_opcode (insn
) == BE
2472 || get_opcode (insn
) == BL
))
2473 reloc_entry
->howto
= bfd_reloc_type_lookup (abfd
, R_HPPA_STUB_CALL_17
);
2477 /* Create a new symbol to point to this stub. */
2478 stub_sym
= bfd_make_empty_symbol (abfd
);
2481 bfd_error
= no_memory
;
2484 stub_sym
->name
= bfd_zalloc (abfd
, strlen (stub_sym_name
) + 1);
2485 if (!stub_sym
->name
)
2487 bfd_error
= no_memory
;
2490 strcpy ((char *) stub_sym
->name
, stub_sym_name
);
2492 = (char *) stub_desc
->stub_secp
- (char *) stub_desc
->stub_contents
;
2493 stub_sym
->section
= stub_sec
;
2494 stub_sym
->flags
= BSF_LOCAL
| BSF_FUNCTION
;
2495 stub_entry
= add_stub_by_name (abfd
, stub_sec
, stub_sym
, link_info
);
2497 /* Redirect the original relocation from the old symbol (a function)
2498 to the stub (the stub calls the function). Change the type of
2499 relocation to be the internal use only stub R_HPPA_STUB_CALL_17. */
2500 reloc_entry
->sym_ptr_ptr
= (asymbol
**) bfd_zalloc (stub_desc
->this_bfd
,
2501 sizeof (asymbol
*));
2502 if (!reloc_entry
->sym_ptr_ptr
)
2504 bfd_error
= no_memory
;
2507 reloc_entry
->sym_ptr_ptr
[0] = stub_sym
;
2508 if (reloc_entry
->howto
->type
!= R_HPPA_PLABEL_32
2509 && (get_opcode (insn
) == BLE
2510 || get_opcode (insn
) == BE
2511 || get_opcode (insn
) == BL
))
2512 reloc_entry
->howto
= bfd_reloc_type_lookup (abfd
, R_HPPA_STUB_CALL_17
);
2514 /* Generate common code for all stubs. */
2516 NEW_INSTRUCTION (stub_entry
, LDSID_31_1
);
2517 NEW_INSTRUCTION (stub_entry
, MTSP_1_SR0
);
2518 NEW_INSTRUCTION (stub_entry
, ADDI_8_SP
);
2520 /* Generate code to move the arguments around. */
2521 for (i
= ARG0
; i
< ARG3
; i
++)
2523 if (stub_types
[i
] != NO_ARG_RELOC
)
2525 switch (stub_types
[i
])
2531 NEW_INSTRUCTION (stub_entry
, STWS_ARG0_M8SP
);
2532 NEW_INSTRUCTION (stub_entry
, FLDWS_M8SP_FARG0
);
2535 NEW_INSTRUCTION (stub_entry
, STWS_ARG1_M8SP
);
2536 NEW_INSTRUCTION (stub_entry
, FLDWS_M8SP_FARG1
);
2539 NEW_INSTRUCTION (stub_entry
, STWS_ARG2_M8SP
);
2540 NEW_INSTRUCTION (stub_entry
, FLDWS_M8SP_FARG2
);
2543 NEW_INSTRUCTION (stub_entry
, STWS_ARG3_M8SP
);
2544 NEW_INSTRUCTION (stub_entry
, FLDWS_M8SP_FARG3
);
2553 NEW_INSTRUCTION (stub_entry
, STWS_ARG0_M4SP
);
2554 NEW_INSTRUCTION (stub_entry
, STWS_ARG1_M8SP
);
2555 NEW_INSTRUCTION (stub_entry
, FLDDS_M8SP_FARG1
);
2558 AR_WARN (stub_types
[i
],i
);
2567 NEW_INSTRUCTION (stub_entry
, STWS_ARG2_M4SP
);
2568 NEW_INSTRUCTION (stub_entry
, STWS_ARG3_M8SP
);
2569 NEW_INSTRUCTION (stub_entry
, FLDDS_M8SP_FARG3
);
2572 AR_WARN (stub_types
[i
],i
);
2581 NEW_INSTRUCTION (stub_entry
, FSTWS_FARG0_M8SP
);
2582 NEW_INSTRUCTION (stub_entry
, LDWS_M4SP_ARG0
);
2585 NEW_INSTRUCTION (stub_entry
, FSTWS_FARG1_M8SP
);
2586 NEW_INSTRUCTION (stub_entry
, LDWS_M4SP_ARG1
);
2589 NEW_INSTRUCTION (stub_entry
, FSTWS_FARG2_M8SP
);
2590 NEW_INSTRUCTION (stub_entry
, LDWS_M4SP_ARG2
);
2593 NEW_INSTRUCTION (stub_entry
, FSTWS_FARG3_M8SP
);
2594 NEW_INSTRUCTION (stub_entry
, LDWS_M4SP_ARG3
);
2603 NEW_INSTRUCTION (stub_entry
, FSTDS_FARG1_M8SP
);
2604 NEW_INSTRUCTION (stub_entry
, LDWS_M4SP_ARG0
);
2605 NEW_INSTRUCTION (stub_entry
, LDWS_M8SP_ARG1
);
2608 AR_WARN (stub_types
[i
],i
);
2617 NEW_INSTRUCTION (stub_entry
, FSTDS_FARG3_M8SP
);
2618 NEW_INSTRUCTION (stub_entry
, LDWS_M4SP_ARG2
);
2619 NEW_INSTRUCTION (stub_entry
, LDWS_M8SP_ARG3
);
2622 AR_WARN (stub_types
[i
],i
);
2631 NEW_INSTRUCTION (stub_entry
, ADDI_M8_SP_SP
);
2633 /* Adjust the return address if necessary. */
2636 NEW_INSTRUCTION (stub_entry
, ADDI_M4_31_RP
);
2639 NEW_INSTRUCTION (stub_entry
, COPY_31_2
);
2641 /* Save the return address. */
2642 NEW_INSTRUCTION (stub_entry
, STW_RP_M8SP
);
2644 /* Long branch to the target function. */
2645 NEW_INSTRUCTION (stub_entry
, LDIL_XXX_31
);
2646 hppa_elf_stub_reloc (stub_entry
->stub_desc
,
2649 CURRENT_STUB_OFFSET (stub_entry
),
2651 NEW_INSTRUCTION (stub_entry
, BLE_XXX_0_31
);
2652 hppa_elf_stub_reloc (stub_entry
->stub_desc
,
2655 CURRENT_STUB_OFFSET (stub_entry
),
2656 R_HPPA_ABS_CALL_R17
);
2657 NEW_INSTRUCTION (stub_entry
, COPY_31_2
);
2660 /* Restore the return address. */
2661 NEW_INSTRUCTION (stub_entry
, LDW_M8SP_RP
);
2663 /* Generate the code to move the return value around. */
2665 if (stub_types
[i
] != NO_ARG_RELOC
)
2667 switch (stub_types
[i
])
2670 NEW_INSTRUCTION (stub_entry
, STWS_RET0_M8SP
);
2671 NEW_INSTRUCTION (stub_entry
, FLDWS_M8SP_FRET0
);
2675 NEW_INSTRUCTION (stub_entry
, FSTWS_FRET0_M8SP
);
2676 NEW_INSTRUCTION (stub_entry
, LDWS_M4SP_RET0
);
2680 NEW_INSTRUCTION (stub_entry
, BV_N_0_RP
);
2687 hppa_elf_arg_reloc_needed_p (abfd
, reloc_entry
, stub_types
, caller_ar
)
2689 arelent
*reloc_entry
;
2691 symext_entryS caller_ar
;
2693 /* If the symbol is still undefined, there is */
2694 /* no way to know if a stub is required. */
2696 if (reloc_entry
->sym_ptr_ptr
[0] && reloc_entry
->sym_ptr_ptr
[0]->section
!= &bfd_und_section
)
2698 symext_entryS callee_ar
= elf32_hppa_get_sym_extn (abfd
,
2699 reloc_entry
->sym_ptr_ptr
[0],
2700 HPPA_SXT_ARG_RELOC
);
2702 /* Now, determine if a stub is */
2703 /* required. A stub is required if they the callee and caller */
2704 /* argument relocation bits are both nonzero and not equal. */
2706 if (caller_ar
&& callee_ar
)
2708 /* Both are non-zero, we need to do further checking. */
2709 /* First, check if there is a return value relocation to be done */
2713 callee_loc
[RETVAL
] = EXTRACT_ARBITS (callee_ar
, RETVAL
);
2714 caller_loc
[RETVAL
] = EXTRACT_ARBITS (caller_ar
, RETVAL
);
2715 callee_loc
[ARG0
] = EXTRACT_ARBITS (callee_ar
, ARG0
);
2716 caller_loc
[ARG0
] = EXTRACT_ARBITS (caller_ar
, ARG0
);
2717 callee_loc
[ARG1
] = EXTRACT_ARBITS (callee_ar
, ARG1
);
2718 caller_loc
[ARG1
] = EXTRACT_ARBITS (caller_ar
, ARG1
);
2719 callee_loc
[ARG2
] = EXTRACT_ARBITS (callee_ar
, ARG2
);
2720 caller_loc
[ARG2
] = EXTRACT_ARBITS (caller_ar
, ARG2
);
2721 callee_loc
[ARG3
] = EXTRACT_ARBITS (callee_ar
, ARG3
);
2722 caller_loc
[ARG3
] = EXTRACT_ARBITS (caller_ar
, ARG3
);
2724 /* Check some special combinations. For */
2725 /* example, if FU appears in ARG1 or ARG3, we */
2726 /* can move it to ARG0 or ARG2, respectively. */
2728 if (caller_loc
[ARG0
] == AR_FU
|| caller_loc
[ARG1
] == AR_FU
)
2730 caller_loc
[ARG0
] = AR_DBL01
;
2731 caller_loc
[ARG1
] = AR_NO
;
2733 if (caller_loc
[ARG2
] == AR_FU
|| caller_loc
[ARG3
] == AR_FU
)
2735 caller_loc
[ARG2
] = AR_DBL23
;
2736 caller_loc
[ARG3
] = AR_NO
;
2738 if (callee_loc
[ARG0
] == AR_FU
|| callee_loc
[ARG1
] == AR_FU
)
2740 callee_loc
[ARG0
] = AR_DBL01
;
2741 callee_loc
[ARG1
] = AR_NO
;
2743 if (callee_loc
[ARG2
] == AR_FU
|| callee_loc
[ARG3
] == AR_FU
)
2745 callee_loc
[ARG2
] = AR_DBL23
;
2746 callee_loc
[ARG3
] = AR_NO
;
2749 stub_types
[ARG0
] = type_of_mismatch (caller_loc
[ARG0
], callee_loc
[ARG0
], ARGUMENTS
);
2750 stub_types
[ARG1
] = type_of_mismatch (caller_loc
[ARG1
], callee_loc
[ARG1
], ARGUMENTS
);
2751 stub_types
[ARG2
] = type_of_mismatch (caller_loc
[ARG2
], callee_loc
[ARG2
], ARGUMENTS
);
2752 stub_types
[ARG3
] = type_of_mismatch (caller_loc
[ARG3
], callee_loc
[ARG3
], ARGUMENTS
);
2753 stub_types
[RETVAL
] = type_of_mismatch (caller_loc
[RETVAL
], callee_loc
[RETVAL
], RETURN_VALUE
);
2755 /* Steps involved in building stubs: */
2756 /* 1. Determine what argument registers need to relocated. This */
2757 /* step is already done here. */
2758 /* 2. Build the appropriate stub in the .hppa_linker_stubs section. */
2759 /* This section should never appear in an object file. It is */
2760 /* only used internally. The output_section of the */
2761 /* .hppa_linker_stubs section is the .text section of the */
2763 /* 3. Build a symbol that is used (internally only) as the entry */
2764 /* point of the stub. */
2765 /* 4. Change the instruction of the original branch into a branch to */
2766 /* the stub routine. */
2767 /* 5. Build a relocation entry for the instruction of the original */
2768 /* branch to be R_HPPA_PCREL_CALL to the stub routine. */
2780 fprintf (stderr
, "Stub needed for %s @ %s+0x%x: callee/caller ar=0x%x/0x%x ",
2781 reloc_entry
->sym_ptr_ptr
[0]->name
,
2782 abfd
->filename
, reloc_entry
->address
,
2783 callee_ar
, caller_ar
);
2784 for (i
= ARG0
; i
< RETVAL
; i
++)
2786 if (stub_types
[i
] != NO_ARG_RELOC
)
2788 fprintf (stderr
, "%s%d: %s ",
2789 i
== RETVAL
? "ret" : "arg",
2790 i
== RETVAL
? 0 : i
,
2791 reloc_type_strings
[stub_types
[i
]]);
2794 fprintf (stderr
, "\n");
2805 hppa_elf_build_long_branch_stub (abfd
, output_bfd
, link_info
, reloc_entry
,
2809 struct bfd_link_info
*link_info
;
2810 arelent
*reloc_entry
;
2814 asection
*stub_sec
= bfd_get_section_by_name (abfd
, ".hppa_linker_stubs");
2815 elf32_hppa_stub_description
*stub_desc
= find_stubs (abfd
, stub_sec
);
2816 asymbol
*stub_sym
= NULL
;
2817 asymbol
*target_sym
= reloc_entry
->sym_ptr_ptr
[0];
2818 asection
*output_text_section
= bfd_get_section_by_name (output_bfd
, ".text");
2819 char stub_sym_name
[128];
2821 int dyncall
= false;
2822 elf32_hppa_stub_name_list
*stub_entry
;
2823 int rtn_adjust
= true;
2827 /* Create the stub section if it does not already exist. */
2830 BFD_ASSERT (stub_desc
== NULL
);
2831 stub_sec
= bfd_make_section (abfd
, ".hppa_linker_stubs");
2832 bfd_set_section_flags (abfd
,
2834 SEC_HAS_CONTENTS
| SEC_ALLOC
| SEC_LOAD
2835 | SEC_RELOC
| SEC_CODE
| SEC_READONLY
);
2836 stub_sec
->output_section
= output_text_section
->output_section
;
2837 stub_sec
->output_offset
= 0;
2839 /* Set up the ELF section header for this new section. This
2840 is basically the same processing as elf_make_sections().
2841 elf_make_sections is static and therefore not accessable
2844 Elf_Internal_Shdr
*this_hdr
;
2845 this_hdr
= &elf_section_data (stub_sec
)->this_hdr
;
2847 /* Set the sizes of this section. The contents have already
2849 this_hdr
->sh_addr
= stub_sec
->vma
;
2850 this_hdr
->sh_size
= stub_sec
->_raw_size
;
2852 /* Set appropriate flags for sections with relocations. */
2853 if (stub_sec
->flags
& SEC_RELOC
)
2855 Elf_Internal_Shdr
*rela_hdr
;
2856 int use_rela_p
= get_elf_backend_data (abfd
)->use_rela_p
;
2858 rela_hdr
= &elf_section_data (stub_sec
)->rel_hdr
;
2862 rela_hdr
->sh_type
= SHT_RELA
;
2863 rela_hdr
->sh_entsize
= sizeof (Elf32_External_Rela
);
2867 rela_hdr
->sh_type
= SHT_REL
;
2868 rela_hdr
->sh_entsize
= sizeof (Elf32_External_Rel
);
2870 rela_hdr
->sh_flags
= 0;
2871 rela_hdr
->sh_addr
= 0;
2872 rela_hdr
->sh_offset
= 0;
2873 rela_hdr
->sh_addralign
= 0;
2877 if (stub_sec
->flags
& SEC_ALLOC
)
2879 this_hdr
->sh_flags
|= SHF_ALLOC
;
2880 /* FIXME. If SEC_LOAD is true should we do something with
2884 if (!(stub_sec
->flags
& SEC_READONLY
))
2885 this_hdr
->sh_flags
|= SHF_WRITE
;
2887 if (stub_sec
->flags
& SEC_CODE
)
2888 this_hdr
->sh_flags
|= SHF_EXECINSTR
;
2891 bfd_set_section_alignment (abfd
, stub_sec
, 2);
2892 stub_desc
= new_stub (abfd
, stub_sec
, link_info
);
2896 stub_desc
= new_stub (abfd
, stub_sec
, link_info
);
2898 /* Allocate memory to contain the stub. FIXME. Why isn't this using
2899 the BFD memory allocation routines? */
2900 if (!stub_desc
->stub_contents
)
2902 stub_desc
->allocated_size
= STUB_BUFFER_INCR
;
2903 stub_desc
->stub_contents
= (char *) malloc (STUB_BUFFER_INCR
);
2905 else if ((stub_desc
->allocated_size
- stub_desc
->real_size
) < STUB_MAX_SIZE
)
2907 stub_desc
->allocated_size
= stub_desc
->allocated_size
+ STUB_BUFFER_INCR
;
2908 stub_desc
->stub_contents
= (char *) realloc (stub_desc
->stub_contents
,
2909 stub_desc
->allocated_size
);
2912 stub_desc
->stub_secp
2913 = (int *) (stub_desc
->stub_contents
+ stub_desc
->real_size
);
2915 /* Is this a millicode call? If so, the return address
2916 comes in on r31 rather than r2 (rp) so a slightly
2917 different code sequence is needed. */
2920 rtn_reg
= (insn
& 0x03e00000) >> 21;
2924 if (strcmp (symbol
->name
, "$$dyncall") == 0)
2927 /* If we are creating a call from a stub to another stub, then
2928 never do the instruction reordering. We can tell if we are
2929 going to be calling one stub from another by the fact that
2930 the symbol name has '_stub_' (arg. reloc. stub) or '_lb_stub_'
2931 prepended to the name. Alternatively, the section of the
2932 symbol will be '.hppa_linker_stubs'. */
2934 if ((strncmp (symbol
->name
, "_stub_", 6) == 0)
2935 || (strncmp (symbol
->name
, "_lb_stub_", 9) == 0))
2937 BFD_ASSERT (strcmp (symbol
->section
->name
, ".hppa_linker_stubs") == 0);
2941 /* Check to see if we modify the return pointer
2942 in the delay slot of the branch. */
2944 unsigned delay_insn
= data
[1];
2946 /* If we nullify the delay slot, or if the delay slot contains an
2947 instruction that modifies the return pointer, then no additional
2948 modification of the return pointer is necessary. */
2949 if (insn
& 2 || insn
== 0)
2953 if (get_opcode (delay_insn
) == LDO
2954 && (((delay_insn
& 0x001f0000) >> 16) == rtn_reg
))
2961 sprintf (stub_sym_name
,
2962 "_lb_stub_%s_%s", reloc_entry
->sym_ptr_ptr
[0]->name
,
2963 rtn_adjust
? "RA" : "");
2964 stub_entry
= find_stub_by_name(abfd
, stub_sec
, stub_sym_name
);
2966 /* If a copy of this stub already exists re-use it. */
2969 stub_sym
= stub_entry
->sym
;
2971 /* Change symbol associated with the original relocation to point
2974 FIXME. Is there a need to change the relocation type too? */
2975 reloc_entry
->sym_ptr_ptr
= (asymbol
**) bfd_zalloc (stub_desc
->this_bfd
,
2976 sizeof (asymbol
*));
2977 if (!reloc_entry
->sym_ptr_ptr
)
2979 bfd_error
= no_memory
;
2982 reloc_entry
->sym_ptr_ptr
[0] = stub_sym
;
2983 reloc_entry
->howto
= bfd_reloc_type_lookup (abfd
, R_HPPA_STUB_CALL_17
);
2987 /* We will need to allocate a new stub. */
2988 stub_sym
= bfd_make_empty_symbol (abfd
);
2991 bfd_error
= no_memory
;
2994 stub_sym
->name
= bfd_zalloc (abfd
, strlen (stub_sym_name
) + 1);
2995 if (!stub_sym
->name
)
2997 bfd_error
= no_memory
;
3000 strcpy ((char *) stub_sym
->name
, stub_sym_name
);
3002 = (char *) stub_desc
->stub_secp
- (char *) stub_desc
->stub_contents
;
3003 stub_sym
->section
= stub_sec
;
3004 stub_sym
->flags
= BSF_LOCAL
| BSF_FUNCTION
;
3005 stub_entry
= add_stub_by_name (abfd
, stub_sec
, stub_sym
, link_info
);
3007 /* Change symbol associated with the original relocation to point
3010 FIXME. Is there a need to change the relocation type too? */
3011 reloc_entry
->sym_ptr_ptr
= (asymbol
**) bfd_zalloc (stub_desc
->this_bfd
,
3012 sizeof (asymbol
*));
3013 if (!reloc_entry
->sym_ptr_ptr
)
3015 bfd_error
= no_memory
;
3018 reloc_entry
->sym_ptr_ptr
[0] = stub_sym
;
3019 reloc_entry
->howto
= bfd_reloc_type_lookup (abfd
, R_HPPA_STUB_CALL_17
);
3021 /* Build the stub. */
3023 /* 1. initialization for the call. */
3024 NEW_INSTRUCTION (stub_entry
, LDSID_31_1
);
3025 NEW_INSTRUCTION (stub_entry
, MTSP_1_SR0
);
3033 NEW_INSTRUCTION (stub_entry
, ADDI_M4_31_RP
);
3037 NEW_INSTRUCTION (stub_entry
, COPY_31_2
);
3044 NEW_INSTRUCTION (stub_entry
, ADDI_M4_31_1
);
3048 NEW_INSTRUCTION (stub_entry
, COPY_31_1
);
3052 NEW_INSTRUCTION (stub_entry
, LDIL_XXX_31
);
3053 hppa_elf_stub_reloc (stub_desc
,
3056 CURRENT_STUB_OFFSET (stub_entry
),
3059 /* 2. Make the call. */
3062 NEW_INSTRUCTION (stub_entry
, BE_XXX_0_31
);
3063 hppa_elf_stub_reloc (stub_desc
,
3066 CURRENT_STUB_OFFSET (stub_entry
),
3067 R_HPPA_ABS_CALL_R17
);
3068 NEW_INSTRUCTION (stub_entry
, COPY_2_31
);
3072 NEW_INSTRUCTION (stub_entry
, BE_XXX_0_31
);
3073 hppa_elf_stub_reloc (stub_desc
,
3076 CURRENT_STUB_OFFSET (stub_entry
),
3077 R_HPPA_ABS_CALL_R17
);
3078 NEW_INSTRUCTION (stub_entry
, COPY_1_31
);
3083 /* 3. Branch back to the original location.
3084 (For non-millicode calls, this is accomplished with the
3085 COPY_31_2 instruction. For millicode calls, the return
3086 location is already in r2.) */
3089 NEW_INSTRUCTION (stub_entry
, ADDI_M4_31_RP
);
3091 NEW_INSTRUCTION (stub_entry
, LDIL_XXX_31
);
3092 hppa_elf_stub_reloc (stub_desc
,
3095 CURRENT_STUB_OFFSET (stub_entry
),
3098 NEW_INSTRUCTION (stub_entry
, BE_XXX_0_31
);
3099 hppa_elf_stub_reloc (stub_desc
,
3102 CURRENT_STUB_OFFSET (stub_entry
),
3103 R_HPPA_ABS_CALL_R17
);
3104 NEW_INSTRUCTION (stub_entry
, COPY_2_31
);
3111 hppa_elf_long_branch_needed_p (abfd
, asec
, reloc_entry
, symbol
, insn
)
3114 arelent
*reloc_entry
;
3118 long sym_value
= get_symbol_value(symbol
);
3119 int fmt
= reloc_entry
->howto
->bitsize
;
3120 unsigned char op
= get_opcode(insn
);
3123 #define too_far(val,num_bits) ((int)(val) > (1<<(num_bits))-1) || ((int)(val) < (-1<<(num_bits)))
3129 reloc_entry
->address
+ asec
->output_offset
+ asec
->output_section
->vma
;
3130 if ( too_far(sym_value
- raddr
,fmt
+1) )
3133 fprintf(stderr
,"long_branch needed on BL insn: abfd=%s,sym=%s,distance=0x%x\n",abfd
->filename
,symbol
->name
,sym_value
- reloc_entry
->address
);
3142 #define STUB_SYM_BUFFER_INC 5
3145 hppa_look_for_stubs_in_section (stub_bfd
, abfd
, output_bfd
, asec
,
3146 syms
, new_sym_cnt
, link_info
)
3153 struct bfd_link_info
*link_info
;
3157 asymbol
*new_syms
= (asymbol
*) NULL
;
3161 /* Relocations are in different places depending on whether this is
3162 an output section or an input section. Also, the relocations are
3163 in different forms. Sigh. Luckily, we have
3164 bfd_canonicalize_reloc() to straighten this out for us . */
3166 if (asec
->reloc_count
> 0)
3168 arelent
**reloc_vector
3169 = (arelent
**) alloca (asec
->reloc_count
* (sizeof (arelent
*) + 1));
3171 bfd_canonicalize_reloc (abfd
, asec
, reloc_vector
, syms
);
3172 for (i
= 0; i
< asec
->reloc_count
; i
++)
3174 arelent
*rle
= reloc_vector
[i
];
3176 switch (rle
->howto
->type
)
3178 case R_HPPA_ABS_CALL_11
:
3179 case R_HPPA_ABS_CALL_14
:
3180 case R_HPPA_ABS_CALL_17
:
3181 case R_HPPA_ABS_CALL_L21
:
3182 case R_HPPA_ABS_CALL_R11
:
3183 case R_HPPA_ABS_CALL_R14
:
3184 case R_HPPA_ABS_CALL_R17
:
3185 case R_HPPA_ABS_CALL_LS21
:
3186 case R_HPPA_ABS_CALL_RS11
:
3187 case R_HPPA_ABS_CALL_RS14
:
3188 case R_HPPA_ABS_CALL_RS17
:
3189 case R_HPPA_ABS_CALL_LD21
:
3190 case R_HPPA_ABS_CALL_RD11
:
3191 case R_HPPA_ABS_CALL_RD14
:
3192 case R_HPPA_ABS_CALL_RD17
:
3193 case R_HPPA_ABS_CALL_LR21
:
3194 case R_HPPA_ABS_CALL_RR14
:
3195 case R_HPPA_ABS_CALL_RR17
:
3196 case R_HPPA_PCREL_CALL_11
:
3197 case R_HPPA_PCREL_CALL_14
:
3198 case R_HPPA_PCREL_CALL_17
:
3199 case R_HPPA_PCREL_CALL_12
:
3200 case R_HPPA_PCREL_CALL_L21
:
3201 case R_HPPA_PCREL_CALL_R11
:
3202 case R_HPPA_PCREL_CALL_R14
:
3203 case R_HPPA_PCREL_CALL_R17
:
3204 case R_HPPA_PCREL_CALL_LS21
:
3205 case R_HPPA_PCREL_CALL_RS11
:
3206 case R_HPPA_PCREL_CALL_RS14
:
3207 case R_HPPA_PCREL_CALL_RS17
:
3208 case R_HPPA_PCREL_CALL_LD21
:
3209 case R_HPPA_PCREL_CALL_RD11
:
3210 case R_HPPA_PCREL_CALL_RD14
:
3211 case R_HPPA_PCREL_CALL_RD17
:
3212 case R_HPPA_PCREL_CALL_LR21
:
3213 case R_HPPA_PCREL_CALL_RR14
:
3214 case R_HPPA_PCREL_CALL_RR17
:
3216 symext_entryS caller_ar
3217 = (symext_entryS
) HPPA_R_ARG_RELOC (rle
->addend
);
3220 bfd_get_section_contents (abfd
, asec
, insn
, rle
->address
,
3222 if (hppa_elf_arg_reloc_needed_p (abfd
, rle
, stub_types
,
3225 /* Generate a stub and keep track of the new symbol. */
3228 if (new_cnt
== new_max
)
3230 new_max
+= STUB_SYM_BUFFER_INC
;
3231 new_syms
= (asymbol
*)
3232 realloc (new_syms
, new_max
* sizeof (asymbol
));
3235 /* The rtn_adjust argument is true here because we
3236 know that we have a branch and (with a few exceptions
3237 detailed under the relocation code for relocation type
3238 R_HPPA_STUB_CALL_17) it will be possible to perform
3239 the code reorientation. */
3240 r
= hppa_elf_build_arg_reloc_stub (stub_bfd
, output_bfd
,
3244 new_syms
[new_cnt
++] = *r
;
3247 /* We need to retrieve the section contents to check for
3248 long branch stubs. */
3249 if (hppa_elf_long_branch_needed_p (abfd
, asec
, rle
,
3250 rle
->sym_ptr_ptr
[0],
3253 /* Generate a stub and keep track of the new symbol. */
3256 if (new_cnt
== new_max
)
3258 new_max
+= STUB_SYM_BUFFER_INC
;
3259 new_syms
= (asymbol
*)
3260 realloc (new_syms
, (new_max
* sizeof (asymbol
)));
3262 r
= hppa_elf_build_long_branch_stub (stub_bfd
, output_bfd
,
3264 rle
->sym_ptr_ptr
[0],
3266 new_syms
[new_cnt
++] = *r
;
3271 case R_HPPA_PLABEL_32
:
3272 case R_HPPA_PLABEL_11
:
3273 case R_HPPA_PLABEL_14
:
3274 case R_HPPA_PLABEL_L21
:
3275 case R_HPPA_PLABEL_R11
:
3276 case R_HPPA_PLABEL_R14
:
3278 /* On a plabel relocation, assume the arguments of the
3279 caller are set up in general registers.
3280 NOTE: 0x155 = ARGW0=CR,ARGW1=GR,ARGW2=GR,RETVAL=GR */
3281 symext_entryS caller_ar
= (symext_entryS
) 0x155;
3284 bfd_get_section_contents (abfd
, asec
, insn
, rle
->address
,
3287 if (hppa_elf_arg_reloc_needed_p (abfd
, rle
, stub_types
,
3290 /* Generate a plabel stub and keep track of the
3295 if (new_cnt
== new_max
)
3297 new_max
+= STUB_SYM_BUFFER_INC
;
3298 new_syms
= (asymbol
*) realloc (new_syms
, new_max
3299 * sizeof (asymbol
));
3302 /* Determine whether a return adjustment
3303 (see the relocation code for relocation type
3304 R_HPPA_STUB_CALL_17) is possible. Basically,
3305 determine whether we are looking at a branch or not. */
3307 if (rle
->howto
->type
== R_HPPA_PLABEL_32
)
3311 switch (get_opcode(insn
[0]))
3321 r
= hppa_elf_build_arg_reloc_stub (stub_bfd
, output_bfd
,
3325 new_syms
[new_cnt
++] = *r
;
3336 *new_sym_cnt
= new_cnt
;
3341 char *linker_stubs
= NULL
;
3342 int linker_stubs_size
= 0;
3343 int linker_stubs_max_size
= 0;
3344 #define STUB_ALLOC_INCR 100
3347 hppa_elf_set_section_contents (abfd
, section
, location
, offset
, count
)
3352 bfd_size_type count
;
3354 if ( strcmp(section
->name
, ".hppa_linker_stubs") == 0 )
3356 if ( linker_stubs_max_size
< offset
+ count
)
3358 linker_stubs_max_size
= offset
+ count
+ STUB_ALLOC_INCR
;
3359 linker_stubs
= (char *)realloc(linker_stubs
, linker_stubs_max_size
);
3362 if ( offset
+ count
> linker_stubs_size
)
3363 linker_stubs_size
= offset
+ count
;
3365 memcpy(linker_stubs
+ offset
,location
,count
);
3369 return bfd_elf32_set_section_contents (abfd
, section
, location
,
3373 /* Get the contents of the given section.
3375 This is special for PA ELF because some sections (such as linker stubs)
3376 may reside in memory rather than on disk, or in the case of the symbol
3377 extension section, the contents may need to be generated from other
3378 information contained in the BFD. */
3381 hppa_elf_get_section_contents (abfd
, section
, location
, offset
, count
)
3386 bfd_size_type count
;
3388 /* If this is the linker stub section, then its contents are contained
3389 in memory rather than on disk. FIXME. Is that always right? What
3390 about the case where a final executable is read in and a user tries
3391 to get the contents of this section? In that case the contents would
3392 be on disk like everything else. */
3393 if (strcmp (section
->name
, ".hppa_linker_stubs") == 0)
3395 elf32_hppa_stub_description
*stub_desc
= find_stubs (abfd
, section
);
3400 /* Sanity check our arguments. */
3401 if ((bfd_size_type
) (offset
+ count
) > section
->_raw_size
3402 || (bfd_size_type
) (offset
+ count
) > stub_desc
->real_size
)
3405 memcpy (location
, stub_desc
->stub_contents
+ offset
, count
);
3409 /* The symbol extension section also needs special handling. Its
3410 contents might be on the disk, in memory, or still need to
3412 else if (strcmp (section
->name
, ".hppa_symextn") == 0)
3414 /* If there are no output sections, then read the contents of the
3415 symbol extension section from disk. */
3416 if (section
->output_section
== NULL
3417 && abfd
->direction
== read_direction
)
3419 return bfd_generic_get_section_contents (abfd
, section
, location
,
3423 /* If this is the first time through, and there are output sections,
3424 then build the symbol extension section based on other information
3425 contained in the BFD. */
3426 else if (! symext_chain_built
)
3430 (int *) elf_sym_extra(section
->output_section
->owner
);
3432 for (i
= 0; i
< section
->output_section
->owner
->symcount
; i
++ )
3434 elf_hppa_tc_symbol(section
->output_section
->owner
,
3435 ((elf_symbol_type
*)
3436 section
->output_section
->owner
->outsymbols
[i
]),
3439 symext_chain_built
++;
3440 elf_hppa_tc_make_sections (section
->output_section
->owner
, NULL
);
3443 /* At this point we know that the symbol extension section has been
3444 built. We just need to copy it into the user's buffer. */
3448 /* Sanity check our arguments. */
3449 if ((bfd_size_type
) (offset
+ count
) > section
->_raw_size
3450 || (bfd_size_type
) (offset
+ count
) > symextn_contents_real_size
)
3454 ((char *)symextn_contents
+ section
->output_offset
+ offset
),
3459 return bfd_generic_get_section_contents (abfd
, section
, location
,
3464 elf_info_to_howto (abfd
, cache_ptr
, dst
)
3467 Elf32_Internal_Rela
*dst
;
3469 BFD_ASSERT (ELF32_R_TYPE(dst
->r_info
) < (unsigned int) R_HPPA_UNIMPLEMENTED
);
3470 cache_ptr
->howto
= &elf_hppa_howto_table
[ELF32_R_TYPE(dst
->r_info
)];
3474 elf32_hppa_backend_symbol_processing (abfd
, sym
)
3478 /* Is this a definition of $global$? If so, keep it because it will be
3479 needed if any relocations are performed. */
3481 if (!strcmp (sym
->name
, "$global$")
3482 && sym
->section
!= &bfd_und_section
)
3484 global_symbol
= sym
;
3488 #define elf_backend_symbol_processing elf32_hppa_backend_symbol_processing
3490 struct elf32_hppa_symextn_map_struct
3498 static struct elf32_hppa_symextn_map_struct
*elf32_hppa_symextn_map
;
3499 static int elf32_hppa_symextn_map_size
;
3502 elf32_hppa_backend_symbol_table_processing (abfd
, esyms
,symcnt
)
3504 elf_symbol_type
*esyms
;
3507 Elf32_Internal_Shdr
*symextn_hdr
= bfd_elf_find_section (abfd
, SYMEXTN_SECTION_NAME
);
3509 int current_sym_idx
= 0;
3511 /* If the symbol extension section does not exist, all the symbol */
3512 /* all the symbol extension information is assumed to be zero. */
3514 if ( symextn_hdr
== NULL
)
3516 for ( i
= 0; i
< symcnt
; i
++ )
3518 esyms
[i
].tc_data
.hppa_arg_reloc
= 0;
3523 /* allocate a buffer of the appropriate size for the symextn section */
3525 symextn_hdr
->contents
= bfd_zalloc(abfd
,symextn_hdr
->sh_size
);
3526 if (!symextn_hdr
->contents
)
3528 bfd_error
= no_memory
;
3531 symextn_hdr
->size
= symextn_hdr
->sh_size
;
3533 /* read in the symextn section */
3535 if (bfd_seek (abfd
, symextn_hdr
->sh_offset
, SEEK_SET
) == -1)
3537 bfd_error
= system_call_error
;
3540 if (bfd_read ((PTR
) symextn_hdr
->contents
, 1, symextn_hdr
->size
, abfd
)
3541 != symextn_hdr
->size
)
3543 free ((PTR
)symextn_hdr
->contents
);
3544 bfd_error
= system_call_error
;
3548 /* parse the entries, updating the symtab entries as we go */
3550 for ( i
= 0; i
< symextn_hdr
->size
/ sizeof(symext_entryS
); i
++ )
3552 symext_entryS
*seP
= ((symext_entryS
*)symextn_hdr
->contents
) + i
;
3553 int se_value
= ELF32_HPPA_SX_VAL(*seP
);
3554 int se_type
= ELF32_HPPA_SX_TYPE(*seP
);
3561 case HPPA_SXT_SYMNDX
:
3562 if ( se_value
>= symcnt
)
3564 bfd_error
= bad_value
;
3565 bfd_perror("elf32_hppa_backend_symbol_table_processing -- symbol index");
3568 current_sym_idx
= se_value
- 1;
3571 case HPPA_SXT_ARG_RELOC
:
3572 esyms
[current_sym_idx
].tc_data
.hppa_arg_reloc
= se_value
;
3576 bfd_error
= bad_value
;
3577 bfd_perror("elf32_hppa_backend_symbol_table_processing");
3584 #define elf_backend_symbol_table_processing elf32_hppa_backend_symbol_table_processing
3587 elf32_hppa_backend_section_processing (abfd
, secthdr
)
3589 Elf32_Internal_Shdr
*secthdr
;
3593 if ( secthdr
->sh_type
== SHT_HPPA_SYMEXTN
)
3595 for ( i
= 0; i
< secthdr
->size
/ sizeof(symext_entryS
); i
++ )
3597 symext_entryS
*seP
= ((symext_entryS
*)secthdr
->contents
) + i
;
3598 int se_value
= ELF32_HPPA_SX_VAL(*seP
);
3599 int se_type
= ELF32_HPPA_SX_TYPE(*seP
);
3606 case HPPA_SXT_SYMNDX
:
3607 for ( j
= 0; j
< abfd
->symcount
; j
++ )
3609 /* locate the map entry for this symbol, if there is one. */
3610 /* modify the symbol extension section symbol index entry */
3611 /* to reflect the new symbol table index */
3613 for ( k
= 0; k
< elf32_hppa_symextn_map_size
; k
++ )
3615 if ( elf32_hppa_symextn_map
[k
].old_index
== se_value
3616 && elf32_hppa_symextn_map
[k
].bfd
== abfd
->outsymbols
[j
]->the_bfd
3617 && elf32_hppa_symextn_map
[k
].sym
== abfd
->outsymbols
[j
] )
3620 ELF32_HPPA_SX_WORD (HPPA_SXT_SYMNDX
, j
),
3627 case HPPA_SXT_ARG_RELOC
:
3631 bfd_error
= bad_value
;
3632 bfd_perror("elf32_hppa_backend_section_processing");
3640 #define elf_backend_section_processing elf32_hppa_backend_section_processing
3643 elf32_hppa_backend_section_from_shdr (abfd
, hdr
, name
)
3645 Elf32_Internal_Shdr
*hdr
;
3650 if ( hdr
->sh_type
== SHT_HPPA_SYMEXTN
)
3652 BFD_ASSERT ( strcmp(name
,".hppa_symextn") == 0 );
3654 /* Bits that get saved. This one is real. */
3657 newsect
= bfd_make_section (abfd
, name
);
3658 if (newsect
!= NULL
)
3660 newsect
->vma
= hdr
->sh_addr
;
3661 newsect
->_raw_size
= hdr
->sh_size
;
3662 newsect
->filepos
= hdr
->sh_offset
; /* so we can read back the bits */
3663 newsect
->flags
|= SEC_HAS_CONTENTS
;
3664 newsect
->alignment_power
= hdr
->sh_addralign
;
3666 if (hdr
->sh_flags
& SHF_ALLOC
)
3668 newsect
->flags
|= SEC_ALLOC
;
3669 newsect
->flags
|= SEC_LOAD
;
3672 if (!(hdr
->sh_flags
& SHF_WRITE
))
3673 newsect
->flags
|= SEC_READONLY
;
3675 if (hdr
->sh_flags
& SHF_EXECINSTR
)
3676 newsect
->flags
|= SEC_CODE
; /* FIXME: may only contain SOME code */
3678 newsect
->flags
|= SEC_DATA
;
3680 hdr
->rawdata
= (void *) newsect
;
3688 #define elf_backend_section_from_shdr elf32_hppa_backend_section_from_shdr
3691 elf32_hppa_backend_fake_sections (abfd
, secthdr
, asect
)
3693 Elf_Internal_Shdr
*secthdr
;
3697 if ( strcmp(asect
->name
, ".hppa_symextn") == 0 )
3699 secthdr
->sh_type
= SHT_HPPA_SYMEXTN
;
3700 secthdr
->sh_flags
= 0;
3701 secthdr
->sh_info
= elf_section_data(asect
)->rel_hdr
.sh_link
;
3702 secthdr
->sh_link
= elf_onesymtab(abfd
);
3706 if (!strcmp (asect
->name
, ".hppa_unwind"))
3708 secthdr
->sh_type
= SHT_PROGBITS
;
3709 /* Unwind descriptors are not part of the program memory image. */
3710 secthdr
->sh_flags
= 0;
3711 secthdr
->sh_info
= 0;
3712 secthdr
->sh_link
= 0;
3713 secthdr
->sh_entsize
= 16;
3717 /* @@ Should this be CPU specific?? KR */
3718 if (!strcmp (asect
->name
, ".stabstr"))
3720 secthdr
->sh_type
= SHT_STRTAB
;
3721 secthdr
->sh_flags
= 0;
3722 secthdr
->sh_info
= 0;
3723 secthdr
->sh_link
= 0;
3724 secthdr
->sh_entsize
= 0;
3731 #define elf_backend_fake_sections elf32_hppa_backend_fake_sections
3734 elf32_hppa_backend_section_from_bfd_section (abfd
, hdr
, asect
, retval
)
3736 Elf32_Internal_Shdr
*hdr
;
3740 if ( hdr
->sh_type
== SHT_HPPA_SYMEXTN
)
3744 if (((struct sec
*) (hdr
->rawdata
)) == asect
)
3746 BFD_ASSERT( strcmp(asect
->name
, ".hppa_symextn") == 0 );
3751 else if ( hdr
->sh_type
== SHT_STRTAB
)
3755 if (((struct sec
*) (hdr
->rawdata
)) == asect
)
3757 BFD_ASSERT ( strcmp (asect
->name
, ".stabstr") == 0);
3766 #define elf_backend_section_from_bfd_section elf32_hppa_backend_section_from_bfd_section
3768 #define bfd_generic_get_section_contents hppa_elf_get_section_contents
3769 #define bfd_elf32_set_section_contents hppa_elf_set_section_contents
3771 #define TARGET_BIG_SYM bfd_elf32_hppa_vec
3772 #define TARGET_BIG_NAME "elf32-hppa"
3773 #define ELF_ARCH bfd_arch_hppa
3774 #define ELF_MACHINE_CODE EM_HPPA
3775 #define ELF_MAXPAGESIZE 0x1000
3777 #include "elf32-target.h"