elf64-ia64-vms.c revision 1.1.1.6 1 1.1 christos /* IA-64 support for OpenVMS
2 1.1.1.6 christos Copyright (C) 1998-2020 Free Software Foundation, Inc.
3 1.1 christos
4 1.1 christos This file is part of BFD, the Binary File Descriptor library.
5 1.1 christos
6 1.1 christos This program is free software; you can redistribute it and/or modify
7 1.1 christos it under the terms of the GNU General Public License as published by
8 1.1 christos the Free Software Foundation; either version 3 of the License, or
9 1.1 christos (at your option) any later version.
10 1.1 christos
11 1.1 christos This program is distributed in the hope that it will be useful,
12 1.1 christos but WITHOUT ANY WARRANTY; without even the implied warranty of
13 1.1 christos MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 1.1 christos GNU General Public License for more details.
15 1.1 christos
16 1.1 christos You should have received a copy of the GNU General Public License
17 1.1 christos along with this program; if not, write to the Free Software
18 1.1 christos Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
19 1.1 christos MA 02110-1301, USA. */
20 1.1 christos
21 1.1 christos #include "sysdep.h"
22 1.1 christos #include "bfd.h"
23 1.1 christos #include "libbfd.h"
24 1.1 christos #include "elf-bfd.h"
25 1.1 christos #include "opcode/ia64.h"
26 1.1 christos #include "elf/ia64.h"
27 1.1 christos #include "objalloc.h"
28 1.1 christos #include "hashtab.h"
29 1.1 christos #include "elfxx-ia64.h"
30 1.1 christos #include "vms.h"
31 1.1 christos #include "bfdver.h"
32 1.1 christos
33 1.1 christos /* THE RULES for all the stuff the linker creates --
34 1.1 christos
35 1.1 christos GOT Entries created in response to LTOFF or LTOFF_FPTR
36 1.1 christos relocations. Dynamic relocs created for dynamic
37 1.1 christos symbols in an application; REL relocs for locals
38 1.1 christos in a shared library.
39 1.1 christos
40 1.1 christos FPTR The canonical function descriptor. Created for local
41 1.1 christos symbols in applications. Descriptors for dynamic symbols
42 1.1 christos and local symbols in shared libraries are created by
43 1.1 christos ld.so. Thus there are no dynamic relocs against these
44 1.1 christos objects. The FPTR relocs for such _are_ passed through
45 1.1 christos to the dynamic relocation tables.
46 1.1 christos
47 1.1 christos FULL_PLT Created for a PCREL21B relocation against a dynamic symbol.
48 1.1 christos Requires the creation of a PLTOFF entry. This does not
49 1.1 christos require any dynamic relocations.
50 1.1 christos
51 1.1 christos PLTOFF Created by PLTOFF relocations. For local symbols, this
52 1.1 christos is an alternate function descriptor, and in shared libraries
53 1.1 christos requires two REL relocations. Note that this cannot be
54 1.1 christos transformed into an FPTR relocation, since it must be in
55 1.1 christos range of the GP. For dynamic symbols, this is a function
56 1.1 christos descriptor. */
57 1.1 christos
58 1.1 christos typedef struct bfd_hash_entry *(*new_hash_entry_func)
59 1.1 christos (struct bfd_hash_entry *, struct bfd_hash_table *, const char *);
60 1.1 christos
61 1.1 christos /* In dynamically (linker-) created sections, we generally need to keep track
62 1.1 christos of the place a symbol or expression got allocated to. This is done via hash
63 1.1 christos tables that store entries of the following type. */
64 1.1 christos
65 1.1 christos struct elf64_ia64_dyn_sym_info
66 1.1 christos {
67 1.1 christos /* The addend for which this entry is relevant. */
68 1.1 christos bfd_vma addend;
69 1.1 christos
70 1.1 christos bfd_vma got_offset;
71 1.1 christos bfd_vma fptr_offset;
72 1.1 christos bfd_vma pltoff_offset;
73 1.1 christos bfd_vma plt_offset;
74 1.1 christos bfd_vma plt2_offset;
75 1.1 christos
76 1.1 christos /* The symbol table entry, if any, that this was derived from. */
77 1.1 christos struct elf_link_hash_entry *h;
78 1.1 christos
79 1.1 christos /* Used to count non-got, non-plt relocations for delayed sizing
80 1.1 christos of relocation sections. */
81 1.1 christos struct elf64_ia64_dyn_reloc_entry
82 1.1 christos {
83 1.1 christos struct elf64_ia64_dyn_reloc_entry *next;
84 1.1 christos asection *srel;
85 1.1 christos int type;
86 1.1 christos int count;
87 1.1 christos } *reloc_entries;
88 1.1 christos
89 1.1 christos /* TRUE when the section contents have been updated. */
90 1.1 christos unsigned got_done : 1;
91 1.1 christos unsigned fptr_done : 1;
92 1.1 christos unsigned pltoff_done : 1;
93 1.1 christos
94 1.1 christos /* TRUE for the different kinds of linker data we want created. */
95 1.1 christos unsigned want_got : 1;
96 1.1 christos unsigned want_gotx : 1;
97 1.1 christos unsigned want_fptr : 1;
98 1.1 christos unsigned want_ltoff_fptr : 1;
99 1.1 christos unsigned want_plt : 1; /* A MIN_PLT entry. */
100 1.1 christos unsigned want_plt2 : 1; /* A FULL_PLT. */
101 1.1 christos unsigned want_pltoff : 1;
102 1.1 christos };
103 1.1 christos
104 1.1 christos struct elf64_ia64_local_hash_entry
105 1.1 christos {
106 1.1 christos int id;
107 1.1 christos unsigned int r_sym;
108 1.1 christos /* The number of elements in elf64_ia64_dyn_sym_info array. */
109 1.1 christos unsigned int count;
110 1.1 christos /* The number of sorted elements in elf64_ia64_dyn_sym_info array. */
111 1.1 christos unsigned int sorted_count;
112 1.1 christos /* The size of elf64_ia64_dyn_sym_info array. */
113 1.1 christos unsigned int size;
114 1.1 christos /* The array of elf64_ia64_dyn_sym_info. */
115 1.1 christos struct elf64_ia64_dyn_sym_info *info;
116 1.1 christos
117 1.1 christos /* TRUE if this hash entry's addends was translated for
118 1.1 christos SHF_MERGE optimization. */
119 1.1 christos unsigned sec_merge_done : 1;
120 1.1 christos };
121 1.1 christos
122 1.1 christos struct elf64_ia64_link_hash_entry
123 1.1 christos {
124 1.1 christos struct elf_link_hash_entry root;
125 1.1 christos
126 1.1 christos /* Set if this symbol is defined in a shared library.
127 1.1 christos We can't use root.u.def.section->owner as the symbol is an absolute
128 1.1 christos symbol. */
129 1.1 christos bfd *shl;
130 1.1 christos
131 1.1 christos /* The number of elements in elf64_ia64_dyn_sym_info array. */
132 1.1 christos unsigned int count;
133 1.1 christos /* The number of sorted elements in elf64_ia64_dyn_sym_info array. */
134 1.1 christos unsigned int sorted_count;
135 1.1 christos /* The size of elf64_ia64_dyn_sym_info array. */
136 1.1 christos unsigned int size;
137 1.1 christos /* The array of elf64_ia64_dyn_sym_info. */
138 1.1 christos struct elf64_ia64_dyn_sym_info *info;
139 1.1 christos };
140 1.1 christos
141 1.1 christos struct elf64_ia64_link_hash_table
142 1.1 christos {
143 1.1 christos /* The main hash table. */
144 1.1 christos struct elf_link_hash_table root;
145 1.1 christos
146 1.1 christos asection *fptr_sec; /* Function descriptor table (or NULL). */
147 1.1 christos asection *rel_fptr_sec; /* Dynamic relocation section for same. */
148 1.1 christos asection *pltoff_sec; /* Private descriptors for plt (or NULL). */
149 1.1 christos asection *fixups_sec; /* Fixups section. */
150 1.1 christos asection *transfer_sec; /* Transfer vector section. */
151 1.1 christos asection *note_sec; /* .note section. */
152 1.1 christos
153 1.1 christos /* There are maybe R_IA64_GPREL22 relocations, including those
154 1.1 christos optimized from R_IA64_LTOFF22X, against non-SHF_IA_64_SHORT
155 1.1 christos sections. We need to record those sections so that we can choose
156 1.1 christos a proper GP to cover all R_IA64_GPREL22 relocations. */
157 1.1 christos asection *max_short_sec; /* Maximum short output section. */
158 1.1 christos bfd_vma max_short_offset; /* Maximum short offset. */
159 1.1 christos asection *min_short_sec; /* Minimum short output section. */
160 1.1 christos bfd_vma min_short_offset; /* Minimum short offset. */
161 1.1 christos
162 1.1 christos htab_t loc_hash_table;
163 1.1 christos void *loc_hash_memory;
164 1.1 christos };
165 1.1 christos
166 1.1 christos struct elf64_ia64_allocate_data
167 1.1 christos {
168 1.1 christos struct bfd_link_info *info;
169 1.1 christos bfd_size_type ofs;
170 1.1 christos };
171 1.1 christos
172 1.1 christos #define elf64_ia64_hash_table(p) \
173 1.1 christos (elf_hash_table_id ((struct elf_link_hash_table *) ((p)->hash)) \
174 1.1 christos == IA64_ELF_DATA ? ((struct elf64_ia64_link_hash_table *) ((p)->hash)) : NULL)
175 1.1 christos
176 1.1 christos struct elf64_ia64_vms_obj_tdata
177 1.1 christos {
178 1.1 christos struct elf_obj_tdata root;
179 1.1 christos
180 1.1 christos /* Ident for shared library. */
181 1.1 christos bfd_uint64_t ident;
182 1.1 christos
183 1.1 christos /* Used only during link: offset in the .fixups section for this bfd. */
184 1.1 christos bfd_vma fixups_off;
185 1.1 christos
186 1.1 christos /* Max number of shared libraries. */
187 1.1 christos unsigned int needed_count;
188 1.1 christos };
189 1.1 christos
190 1.1 christos #define elf_ia64_vms_tdata(abfd) \
191 1.1 christos ((struct elf64_ia64_vms_obj_tdata *)((abfd)->tdata.any))
192 1.1 christos #define elf_ia64_vms_ident(abfd) (elf_ia64_vms_tdata(abfd)->ident)
193 1.1 christos
194 1.1 christos struct elf64_vms_transfer
195 1.1 christos {
196 1.1 christos unsigned char size[4];
197 1.1 christos unsigned char spare[4];
198 1.1 christos unsigned char tfradr1[8];
199 1.1 christos unsigned char tfradr2[8];
200 1.1 christos unsigned char tfradr3[8];
201 1.1 christos unsigned char tfradr4[8];
202 1.1 christos unsigned char tfradr5[8];
203 1.1 christos
204 1.1 christos /* Local function descriptor for tfr3. */
205 1.1 christos unsigned char tfr3_func[8];
206 1.1 christos unsigned char tfr3_gp[8];
207 1.1 christos };
208 1.1 christos
209 1.1 christos typedef struct
210 1.1 christos {
211 1.1 christos Elf64_External_Ehdr ehdr;
212 1.1 christos unsigned char vms_needed_count[8];
213 1.1 christos } Elf64_External_VMS_Ehdr;
214 1.1 christos
215 1.1 christos static struct elf64_ia64_dyn_sym_info * get_dyn_sym_info
216 1.1 christos (struct elf64_ia64_link_hash_table *,
217 1.1 christos struct elf_link_hash_entry *,
218 1.1 christos bfd *, const Elf_Internal_Rela *, bfd_boolean);
219 1.1 christos static bfd_boolean elf64_ia64_dynamic_symbol_p
220 1.1 christos (struct elf_link_hash_entry *);
221 1.1 christos static bfd_boolean elf64_ia64_choose_gp
222 1.1 christos (bfd *, struct bfd_link_info *, bfd_boolean);
223 1.1 christos static void elf64_ia64_dyn_sym_traverse
224 1.1 christos (struct elf64_ia64_link_hash_table *,
225 1.1 christos bfd_boolean (*) (struct elf64_ia64_dyn_sym_info *, void *),
226 1.1 christos void *);
227 1.1 christos static bfd_boolean allocate_global_data_got
228 1.1 christos (struct elf64_ia64_dyn_sym_info *, void *);
229 1.1 christos static bfd_boolean allocate_global_fptr_got
230 1.1 christos (struct elf64_ia64_dyn_sym_info *, void *);
231 1.1 christos static bfd_boolean allocate_local_got
232 1.1 christos (struct elf64_ia64_dyn_sym_info *, void *);
233 1.1 christos static bfd_boolean allocate_dynrel_entries
234 1.1 christos (struct elf64_ia64_dyn_sym_info *, void *);
235 1.1 christos static asection *get_pltoff
236 1.1 christos (bfd *, struct elf64_ia64_link_hash_table *);
237 1.1 christos static asection *get_got
238 1.1 christos (bfd *, struct elf64_ia64_link_hash_table *);
239 1.1 christos
240 1.1 christos
241 1.1 christos /* Given a ELF reloc, return the matching HOWTO structure. */
242 1.1 christos
243 1.1.1.5 christos static bfd_boolean
244 1.1 christos elf64_ia64_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED,
245 1.1 christos arelent *bfd_reloc,
246 1.1 christos Elf_Internal_Rela *elf_reloc)
247 1.1 christos {
248 1.1.1.5 christos unsigned int r_type = ELF32_R_TYPE (elf_reloc->r_info);
249 1.1.1.5 christos
250 1.1.1.5 christos bfd_reloc->howto = ia64_elf_lookup_howto (r_type);
251 1.1.1.5 christos if (bfd_reloc->howto == NULL)
252 1.1.1.5 christos {
253 1.1.1.5 christos /* xgettext:c-format */
254 1.1.1.5 christos _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
255 1.1.1.5 christos abfd, r_type);
256 1.1.1.5 christos bfd_set_error (bfd_error_bad_value);
257 1.1.1.5 christos return FALSE;
258 1.1.1.5 christos }
259 1.1.1.5 christos
260 1.1.1.5 christos return TRUE;
261 1.1 christos }
262 1.1 christos
263 1.1 christos
264 1.1 christos #define PLT_FULL_ENTRY_SIZE (2 * 16)
265 1.1 christos
266 1.1 christos static const bfd_byte plt_full_entry[PLT_FULL_ENTRY_SIZE] =
267 1.1 christos {
268 1.1.1.4 christos 0x0b, 0x78, 0x00, 0x02, 0x00, 0x24, /* [MMI] addl r15=0,r1;; */
269 1.1.1.4 christos 0x00, 0x41, 0x3c, 0x70, 0x29, 0xc0, /* ld8.acq r16=[r15],8*/
270 1.1.1.4 christos 0x01, 0x08, 0x00, 0x84, /* mov r14=r1;; */
271 1.1.1.4 christos 0x11, 0x08, 0x00, 0x1e, 0x18, 0x10, /* [MIB] ld8 r1=[r15] */
272 1.1.1.4 christos 0x60, 0x80, 0x04, 0x80, 0x03, 0x00, /* mov b6=r16 */
273 1.1.1.4 christos 0x60, 0x00, 0x80, 0x00 /* br.few b6;; */
274 1.1 christos };
275 1.1 christos
276 1.1 christos static const bfd_byte oor_brl[16] =
277 1.1 christos {
278 1.1.1.4 christos 0x05, 0x00, 0x00, 0x00, 0x01, 0x00, /* [MLX] nop.m 0 */
279 1.1.1.4 christos 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* brl.sptk.few tgt;;*/
280 1.1 christos 0x00, 0x00, 0x00, 0xc0
281 1.1 christos };
282 1.1 christos
283 1.1 christos
284 1.1 christos /* These functions do relaxation for IA-64 ELF. */
285 1.1 christos
286 1.1 christos /* Rename some of the generic section flags to better document how they
287 1.1 christos are used here. */
288 1.1 christos #define skip_relax_pass_0 sec_flg0
289 1.1 christos #define skip_relax_pass_1 sec_flg1
290 1.1 christos
291 1.1 christos static void
292 1.1 christos elf64_ia64_update_short_info (asection *sec, bfd_vma offset,
293 1.1 christos struct elf64_ia64_link_hash_table *ia64_info)
294 1.1 christos {
295 1.1 christos /* Skip ABS and SHF_IA_64_SHORT sections. */
296 1.1 christos if (sec == bfd_abs_section_ptr
297 1.1 christos || (sec->flags & SEC_SMALL_DATA) != 0)
298 1.1 christos return;
299 1.1 christos
300 1.1 christos if (!ia64_info->min_short_sec)
301 1.1 christos {
302 1.1 christos ia64_info->max_short_sec = sec;
303 1.1 christos ia64_info->max_short_offset = offset;
304 1.1 christos ia64_info->min_short_sec = sec;
305 1.1 christos ia64_info->min_short_offset = offset;
306 1.1 christos }
307 1.1 christos else if (sec == ia64_info->max_short_sec
308 1.1 christos && offset > ia64_info->max_short_offset)
309 1.1 christos ia64_info->max_short_offset = offset;
310 1.1 christos else if (sec == ia64_info->min_short_sec
311 1.1 christos && offset < ia64_info->min_short_offset)
312 1.1 christos ia64_info->min_short_offset = offset;
313 1.1 christos else if (sec->output_section->vma
314 1.1 christos > ia64_info->max_short_sec->vma)
315 1.1 christos {
316 1.1 christos ia64_info->max_short_sec = sec;
317 1.1 christos ia64_info->max_short_offset = offset;
318 1.1 christos }
319 1.1 christos else if (sec->output_section->vma
320 1.1 christos < ia64_info->min_short_sec->vma)
321 1.1 christos {
322 1.1 christos ia64_info->min_short_sec = sec;
323 1.1 christos ia64_info->min_short_offset = offset;
324 1.1 christos }
325 1.1 christos }
326 1.1 christos
327 1.1 christos /* Use a two passes algorithm. In the first pass, branches are relaxed
328 1.1 christos (which may increase the size of the section). In the second pass,
329 1.1 christos the other relaxations are done.
330 1.1 christos */
331 1.1 christos
332 1.1 christos static bfd_boolean
333 1.1 christos elf64_ia64_relax_section (bfd *abfd, asection *sec,
334 1.1 christos struct bfd_link_info *link_info,
335 1.1 christos bfd_boolean *again)
336 1.1 christos {
337 1.1 christos struct one_fixup
338 1.1 christos {
339 1.1 christos struct one_fixup *next;
340 1.1 christos asection *tsec;
341 1.1 christos bfd_vma toff;
342 1.1 christos bfd_vma trampoff;
343 1.1 christos };
344 1.1 christos
345 1.1 christos Elf_Internal_Shdr *symtab_hdr;
346 1.1 christos Elf_Internal_Rela *internal_relocs;
347 1.1 christos Elf_Internal_Rela *irel, *irelend;
348 1.1 christos bfd_byte *contents;
349 1.1 christos Elf_Internal_Sym *isymbuf = NULL;
350 1.1 christos struct elf64_ia64_link_hash_table *ia64_info;
351 1.1 christos struct one_fixup *fixups = NULL;
352 1.1 christos bfd_boolean changed_contents = FALSE;
353 1.1 christos bfd_boolean changed_relocs = FALSE;
354 1.1 christos bfd_boolean skip_relax_pass_0 = TRUE;
355 1.1 christos bfd_boolean skip_relax_pass_1 = TRUE;
356 1.1 christos bfd_vma gp = 0;
357 1.1 christos
358 1.1 christos /* Assume we're not going to change any sizes, and we'll only need
359 1.1 christos one pass. */
360 1.1 christos *again = FALSE;
361 1.1 christos
362 1.1.1.2 christos if (bfd_link_relocatable (link_info))
363 1.1 christos (*link_info->callbacks->einfo)
364 1.1 christos (_("%P%F: --relax and -r may not be used together\n"));
365 1.1 christos
366 1.1 christos /* Don't even try to relax for non-ELF outputs. */
367 1.1 christos if (!is_elf_hash_table (link_info->hash))
368 1.1 christos return FALSE;
369 1.1 christos
370 1.1 christos /* Nothing to do if there are no relocations or there is no need for
371 1.1 christos the current pass. */
372 1.1 christos if ((sec->flags & SEC_RELOC) == 0
373 1.1 christos || sec->reloc_count == 0
374 1.1 christos || (link_info->relax_pass == 0 && sec->skip_relax_pass_0)
375 1.1 christos || (link_info->relax_pass == 1 && sec->skip_relax_pass_1))
376 1.1 christos return TRUE;
377 1.1 christos
378 1.1 christos ia64_info = elf64_ia64_hash_table (link_info);
379 1.1 christos if (ia64_info == NULL)
380 1.1 christos return FALSE;
381 1.1 christos
382 1.1 christos symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
383 1.1 christos
384 1.1 christos /* Load the relocations for this section. */
385 1.1 christos internal_relocs = (_bfd_elf_link_read_relocs
386 1.1 christos (abfd, sec, NULL, (Elf_Internal_Rela *) NULL,
387 1.1 christos link_info->keep_memory));
388 1.1 christos if (internal_relocs == NULL)
389 1.1 christos return FALSE;
390 1.1 christos
391 1.1 christos irelend = internal_relocs + sec->reloc_count;
392 1.1 christos
393 1.1 christos /* Get the section contents. */
394 1.1 christos if (elf_section_data (sec)->this_hdr.contents != NULL)
395 1.1 christos contents = elf_section_data (sec)->this_hdr.contents;
396 1.1 christos else
397 1.1 christos {
398 1.1 christos if (!bfd_malloc_and_get_section (abfd, sec, &contents))
399 1.1 christos goto error_return;
400 1.1 christos }
401 1.1 christos
402 1.1 christos for (irel = internal_relocs; irel < irelend; irel++)
403 1.1 christos {
404 1.1 christos unsigned long r_type = ELF64_R_TYPE (irel->r_info);
405 1.1 christos bfd_vma symaddr, reladdr, trampoff, toff, roff;
406 1.1 christos asection *tsec;
407 1.1 christos struct one_fixup *f;
408 1.1 christos bfd_size_type amt;
409 1.1 christos bfd_boolean is_branch;
410 1.1 christos struct elf64_ia64_dyn_sym_info *dyn_i;
411 1.1 christos
412 1.1 christos switch (r_type)
413 1.1 christos {
414 1.1 christos case R_IA64_PCREL21B:
415 1.1 christos case R_IA64_PCREL21BI:
416 1.1 christos case R_IA64_PCREL21M:
417 1.1 christos case R_IA64_PCREL21F:
418 1.1 christos /* In pass 1, all br relaxations are done. We can skip it. */
419 1.1 christos if (link_info->relax_pass == 1)
420 1.1 christos continue;
421 1.1 christos skip_relax_pass_0 = FALSE;
422 1.1 christos is_branch = TRUE;
423 1.1 christos break;
424 1.1 christos
425 1.1 christos case R_IA64_PCREL60B:
426 1.1 christos /* We can't optimize brl to br in pass 0 since br relaxations
427 1.1 christos will increase the code size. Defer it to pass 1. */
428 1.1 christos if (link_info->relax_pass == 0)
429 1.1 christos {
430 1.1 christos skip_relax_pass_1 = FALSE;
431 1.1 christos continue;
432 1.1 christos }
433 1.1 christos is_branch = TRUE;
434 1.1 christos break;
435 1.1 christos
436 1.1 christos case R_IA64_GPREL22:
437 1.1 christos /* Update max_short_sec/min_short_sec. */
438 1.1 christos
439 1.1 christos case R_IA64_LTOFF22X:
440 1.1 christos case R_IA64_LDXMOV:
441 1.1 christos /* We can't relax ldx/mov in pass 0 since br relaxations will
442 1.1 christos increase the code size. Defer it to pass 1. */
443 1.1 christos if (link_info->relax_pass == 0)
444 1.1 christos {
445 1.1 christos skip_relax_pass_1 = FALSE;
446 1.1 christos continue;
447 1.1 christos }
448 1.1 christos is_branch = FALSE;
449 1.1 christos break;
450 1.1 christos
451 1.1 christos default:
452 1.1 christos continue;
453 1.1 christos }
454 1.1 christos
455 1.1 christos /* Get the value of the symbol referred to by the reloc. */
456 1.1 christos if (ELF64_R_SYM (irel->r_info) < symtab_hdr->sh_info)
457 1.1 christos {
458 1.1 christos /* A local symbol. */
459 1.1 christos Elf_Internal_Sym *isym;
460 1.1 christos
461 1.1 christos /* Read this BFD's local symbols. */
462 1.1 christos if (isymbuf == NULL)
463 1.1 christos {
464 1.1 christos isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
465 1.1 christos if (isymbuf == NULL)
466 1.1 christos isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr,
467 1.1 christos symtab_hdr->sh_info, 0,
468 1.1 christos NULL, NULL, NULL);
469 1.1 christos if (isymbuf == 0)
470 1.1 christos goto error_return;
471 1.1 christos }
472 1.1 christos
473 1.1 christos isym = isymbuf + ELF64_R_SYM (irel->r_info);
474 1.1 christos if (isym->st_shndx == SHN_UNDEF)
475 1.1 christos continue; /* We can't do anything with undefined symbols. */
476 1.1 christos else if (isym->st_shndx == SHN_ABS)
477 1.1 christos tsec = bfd_abs_section_ptr;
478 1.1 christos else if (isym->st_shndx == SHN_COMMON)
479 1.1 christos tsec = bfd_com_section_ptr;
480 1.1 christos else if (isym->st_shndx == SHN_IA_64_ANSI_COMMON)
481 1.1 christos tsec = bfd_com_section_ptr;
482 1.1 christos else
483 1.1 christos tsec = bfd_section_from_elf_index (abfd, isym->st_shndx);
484 1.1 christos
485 1.1 christos toff = isym->st_value;
486 1.1 christos dyn_i = get_dyn_sym_info (ia64_info, NULL, abfd, irel, FALSE);
487 1.1 christos }
488 1.1 christos else
489 1.1 christos {
490 1.1 christos unsigned long indx;
491 1.1 christos struct elf_link_hash_entry *h;
492 1.1 christos
493 1.1 christos indx = ELF64_R_SYM (irel->r_info) - symtab_hdr->sh_info;
494 1.1 christos h = elf_sym_hashes (abfd)[indx];
495 1.1 christos BFD_ASSERT (h != NULL);
496 1.1 christos
497 1.1 christos while (h->root.type == bfd_link_hash_indirect
498 1.1 christos || h->root.type == bfd_link_hash_warning)
499 1.1 christos h = (struct elf_link_hash_entry *) h->root.u.i.link;
500 1.1 christos
501 1.1 christos dyn_i = get_dyn_sym_info (ia64_info, h, abfd, irel, FALSE);
502 1.1 christos
503 1.1 christos /* For branches to dynamic symbols, we're interested instead
504 1.1 christos in a branch to the PLT entry. */
505 1.1 christos if (is_branch && dyn_i && dyn_i->want_plt2)
506 1.1 christos {
507 1.1 christos /* Internal branches shouldn't be sent to the PLT.
508 1.1 christos Leave this for now and we'll give an error later. */
509 1.1 christos if (r_type != R_IA64_PCREL21B)
510 1.1 christos continue;
511 1.1 christos
512 1.1 christos tsec = ia64_info->root.splt;
513 1.1 christos toff = dyn_i->plt2_offset;
514 1.1 christos BFD_ASSERT (irel->r_addend == 0);
515 1.1 christos }
516 1.1 christos
517 1.1 christos /* Can't do anything else with dynamic symbols. */
518 1.1 christos else if (elf64_ia64_dynamic_symbol_p (h))
519 1.1 christos continue;
520 1.1 christos
521 1.1 christos else
522 1.1 christos {
523 1.1 christos /* We can't do anything with undefined symbols. */
524 1.1 christos if (h->root.type == bfd_link_hash_undefined
525 1.1 christos || h->root.type == bfd_link_hash_undefweak)
526 1.1 christos continue;
527 1.1 christos
528 1.1 christos tsec = h->root.u.def.section;
529 1.1 christos toff = h->root.u.def.value;
530 1.1 christos }
531 1.1 christos }
532 1.1 christos
533 1.1 christos toff += irel->r_addend;
534 1.1 christos
535 1.1 christos symaddr = tsec->output_section->vma + tsec->output_offset + toff;
536 1.1 christos
537 1.1 christos roff = irel->r_offset;
538 1.1 christos
539 1.1 christos if (is_branch)
540 1.1 christos {
541 1.1 christos bfd_signed_vma offset;
542 1.1 christos
543 1.1 christos reladdr = (sec->output_section->vma
544 1.1 christos + sec->output_offset
545 1.1 christos + roff) & (bfd_vma) -4;
546 1.1 christos
547 1.1 christos /* The .plt section is aligned at 32byte and the .text section
548 1.1 christos is aligned at 64byte. The .text section is right after the
549 1.1 christos .plt section. After the first relaxation pass, linker may
550 1.1 christos increase the gap between the .plt and .text sections up
551 1.1 christos to 32byte. We assume linker will always insert 32byte
552 1.1.1.2 christos between the .plt and .text sections after the first
553 1.1 christos relaxation pass. */
554 1.1 christos if (tsec == ia64_info->root.splt)
555 1.1 christos offset = -0x1000000 + 32;
556 1.1 christos else
557 1.1 christos offset = -0x1000000;
558 1.1 christos
559 1.1 christos /* If the branch is in range, no need to do anything. */
560 1.1 christos if ((bfd_signed_vma) (symaddr - reladdr) >= offset
561 1.1 christos && (bfd_signed_vma) (symaddr - reladdr) <= 0x0FFFFF0)
562 1.1 christos {
563 1.1 christos /* If the 60-bit branch is in 21-bit range, optimize it. */
564 1.1 christos if (r_type == R_IA64_PCREL60B)
565 1.1 christos {
566 1.1 christos ia64_elf_relax_brl (contents, roff);
567 1.1 christos
568 1.1 christos irel->r_info = ELF64_R_INFO (ELF64_R_SYM (irel->r_info),
569 1.1.1.4 christos R_IA64_PCREL21B);
570 1.1 christos
571 1.1 christos /* If the original relocation offset points to slot
572 1.1 christos 1, change it to slot 2. */
573 1.1 christos if ((irel->r_offset & 3) == 1)
574 1.1 christos irel->r_offset += 1;
575 1.1 christos }
576 1.1 christos
577 1.1 christos continue;
578 1.1 christos }
579 1.1 christos else if (r_type == R_IA64_PCREL60B)
580 1.1 christos continue;
581 1.1 christos else if (ia64_elf_relax_br (contents, roff))
582 1.1 christos {
583 1.1 christos irel->r_info = ELF64_R_INFO (ELF64_R_SYM (irel->r_info),
584 1.1.1.4 christos R_IA64_PCREL60B);
585 1.1 christos
586 1.1 christos /* Make the relocation offset point to slot 1. */
587 1.1 christos irel->r_offset = (irel->r_offset & ~((bfd_vma) 0x3)) + 1;
588 1.1 christos continue;
589 1.1 christos }
590 1.1 christos
591 1.1 christos /* We can't put a trampoline in a .init/.fini section. Issue
592 1.1 christos an error. */
593 1.1 christos if (strcmp (sec->output_section->name, ".init") == 0
594 1.1 christos || strcmp (sec->output_section->name, ".fini") == 0)
595 1.1 christos {
596 1.1.1.4 christos _bfd_error_handler
597 1.1.1.4 christos /* xgettext:c-format */
598 1.1.1.5 christos (_("%pB: can't relax br at %#" PRIx64 " in section `%pA';"
599 1.1.1.5 christos " please use brl or indirect branch"),
600 1.1.1.5 christos sec->owner, (uint64_t) roff, sec);
601 1.1 christos bfd_set_error (bfd_error_bad_value);
602 1.1 christos goto error_return;
603 1.1 christos }
604 1.1 christos
605 1.1 christos /* If the branch and target are in the same section, you've
606 1.1 christos got one honking big section and we can't help you unless
607 1.1 christos you are branching backwards. You'll get an error message
608 1.1 christos later. */
609 1.1 christos if (tsec == sec && toff > roff)
610 1.1 christos continue;
611 1.1 christos
612 1.1 christos /* Look for an existing fixup to this address. */
613 1.1 christos for (f = fixups; f ; f = f->next)
614 1.1 christos if (f->tsec == tsec && f->toff == toff)
615 1.1 christos break;
616 1.1 christos
617 1.1 christos if (f == NULL)
618 1.1 christos {
619 1.1 christos /* Two alternatives: If it's a branch to a PLT entry, we can
620 1.1 christos make a copy of the FULL_PLT entry. Otherwise, we'll have
621 1.1 christos to use a `brl' insn to get where we're going. */
622 1.1 christos
623 1.1 christos size_t size;
624 1.1 christos
625 1.1 christos if (tsec == ia64_info->root.splt)
626 1.1 christos size = sizeof (plt_full_entry);
627 1.1 christos else
628 1.1 christos size = sizeof (oor_brl);
629 1.1 christos
630 1.1 christos /* Resize the current section to make room for the new branch. */
631 1.1 christos trampoff = (sec->size + 15) & (bfd_vma) -16;
632 1.1 christos
633 1.1 christos /* If trampoline is out of range, there is nothing we
634 1.1 christos can do. */
635 1.1 christos offset = trampoff - (roff & (bfd_vma) -4);
636 1.1 christos if (offset < -0x1000000 || offset > 0x0FFFFF0)
637 1.1 christos continue;
638 1.1 christos
639 1.1 christos amt = trampoff + size;
640 1.1 christos contents = (bfd_byte *) bfd_realloc (contents, amt);
641 1.1 christos if (contents == NULL)
642 1.1 christos goto error_return;
643 1.1 christos sec->size = amt;
644 1.1 christos
645 1.1 christos if (tsec == ia64_info->root.splt)
646 1.1 christos {
647 1.1 christos memcpy (contents + trampoff, plt_full_entry, size);
648 1.1 christos
649 1.1 christos /* Hijack the old relocation for use as the PLTOFF reloc. */
650 1.1 christos irel->r_info = ELF64_R_INFO (ELF64_R_SYM (irel->r_info),
651 1.1 christos R_IA64_PLTOFF22);
652 1.1 christos irel->r_offset = trampoff;
653 1.1 christos }
654 1.1 christos else
655 1.1 christos {
656 1.1.1.4 christos memcpy (contents + trampoff, oor_brl, size);
657 1.1.1.4 christos irel->r_info = ELF64_R_INFO (ELF64_R_SYM (irel->r_info),
658 1.1.1.4 christos R_IA64_PCREL60B);
659 1.1.1.4 christos irel->r_offset = trampoff + 2;
660 1.1 christos }
661 1.1 christos
662 1.1 christos /* Record the fixup so we don't do it again this section. */
663 1.1 christos f = (struct one_fixup *)
664 1.1 christos bfd_malloc ((bfd_size_type) sizeof (*f));
665 1.1 christos f->next = fixups;
666 1.1 christos f->tsec = tsec;
667 1.1 christos f->toff = toff;
668 1.1 christos f->trampoff = trampoff;
669 1.1 christos fixups = f;
670 1.1 christos }
671 1.1 christos else
672 1.1 christos {
673 1.1 christos /* If trampoline is out of range, there is nothing we
674 1.1 christos can do. */
675 1.1 christos offset = f->trampoff - (roff & (bfd_vma) -4);
676 1.1 christos if (offset < -0x1000000 || offset > 0x0FFFFF0)
677 1.1 christos continue;
678 1.1 christos
679 1.1 christos /* Nop out the reloc, since we're finalizing things here. */
680 1.1 christos irel->r_info = ELF64_R_INFO (0, R_IA64_NONE);
681 1.1 christos }
682 1.1 christos
683 1.1 christos /* Fix up the existing branch to hit the trampoline. */
684 1.1 christos if (ia64_elf_install_value (contents + roff, offset, r_type)
685 1.1 christos != bfd_reloc_ok)
686 1.1 christos goto error_return;
687 1.1 christos
688 1.1 christos changed_contents = TRUE;
689 1.1 christos changed_relocs = TRUE;
690 1.1 christos }
691 1.1 christos else
692 1.1 christos {
693 1.1 christos /* Fetch the gp. */
694 1.1 christos if (gp == 0)
695 1.1 christos {
696 1.1 christos bfd *obfd = sec->output_section->owner;
697 1.1 christos gp = _bfd_get_gp_value (obfd);
698 1.1 christos if (gp == 0)
699 1.1 christos {
700 1.1 christos if (!elf64_ia64_choose_gp (obfd, link_info, FALSE))
701 1.1 christos goto error_return;
702 1.1 christos gp = _bfd_get_gp_value (obfd);
703 1.1 christos }
704 1.1 christos }
705 1.1 christos
706 1.1 christos /* If the data is out of range, do nothing. */
707 1.1 christos if ((bfd_signed_vma) (symaddr - gp) >= 0x200000
708 1.1 christos ||(bfd_signed_vma) (symaddr - gp) < -0x200000)
709 1.1 christos continue;
710 1.1 christos
711 1.1 christos if (r_type == R_IA64_GPREL22)
712 1.1 christos elf64_ia64_update_short_info (tsec->output_section,
713 1.1 christos tsec->output_offset + toff,
714 1.1 christos ia64_info);
715 1.1 christos else if (r_type == R_IA64_LTOFF22X)
716 1.1 christos {
717 1.1.1.4 christos /* Can't deal yet correctly with ABS symbols. */
718 1.1.1.4 christos if (bfd_is_abs_section (tsec))
719 1.1.1.4 christos continue;
720 1.1 christos
721 1.1 christos irel->r_info = ELF64_R_INFO (ELF64_R_SYM (irel->r_info),
722 1.1 christos R_IA64_GPREL22);
723 1.1 christos changed_relocs = TRUE;
724 1.1 christos
725 1.1 christos elf64_ia64_update_short_info (tsec->output_section,
726 1.1 christos tsec->output_offset + toff,
727 1.1 christos ia64_info);
728 1.1 christos }
729 1.1 christos else
730 1.1 christos {
731 1.1 christos ia64_elf_relax_ldxmov (contents, roff);
732 1.1 christos irel->r_info = ELF64_R_INFO (0, R_IA64_NONE);
733 1.1 christos changed_contents = TRUE;
734 1.1 christos changed_relocs = TRUE;
735 1.1 christos }
736 1.1 christos }
737 1.1 christos }
738 1.1 christos
739 1.1 christos /* ??? If we created fixups, this may push the code segment large
740 1.1 christos enough that the data segment moves, which will change the GP.
741 1.1 christos Reset the GP so that we re-calculate next round. We need to
742 1.1 christos do this at the _beginning_ of the next round; now will not do. */
743 1.1 christos
744 1.1 christos /* Clean up and go home. */
745 1.1 christos while (fixups)
746 1.1 christos {
747 1.1 christos struct one_fixup *f = fixups;
748 1.1 christos fixups = fixups->next;
749 1.1 christos free (f);
750 1.1 christos }
751 1.1 christos
752 1.1 christos if (isymbuf != NULL
753 1.1 christos && symtab_hdr->contents != (unsigned char *) isymbuf)
754 1.1 christos {
755 1.1 christos if (! link_info->keep_memory)
756 1.1 christos free (isymbuf);
757 1.1 christos else
758 1.1 christos {
759 1.1 christos /* Cache the symbols for elf_link_input_bfd. */
760 1.1 christos symtab_hdr->contents = (unsigned char *) isymbuf;
761 1.1 christos }
762 1.1 christos }
763 1.1 christos
764 1.1 christos if (contents != NULL
765 1.1 christos && elf_section_data (sec)->this_hdr.contents != contents)
766 1.1 christos {
767 1.1 christos if (!changed_contents && !link_info->keep_memory)
768 1.1 christos free (contents);
769 1.1 christos else
770 1.1 christos {
771 1.1 christos /* Cache the section contents for elf_link_input_bfd. */
772 1.1 christos elf_section_data (sec)->this_hdr.contents = contents;
773 1.1 christos }
774 1.1 christos }
775 1.1 christos
776 1.1 christos if (elf_section_data (sec)->relocs != internal_relocs)
777 1.1 christos {
778 1.1 christos if (!changed_relocs)
779 1.1 christos free (internal_relocs);
780 1.1 christos else
781 1.1 christos elf_section_data (sec)->relocs = internal_relocs;
782 1.1 christos }
783 1.1 christos
784 1.1 christos if (link_info->relax_pass == 0)
785 1.1 christos {
786 1.1 christos /* Pass 0 is only needed to relax br. */
787 1.1 christos sec->skip_relax_pass_0 = skip_relax_pass_0;
788 1.1 christos sec->skip_relax_pass_1 = skip_relax_pass_1;
789 1.1 christos }
790 1.1 christos
791 1.1 christos *again = changed_contents || changed_relocs;
792 1.1 christos return TRUE;
793 1.1 christos
794 1.1 christos error_return:
795 1.1 christos if (isymbuf != NULL && (unsigned char *) isymbuf != symtab_hdr->contents)
796 1.1 christos free (isymbuf);
797 1.1 christos if (contents != NULL
798 1.1 christos && elf_section_data (sec)->this_hdr.contents != contents)
799 1.1 christos free (contents);
800 1.1 christos if (internal_relocs != NULL
801 1.1 christos && elf_section_data (sec)->relocs != internal_relocs)
802 1.1 christos free (internal_relocs);
803 1.1 christos return FALSE;
804 1.1 christos }
805 1.1 christos #undef skip_relax_pass_0
806 1.1 christos #undef skip_relax_pass_1
807 1.1 christos
808 1.1 christos /* Return TRUE if NAME is an unwind table section name. */
809 1.1 christos
810 1.1 christos static inline bfd_boolean
811 1.1 christos is_unwind_section_name (bfd *abfd ATTRIBUTE_UNUSED, const char *name)
812 1.1 christos {
813 1.1 christos return ((CONST_STRNEQ (name, ELF_STRING_ia64_unwind)
814 1.1 christos && ! CONST_STRNEQ (name, ELF_STRING_ia64_unwind_info))
815 1.1 christos || CONST_STRNEQ (name, ELF_STRING_ia64_unwind_once));
816 1.1 christos }
817 1.1 christos
818 1.1 christos
819 1.1 christos /* Convert IA-64 specific section flags to bfd internal section flags. */
820 1.1 christos
821 1.1 christos /* ??? There is no bfd internal flag equivalent to the SHF_IA_64_NORECOV
822 1.1 christos flag. */
823 1.1 christos
824 1.1 christos static bfd_boolean
825 1.1 christos elf64_ia64_section_flags (flagword *flags,
826 1.1 christos const Elf_Internal_Shdr *hdr)
827 1.1 christos {
828 1.1 christos if (hdr->sh_flags & SHF_IA_64_SHORT)
829 1.1 christos *flags |= SEC_SMALL_DATA;
830 1.1 christos
831 1.1 christos return TRUE;
832 1.1 christos }
833 1.1 christos
834 1.1 christos /* Set the correct type for an IA-64 ELF section. We do this by the
835 1.1 christos section name, which is a hack, but ought to work. */
836 1.1 christos
837 1.1 christos static bfd_boolean
838 1.1 christos elf64_ia64_fake_sections (bfd *abfd, Elf_Internal_Shdr *hdr,
839 1.1 christos asection *sec)
840 1.1 christos {
841 1.1 christos const char *name;
842 1.1 christos
843 1.1.1.6 christos name = bfd_section_name (sec);
844 1.1 christos
845 1.1 christos if (is_unwind_section_name (abfd, name))
846 1.1 christos {
847 1.1 christos /* We don't have the sections numbered at this point, so sh_info
848 1.1 christos is set later, in elf64_ia64_final_write_processing. */
849 1.1 christos hdr->sh_type = SHT_IA_64_UNWIND;
850 1.1 christos hdr->sh_flags |= SHF_LINK_ORDER;
851 1.1 christos }
852 1.1 christos else if (strcmp (name, ELF_STRING_ia64_archext) == 0)
853 1.1 christos hdr->sh_type = SHT_IA_64_EXT;
854 1.1 christos
855 1.1 christos if (sec->flags & SEC_SMALL_DATA)
856 1.1 christos hdr->sh_flags |= SHF_IA_64_SHORT;
857 1.1 christos
858 1.1 christos return TRUE;
859 1.1 christos }
860 1.1 christos
861 1.1 christos /* Hook called by the linker routine which adds symbols from an object
862 1.1 christos file. We use it to put .comm items in .sbss, and not .bss. */
863 1.1 christos
864 1.1 christos static bfd_boolean
865 1.1 christos elf64_ia64_add_symbol_hook (bfd *abfd,
866 1.1 christos struct bfd_link_info *info,
867 1.1 christos Elf_Internal_Sym *sym,
868 1.1 christos const char **namep ATTRIBUTE_UNUSED,
869 1.1 christos flagword *flagsp ATTRIBUTE_UNUSED,
870 1.1 christos asection **secp,
871 1.1 christos bfd_vma *valp)
872 1.1 christos {
873 1.1 christos if (sym->st_shndx == SHN_COMMON
874 1.1.1.2 christos && !bfd_link_relocatable (info)
875 1.1 christos && sym->st_size <= elf_gp_size (abfd))
876 1.1 christos {
877 1.1 christos /* Common symbols less than or equal to -G nn bytes are
878 1.1 christos automatically put into .sbss. */
879 1.1 christos
880 1.1 christos asection *scomm = bfd_get_section_by_name (abfd, ".scommon");
881 1.1 christos
882 1.1 christos if (scomm == NULL)
883 1.1 christos {
884 1.1 christos scomm = bfd_make_section_with_flags (abfd, ".scommon",
885 1.1 christos (SEC_ALLOC
886 1.1 christos | SEC_IS_COMMON
887 1.1 christos | SEC_LINKER_CREATED));
888 1.1 christos if (scomm == NULL)
889 1.1 christos return FALSE;
890 1.1 christos }
891 1.1 christos
892 1.1 christos *secp = scomm;
893 1.1 christos *valp = sym->st_size;
894 1.1 christos }
895 1.1 christos
896 1.1 christos return TRUE;
897 1.1 christos }
898 1.1 christos
899 1.1 christos /* According to the Tahoe assembler spec, all labels starting with a
900 1.1 christos '.' are local. */
901 1.1 christos
902 1.1 christos static bfd_boolean
903 1.1 christos elf64_ia64_is_local_label_name (bfd *abfd ATTRIBUTE_UNUSED,
904 1.1 christos const char *name)
905 1.1 christos {
906 1.1 christos return name[0] == '.';
907 1.1 christos }
908 1.1 christos
909 1.1 christos /* Should we do dynamic things to this symbol? */
910 1.1 christos
911 1.1 christos static bfd_boolean
912 1.1 christos elf64_ia64_dynamic_symbol_p (struct elf_link_hash_entry *h)
913 1.1 christos {
914 1.1 christos return h != NULL && h->def_dynamic;
915 1.1 christos }
916 1.1 christos
917 1.1 christos static struct bfd_hash_entry*
918 1.1 christos elf64_ia64_new_elf_hash_entry (struct bfd_hash_entry *entry,
919 1.1 christos struct bfd_hash_table *table,
920 1.1 christos const char *string)
921 1.1 christos {
922 1.1 christos struct elf64_ia64_link_hash_entry *ret;
923 1.1 christos ret = (struct elf64_ia64_link_hash_entry *) entry;
924 1.1 christos
925 1.1 christos /* Allocate the structure if it has not already been allocated by a
926 1.1 christos subclass. */
927 1.1 christos if (!ret)
928 1.1 christos ret = bfd_hash_allocate (table, sizeof (*ret));
929 1.1 christos
930 1.1 christos if (!ret)
931 1.1 christos return 0;
932 1.1 christos
933 1.1 christos /* Call the allocation method of the superclass. */
934 1.1 christos ret = ((struct elf64_ia64_link_hash_entry *)
935 1.1 christos _bfd_elf_link_hash_newfunc ((struct bfd_hash_entry *) ret,
936 1.1 christos table, string));
937 1.1 christos
938 1.1 christos ret->info = NULL;
939 1.1 christos ret->count = 0;
940 1.1 christos ret->sorted_count = 0;
941 1.1 christos ret->size = 0;
942 1.1 christos return (struct bfd_hash_entry *) ret;
943 1.1 christos }
944 1.1 christos
945 1.1 christos static void
946 1.1 christos elf64_ia64_hash_hide_symbol (struct bfd_link_info *info,
947 1.1 christos struct elf_link_hash_entry *xh,
948 1.1 christos bfd_boolean force_local)
949 1.1 christos {
950 1.1 christos struct elf64_ia64_link_hash_entry *h;
951 1.1 christos struct elf64_ia64_dyn_sym_info *dyn_i;
952 1.1 christos unsigned int count;
953 1.1 christos
954 1.1 christos h = (struct elf64_ia64_link_hash_entry *)xh;
955 1.1 christos
956 1.1 christos _bfd_elf_link_hash_hide_symbol (info, &h->root, force_local);
957 1.1 christos
958 1.1 christos for (count = h->count, dyn_i = h->info;
959 1.1 christos count != 0;
960 1.1 christos count--, dyn_i++)
961 1.1 christos {
962 1.1 christos dyn_i->want_plt2 = 0;
963 1.1 christos dyn_i->want_plt = 0;
964 1.1 christos }
965 1.1 christos }
966 1.1 christos
967 1.1 christos /* Compute a hash of a local hash entry. */
968 1.1 christos
969 1.1 christos static hashval_t
970 1.1 christos elf64_ia64_local_htab_hash (const void *ptr)
971 1.1 christos {
972 1.1 christos struct elf64_ia64_local_hash_entry *entry
973 1.1 christos = (struct elf64_ia64_local_hash_entry *) ptr;
974 1.1 christos
975 1.1 christos return ELF_LOCAL_SYMBOL_HASH (entry->id, entry->r_sym);
976 1.1 christos }
977 1.1 christos
978 1.1 christos /* Compare local hash entries. */
979 1.1 christos
980 1.1 christos static int
981 1.1 christos elf64_ia64_local_htab_eq (const void *ptr1, const void *ptr2)
982 1.1 christos {
983 1.1 christos struct elf64_ia64_local_hash_entry *entry1
984 1.1 christos = (struct elf64_ia64_local_hash_entry *) ptr1;
985 1.1 christos struct elf64_ia64_local_hash_entry *entry2
986 1.1 christos = (struct elf64_ia64_local_hash_entry *) ptr2;
987 1.1 christos
988 1.1 christos return entry1->id == entry2->id && entry1->r_sym == entry2->r_sym;
989 1.1 christos }
990 1.1 christos
991 1.1 christos /* Free the global elf64_ia64_dyn_sym_info array. */
992 1.1 christos
993 1.1 christos static bfd_boolean
994 1.1 christos elf64_ia64_global_dyn_info_free (void **xentry,
995 1.1 christos void * unused ATTRIBUTE_UNUSED)
996 1.1 christos {
997 1.1 christos struct elf64_ia64_link_hash_entry *entry
998 1.1 christos = (struct elf64_ia64_link_hash_entry *) xentry;
999 1.1 christos
1000 1.1 christos if (entry->root.root.type == bfd_link_hash_warning)
1001 1.1 christos entry = (struct elf64_ia64_link_hash_entry *) entry->root.root.u.i.link;
1002 1.1 christos
1003 1.1 christos if (entry->info)
1004 1.1 christos {
1005 1.1 christos free (entry->info);
1006 1.1 christos entry->info = NULL;
1007 1.1 christos entry->count = 0;
1008 1.1 christos entry->sorted_count = 0;
1009 1.1 christos entry->size = 0;
1010 1.1 christos }
1011 1.1 christos
1012 1.1 christos return TRUE;
1013 1.1 christos }
1014 1.1 christos
1015 1.1 christos /* Free the local elf64_ia64_dyn_sym_info array. */
1016 1.1 christos
1017 1.1 christos static bfd_boolean
1018 1.1 christos elf64_ia64_local_dyn_info_free (void **slot,
1019 1.1 christos void * unused ATTRIBUTE_UNUSED)
1020 1.1 christos {
1021 1.1 christos struct elf64_ia64_local_hash_entry *entry
1022 1.1 christos = (struct elf64_ia64_local_hash_entry *) *slot;
1023 1.1 christos
1024 1.1 christos if (entry->info)
1025 1.1 christos {
1026 1.1 christos free (entry->info);
1027 1.1 christos entry->info = NULL;
1028 1.1 christos entry->count = 0;
1029 1.1 christos entry->sorted_count = 0;
1030 1.1 christos entry->size = 0;
1031 1.1 christos }
1032 1.1 christos
1033 1.1 christos return TRUE;
1034 1.1 christos }
1035 1.1 christos
1036 1.1 christos /* Destroy IA-64 linker hash table. */
1037 1.1 christos
1038 1.1 christos static void
1039 1.1.1.2 christos elf64_ia64_link_hash_table_free (bfd *obfd)
1040 1.1 christos {
1041 1.1 christos struct elf64_ia64_link_hash_table *ia64_info
1042 1.1.1.2 christos = (struct elf64_ia64_link_hash_table *) obfd->link.hash;
1043 1.1 christos if (ia64_info->loc_hash_table)
1044 1.1 christos {
1045 1.1 christos htab_traverse (ia64_info->loc_hash_table,
1046 1.1 christos elf64_ia64_local_dyn_info_free, NULL);
1047 1.1 christos htab_delete (ia64_info->loc_hash_table);
1048 1.1 christos }
1049 1.1 christos if (ia64_info->loc_hash_memory)
1050 1.1 christos objalloc_free ((struct objalloc *) ia64_info->loc_hash_memory);
1051 1.1 christos elf_link_hash_traverse (&ia64_info->root,
1052 1.1 christos elf64_ia64_global_dyn_info_free, NULL);
1053 1.1.1.2 christos _bfd_elf_link_hash_table_free (obfd);
1054 1.1.1.2 christos }
1055 1.1.1.2 christos
1056 1.1.1.2 christos /* Create the derived linker hash table. The IA-64 ELF port uses this
1057 1.1.1.2 christos derived hash table to keep information specific to the IA-64 ElF
1058 1.1.1.2 christos linker (without using static variables). */
1059 1.1.1.2 christos
1060 1.1.1.2 christos static struct bfd_link_hash_table *
1061 1.1.1.2 christos elf64_ia64_hash_table_create (bfd *abfd)
1062 1.1.1.2 christos {
1063 1.1.1.2 christos struct elf64_ia64_link_hash_table *ret;
1064 1.1.1.2 christos
1065 1.1.1.2 christos ret = bfd_zmalloc ((bfd_size_type) sizeof (*ret));
1066 1.1.1.2 christos if (!ret)
1067 1.1.1.2 christos return NULL;
1068 1.1.1.2 christos
1069 1.1.1.2 christos if (!_bfd_elf_link_hash_table_init (&ret->root, abfd,
1070 1.1.1.2 christos elf64_ia64_new_elf_hash_entry,
1071 1.1.1.2 christos sizeof (struct elf64_ia64_link_hash_entry),
1072 1.1.1.2 christos IA64_ELF_DATA))
1073 1.1.1.2 christos {
1074 1.1.1.2 christos free (ret);
1075 1.1.1.2 christos return NULL;
1076 1.1.1.2 christos }
1077 1.1.1.2 christos
1078 1.1.1.2 christos ret->loc_hash_table = htab_try_create (1024, elf64_ia64_local_htab_hash,
1079 1.1.1.2 christos elf64_ia64_local_htab_eq, NULL);
1080 1.1.1.2 christos ret->loc_hash_memory = objalloc_create ();
1081 1.1.1.2 christos if (!ret->loc_hash_table || !ret->loc_hash_memory)
1082 1.1.1.2 christos {
1083 1.1.1.2 christos elf64_ia64_link_hash_table_free (abfd);
1084 1.1.1.2 christos return NULL;
1085 1.1.1.2 christos }
1086 1.1.1.2 christos ret->root.root.hash_table_free = elf64_ia64_link_hash_table_free;
1087 1.1.1.2 christos
1088 1.1.1.2 christos return &ret->root.root;
1089 1.1 christos }
1090 1.1 christos
1091 1.1 christos /* Traverse both local and global hash tables. */
1092 1.1 christos
1093 1.1 christos struct elf64_ia64_dyn_sym_traverse_data
1094 1.1 christos {
1095 1.1 christos bfd_boolean (*func) (struct elf64_ia64_dyn_sym_info *, void *);
1096 1.1 christos void * data;
1097 1.1 christos };
1098 1.1 christos
1099 1.1 christos static bfd_boolean
1100 1.1 christos elf64_ia64_global_dyn_sym_thunk (struct bfd_hash_entry *xentry,
1101 1.1 christos void * xdata)
1102 1.1 christos {
1103 1.1 christos struct elf64_ia64_link_hash_entry *entry
1104 1.1 christos = (struct elf64_ia64_link_hash_entry *) xentry;
1105 1.1 christos struct elf64_ia64_dyn_sym_traverse_data *data
1106 1.1 christos = (struct elf64_ia64_dyn_sym_traverse_data *) xdata;
1107 1.1 christos struct elf64_ia64_dyn_sym_info *dyn_i;
1108 1.1 christos unsigned int count;
1109 1.1 christos
1110 1.1 christos if (entry->root.root.type == bfd_link_hash_warning)
1111 1.1 christos entry = (struct elf64_ia64_link_hash_entry *) entry->root.root.u.i.link;
1112 1.1 christos
1113 1.1 christos for (count = entry->count, dyn_i = entry->info;
1114 1.1 christos count != 0;
1115 1.1 christos count--, dyn_i++)
1116 1.1 christos if (! (*data->func) (dyn_i, data->data))
1117 1.1 christos return FALSE;
1118 1.1 christos return TRUE;
1119 1.1 christos }
1120 1.1 christos
1121 1.1 christos static bfd_boolean
1122 1.1 christos elf64_ia64_local_dyn_sym_thunk (void **slot, void * xdata)
1123 1.1 christos {
1124 1.1 christos struct elf64_ia64_local_hash_entry *entry
1125 1.1 christos = (struct elf64_ia64_local_hash_entry *) *slot;
1126 1.1 christos struct elf64_ia64_dyn_sym_traverse_data *data
1127 1.1 christos = (struct elf64_ia64_dyn_sym_traverse_data *) xdata;
1128 1.1 christos struct elf64_ia64_dyn_sym_info *dyn_i;
1129 1.1 christos unsigned int count;
1130 1.1 christos
1131 1.1 christos for (count = entry->count, dyn_i = entry->info;
1132 1.1 christos count != 0;
1133 1.1 christos count--, dyn_i++)
1134 1.1 christos if (! (*data->func) (dyn_i, data->data))
1135 1.1 christos return FALSE;
1136 1.1 christos return TRUE;
1137 1.1 christos }
1138 1.1 christos
1139 1.1 christos static void
1140 1.1 christos elf64_ia64_dyn_sym_traverse (struct elf64_ia64_link_hash_table *ia64_info,
1141 1.1 christos bfd_boolean (*func) (struct elf64_ia64_dyn_sym_info *, void *),
1142 1.1 christos void * data)
1143 1.1 christos {
1144 1.1 christos struct elf64_ia64_dyn_sym_traverse_data xdata;
1145 1.1 christos
1146 1.1 christos xdata.func = func;
1147 1.1 christos xdata.data = data;
1148 1.1 christos
1149 1.1 christos elf_link_hash_traverse (&ia64_info->root,
1150 1.1 christos elf64_ia64_global_dyn_sym_thunk, &xdata);
1151 1.1 christos htab_traverse (ia64_info->loc_hash_table,
1152 1.1 christos elf64_ia64_local_dyn_sym_thunk, &xdata);
1153 1.1 christos }
1154 1.1 christos
1155 1.1 christos #define NOTE_NAME "IPF/VMS"
1156 1.1 christos
1157 1.1 christos static bfd_boolean
1158 1.1 christos create_ia64_vms_notes (bfd *abfd, struct bfd_link_info *info,
1159 1.1.1.4 christos unsigned int time_hi, unsigned int time_lo)
1160 1.1 christos {
1161 1.1 christos #define NBR_NOTES 7
1162 1.1 christos Elf_Internal_Note notes[NBR_NOTES];
1163 1.1 christos char *module_name;
1164 1.1 christos int module_name_len;
1165 1.1 christos unsigned char cur_time[8];
1166 1.1 christos Elf64_External_VMS_ORIG_DYN_Note *orig_dyn;
1167 1.1 christos unsigned int orig_dyn_size;
1168 1.1 christos unsigned int note_size;
1169 1.1 christos int i;
1170 1.1 christos unsigned char *noteptr;
1171 1.1 christos unsigned char *note_contents;
1172 1.1 christos struct elf64_ia64_link_hash_table *ia64_info;
1173 1.1 christos
1174 1.1 christos ia64_info = elf64_ia64_hash_table (info);
1175 1.1 christos
1176 1.1 christos module_name = vms_get_module_name (bfd_get_filename (abfd), TRUE);
1177 1.1 christos module_name_len = strlen (module_name) + 1;
1178 1.1 christos
1179 1.1 christos bfd_putl32 (time_lo, cur_time + 0);
1180 1.1 christos bfd_putl32 (time_hi, cur_time + 4);
1181 1.1 christos
1182 1.1 christos /* Note 0: IMGNAM. */
1183 1.1 christos notes[0].type = NT_VMS_IMGNAM;
1184 1.1 christos notes[0].descdata = module_name;
1185 1.1 christos notes[0].descsz = module_name_len;
1186 1.1 christos
1187 1.1 christos /* Note 1: GSTNAM. */
1188 1.1 christos notes[1].type = NT_VMS_GSTNAM;
1189 1.1 christos notes[1].descdata = module_name;
1190 1.1 christos notes[1].descsz = module_name_len;
1191 1.1 christos
1192 1.1 christos /* Note 2: IMGID. */
1193 1.1 christos #define IMG_ID "V1.0"
1194 1.1 christos notes[2].type = NT_VMS_IMGID;
1195 1.1 christos notes[2].descdata = IMG_ID;
1196 1.1 christos notes[2].descsz = sizeof (IMG_ID);
1197 1.1 christos
1198 1.1 christos /* Note 3: Linktime. */
1199 1.1 christos notes[3].type = NT_VMS_LINKTIME;
1200 1.1 christos notes[3].descdata = (char *)cur_time;
1201 1.1 christos notes[3].descsz = sizeof (cur_time);
1202 1.1 christos
1203 1.1 christos /* Note 4: Linker id. */
1204 1.1 christos notes[4].type = NT_VMS_LINKID;
1205 1.1 christos notes[4].descdata = "GNU ld " BFD_VERSION_STRING;
1206 1.1 christos notes[4].descsz = strlen (notes[4].descdata) + 1;
1207 1.1 christos
1208 1.1 christos /* Note 5: Original dyn. */
1209 1.1 christos orig_dyn_size = (sizeof (*orig_dyn) + sizeof (IMG_ID) - 1 + 7) & ~7;
1210 1.1 christos orig_dyn = bfd_zalloc (abfd, orig_dyn_size);
1211 1.1 christos if (orig_dyn == NULL)
1212 1.1 christos return FALSE;
1213 1.1 christos bfd_putl32 (1, orig_dyn->major_id);
1214 1.1 christos bfd_putl32 (3, orig_dyn->minor_id);
1215 1.1 christos memcpy (orig_dyn->manipulation_date, cur_time, sizeof (cur_time));
1216 1.1 christos bfd_putl64 (VMS_LF_IMGSTA | VMS_LF_MAIN, orig_dyn->link_flags);
1217 1.1 christos bfd_putl32 (EF_IA_64_ABI64, orig_dyn->elf_flags);
1218 1.1 christos memcpy (orig_dyn->imgid, IMG_ID, sizeof (IMG_ID));
1219 1.1 christos notes[5].type = NT_VMS_ORIG_DYN;
1220 1.1 christos notes[5].descdata = (char *)orig_dyn;
1221 1.1 christos notes[5].descsz = orig_dyn_size;
1222 1.1 christos
1223 1.1 christos /* Note 3: Patchtime. */
1224 1.1 christos notes[6].type = NT_VMS_PATCHTIME;
1225 1.1 christos notes[6].descdata = (char *)cur_time;
1226 1.1 christos notes[6].descsz = sizeof (cur_time);
1227 1.1 christos
1228 1.1 christos /* Compute notes size. */
1229 1.1 christos note_size = 0;
1230 1.1 christos for (i = 0; i < NBR_NOTES; i++)
1231 1.1 christos note_size += sizeof (Elf64_External_VMS_Note) - 1
1232 1.1 christos + ((sizeof (NOTE_NAME) - 1 + 7) & ~7)
1233 1.1 christos + ((notes[i].descsz + 7) & ~7);
1234 1.1 christos
1235 1.1 christos /* Malloc a temporary buffer large enough for most notes */
1236 1.1 christos note_contents = (unsigned char *) bfd_zalloc (abfd, note_size);
1237 1.1 christos if (note_contents == NULL)
1238 1.1 christos return FALSE;
1239 1.1 christos noteptr = note_contents;
1240 1.1 christos
1241 1.1 christos /* Fill notes. */
1242 1.1 christos for (i = 0; i < NBR_NOTES; i++)
1243 1.1 christos {
1244 1.1 christos Elf64_External_VMS_Note *enote = (Elf64_External_VMS_Note *) noteptr;
1245 1.1 christos
1246 1.1 christos bfd_putl64 (sizeof (NOTE_NAME) - 1, enote->namesz);
1247 1.1 christos bfd_putl64 (notes[i].descsz, enote->descsz);
1248 1.1 christos bfd_putl64 (notes[i].type, enote->type);
1249 1.1 christos
1250 1.1 christos noteptr = (unsigned char *)enote->name;
1251 1.1 christos memcpy (noteptr, NOTE_NAME, sizeof (NOTE_NAME) - 1);
1252 1.1 christos noteptr += (sizeof (NOTE_NAME) - 1 + 7) & ~7;
1253 1.1 christos memcpy (noteptr, notes[i].descdata, notes[i].descsz);
1254 1.1 christos noteptr += (notes[i].descsz + 7) & ~7;
1255 1.1 christos }
1256 1.1 christos
1257 1.1 christos ia64_info->note_sec->contents = note_contents;
1258 1.1 christos ia64_info->note_sec->size = note_size;
1259 1.1 christos
1260 1.1 christos free (module_name);
1261 1.1 christos
1262 1.1 christos return TRUE;
1263 1.1 christos }
1264 1.1 christos
1265 1.1 christos static bfd_boolean
1266 1.1 christos elf64_ia64_create_dynamic_sections (bfd *abfd,
1267 1.1 christos struct bfd_link_info *info)
1268 1.1 christos {
1269 1.1 christos struct elf64_ia64_link_hash_table *ia64_info;
1270 1.1 christos asection *s;
1271 1.1 christos flagword flags;
1272 1.1 christos const struct elf_backend_data *bed;
1273 1.1 christos
1274 1.1 christos ia64_info = elf64_ia64_hash_table (info);
1275 1.1 christos if (ia64_info == NULL)
1276 1.1 christos return FALSE;
1277 1.1 christos
1278 1.1 christos if (elf_hash_table (info)->dynamic_sections_created)
1279 1.1 christos return TRUE;
1280 1.1 christos
1281 1.1 christos abfd = elf_hash_table (info)->dynobj;
1282 1.1 christos bed = get_elf_backend_data (abfd);
1283 1.1 christos
1284 1.1 christos flags = bed->dynamic_sec_flags;
1285 1.1 christos
1286 1.1 christos s = bfd_make_section_anyway_with_flags (abfd, ".dynamic",
1287 1.1 christos flags | SEC_READONLY);
1288 1.1 christos if (s == NULL
1289 1.1.1.6 christos || !bfd_set_section_alignment (s, bed->s->log_file_align))
1290 1.1 christos return FALSE;
1291 1.1 christos
1292 1.1 christos s = bfd_make_section_anyway_with_flags (abfd, ".plt", flags | SEC_READONLY);
1293 1.1 christos if (s == NULL
1294 1.1.1.6 christos || !bfd_set_section_alignment (s, bed->plt_alignment))
1295 1.1 christos return FALSE;
1296 1.1 christos ia64_info->root.splt = s;
1297 1.1 christos
1298 1.1 christos if (!get_got (abfd, ia64_info))
1299 1.1 christos return FALSE;
1300 1.1 christos
1301 1.1 christos if (!get_pltoff (abfd, ia64_info))
1302 1.1 christos return FALSE;
1303 1.1 christos
1304 1.1 christos s = bfd_make_section_anyway_with_flags (abfd, ".vmsdynstr",
1305 1.1 christos (SEC_ALLOC
1306 1.1 christos | SEC_HAS_CONTENTS
1307 1.1 christos | SEC_IN_MEMORY
1308 1.1 christos | SEC_LINKER_CREATED));
1309 1.1 christos if (s == NULL
1310 1.1.1.6 christos || !bfd_set_section_alignment (s, 0))
1311 1.1 christos return FALSE;
1312 1.1 christos
1313 1.1 christos /* Create a fixup section. */
1314 1.1 christos s = bfd_make_section_anyway_with_flags (abfd, ".fixups",
1315 1.1 christos (SEC_ALLOC
1316 1.1 christos | SEC_HAS_CONTENTS
1317 1.1 christos | SEC_IN_MEMORY
1318 1.1 christos | SEC_LINKER_CREATED));
1319 1.1 christos if (s == NULL
1320 1.1.1.6 christos || !bfd_set_section_alignment (s, 3))
1321 1.1 christos return FALSE;
1322 1.1 christos ia64_info->fixups_sec = s;
1323 1.1 christos
1324 1.1 christos /* Create the transfer fixup section. */
1325 1.1 christos s = bfd_make_section_anyway_with_flags (abfd, ".transfer",
1326 1.1 christos (SEC_ALLOC
1327 1.1 christos | SEC_HAS_CONTENTS
1328 1.1 christos | SEC_IN_MEMORY
1329 1.1 christos | SEC_LINKER_CREATED));
1330 1.1 christos if (s == NULL
1331 1.1.1.6 christos || !bfd_set_section_alignment (s, 3))
1332 1.1 christos return FALSE;
1333 1.1 christos s->size = sizeof (struct elf64_vms_transfer);
1334 1.1 christos ia64_info->transfer_sec = s;
1335 1.1 christos
1336 1.1 christos /* Create note section. */
1337 1.1 christos s = bfd_make_section_anyway_with_flags (abfd, ".vms.note",
1338 1.1.1.4 christos (SEC_LINKER_CREATED
1339 1.1.1.4 christos | SEC_HAS_CONTENTS
1340 1.1.1.4 christos | SEC_IN_MEMORY
1341 1.1.1.4 christos | SEC_READONLY));
1342 1.1 christos if (s == NULL
1343 1.1.1.6 christos || !bfd_set_section_alignment (s, 3))
1344 1.1 christos return FALSE;
1345 1.1 christos ia64_info->note_sec = s;
1346 1.1 christos
1347 1.1 christos elf_hash_table (info)->dynamic_sections_created = TRUE;
1348 1.1 christos return TRUE;
1349 1.1 christos }
1350 1.1 christos
1351 1.1 christos /* Find and/or create a hash entry for local symbol. */
1352 1.1 christos static struct elf64_ia64_local_hash_entry *
1353 1.1 christos get_local_sym_hash (struct elf64_ia64_link_hash_table *ia64_info,
1354 1.1 christos bfd *abfd, const Elf_Internal_Rela *rel,
1355 1.1 christos bfd_boolean create)
1356 1.1 christos {
1357 1.1 christos struct elf64_ia64_local_hash_entry e, *ret;
1358 1.1 christos asection *sec = abfd->sections;
1359 1.1 christos hashval_t h = ELF_LOCAL_SYMBOL_HASH (sec->id,
1360 1.1 christos ELF64_R_SYM (rel->r_info));
1361 1.1 christos void **slot;
1362 1.1 christos
1363 1.1 christos e.id = sec->id;
1364 1.1 christos e.r_sym = ELF64_R_SYM (rel->r_info);
1365 1.1 christos slot = htab_find_slot_with_hash (ia64_info->loc_hash_table, &e, h,
1366 1.1 christos create ? INSERT : NO_INSERT);
1367 1.1 christos
1368 1.1 christos if (!slot)
1369 1.1 christos return NULL;
1370 1.1 christos
1371 1.1 christos if (*slot)
1372 1.1 christos return (struct elf64_ia64_local_hash_entry *) *slot;
1373 1.1 christos
1374 1.1 christos ret = (struct elf64_ia64_local_hash_entry *)
1375 1.1 christos objalloc_alloc ((struct objalloc *) ia64_info->loc_hash_memory,
1376 1.1 christos sizeof (struct elf64_ia64_local_hash_entry));
1377 1.1 christos if (ret)
1378 1.1 christos {
1379 1.1 christos memset (ret, 0, sizeof (*ret));
1380 1.1 christos ret->id = sec->id;
1381 1.1 christos ret->r_sym = ELF64_R_SYM (rel->r_info);
1382 1.1 christos *slot = ret;
1383 1.1 christos }
1384 1.1 christos return ret;
1385 1.1 christos }
1386 1.1 christos
1387 1.1 christos /* Used to sort elf64_ia64_dyn_sym_info array. */
1388 1.1 christos
1389 1.1 christos static int
1390 1.1 christos addend_compare (const void *xp, const void *yp)
1391 1.1 christos {
1392 1.1 christos const struct elf64_ia64_dyn_sym_info *x
1393 1.1 christos = (const struct elf64_ia64_dyn_sym_info *) xp;
1394 1.1 christos const struct elf64_ia64_dyn_sym_info *y
1395 1.1 christos = (const struct elf64_ia64_dyn_sym_info *) yp;
1396 1.1 christos
1397 1.1 christos return x->addend < y->addend ? -1 : x->addend > y->addend ? 1 : 0;
1398 1.1 christos }
1399 1.1 christos
1400 1.1 christos /* Sort elf64_ia64_dyn_sym_info array and remove duplicates. */
1401 1.1 christos
1402 1.1 christos static unsigned int
1403 1.1 christos sort_dyn_sym_info (struct elf64_ia64_dyn_sym_info *info,
1404 1.1 christos unsigned int count)
1405 1.1 christos {
1406 1.1 christos bfd_vma curr, prev, got_offset;
1407 1.1 christos unsigned int i, kept, dupes, diff, dest, src, len;
1408 1.1 christos
1409 1.1 christos qsort (info, count, sizeof (*info), addend_compare);
1410 1.1 christos
1411 1.1 christos /* Find the first duplicate. */
1412 1.1 christos prev = info [0].addend;
1413 1.1 christos got_offset = info [0].got_offset;
1414 1.1 christos for (i = 1; i < count; i++)
1415 1.1 christos {
1416 1.1 christos curr = info [i].addend;
1417 1.1 christos if (curr == prev)
1418 1.1 christos {
1419 1.1 christos /* For duplicates, make sure that GOT_OFFSET is valid. */
1420 1.1 christos if (got_offset == (bfd_vma) -1)
1421 1.1 christos got_offset = info [i].got_offset;
1422 1.1 christos break;
1423 1.1 christos }
1424 1.1 christos got_offset = info [i].got_offset;
1425 1.1 christos prev = curr;
1426 1.1 christos }
1427 1.1 christos
1428 1.1 christos /* We may move a block of elements to here. */
1429 1.1 christos dest = i++;
1430 1.1 christos
1431 1.1 christos /* Remove duplicates. */
1432 1.1 christos if (i < count)
1433 1.1 christos {
1434 1.1 christos while (i < count)
1435 1.1 christos {
1436 1.1 christos /* For duplicates, make sure that the kept one has a valid
1437 1.1 christos got_offset. */
1438 1.1 christos kept = dest - 1;
1439 1.1 christos if (got_offset != (bfd_vma) -1)
1440 1.1 christos info [kept].got_offset = got_offset;
1441 1.1 christos
1442 1.1 christos curr = info [i].addend;
1443 1.1 christos got_offset = info [i].got_offset;
1444 1.1 christos
1445 1.1 christos /* Move a block of elements whose first one is different from
1446 1.1 christos the previous. */
1447 1.1 christos if (curr == prev)
1448 1.1 christos {
1449 1.1 christos for (src = i + 1; src < count; src++)
1450 1.1 christos {
1451 1.1 christos if (info [src].addend != curr)
1452 1.1 christos break;
1453 1.1 christos /* For duplicates, make sure that GOT_OFFSET is
1454 1.1 christos valid. */
1455 1.1 christos if (got_offset == (bfd_vma) -1)
1456 1.1 christos got_offset = info [src].got_offset;
1457 1.1 christos }
1458 1.1 christos
1459 1.1 christos /* Make sure that the kept one has a valid got_offset. */
1460 1.1 christos if (got_offset != (bfd_vma) -1)
1461 1.1 christos info [kept].got_offset = got_offset;
1462 1.1 christos }
1463 1.1 christos else
1464 1.1 christos src = i;
1465 1.1 christos
1466 1.1 christos if (src >= count)
1467 1.1 christos break;
1468 1.1 christos
1469 1.1 christos /* Find the next duplicate. SRC will be kept. */
1470 1.1 christos prev = info [src].addend;
1471 1.1 christos got_offset = info [src].got_offset;
1472 1.1 christos for (dupes = src + 1; dupes < count; dupes ++)
1473 1.1 christos {
1474 1.1 christos curr = info [dupes].addend;
1475 1.1 christos if (curr == prev)
1476 1.1 christos {
1477 1.1 christos /* Make sure that got_offset is valid. */
1478 1.1 christos if (got_offset == (bfd_vma) -1)
1479 1.1 christos got_offset = info [dupes].got_offset;
1480 1.1 christos
1481 1.1 christos /* For duplicates, make sure that the kept one has
1482 1.1 christos a valid got_offset. */
1483 1.1 christos if (got_offset != (bfd_vma) -1)
1484 1.1 christos info [dupes - 1].got_offset = got_offset;
1485 1.1 christos break;
1486 1.1 christos }
1487 1.1 christos got_offset = info [dupes].got_offset;
1488 1.1 christos prev = curr;
1489 1.1 christos }
1490 1.1 christos
1491 1.1 christos /* How much to move. */
1492 1.1 christos len = dupes - src;
1493 1.1 christos i = dupes + 1;
1494 1.1 christos
1495 1.1 christos if (len == 1 && dupes < count)
1496 1.1 christos {
1497 1.1 christos /* If we only move 1 element, we combine it with the next
1498 1.1 christos one. There must be at least a duplicate. Find the
1499 1.1 christos next different one. */
1500 1.1 christos for (diff = dupes + 1, src++; diff < count; diff++, src++)
1501 1.1 christos {
1502 1.1 christos if (info [diff].addend != curr)
1503 1.1 christos break;
1504 1.1 christos /* Make sure that got_offset is valid. */
1505 1.1 christos if (got_offset == (bfd_vma) -1)
1506 1.1 christos got_offset = info [diff].got_offset;
1507 1.1 christos }
1508 1.1 christos
1509 1.1 christos /* Makre sure that the last duplicated one has an valid
1510 1.1 christos offset. */
1511 1.1 christos BFD_ASSERT (curr == prev);
1512 1.1 christos if (got_offset != (bfd_vma) -1)
1513 1.1 christos info [diff - 1].got_offset = got_offset;
1514 1.1 christos
1515 1.1 christos if (diff < count)
1516 1.1 christos {
1517 1.1 christos /* Find the next duplicate. Track the current valid
1518 1.1 christos offset. */
1519 1.1 christos prev = info [diff].addend;
1520 1.1 christos got_offset = info [diff].got_offset;
1521 1.1 christos for (dupes = diff + 1; dupes < count; dupes ++)
1522 1.1 christos {
1523 1.1 christos curr = info [dupes].addend;
1524 1.1 christos if (curr == prev)
1525 1.1 christos {
1526 1.1 christos /* For duplicates, make sure that GOT_OFFSET
1527 1.1 christos is valid. */
1528 1.1 christos if (got_offset == (bfd_vma) -1)
1529 1.1 christos got_offset = info [dupes].got_offset;
1530 1.1 christos break;
1531 1.1 christos }
1532 1.1 christos got_offset = info [dupes].got_offset;
1533 1.1 christos prev = curr;
1534 1.1 christos diff++;
1535 1.1 christos }
1536 1.1 christos
1537 1.1 christos len = diff - src + 1;
1538 1.1 christos i = diff + 1;
1539 1.1 christos }
1540 1.1 christos }
1541 1.1 christos
1542 1.1 christos memmove (&info [dest], &info [src], len * sizeof (*info));
1543 1.1 christos
1544 1.1 christos dest += len;
1545 1.1 christos }
1546 1.1 christos
1547 1.1 christos count = dest;
1548 1.1 christos }
1549 1.1 christos else
1550 1.1 christos {
1551 1.1 christos /* When we get here, either there is no duplicate at all or
1552 1.1 christos the only duplicate is the last element. */
1553 1.1 christos if (dest < count)
1554 1.1 christos {
1555 1.1 christos /* If the last element is a duplicate, make sure that the
1556 1.1 christos kept one has a valid got_offset. We also update count. */
1557 1.1 christos if (got_offset != (bfd_vma) -1)
1558 1.1 christos info [dest - 1].got_offset = got_offset;
1559 1.1 christos count = dest;
1560 1.1 christos }
1561 1.1 christos }
1562 1.1 christos
1563 1.1 christos return count;
1564 1.1 christos }
1565 1.1 christos
1566 1.1 christos /* Find and/or create a descriptor for dynamic symbol info. This will
1567 1.1 christos vary based on global or local symbol, and the addend to the reloc.
1568 1.1 christos
1569 1.1 christos We don't sort when inserting. Also, we sort and eliminate
1570 1.1 christos duplicates if there is an unsorted section. Typically, this will
1571 1.1 christos only happen once, because we do all insertions before lookups. We
1572 1.1 christos then use bsearch to do a lookup. This also allows lookups to be
1573 1.1 christos fast. So we have fast insertion (O(log N) due to duplicate check),
1574 1.1 christos fast lookup (O(log N)) and one sort (O(N log N) expected time).
1575 1.1 christos Previously, all lookups were O(N) because of the use of the linked
1576 1.1 christos list and also all insertions were O(N) because of the check for
1577 1.1 christos duplicates. There are some complications here because the array
1578 1.1 christos size grows occasionally, which may add an O(N) factor, but this
1579 1.1 christos should be rare. Also, we free the excess array allocation, which
1580 1.1 christos requires a copy which is O(N), but this only happens once. */
1581 1.1 christos
1582 1.1 christos static struct elf64_ia64_dyn_sym_info *
1583 1.1 christos get_dyn_sym_info (struct elf64_ia64_link_hash_table *ia64_info,
1584 1.1 christos struct elf_link_hash_entry *h, bfd *abfd,
1585 1.1 christos const Elf_Internal_Rela *rel, bfd_boolean create)
1586 1.1 christos {
1587 1.1 christos struct elf64_ia64_dyn_sym_info **info_p, *info, *dyn_i, key;
1588 1.1 christos unsigned int *count_p, *sorted_count_p, *size_p;
1589 1.1 christos unsigned int count, sorted_count, size;
1590 1.1 christos bfd_vma addend = rel ? rel->r_addend : 0;
1591 1.1 christos bfd_size_type amt;
1592 1.1 christos
1593 1.1 christos if (h)
1594 1.1 christos {
1595 1.1 christos struct elf64_ia64_link_hash_entry *global_h;
1596 1.1 christos
1597 1.1 christos global_h = (struct elf64_ia64_link_hash_entry *) h;
1598 1.1 christos info_p = &global_h->info;
1599 1.1 christos count_p = &global_h->count;
1600 1.1 christos sorted_count_p = &global_h->sorted_count;
1601 1.1 christos size_p = &global_h->size;
1602 1.1 christos }
1603 1.1 christos else
1604 1.1 christos {
1605 1.1 christos struct elf64_ia64_local_hash_entry *loc_h;
1606 1.1 christos
1607 1.1 christos loc_h = get_local_sym_hash (ia64_info, abfd, rel, create);
1608 1.1 christos if (!loc_h)
1609 1.1 christos {
1610 1.1 christos BFD_ASSERT (!create);
1611 1.1 christos return NULL;
1612 1.1 christos }
1613 1.1 christos
1614 1.1 christos info_p = &loc_h->info;
1615 1.1 christos count_p = &loc_h->count;
1616 1.1 christos sorted_count_p = &loc_h->sorted_count;
1617 1.1 christos size_p = &loc_h->size;
1618 1.1 christos }
1619 1.1 christos
1620 1.1 christos count = *count_p;
1621 1.1 christos sorted_count = *sorted_count_p;
1622 1.1 christos size = *size_p;
1623 1.1 christos info = *info_p;
1624 1.1 christos if (create)
1625 1.1 christos {
1626 1.1 christos /* When we create the array, we don't check for duplicates,
1627 1.1.1.4 christos except in the previously sorted section if one exists, and
1628 1.1 christos against the last inserted entry. This allows insertions to
1629 1.1 christos be fast. */
1630 1.1 christos if (info)
1631 1.1 christos {
1632 1.1 christos if (sorted_count)
1633 1.1 christos {
1634 1.1 christos /* Try bsearch first on the sorted section. */
1635 1.1 christos key.addend = addend;
1636 1.1 christos dyn_i = bsearch (&key, info, sorted_count,
1637 1.1 christos sizeof (*info), addend_compare);
1638 1.1 christos
1639 1.1 christos if (dyn_i)
1640 1.1 christos {
1641 1.1 christos return dyn_i;
1642 1.1 christos }
1643 1.1 christos }
1644 1.1 christos
1645 1.1 christos /* Do a quick check for the last inserted entry. */
1646 1.1 christos dyn_i = info + count - 1;
1647 1.1 christos if (dyn_i->addend == addend)
1648 1.1 christos {
1649 1.1 christos return dyn_i;
1650 1.1 christos }
1651 1.1 christos }
1652 1.1 christos
1653 1.1 christos if (size == 0)
1654 1.1 christos {
1655 1.1 christos /* It is the very first element. We create the array of size
1656 1.1 christos 1. */
1657 1.1 christos size = 1;
1658 1.1 christos amt = size * sizeof (*info);
1659 1.1 christos info = bfd_malloc (amt);
1660 1.1 christos }
1661 1.1 christos else if (size <= count)
1662 1.1 christos {
1663 1.1 christos /* We double the array size every time when we reach the
1664 1.1 christos size limit. */
1665 1.1 christos size += size;
1666 1.1 christos amt = size * sizeof (*info);
1667 1.1 christos info = bfd_realloc (info, amt);
1668 1.1 christos }
1669 1.1 christos else
1670 1.1 christos goto has_space;
1671 1.1 christos
1672 1.1 christos if (info == NULL)
1673 1.1 christos return NULL;
1674 1.1 christos *size_p = size;
1675 1.1 christos *info_p = info;
1676 1.1 christos
1677 1.1 christos has_space:
1678 1.1 christos /* Append the new one to the array. */
1679 1.1 christos dyn_i = info + count;
1680 1.1 christos memset (dyn_i, 0, sizeof (*dyn_i));
1681 1.1 christos dyn_i->got_offset = (bfd_vma) -1;
1682 1.1 christos dyn_i->addend = addend;
1683 1.1 christos
1684 1.1 christos /* We increment count only since the new ones are unsorted and
1685 1.1 christos may have duplicate. */
1686 1.1 christos (*count_p)++;
1687 1.1 christos }
1688 1.1 christos else
1689 1.1 christos {
1690 1.1 christos /* It is a lookup without insertion. Sort array if part of the
1691 1.1 christos array isn't sorted. */
1692 1.1 christos if (count != sorted_count)
1693 1.1 christos {
1694 1.1 christos count = sort_dyn_sym_info (info, count);
1695 1.1 christos *count_p = count;
1696 1.1 christos *sorted_count_p = count;
1697 1.1 christos }
1698 1.1 christos
1699 1.1 christos /* Free unused memory. */
1700 1.1 christos if (size != count)
1701 1.1 christos {
1702 1.1 christos amt = count * sizeof (*info);
1703 1.1 christos info = bfd_malloc (amt);
1704 1.1 christos if (info != NULL)
1705 1.1 christos {
1706 1.1 christos memcpy (info, *info_p, amt);
1707 1.1 christos free (*info_p);
1708 1.1 christos *size_p = count;
1709 1.1 christos *info_p = info;
1710 1.1 christos }
1711 1.1 christos }
1712 1.1 christos
1713 1.1 christos key.addend = addend;
1714 1.1 christos dyn_i = bsearch (&key, info, count,
1715 1.1 christos sizeof (*info), addend_compare);
1716 1.1 christos }
1717 1.1 christos
1718 1.1 christos return dyn_i;
1719 1.1 christos }
1720 1.1 christos
1721 1.1 christos static asection *
1722 1.1 christos get_got (bfd *abfd, struct elf64_ia64_link_hash_table *ia64_info)
1723 1.1 christos {
1724 1.1 christos asection *got;
1725 1.1 christos bfd *dynobj;
1726 1.1 christos
1727 1.1 christos got = ia64_info->root.sgot;
1728 1.1 christos if (!got)
1729 1.1 christos {
1730 1.1 christos flagword flags;
1731 1.1 christos
1732 1.1 christos dynobj = ia64_info->root.dynobj;
1733 1.1 christos if (!dynobj)
1734 1.1 christos ia64_info->root.dynobj = dynobj = abfd;
1735 1.1 christos
1736 1.1 christos /* The .got section is always aligned at 8 bytes. */
1737 1.1 christos flags = get_elf_backend_data (dynobj)->dynamic_sec_flags;
1738 1.1 christos got = bfd_make_section_anyway_with_flags (dynobj, ".got",
1739 1.1 christos flags | SEC_SMALL_DATA);
1740 1.1 christos if (got == NULL
1741 1.1.1.6 christos || !bfd_set_section_alignment (got, 3))
1742 1.1.1.4 christos return NULL;
1743 1.1 christos ia64_info->root.sgot = got;
1744 1.1 christos }
1745 1.1 christos
1746 1.1 christos return got;
1747 1.1 christos }
1748 1.1 christos
1749 1.1 christos /* Create function descriptor section (.opd). This section is called .opd
1750 1.1 christos because it contains "official procedure descriptors". The "official"
1751 1.1 christos refers to the fact that these descriptors are used when taking the address
1752 1.1 christos of a procedure, thus ensuring a unique address for each procedure. */
1753 1.1 christos
1754 1.1 christos static asection *
1755 1.1 christos get_fptr (bfd *abfd, struct bfd_link_info *info,
1756 1.1 christos struct elf64_ia64_link_hash_table *ia64_info)
1757 1.1 christos {
1758 1.1 christos asection *fptr;
1759 1.1 christos bfd *dynobj;
1760 1.1 christos
1761 1.1 christos fptr = ia64_info->fptr_sec;
1762 1.1 christos if (!fptr)
1763 1.1 christos {
1764 1.1 christos dynobj = ia64_info->root.dynobj;
1765 1.1 christos if (!dynobj)
1766 1.1 christos ia64_info->root.dynobj = dynobj = abfd;
1767 1.1 christos
1768 1.1 christos fptr = bfd_make_section_anyway_with_flags (dynobj, ".opd",
1769 1.1 christos (SEC_ALLOC
1770 1.1 christos | SEC_LOAD
1771 1.1 christos | SEC_HAS_CONTENTS
1772 1.1 christos | SEC_IN_MEMORY
1773 1.1.1.2 christos | (bfd_link_pie (info) ? 0
1774 1.1 christos : SEC_READONLY)
1775 1.1 christos | SEC_LINKER_CREATED));
1776 1.1 christos if (!fptr
1777 1.1.1.6 christos || !bfd_set_section_alignment (fptr, 4))
1778 1.1 christos {
1779 1.1 christos BFD_ASSERT (0);
1780 1.1 christos return NULL;
1781 1.1 christos }
1782 1.1 christos
1783 1.1 christos ia64_info->fptr_sec = fptr;
1784 1.1 christos
1785 1.1.1.2 christos if (bfd_link_pie (info))
1786 1.1 christos {
1787 1.1 christos asection *fptr_rel;
1788 1.1 christos fptr_rel = bfd_make_section_anyway_with_flags (dynobj, ".rela.opd",
1789 1.1 christos (SEC_ALLOC | SEC_LOAD
1790 1.1 christos | SEC_HAS_CONTENTS
1791 1.1 christos | SEC_IN_MEMORY
1792 1.1 christos | SEC_LINKER_CREATED
1793 1.1 christos | SEC_READONLY));
1794 1.1 christos if (fptr_rel == NULL
1795 1.1.1.6 christos || !bfd_set_section_alignment (fptr_rel, 3))
1796 1.1 christos {
1797 1.1 christos BFD_ASSERT (0);
1798 1.1 christos return NULL;
1799 1.1 christos }
1800 1.1 christos
1801 1.1 christos ia64_info->rel_fptr_sec = fptr_rel;
1802 1.1 christos }
1803 1.1 christos }
1804 1.1 christos
1805 1.1 christos return fptr;
1806 1.1 christos }
1807 1.1 christos
1808 1.1 christos static asection *
1809 1.1 christos get_pltoff (bfd *abfd, struct elf64_ia64_link_hash_table *ia64_info)
1810 1.1 christos {
1811 1.1 christos asection *pltoff;
1812 1.1 christos bfd *dynobj;
1813 1.1 christos
1814 1.1 christos pltoff = ia64_info->pltoff_sec;
1815 1.1 christos if (!pltoff)
1816 1.1 christos {
1817 1.1 christos dynobj = ia64_info->root.dynobj;
1818 1.1 christos if (!dynobj)
1819 1.1 christos ia64_info->root.dynobj = dynobj = abfd;
1820 1.1 christos
1821 1.1 christos pltoff = bfd_make_section_anyway_with_flags (dynobj,
1822 1.1 christos ELF_STRING_ia64_pltoff,
1823 1.1 christos (SEC_ALLOC
1824 1.1 christos | SEC_LOAD
1825 1.1 christos | SEC_HAS_CONTENTS
1826 1.1 christos | SEC_IN_MEMORY
1827 1.1 christos | SEC_SMALL_DATA
1828 1.1 christos | SEC_LINKER_CREATED));
1829 1.1 christos if (!pltoff
1830 1.1.1.6 christos || !bfd_set_section_alignment (pltoff, 4))
1831 1.1 christos {
1832 1.1 christos BFD_ASSERT (0);
1833 1.1 christos return NULL;
1834 1.1 christos }
1835 1.1 christos
1836 1.1 christos ia64_info->pltoff_sec = pltoff;
1837 1.1 christos }
1838 1.1 christos
1839 1.1 christos return pltoff;
1840 1.1 christos }
1841 1.1 christos
1842 1.1 christos static asection *
1843 1.1 christos get_reloc_section (bfd *abfd,
1844 1.1 christos struct elf64_ia64_link_hash_table *ia64_info,
1845 1.1 christos asection *sec, bfd_boolean create)
1846 1.1 christos {
1847 1.1 christos const char *srel_name;
1848 1.1 christos asection *srel;
1849 1.1 christos bfd *dynobj;
1850 1.1 christos
1851 1.1 christos srel_name = (bfd_elf_string_from_elf_section
1852 1.1 christos (abfd, elf_elfheader(abfd)->e_shstrndx,
1853 1.1 christos _bfd_elf_single_rel_hdr (sec)->sh_name));
1854 1.1 christos if (srel_name == NULL)
1855 1.1 christos return NULL;
1856 1.1 christos
1857 1.1 christos BFD_ASSERT ((CONST_STRNEQ (srel_name, ".rela")
1858 1.1.1.6 christos && strcmp (bfd_section_name (sec), srel_name+5) == 0)
1859 1.1 christos || (CONST_STRNEQ (srel_name, ".rel")
1860 1.1.1.6 christos && strcmp (bfd_section_name (sec), srel_name+4) == 0));
1861 1.1 christos
1862 1.1 christos dynobj = ia64_info->root.dynobj;
1863 1.1 christos if (!dynobj)
1864 1.1 christos ia64_info->root.dynobj = dynobj = abfd;
1865 1.1 christos
1866 1.1 christos srel = bfd_get_linker_section (dynobj, srel_name);
1867 1.1 christos if (srel == NULL && create)
1868 1.1 christos {
1869 1.1 christos srel = bfd_make_section_anyway_with_flags (dynobj, srel_name,
1870 1.1 christos (SEC_ALLOC | SEC_LOAD
1871 1.1 christos | SEC_HAS_CONTENTS
1872 1.1 christos | SEC_IN_MEMORY
1873 1.1 christos | SEC_LINKER_CREATED
1874 1.1 christos | SEC_READONLY));
1875 1.1 christos if (srel == NULL
1876 1.1.1.6 christos || !bfd_set_section_alignment (srel, 3))
1877 1.1 christos return NULL;
1878 1.1 christos }
1879 1.1 christos
1880 1.1 christos return srel;
1881 1.1 christos }
1882 1.1 christos
1883 1.1 christos static bfd_boolean
1884 1.1 christos count_dyn_reloc (bfd *abfd, struct elf64_ia64_dyn_sym_info *dyn_i,
1885 1.1 christos asection *srel, int type)
1886 1.1 christos {
1887 1.1 christos struct elf64_ia64_dyn_reloc_entry *rent;
1888 1.1 christos
1889 1.1 christos for (rent = dyn_i->reloc_entries; rent; rent = rent->next)
1890 1.1 christos if (rent->srel == srel && rent->type == type)
1891 1.1 christos break;
1892 1.1 christos
1893 1.1 christos if (!rent)
1894 1.1 christos {
1895 1.1 christos rent = ((struct elf64_ia64_dyn_reloc_entry *)
1896 1.1 christos bfd_alloc (abfd, (bfd_size_type) sizeof (*rent)));
1897 1.1 christos if (!rent)
1898 1.1 christos return FALSE;
1899 1.1 christos
1900 1.1 christos rent->next = dyn_i->reloc_entries;
1901 1.1 christos rent->srel = srel;
1902 1.1 christos rent->type = type;
1903 1.1 christos rent->count = 0;
1904 1.1 christos dyn_i->reloc_entries = rent;
1905 1.1 christos }
1906 1.1 christos rent->count++;
1907 1.1 christos
1908 1.1 christos return TRUE;
1909 1.1 christos }
1910 1.1 christos
1911 1.1 christos static bfd_boolean
1912 1.1 christos elf64_ia64_check_relocs (bfd *abfd, struct bfd_link_info *info,
1913 1.1 christos asection *sec,
1914 1.1 christos const Elf_Internal_Rela *relocs)
1915 1.1 christos {
1916 1.1 christos struct elf64_ia64_link_hash_table *ia64_info;
1917 1.1 christos const Elf_Internal_Rela *relend;
1918 1.1 christos Elf_Internal_Shdr *symtab_hdr;
1919 1.1 christos const Elf_Internal_Rela *rel;
1920 1.1 christos asection *got, *fptr, *srel, *pltoff;
1921 1.1 christos enum {
1922 1.1 christos NEED_GOT = 1,
1923 1.1 christos NEED_GOTX = 2,
1924 1.1 christos NEED_FPTR = 4,
1925 1.1 christos NEED_PLTOFF = 8,
1926 1.1 christos NEED_MIN_PLT = 16,
1927 1.1 christos NEED_FULL_PLT = 32,
1928 1.1 christos NEED_DYNREL = 64,
1929 1.1 christos NEED_LTOFF_FPTR = 128
1930 1.1 christos };
1931 1.1 christos int need_entry;
1932 1.1 christos struct elf_link_hash_entry *h;
1933 1.1 christos unsigned long r_symndx;
1934 1.1 christos bfd_boolean maybe_dynamic;
1935 1.1 christos
1936 1.1.1.2 christos if (bfd_link_relocatable (info))
1937 1.1 christos return TRUE;
1938 1.1 christos
1939 1.1 christos symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1940 1.1 christos ia64_info = elf64_ia64_hash_table (info);
1941 1.1 christos if (ia64_info == NULL)
1942 1.1 christos return FALSE;
1943 1.1 christos
1944 1.1 christos got = fptr = srel = pltoff = NULL;
1945 1.1 christos
1946 1.1 christos relend = relocs + sec->reloc_count;
1947 1.1 christos
1948 1.1 christos /* We scan relocations first to create dynamic relocation arrays. We
1949 1.1 christos modified get_dyn_sym_info to allow fast insertion and support fast
1950 1.1 christos lookup in the next loop. */
1951 1.1 christos for (rel = relocs; rel < relend; ++rel)
1952 1.1 christos {
1953 1.1 christos r_symndx = ELF64_R_SYM (rel->r_info);
1954 1.1 christos if (r_symndx >= symtab_hdr->sh_info)
1955 1.1 christos {
1956 1.1 christos long indx = r_symndx - symtab_hdr->sh_info;
1957 1.1 christos h = elf_sym_hashes (abfd)[indx];
1958 1.1 christos while (h->root.type == bfd_link_hash_indirect
1959 1.1 christos || h->root.type == bfd_link_hash_warning)
1960 1.1 christos h = (struct elf_link_hash_entry *) h->root.u.i.link;
1961 1.1 christos }
1962 1.1 christos else
1963 1.1 christos h = NULL;
1964 1.1 christos
1965 1.1 christos /* We can only get preliminary data on whether a symbol is
1966 1.1 christos locally or externally defined, as not all of the input files
1967 1.1 christos have yet been processed. Do something with what we know, as
1968 1.1 christos this may help reduce memory usage and processing time later. */
1969 1.1.1.2 christos maybe_dynamic = (h && ((!bfd_link_executable (info)
1970 1.1 christos && (!SYMBOLIC_BIND (info, h)
1971 1.1 christos || info->unresolved_syms_in_shared_libs == RM_IGNORE))
1972 1.1 christos || !h->def_regular
1973 1.1 christos || h->root.type == bfd_link_hash_defweak));
1974 1.1 christos
1975 1.1 christos need_entry = 0;
1976 1.1 christos switch (ELF64_R_TYPE (rel->r_info))
1977 1.1 christos {
1978 1.1 christos case R_IA64_TPREL64MSB:
1979 1.1 christos case R_IA64_TPREL64LSB:
1980 1.1 christos case R_IA64_LTOFF_TPREL22:
1981 1.1 christos case R_IA64_DTPREL32MSB:
1982 1.1 christos case R_IA64_DTPREL32LSB:
1983 1.1 christos case R_IA64_DTPREL64MSB:
1984 1.1 christos case R_IA64_DTPREL64LSB:
1985 1.1 christos case R_IA64_LTOFF_DTPREL22:
1986 1.1 christos case R_IA64_DTPMOD64MSB:
1987 1.1 christos case R_IA64_DTPMOD64LSB:
1988 1.1 christos case R_IA64_LTOFF_DTPMOD22:
1989 1.1.1.4 christos abort ();
1990 1.1 christos break;
1991 1.1 christos
1992 1.1 christos case R_IA64_IPLTMSB:
1993 1.1 christos case R_IA64_IPLTLSB:
1994 1.1.1.4 christos break;
1995 1.1 christos
1996 1.1 christos case R_IA64_LTOFF_FPTR22:
1997 1.1 christos case R_IA64_LTOFF_FPTR64I:
1998 1.1 christos case R_IA64_LTOFF_FPTR32MSB:
1999 1.1 christos case R_IA64_LTOFF_FPTR32LSB:
2000 1.1 christos case R_IA64_LTOFF_FPTR64MSB:
2001 1.1 christos case R_IA64_LTOFF_FPTR64LSB:
2002 1.1 christos need_entry = NEED_FPTR | NEED_GOT | NEED_LTOFF_FPTR;
2003 1.1 christos break;
2004 1.1 christos
2005 1.1 christos case R_IA64_FPTR64I:
2006 1.1 christos case R_IA64_FPTR32MSB:
2007 1.1 christos case R_IA64_FPTR32LSB:
2008 1.1 christos case R_IA64_FPTR64MSB:
2009 1.1 christos case R_IA64_FPTR64LSB:
2010 1.1.1.2 christos if (bfd_link_pic (info) || h)
2011 1.1 christos need_entry = NEED_FPTR | NEED_DYNREL;
2012 1.1 christos else
2013 1.1 christos need_entry = NEED_FPTR;
2014 1.1 christos break;
2015 1.1 christos
2016 1.1 christos case R_IA64_LTOFF22:
2017 1.1 christos case R_IA64_LTOFF64I:
2018 1.1 christos need_entry = NEED_GOT;
2019 1.1 christos break;
2020 1.1 christos
2021 1.1 christos case R_IA64_LTOFF22X:
2022 1.1 christos need_entry = NEED_GOTX;
2023 1.1 christos break;
2024 1.1 christos
2025 1.1 christos case R_IA64_PLTOFF22:
2026 1.1 christos case R_IA64_PLTOFF64I:
2027 1.1 christos case R_IA64_PLTOFF64MSB:
2028 1.1 christos case R_IA64_PLTOFF64LSB:
2029 1.1 christos need_entry = NEED_PLTOFF;
2030 1.1 christos if (h)
2031 1.1 christos {
2032 1.1 christos if (maybe_dynamic)
2033 1.1 christos need_entry |= NEED_MIN_PLT;
2034 1.1 christos }
2035 1.1 christos else
2036 1.1 christos {
2037 1.1 christos (*info->callbacks->warning)
2038 1.1 christos (info, _("@pltoff reloc against local symbol"), 0,
2039 1.1 christos abfd, 0, (bfd_vma) 0);
2040 1.1 christos }
2041 1.1 christos break;
2042 1.1 christos
2043 1.1 christos case R_IA64_PCREL21B:
2044 1.1.1.4 christos case R_IA64_PCREL60B:
2045 1.1 christos /* Depending on where this symbol is defined, we may or may not
2046 1.1 christos need a full plt entry. Only skip if we know we'll not need
2047 1.1 christos the entry -- static or symbolic, and the symbol definition
2048 1.1 christos has already been seen. */
2049 1.1 christos if (maybe_dynamic && rel->r_addend == 0)
2050 1.1 christos need_entry = NEED_FULL_PLT;
2051 1.1 christos break;
2052 1.1 christos
2053 1.1 christos case R_IA64_IMM14:
2054 1.1 christos case R_IA64_IMM22:
2055 1.1 christos case R_IA64_IMM64:
2056 1.1 christos case R_IA64_DIR32MSB:
2057 1.1 christos case R_IA64_DIR32LSB:
2058 1.1 christos case R_IA64_DIR64MSB:
2059 1.1 christos case R_IA64_DIR64LSB:
2060 1.1 christos /* Shared objects will always need at least a REL relocation. */
2061 1.1.1.2 christos if (bfd_link_pic (info) || maybe_dynamic)
2062 1.1 christos need_entry = NEED_DYNREL;
2063 1.1 christos break;
2064 1.1 christos
2065 1.1 christos case R_IA64_PCREL22:
2066 1.1 christos case R_IA64_PCREL64I:
2067 1.1 christos case R_IA64_PCREL32MSB:
2068 1.1 christos case R_IA64_PCREL32LSB:
2069 1.1 christos case R_IA64_PCREL64MSB:
2070 1.1 christos case R_IA64_PCREL64LSB:
2071 1.1 christos if (maybe_dynamic)
2072 1.1 christos need_entry = NEED_DYNREL;
2073 1.1 christos break;
2074 1.1 christos }
2075 1.1 christos
2076 1.1 christos if (!need_entry)
2077 1.1 christos continue;
2078 1.1 christos
2079 1.1 christos if ((need_entry & NEED_FPTR) != 0
2080 1.1 christos && rel->r_addend)
2081 1.1 christos {
2082 1.1 christos (*info->callbacks->warning)
2083 1.1 christos (info, _("non-zero addend in @fptr reloc"), 0,
2084 1.1 christos abfd, 0, (bfd_vma) 0);
2085 1.1 christos }
2086 1.1 christos
2087 1.1 christos if (get_dyn_sym_info (ia64_info, h, abfd, rel, TRUE) == NULL)
2088 1.1 christos return FALSE;
2089 1.1 christos }
2090 1.1 christos
2091 1.1 christos /* Now, we only do lookup without insertion, which is very fast
2092 1.1 christos with the modified get_dyn_sym_info. */
2093 1.1 christos for (rel = relocs; rel < relend; ++rel)
2094 1.1 christos {
2095 1.1 christos struct elf64_ia64_dyn_sym_info *dyn_i;
2096 1.1 christos int dynrel_type = R_IA64_NONE;
2097 1.1 christos
2098 1.1 christos r_symndx = ELF64_R_SYM (rel->r_info);
2099 1.1 christos if (r_symndx >= symtab_hdr->sh_info)
2100 1.1 christos {
2101 1.1 christos /* We're dealing with a global symbol -- find its hash entry
2102 1.1 christos and mark it as being referenced. */
2103 1.1 christos long indx = r_symndx - symtab_hdr->sh_info;
2104 1.1 christos h = elf_sym_hashes (abfd)[indx];
2105 1.1 christos while (h->root.type == bfd_link_hash_indirect
2106 1.1 christos || h->root.type == bfd_link_hash_warning)
2107 1.1 christos h = (struct elf_link_hash_entry *) h->root.u.i.link;
2108 1.1 christos
2109 1.1.1.2 christos /* PR15323, ref flags aren't set for references in the same
2110 1.1.1.2 christos object. */
2111 1.1 christos h->ref_regular = 1;
2112 1.1 christos }
2113 1.1 christos else
2114 1.1 christos h = NULL;
2115 1.1 christos
2116 1.1 christos /* We can only get preliminary data on whether a symbol is
2117 1.1 christos locally or externally defined, as not all of the input files
2118 1.1 christos have yet been processed. Do something with what we know, as
2119 1.1 christos this may help reduce memory usage and processing time later. */
2120 1.1.1.2 christos maybe_dynamic = (h && ((!bfd_link_executable (info)
2121 1.1 christos && (!SYMBOLIC_BIND (info, h)
2122 1.1 christos || info->unresolved_syms_in_shared_libs == RM_IGNORE))
2123 1.1 christos || !h->def_regular
2124 1.1 christos || h->root.type == bfd_link_hash_defweak));
2125 1.1 christos
2126 1.1 christos need_entry = 0;
2127 1.1 christos switch (ELF64_R_TYPE (rel->r_info))
2128 1.1 christos {
2129 1.1 christos case R_IA64_TPREL64MSB:
2130 1.1 christos case R_IA64_TPREL64LSB:
2131 1.1 christos case R_IA64_LTOFF_TPREL22:
2132 1.1 christos case R_IA64_DTPREL32MSB:
2133 1.1 christos case R_IA64_DTPREL32LSB:
2134 1.1 christos case R_IA64_DTPREL64MSB:
2135 1.1 christos case R_IA64_DTPREL64LSB:
2136 1.1 christos case R_IA64_LTOFF_DTPREL22:
2137 1.1 christos case R_IA64_DTPMOD64MSB:
2138 1.1 christos case R_IA64_DTPMOD64LSB:
2139 1.1 christos case R_IA64_LTOFF_DTPMOD22:
2140 1.1.1.4 christos abort ();
2141 1.1 christos break;
2142 1.1 christos
2143 1.1 christos case R_IA64_LTOFF_FPTR22:
2144 1.1 christos case R_IA64_LTOFF_FPTR64I:
2145 1.1 christos case R_IA64_LTOFF_FPTR32MSB:
2146 1.1 christos case R_IA64_LTOFF_FPTR32LSB:
2147 1.1 christos case R_IA64_LTOFF_FPTR64MSB:
2148 1.1 christos case R_IA64_LTOFF_FPTR64LSB:
2149 1.1 christos need_entry = NEED_FPTR | NEED_GOT | NEED_LTOFF_FPTR;
2150 1.1 christos break;
2151 1.1 christos
2152 1.1 christos case R_IA64_FPTR64I:
2153 1.1 christos case R_IA64_FPTR32MSB:
2154 1.1 christos case R_IA64_FPTR32LSB:
2155 1.1 christos case R_IA64_FPTR64MSB:
2156 1.1 christos case R_IA64_FPTR64LSB:
2157 1.1.1.2 christos if (bfd_link_pic (info) || h)
2158 1.1 christos need_entry = NEED_FPTR | NEED_DYNREL;
2159 1.1 christos else
2160 1.1 christos need_entry = NEED_FPTR;
2161 1.1 christos dynrel_type = R_IA64_FPTR64LSB;
2162 1.1 christos break;
2163 1.1 christos
2164 1.1 christos case R_IA64_LTOFF22:
2165 1.1 christos case R_IA64_LTOFF64I:
2166 1.1 christos need_entry = NEED_GOT;
2167 1.1 christos break;
2168 1.1 christos
2169 1.1 christos case R_IA64_LTOFF22X:
2170 1.1 christos need_entry = NEED_GOTX;
2171 1.1 christos break;
2172 1.1 christos
2173 1.1 christos case R_IA64_PLTOFF22:
2174 1.1 christos case R_IA64_PLTOFF64I:
2175 1.1 christos case R_IA64_PLTOFF64MSB:
2176 1.1 christos case R_IA64_PLTOFF64LSB:
2177 1.1 christos need_entry = NEED_PLTOFF;
2178 1.1 christos if (h)
2179 1.1 christos {
2180 1.1 christos if (maybe_dynamic)
2181 1.1 christos need_entry |= NEED_MIN_PLT;
2182 1.1 christos }
2183 1.1 christos break;
2184 1.1 christos
2185 1.1 christos case R_IA64_PCREL21B:
2186 1.1.1.4 christos case R_IA64_PCREL60B:
2187 1.1 christos /* Depending on where this symbol is defined, we may or may not
2188 1.1 christos need a full plt entry. Only skip if we know we'll not need
2189 1.1 christos the entry -- static or symbolic, and the symbol definition
2190 1.1 christos has already been seen. */
2191 1.1 christos if (maybe_dynamic && rel->r_addend == 0)
2192 1.1 christos need_entry = NEED_FULL_PLT;
2193 1.1 christos break;
2194 1.1 christos
2195 1.1 christos case R_IA64_IMM14:
2196 1.1 christos case R_IA64_IMM22:
2197 1.1 christos case R_IA64_IMM64:
2198 1.1 christos case R_IA64_DIR32MSB:
2199 1.1 christos case R_IA64_DIR32LSB:
2200 1.1 christos case R_IA64_DIR64MSB:
2201 1.1 christos case R_IA64_DIR64LSB:
2202 1.1 christos /* Shared objects will always need at least a REL relocation. */
2203 1.1.1.2 christos if (bfd_link_pic (info) || maybe_dynamic)
2204 1.1 christos need_entry = NEED_DYNREL;
2205 1.1 christos dynrel_type = R_IA64_DIR64LSB;
2206 1.1 christos break;
2207 1.1 christos
2208 1.1 christos case R_IA64_IPLTMSB:
2209 1.1 christos case R_IA64_IPLTLSB:
2210 1.1 christos break;
2211 1.1 christos
2212 1.1 christos case R_IA64_PCREL22:
2213 1.1 christos case R_IA64_PCREL64I:
2214 1.1 christos case R_IA64_PCREL32MSB:
2215 1.1 christos case R_IA64_PCREL32LSB:
2216 1.1 christos case R_IA64_PCREL64MSB:
2217 1.1 christos case R_IA64_PCREL64LSB:
2218 1.1 christos if (maybe_dynamic)
2219 1.1 christos need_entry = NEED_DYNREL;
2220 1.1 christos dynrel_type = R_IA64_PCREL64LSB;
2221 1.1 christos break;
2222 1.1 christos }
2223 1.1 christos
2224 1.1 christos if (!need_entry)
2225 1.1 christos continue;
2226 1.1 christos
2227 1.1 christos dyn_i = get_dyn_sym_info (ia64_info, h, abfd, rel, FALSE);
2228 1.1 christos
2229 1.1 christos /* Record whether or not this is a local symbol. */
2230 1.1 christos dyn_i->h = h;
2231 1.1 christos
2232 1.1 christos /* Create what's needed. */
2233 1.1 christos if (need_entry & (NEED_GOT | NEED_GOTX))
2234 1.1 christos {
2235 1.1 christos if (!got)
2236 1.1 christos {
2237 1.1 christos got = get_got (abfd, ia64_info);
2238 1.1 christos if (!got)
2239 1.1 christos return FALSE;
2240 1.1 christos }
2241 1.1 christos if (need_entry & NEED_GOT)
2242 1.1 christos dyn_i->want_got = 1;
2243 1.1 christos if (need_entry & NEED_GOTX)
2244 1.1 christos dyn_i->want_gotx = 1;
2245 1.1 christos }
2246 1.1 christos if (need_entry & NEED_FPTR)
2247 1.1 christos {
2248 1.1.1.4 christos /* Create the .opd section. */
2249 1.1 christos if (!fptr)
2250 1.1 christos {
2251 1.1 christos fptr = get_fptr (abfd, info, ia64_info);
2252 1.1 christos if (!fptr)
2253 1.1 christos return FALSE;
2254 1.1 christos }
2255 1.1 christos dyn_i->want_fptr = 1;
2256 1.1 christos }
2257 1.1 christos if (need_entry & NEED_LTOFF_FPTR)
2258 1.1 christos dyn_i->want_ltoff_fptr = 1;
2259 1.1 christos if (need_entry & (NEED_MIN_PLT | NEED_FULL_PLT))
2260 1.1 christos {
2261 1.1.1.4 christos if (!ia64_info->root.dynobj)
2262 1.1 christos ia64_info->root.dynobj = abfd;
2263 1.1 christos h->needs_plt = 1;
2264 1.1 christos dyn_i->want_plt = 1;
2265 1.1 christos }
2266 1.1 christos if (need_entry & NEED_FULL_PLT)
2267 1.1 christos dyn_i->want_plt2 = 1;
2268 1.1 christos if (need_entry & NEED_PLTOFF)
2269 1.1 christos {
2270 1.1 christos /* This is needed here, in case @pltoff is used in a non-shared
2271 1.1 christos link. */
2272 1.1 christos if (!pltoff)
2273 1.1 christos {
2274 1.1 christos pltoff = get_pltoff (abfd, ia64_info);
2275 1.1 christos if (!pltoff)
2276 1.1 christos return FALSE;
2277 1.1 christos }
2278 1.1 christos
2279 1.1 christos dyn_i->want_pltoff = 1;
2280 1.1 christos }
2281 1.1 christos if ((need_entry & NEED_DYNREL) && (sec->flags & SEC_ALLOC))
2282 1.1 christos {
2283 1.1 christos if (!srel)
2284 1.1 christos {
2285 1.1 christos srel = get_reloc_section (abfd, ia64_info, sec, TRUE);
2286 1.1 christos if (!srel)
2287 1.1 christos return FALSE;
2288 1.1 christos }
2289 1.1 christos if (!count_dyn_reloc (abfd, dyn_i, srel, dynrel_type))
2290 1.1 christos return FALSE;
2291 1.1 christos }
2292 1.1 christos }
2293 1.1 christos
2294 1.1 christos return TRUE;
2295 1.1 christos }
2296 1.1 christos
2297 1.1 christos /* For cleanliness, and potentially faster dynamic loading, allocate
2298 1.1 christos external GOT entries first. */
2299 1.1 christos
2300 1.1 christos static bfd_boolean
2301 1.1 christos allocate_global_data_got (struct elf64_ia64_dyn_sym_info *dyn_i,
2302 1.1 christos void * data)
2303 1.1 christos {
2304 1.1 christos struct elf64_ia64_allocate_data *x = (struct elf64_ia64_allocate_data *)data;
2305 1.1 christos
2306 1.1 christos if ((dyn_i->want_got || dyn_i->want_gotx)
2307 1.1 christos && ! dyn_i->want_fptr
2308 1.1 christos && elf64_ia64_dynamic_symbol_p (dyn_i->h))
2309 1.1 christos {
2310 1.1 christos /* GOT entry with FPTR is done by allocate_global_fptr_got. */
2311 1.1 christos dyn_i->got_offset = x->ofs;
2312 1.1 christos x->ofs += 8;
2313 1.1 christos }
2314 1.1 christos return TRUE;
2315 1.1 christos }
2316 1.1 christos
2317 1.1 christos /* Next, allocate all the GOT entries used by LTOFF_FPTR relocs. */
2318 1.1 christos
2319 1.1 christos static bfd_boolean
2320 1.1 christos allocate_global_fptr_got (struct elf64_ia64_dyn_sym_info *dyn_i,
2321 1.1 christos void * data)
2322 1.1 christos {
2323 1.1 christos struct elf64_ia64_allocate_data *x = (struct elf64_ia64_allocate_data *)data;
2324 1.1 christos
2325 1.1 christos if (dyn_i->want_got
2326 1.1 christos && dyn_i->want_fptr
2327 1.1 christos && elf64_ia64_dynamic_symbol_p (dyn_i->h))
2328 1.1 christos {
2329 1.1 christos dyn_i->got_offset = x->ofs;
2330 1.1 christos x->ofs += 8;
2331 1.1 christos }
2332 1.1 christos return TRUE;
2333 1.1 christos }
2334 1.1 christos
2335 1.1 christos /* Lastly, allocate all the GOT entries for local data. */
2336 1.1 christos
2337 1.1 christos static bfd_boolean
2338 1.1 christos allocate_local_got (struct elf64_ia64_dyn_sym_info *dyn_i,
2339 1.1 christos void * data)
2340 1.1 christos {
2341 1.1 christos struct elf64_ia64_allocate_data *x = (struct elf64_ia64_allocate_data *) data;
2342 1.1 christos
2343 1.1 christos if ((dyn_i->want_got || dyn_i->want_gotx)
2344 1.1 christos && !elf64_ia64_dynamic_symbol_p (dyn_i->h))
2345 1.1 christos {
2346 1.1 christos dyn_i->got_offset = x->ofs;
2347 1.1 christos x->ofs += 8;
2348 1.1 christos }
2349 1.1 christos return TRUE;
2350 1.1 christos }
2351 1.1 christos
2352 1.1 christos /* Allocate function descriptors. We can do these for every function
2353 1.1 christos in a main executable that is not exported. */
2354 1.1 christos
2355 1.1 christos static bfd_boolean
2356 1.1 christos allocate_fptr (struct elf64_ia64_dyn_sym_info *dyn_i, void * data)
2357 1.1 christos {
2358 1.1 christos struct elf64_ia64_allocate_data *x = (struct elf64_ia64_allocate_data *) data;
2359 1.1 christos
2360 1.1 christos if (dyn_i->want_fptr)
2361 1.1 christos {
2362 1.1 christos struct elf_link_hash_entry *h = dyn_i->h;
2363 1.1 christos
2364 1.1 christos if (h)
2365 1.1 christos while (h->root.type == bfd_link_hash_indirect
2366 1.1 christos || h->root.type == bfd_link_hash_warning)
2367 1.1 christos h = (struct elf_link_hash_entry *) h->root.u.i.link;
2368 1.1 christos
2369 1.1 christos if (h == NULL || !h->def_dynamic)
2370 1.1 christos {
2371 1.1.1.4 christos /* A non dynamic symbol. */
2372 1.1 christos dyn_i->fptr_offset = x->ofs;
2373 1.1 christos x->ofs += 16;
2374 1.1 christos }
2375 1.1 christos else
2376 1.1 christos dyn_i->want_fptr = 0;
2377 1.1 christos }
2378 1.1 christos return TRUE;
2379 1.1 christos }
2380 1.1 christos
2381 1.1 christos /* Allocate all the minimal PLT entries. */
2382 1.1 christos
2383 1.1 christos static bfd_boolean
2384 1.1 christos allocate_plt_entries (struct elf64_ia64_dyn_sym_info *dyn_i,
2385 1.1 christos void * data ATTRIBUTE_UNUSED)
2386 1.1 christos {
2387 1.1 christos if (dyn_i->want_plt)
2388 1.1 christos {
2389 1.1 christos struct elf_link_hash_entry *h = dyn_i->h;
2390 1.1 christos
2391 1.1 christos if (h)
2392 1.1 christos while (h->root.type == bfd_link_hash_indirect
2393 1.1 christos || h->root.type == bfd_link_hash_warning)
2394 1.1 christos h = (struct elf_link_hash_entry *) h->root.u.i.link;
2395 1.1 christos
2396 1.1 christos /* ??? Versioned symbols seem to lose NEEDS_PLT. */
2397 1.1 christos if (elf64_ia64_dynamic_symbol_p (h))
2398 1.1 christos {
2399 1.1 christos dyn_i->want_pltoff = 1;
2400 1.1 christos }
2401 1.1 christos else
2402 1.1 christos {
2403 1.1 christos dyn_i->want_plt = 0;
2404 1.1 christos dyn_i->want_plt2 = 0;
2405 1.1 christos }
2406 1.1 christos }
2407 1.1 christos return TRUE;
2408 1.1 christos }
2409 1.1 christos
2410 1.1 christos /* Allocate all the full PLT entries. */
2411 1.1 christos
2412 1.1 christos static bfd_boolean
2413 1.1 christos allocate_plt2_entries (struct elf64_ia64_dyn_sym_info *dyn_i,
2414 1.1 christos void * data)
2415 1.1 christos {
2416 1.1 christos struct elf64_ia64_allocate_data *x = (struct elf64_ia64_allocate_data *)data;
2417 1.1 christos
2418 1.1 christos if (dyn_i->want_plt2)
2419 1.1 christos {
2420 1.1 christos struct elf_link_hash_entry *h = dyn_i->h;
2421 1.1 christos bfd_size_type ofs = x->ofs;
2422 1.1 christos
2423 1.1 christos dyn_i->plt2_offset = ofs;
2424 1.1 christos x->ofs = ofs + PLT_FULL_ENTRY_SIZE;
2425 1.1 christos
2426 1.1 christos while (h->root.type == bfd_link_hash_indirect
2427 1.1 christos || h->root.type == bfd_link_hash_warning)
2428 1.1 christos h = (struct elf_link_hash_entry *) h->root.u.i.link;
2429 1.1 christos dyn_i->h->plt.offset = ofs;
2430 1.1 christos }
2431 1.1 christos return TRUE;
2432 1.1 christos }
2433 1.1 christos
2434 1.1 christos /* Allocate all the PLTOFF entries requested by relocations and
2435 1.1 christos plt entries. We can't share space with allocated FPTR entries,
2436 1.1 christos because the latter are not necessarily addressable by the GP.
2437 1.1 christos ??? Relaxation might be able to determine that they are. */
2438 1.1 christos
2439 1.1 christos static bfd_boolean
2440 1.1 christos allocate_pltoff_entries (struct elf64_ia64_dyn_sym_info *dyn_i,
2441 1.1 christos void * data)
2442 1.1 christos {
2443 1.1 christos struct elf64_ia64_allocate_data *x = (struct elf64_ia64_allocate_data *)data;
2444 1.1 christos
2445 1.1 christos if (dyn_i->want_pltoff)
2446 1.1 christos {
2447 1.1 christos dyn_i->pltoff_offset = x->ofs;
2448 1.1 christos x->ofs += 16;
2449 1.1 christos }
2450 1.1 christos return TRUE;
2451 1.1 christos }
2452 1.1 christos
2453 1.1 christos /* Allocate dynamic relocations for those symbols that turned out
2454 1.1 christos to be dynamic. */
2455 1.1 christos
2456 1.1 christos static bfd_boolean
2457 1.1 christos allocate_dynrel_entries (struct elf64_ia64_dyn_sym_info *dyn_i,
2458 1.1 christos void * data)
2459 1.1 christos {
2460 1.1 christos struct elf64_ia64_allocate_data *x = (struct elf64_ia64_allocate_data *)data;
2461 1.1 christos struct elf64_ia64_link_hash_table *ia64_info;
2462 1.1 christos struct elf64_ia64_dyn_reloc_entry *rent;
2463 1.1 christos bfd_boolean dynamic_symbol, shared, resolved_zero;
2464 1.1 christos struct elf64_ia64_link_hash_entry *h_ia64;
2465 1.1 christos
2466 1.1 christos ia64_info = elf64_ia64_hash_table (x->info);
2467 1.1 christos if (ia64_info == NULL)
2468 1.1 christos return FALSE;
2469 1.1 christos
2470 1.1 christos /* Note that this can't be used in relation to FPTR relocs below. */
2471 1.1 christos dynamic_symbol = elf64_ia64_dynamic_symbol_p (dyn_i->h);
2472 1.1 christos
2473 1.1.1.2 christos shared = bfd_link_pic (x->info);
2474 1.1 christos resolved_zero = (dyn_i->h
2475 1.1 christos && ELF_ST_VISIBILITY (dyn_i->h->other)
2476 1.1 christos && dyn_i->h->root.type == bfd_link_hash_undefweak);
2477 1.1 christos
2478 1.1 christos /* Take care of the GOT and PLT relocations. */
2479 1.1 christos
2480 1.1 christos if ((!resolved_zero
2481 1.1 christos && (dynamic_symbol || shared)
2482 1.1 christos && (dyn_i->want_got || dyn_i->want_gotx))
2483 1.1 christos || (dyn_i->want_ltoff_fptr
2484 1.1 christos && dyn_i->h
2485 1.1 christos && dyn_i->h->def_dynamic))
2486 1.1 christos {
2487 1.1 christos /* VMS: FIX64. */
2488 1.1 christos if (dyn_i->h != NULL && dyn_i->h->def_dynamic)
2489 1.1.1.4 christos {
2490 1.1.1.4 christos h_ia64 = (struct elf64_ia64_link_hash_entry *) dyn_i->h;
2491 1.1.1.4 christos elf_ia64_vms_tdata (h_ia64->shl)->fixups_off +=
2492 1.1.1.4 christos sizeof (Elf64_External_VMS_IMAGE_FIXUP);
2493 1.1.1.4 christos ia64_info->fixups_sec->size +=
2494 1.1.1.4 christos sizeof (Elf64_External_VMS_IMAGE_FIXUP);
2495 1.1.1.4 christos }
2496 1.1 christos }
2497 1.1 christos
2498 1.1 christos if (ia64_info->rel_fptr_sec && dyn_i->want_fptr)
2499 1.1 christos {
2500 1.1 christos /* VMS: only image reloc. */
2501 1.1 christos if (dyn_i->h == NULL || dyn_i->h->root.type != bfd_link_hash_undefweak)
2502 1.1 christos ia64_info->rel_fptr_sec->size += sizeof (Elf64_External_Rela);
2503 1.1 christos }
2504 1.1 christos
2505 1.1 christos if (!resolved_zero && dyn_i->want_pltoff)
2506 1.1 christos {
2507 1.1 christos /* VMS: FIXFD. */
2508 1.1 christos if (dyn_i->h != NULL && dyn_i->h->def_dynamic)
2509 1.1.1.4 christos {
2510 1.1.1.4 christos h_ia64 = (struct elf64_ia64_link_hash_entry *) dyn_i->h;
2511 1.1.1.4 christos elf_ia64_vms_tdata (h_ia64->shl)->fixups_off +=
2512 1.1.1.4 christos sizeof (Elf64_External_VMS_IMAGE_FIXUP);
2513 1.1.1.4 christos ia64_info->fixups_sec->size +=
2514 1.1.1.4 christos sizeof (Elf64_External_VMS_IMAGE_FIXUP);
2515 1.1.1.4 christos }
2516 1.1 christos }
2517 1.1 christos
2518 1.1 christos /* Take care of the normal data relocations. */
2519 1.1 christos
2520 1.1 christos for (rent = dyn_i->reloc_entries; rent; rent = rent->next)
2521 1.1 christos {
2522 1.1 christos int count = rent->count;
2523 1.1 christos
2524 1.1 christos switch (rent->type)
2525 1.1 christos {
2526 1.1 christos case R_IA64_FPTR32LSB:
2527 1.1 christos case R_IA64_FPTR64LSB:
2528 1.1 christos /* Allocate one iff !want_fptr and not PIE, which by this point
2529 1.1 christos will be true only if we're actually allocating one statically
2530 1.1 christos in the main executable. Position independent executables
2531 1.1 christos need a relative reloc. */
2532 1.1.1.2 christos if (dyn_i->want_fptr && !bfd_link_pie (x->info))
2533 1.1 christos continue;
2534 1.1 christos break;
2535 1.1 christos case R_IA64_PCREL32LSB:
2536 1.1 christos case R_IA64_PCREL64LSB:
2537 1.1 christos if (!dynamic_symbol)
2538 1.1 christos continue;
2539 1.1 christos break;
2540 1.1 christos case R_IA64_DIR32LSB:
2541 1.1 christos case R_IA64_DIR64LSB:
2542 1.1 christos if (!dynamic_symbol && !shared)
2543 1.1 christos continue;
2544 1.1 christos break;
2545 1.1 christos case R_IA64_IPLTLSB:
2546 1.1 christos if (!dynamic_symbol && !shared)
2547 1.1 christos continue;
2548 1.1 christos /* Use two REL relocations for IPLT relocations
2549 1.1 christos against local symbols. */
2550 1.1 christos if (!dynamic_symbol)
2551 1.1 christos count *= 2;
2552 1.1 christos break;
2553 1.1 christos case R_IA64_DTPREL32LSB:
2554 1.1 christos case R_IA64_TPREL64LSB:
2555 1.1 christos case R_IA64_DTPREL64LSB:
2556 1.1 christos case R_IA64_DTPMOD64LSB:
2557 1.1 christos break;
2558 1.1 christos default:
2559 1.1 christos abort ();
2560 1.1 christos }
2561 1.1 christos
2562 1.1 christos /* Add a fixup. */
2563 1.1 christos if (!dynamic_symbol)
2564 1.1.1.4 christos abort ();
2565 1.1 christos
2566 1.1 christos h_ia64 = (struct elf64_ia64_link_hash_entry *) dyn_i->h;
2567 1.1 christos elf_ia64_vms_tdata (h_ia64->shl)->fixups_off +=
2568 1.1.1.4 christos sizeof (Elf64_External_VMS_IMAGE_FIXUP);
2569 1.1 christos ia64_info->fixups_sec->size +=
2570 1.1.1.4 christos sizeof (Elf64_External_VMS_IMAGE_FIXUP);
2571 1.1 christos }
2572 1.1 christos
2573 1.1 christos return TRUE;
2574 1.1 christos }
2575 1.1 christos
2576 1.1 christos static bfd_boolean
2577 1.1 christos elf64_ia64_adjust_dynamic_symbol (struct bfd_link_info *info ATTRIBUTE_UNUSED,
2578 1.1 christos struct elf_link_hash_entry *h)
2579 1.1 christos {
2580 1.1 christos /* ??? Undefined symbols with PLT entries should be re-defined
2581 1.1 christos to be the PLT entry. */
2582 1.1 christos
2583 1.1 christos /* If this is a weak symbol, and there is a real definition, the
2584 1.1 christos processor independent code will have arranged for us to see the
2585 1.1 christos real definition first, and we can just use the same value. */
2586 1.1.1.4 christos if (h->is_weakalias)
2587 1.1 christos {
2588 1.1.1.4 christos struct elf_link_hash_entry *def = weakdef (h);
2589 1.1.1.4 christos BFD_ASSERT (def->root.type == bfd_link_hash_defined);
2590 1.1.1.4 christos h->root.u.def.section = def->root.u.def.section;
2591 1.1.1.4 christos h->root.u.def.value = def->root.u.def.value;
2592 1.1 christos return TRUE;
2593 1.1 christos }
2594 1.1 christos
2595 1.1 christos /* If this is a reference to a symbol defined by a dynamic object which
2596 1.1 christos is not a function, we might allocate the symbol in our .dynbss section
2597 1.1 christos and allocate a COPY dynamic relocation.
2598 1.1 christos
2599 1.1 christos But IA-64 code is canonically PIC, so as a rule we can avoid this sort
2600 1.1 christos of hackery. */
2601 1.1 christos
2602 1.1 christos return TRUE;
2603 1.1 christos }
2604 1.1 christos
2605 1.1 christos static bfd_boolean
2606 1.1 christos elf64_ia64_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
2607 1.1 christos struct bfd_link_info *info)
2608 1.1 christos {
2609 1.1 christos struct elf64_ia64_allocate_data data;
2610 1.1 christos struct elf64_ia64_link_hash_table *ia64_info;
2611 1.1 christos asection *sec;
2612 1.1 christos bfd *dynobj;
2613 1.1 christos struct elf_link_hash_table *hash_table;
2614 1.1 christos
2615 1.1 christos hash_table = elf_hash_table (info);
2616 1.1 christos dynobj = hash_table->dynobj;
2617 1.1 christos ia64_info = elf64_ia64_hash_table (info);
2618 1.1 christos if (ia64_info == NULL)
2619 1.1 christos return FALSE;
2620 1.1 christos BFD_ASSERT(dynobj != NULL);
2621 1.1 christos data.info = info;
2622 1.1 christos
2623 1.1 christos /* Allocate the GOT entries. */
2624 1.1 christos
2625 1.1 christos if (ia64_info->root.sgot)
2626 1.1 christos {
2627 1.1 christos data.ofs = 0;
2628 1.1 christos elf64_ia64_dyn_sym_traverse (ia64_info, allocate_global_data_got, &data);
2629 1.1 christos elf64_ia64_dyn_sym_traverse (ia64_info, allocate_global_fptr_got, &data);
2630 1.1 christos elf64_ia64_dyn_sym_traverse (ia64_info, allocate_local_got, &data);
2631 1.1 christos ia64_info->root.sgot->size = data.ofs;
2632 1.1 christos }
2633 1.1 christos
2634 1.1 christos /* Allocate the FPTR entries. */
2635 1.1 christos
2636 1.1 christos if (ia64_info->fptr_sec)
2637 1.1 christos {
2638 1.1 christos data.ofs = 0;
2639 1.1 christos elf64_ia64_dyn_sym_traverse (ia64_info, allocate_fptr, &data);
2640 1.1 christos ia64_info->fptr_sec->size = data.ofs;
2641 1.1 christos }
2642 1.1 christos
2643 1.1 christos /* Now that we've seen all of the input files, we can decide which
2644 1.1 christos symbols need plt entries. Allocate the minimal PLT entries first.
2645 1.1 christos We do this even though dynamic_sections_created may be FALSE, because
2646 1.1 christos this has the side-effect of clearing want_plt and want_plt2. */
2647 1.1 christos
2648 1.1 christos data.ofs = 0;
2649 1.1 christos elf64_ia64_dyn_sym_traverse (ia64_info, allocate_plt_entries, &data);
2650 1.1 christos
2651 1.1 christos /* Align the pointer for the plt2 entries. */
2652 1.1 christos data.ofs = (data.ofs + 31) & (bfd_vma) -32;
2653 1.1 christos
2654 1.1 christos elf64_ia64_dyn_sym_traverse (ia64_info, allocate_plt2_entries, &data);
2655 1.1 christos if (data.ofs != 0 || ia64_info->root.dynamic_sections_created)
2656 1.1 christos {
2657 1.1 christos /* FIXME: we always reserve the memory for dynamic linker even if
2658 1.1 christos there are no PLT entries since dynamic linker may assume the
2659 1.1 christos reserved memory always exists. */
2660 1.1 christos
2661 1.1 christos BFD_ASSERT (ia64_info->root.dynamic_sections_created);
2662 1.1 christos
2663 1.1 christos ia64_info->root.splt->size = data.ofs;
2664 1.1 christos }
2665 1.1 christos
2666 1.1 christos /* Allocate the PLTOFF entries. */
2667 1.1 christos
2668 1.1 christos if (ia64_info->pltoff_sec)
2669 1.1 christos {
2670 1.1 christos data.ofs = 0;
2671 1.1 christos elf64_ia64_dyn_sym_traverse (ia64_info, allocate_pltoff_entries, &data);
2672 1.1 christos ia64_info->pltoff_sec->size = data.ofs;
2673 1.1 christos }
2674 1.1 christos
2675 1.1 christos if (ia64_info->root.dynamic_sections_created)
2676 1.1 christos {
2677 1.1 christos /* Allocate space for the dynamic relocations that turned out to be
2678 1.1 christos required. */
2679 1.1 christos elf64_ia64_dyn_sym_traverse (ia64_info, allocate_dynrel_entries, &data);
2680 1.1 christos }
2681 1.1 christos
2682 1.1 christos /* We have now determined the sizes of the various dynamic sections.
2683 1.1 christos Allocate memory for them. */
2684 1.1 christos for (sec = dynobj->sections; sec != NULL; sec = sec->next)
2685 1.1 christos {
2686 1.1 christos bfd_boolean strip;
2687 1.1 christos
2688 1.1 christos if (!(sec->flags & SEC_LINKER_CREATED))
2689 1.1 christos continue;
2690 1.1 christos
2691 1.1 christos /* If we don't need this section, strip it from the output file.
2692 1.1 christos There were several sections primarily related to dynamic
2693 1.1 christos linking that must be create before the linker maps input
2694 1.1 christos sections to output sections. The linker does that before
2695 1.1 christos bfd_elf_size_dynamic_sections is called, and it is that
2696 1.1 christos function which decides whether anything needs to go into
2697 1.1 christos these sections. */
2698 1.1 christos
2699 1.1 christos strip = (sec->size == 0);
2700 1.1 christos
2701 1.1 christos if (sec == ia64_info->root.sgot)
2702 1.1 christos strip = FALSE;
2703 1.1 christos else if (sec == ia64_info->root.srelgot)
2704 1.1 christos {
2705 1.1 christos if (strip)
2706 1.1 christos ia64_info->root.srelgot = NULL;
2707 1.1 christos else
2708 1.1 christos /* We use the reloc_count field as a counter if we need to
2709 1.1 christos copy relocs into the output file. */
2710 1.1 christos sec->reloc_count = 0;
2711 1.1 christos }
2712 1.1 christos else if (sec == ia64_info->fptr_sec)
2713 1.1 christos {
2714 1.1 christos if (strip)
2715 1.1 christos ia64_info->fptr_sec = NULL;
2716 1.1 christos }
2717 1.1 christos else if (sec == ia64_info->rel_fptr_sec)
2718 1.1 christos {
2719 1.1 christos if (strip)
2720 1.1 christos ia64_info->rel_fptr_sec = NULL;
2721 1.1 christos else
2722 1.1 christos /* We use the reloc_count field as a counter if we need to
2723 1.1 christos copy relocs into the output file. */
2724 1.1 christos sec->reloc_count = 0;
2725 1.1 christos }
2726 1.1 christos else if (sec == ia64_info->root.splt)
2727 1.1 christos {
2728 1.1 christos if (strip)
2729 1.1 christos ia64_info->root.splt = NULL;
2730 1.1 christos }
2731 1.1 christos else if (sec == ia64_info->pltoff_sec)
2732 1.1 christos {
2733 1.1 christos if (strip)
2734 1.1 christos ia64_info->pltoff_sec = NULL;
2735 1.1 christos }
2736 1.1 christos else if (sec == ia64_info->fixups_sec)
2737 1.1 christos {
2738 1.1.1.4 christos if (strip)
2739 1.1.1.4 christos ia64_info->fixups_sec = NULL;
2740 1.1 christos }
2741 1.1 christos else if (sec == ia64_info->transfer_sec)
2742 1.1.1.4 christos {
2743 1.1.1.4 christos ;
2744 1.1.1.4 christos }
2745 1.1 christos else
2746 1.1 christos {
2747 1.1 christos const char *name;
2748 1.1 christos
2749 1.1 christos /* It's OK to base decisions on the section name, because none
2750 1.1 christos of the dynobj section names depend upon the input files. */
2751 1.1.1.6 christos name = bfd_section_name (sec);
2752 1.1 christos
2753 1.1 christos if (strcmp (name, ".got.plt") == 0)
2754 1.1 christos strip = FALSE;
2755 1.1 christos else if (CONST_STRNEQ (name, ".rel"))
2756 1.1 christos {
2757 1.1 christos if (!strip)
2758 1.1 christos {
2759 1.1 christos /* We use the reloc_count field as a counter if we need to
2760 1.1 christos copy relocs into the output file. */
2761 1.1 christos sec->reloc_count = 0;
2762 1.1 christos }
2763 1.1 christos }
2764 1.1 christos else
2765 1.1 christos continue;
2766 1.1 christos }
2767 1.1 christos
2768 1.1 christos if (strip)
2769 1.1 christos sec->flags |= SEC_EXCLUDE;
2770 1.1 christos else
2771 1.1 christos {
2772 1.1 christos /* Allocate memory for the section contents. */
2773 1.1 christos sec->contents = (bfd_byte *) bfd_zalloc (dynobj, sec->size);
2774 1.1 christos if (sec->contents == NULL && sec->size != 0)
2775 1.1 christos return FALSE;
2776 1.1 christos }
2777 1.1 christos }
2778 1.1 christos
2779 1.1 christos if (elf_hash_table (info)->dynamic_sections_created)
2780 1.1 christos {
2781 1.1 christos bfd *abfd;
2782 1.1 christos asection *dynsec;
2783 1.1 christos asection *dynstrsec;
2784 1.1 christos Elf_Internal_Dyn dyn;
2785 1.1 christos const struct elf_backend_data *bed;
2786 1.1 christos unsigned int shl_num = 0;
2787 1.1 christos bfd_vma fixups_off = 0;
2788 1.1 christos bfd_vma strdyn_off;
2789 1.1 christos unsigned int time_hi, time_lo;
2790 1.1 christos
2791 1.1 christos /* The .dynamic section must exist and be empty. */
2792 1.1 christos dynsec = bfd_get_linker_section (hash_table->dynobj, ".dynamic");
2793 1.1 christos BFD_ASSERT (dynsec != NULL);
2794 1.1 christos BFD_ASSERT (dynsec->size == 0);
2795 1.1 christos
2796 1.1 christos dynstrsec = bfd_get_linker_section (hash_table->dynobj, ".vmsdynstr");
2797 1.1 christos BFD_ASSERT (dynstrsec != NULL);
2798 1.1 christos BFD_ASSERT (dynstrsec->size == 0);
2799 1.1 christos dynstrsec->size = 1; /* Initial blank. */
2800 1.1 christos
2801 1.1 christos /* Ident + link time. */
2802 1.1 christos vms_get_time (&time_hi, &time_lo);
2803 1.1 christos
2804 1.1 christos if (!_bfd_elf_add_dynamic_entry (info, DT_IA_64_VMS_IDENT, 0))
2805 1.1.1.4 christos return FALSE;
2806 1.1 christos if (!_bfd_elf_add_dynamic_entry (info, DT_IA_64_VMS_LINKTIME,
2807 1.1.1.4 christos (((bfd_uint64_t)time_hi) << 32)
2808 1.1.1.4 christos + time_lo))
2809 1.1.1.4 christos return FALSE;
2810 1.1 christos
2811 1.1 christos /* Strtab. */
2812 1.1 christos strdyn_off = dynsec->size;
2813 1.1 christos if (!_bfd_elf_add_dynamic_entry (info, DT_IA_64_VMS_STRTAB_OFFSET, 0))
2814 1.1.1.4 christos return FALSE;
2815 1.1 christos if (!_bfd_elf_add_dynamic_entry (info, DT_STRSZ, 0))
2816 1.1.1.4 christos return FALSE;
2817 1.1 christos
2818 1.1 christos /* PLTGOT */
2819 1.1 christos if (!_bfd_elf_add_dynamic_entry (info, DT_IA_64_VMS_PLTGOT_SEG, 0))
2820 1.1.1.4 christos return FALSE;
2821 1.1 christos if (!_bfd_elf_add_dynamic_entry (info, DT_IA_64_VMS_PLTGOT_OFFSET, 0))
2822 1.1.1.4 christos return FALSE;
2823 1.1 christos
2824 1.1 christos /* Misc. */
2825 1.1 christos if (!_bfd_elf_add_dynamic_entry (info, DT_IA_64_VMS_FPMODE, 0x9800000))
2826 1.1.1.4 christos return FALSE;
2827 1.1 christos if (!_bfd_elf_add_dynamic_entry (info, DT_IA_64_VMS_LNKFLAGS,
2828 1.1.1.4 christos VMS_LF_IMGSTA | VMS_LF_MAIN))
2829 1.1.1.4 christos return FALSE;
2830 1.1 christos
2831 1.1 christos /* Add entries for shared libraries. */
2832 1.1.1.2 christos for (abfd = info->input_bfds; abfd; abfd = abfd->link.next)
2833 1.1.1.4 christos {
2834 1.1.1.4 christos char *soname;
2835 1.1.1.4 christos size_t soname_len;
2836 1.1.1.4 christos bfd_size_type strindex;
2837 1.1.1.4 christos bfd_byte *newcontents;
2838 1.1.1.4 christos bfd_vma fixups_shl_off;
2839 1.1.1.4 christos
2840 1.1.1.4 christos if (!(abfd->flags & DYNAMIC))
2841 1.1.1.4 christos continue;
2842 1.1.1.4 christos BFD_ASSERT (abfd->xvec == output_bfd->xvec);
2843 1.1.1.4 christos
2844 1.1.1.4 christos if (!_bfd_elf_add_dynamic_entry (info, DT_IA_64_VMS_NEEDED_IDENT,
2845 1.1.1.4 christos elf_ia64_vms_ident (abfd)))
2846 1.1.1.4 christos return FALSE;
2847 1.1.1.4 christos
2848 1.1.1.4 christos soname = vms_get_module_name (abfd->filename, TRUE);
2849 1.1.1.4 christos if (soname == NULL)
2850 1.1.1.4 christos return FALSE;
2851 1.1.1.4 christos strindex = dynstrsec->size;
2852 1.1.1.4 christos soname_len = strlen (soname) + 1;
2853 1.1.1.4 christos newcontents = (bfd_byte *) bfd_realloc (dynstrsec->contents,
2854 1.1.1.4 christos strindex + soname_len);
2855 1.1.1.4 christos if (newcontents == NULL)
2856 1.1.1.4 christos return FALSE;
2857 1.1.1.4 christos memcpy (newcontents + strindex, soname, soname_len);
2858 1.1.1.4 christos dynstrsec->size += soname_len;
2859 1.1.1.4 christos dynstrsec->contents = newcontents;
2860 1.1.1.4 christos
2861 1.1.1.4 christos if (!_bfd_elf_add_dynamic_entry (info, DT_NEEDED, strindex))
2862 1.1.1.4 christos return FALSE;
2863 1.1.1.4 christos
2864 1.1.1.4 christos if (!_bfd_elf_add_dynamic_entry (info, DT_IA_64_VMS_FIXUP_NEEDED,
2865 1.1.1.4 christos shl_num))
2866 1.1.1.4 christos return FALSE;
2867 1.1.1.4 christos shl_num++;
2868 1.1.1.4 christos
2869 1.1.1.4 christos /* The fixups_off was in fact containing the size of the fixup
2870 1.1.1.4 christos section. Remap into the offset. */
2871 1.1.1.4 christos fixups_shl_off = elf_ia64_vms_tdata (abfd)->fixups_off;
2872 1.1.1.4 christos elf_ia64_vms_tdata (abfd)->fixups_off = fixups_off;
2873 1.1.1.4 christos
2874 1.1.1.4 christos if (!_bfd_elf_add_dynamic_entry
2875 1.1.1.4 christos (info, DT_IA_64_VMS_FIXUP_RELA_CNT,
2876 1.1.1.4 christos fixups_shl_off / sizeof (Elf64_External_VMS_IMAGE_FIXUP)))
2877 1.1.1.4 christos return FALSE;
2878 1.1.1.4 christos if (!_bfd_elf_add_dynamic_entry (info, DT_IA_64_VMS_FIXUP_RELA_OFF,
2879 1.1.1.4 christos fixups_off))
2880 1.1.1.4 christos return FALSE;
2881 1.1.1.4 christos fixups_off += fixups_shl_off;
2882 1.1.1.4 christos }
2883 1.1 christos
2884 1.1 christos /* Unwind. */
2885 1.1 christos if (!_bfd_elf_add_dynamic_entry (info, DT_IA_64_VMS_UNWINDSZ, 0))
2886 1.1.1.4 christos return FALSE;
2887 1.1 christos if (!_bfd_elf_add_dynamic_entry (info, DT_IA_64_VMS_UNWIND_CODSEG, 0))
2888 1.1.1.4 christos return FALSE;
2889 1.1 christos if (!_bfd_elf_add_dynamic_entry (info, DT_IA_64_VMS_UNWIND_INFOSEG, 0))
2890 1.1.1.4 christos return FALSE;
2891 1.1 christos if (!_bfd_elf_add_dynamic_entry (info, DT_IA_64_VMS_UNWIND_OFFSET, 0))
2892 1.1.1.4 christos return FALSE;
2893 1.1 christos if (!_bfd_elf_add_dynamic_entry (info, DT_IA_64_VMS_UNWIND_SEG, 0))
2894 1.1.1.4 christos return FALSE;
2895 1.1 christos
2896 1.1 christos if (!_bfd_elf_add_dynamic_entry (info, DT_NULL, 0xdead))
2897 1.1.1.4 christos return FALSE;
2898 1.1 christos
2899 1.1 christos /* Fix the strtab entries. */
2900 1.1 christos bed = get_elf_backend_data (hash_table->dynobj);
2901 1.1 christos
2902 1.1 christos if (dynstrsec->size > 1)
2903 1.1.1.4 christos dynstrsec->contents[0] = 0;
2904 1.1 christos else
2905 1.1.1.4 christos dynstrsec->size = 0;
2906 1.1 christos
2907 1.1 christos /* Note: one 'spare' (ie DT_NULL) entry is added by
2908 1.1.1.4 christos bfd_elf_size_dynsym_hash_dynstr. */
2909 1.1 christos dyn.d_tag = DT_IA_64_VMS_STRTAB_OFFSET;
2910 1.1 christos dyn.d_un.d_val = dynsec->size /* + sizeof (Elf64_External_Dyn) */;
2911 1.1 christos bed->s->swap_dyn_out (hash_table->dynobj, &dyn,
2912 1.1.1.4 christos dynsec->contents + strdyn_off);
2913 1.1 christos
2914 1.1 christos dyn.d_tag = DT_STRSZ;
2915 1.1 christos dyn.d_un.d_val = dynstrsec->size;
2916 1.1 christos bed->s->swap_dyn_out (hash_table->dynobj, &dyn,
2917 1.1.1.4 christos dynsec->contents + strdyn_off + bed->s->sizeof_dyn);
2918 1.1 christos
2919 1.1 christos elf_ia64_vms_tdata (output_bfd)->needed_count = shl_num;
2920 1.1 christos
2921 1.1 christos /* Note section. */
2922 1.1 christos if (!create_ia64_vms_notes (output_bfd, info, time_hi, time_lo))
2923 1.1.1.4 christos return FALSE;
2924 1.1 christos }
2925 1.1 christos
2926 1.1 christos /* ??? Perhaps force __gp local. */
2927 1.1 christos
2928 1.1 christos return TRUE;
2929 1.1 christos }
2930 1.1 christos
2931 1.1 christos static void
2932 1.1 christos elf64_ia64_install_fixup (bfd *output_bfd,
2933 1.1.1.4 christos struct elf64_ia64_link_hash_table *ia64_info,
2934 1.1.1.4 christos struct elf_link_hash_entry *h,
2935 1.1.1.4 christos unsigned int type, asection *sec, bfd_vma offset,
2936 1.1.1.4 christos bfd_vma addend)
2937 1.1 christos {
2938 1.1 christos asection *relsec;
2939 1.1 christos Elf64_External_VMS_IMAGE_FIXUP *fixup;
2940 1.1 christos struct elf64_ia64_link_hash_entry *h_ia64;
2941 1.1 christos bfd_vma fixoff;
2942 1.1 christos Elf_Internal_Phdr *phdr;
2943 1.1 christos
2944 1.1 christos if (h == NULL || !h->def_dynamic)
2945 1.1 christos abort ();
2946 1.1 christos
2947 1.1 christos h_ia64 = (struct elf64_ia64_link_hash_entry *) h;
2948 1.1 christos fixoff = elf_ia64_vms_tdata (h_ia64->shl)->fixups_off;
2949 1.1 christos elf_ia64_vms_tdata (h_ia64->shl)->fixups_off +=
2950 1.1 christos sizeof (Elf64_External_VMS_IMAGE_FIXUP);
2951 1.1 christos relsec = ia64_info->fixups_sec;
2952 1.1 christos
2953 1.1 christos fixup = (Elf64_External_VMS_IMAGE_FIXUP *)(relsec->contents + fixoff);
2954 1.1 christos offset += sec->output_section->vma + sec->output_offset;
2955 1.1 christos
2956 1.1 christos /* FIXME: this is slow. We should cache the last one used, or create a
2957 1.1 christos map. */
2958 1.1 christos phdr = _bfd_elf_find_segment_containing_section
2959 1.1 christos (output_bfd, sec->output_section);
2960 1.1 christos BFD_ASSERT (phdr != NULL);
2961 1.1 christos
2962 1.1 christos bfd_putl64 (offset - phdr->p_vaddr, fixup->fixup_offset);
2963 1.1 christos bfd_putl32 (type, fixup->type);
2964 1.1 christos bfd_putl32 (phdr - elf_tdata (output_bfd)->phdr, fixup->fixup_seg);
2965 1.1 christos bfd_putl64 (addend, fixup->addend);
2966 1.1 christos bfd_putl32 (h->root.u.def.value, fixup->symvec_index);
2967 1.1 christos bfd_putl32 (2, fixup->data_type);
2968 1.1 christos }
2969 1.1 christos
2970 1.1 christos /* Store an entry for target address TARGET_ADDR in the linkage table
2971 1.1 christos and return the gp-relative address of the linkage table entry. */
2972 1.1 christos
2973 1.1 christos static bfd_vma
2974 1.1 christos set_got_entry (bfd *abfd, struct bfd_link_info *info,
2975 1.1 christos struct elf64_ia64_dyn_sym_info *dyn_i,
2976 1.1 christos bfd_vma addend, bfd_vma value, unsigned int dyn_r_type)
2977 1.1 christos {
2978 1.1 christos struct elf64_ia64_link_hash_table *ia64_info;
2979 1.1 christos asection *got_sec;
2980 1.1 christos bfd_boolean done;
2981 1.1 christos bfd_vma got_offset;
2982 1.1 christos
2983 1.1 christos ia64_info = elf64_ia64_hash_table (info);
2984 1.1 christos if (ia64_info == NULL)
2985 1.1 christos return 0;
2986 1.1 christos
2987 1.1 christos got_sec = ia64_info->root.sgot;
2988 1.1 christos
2989 1.1 christos switch (dyn_r_type)
2990 1.1 christos {
2991 1.1 christos case R_IA64_TPREL64LSB:
2992 1.1 christos case R_IA64_DTPMOD64LSB:
2993 1.1 christos case R_IA64_DTPREL32LSB:
2994 1.1 christos case R_IA64_DTPREL64LSB:
2995 1.1 christos abort ();
2996 1.1 christos break;
2997 1.1 christos default:
2998 1.1 christos done = dyn_i->got_done;
2999 1.1 christos dyn_i->got_done = TRUE;
3000 1.1 christos got_offset = dyn_i->got_offset;
3001 1.1 christos break;
3002 1.1 christos }
3003 1.1 christos
3004 1.1 christos BFD_ASSERT ((got_offset & 7) == 0);
3005 1.1 christos
3006 1.1 christos if (! done)
3007 1.1 christos {
3008 1.1 christos /* Store the target address in the linkage table entry. */
3009 1.1 christos bfd_put_64 (abfd, value, got_sec->contents + got_offset);
3010 1.1 christos
3011 1.1 christos /* Install a dynamic relocation if needed. */
3012 1.1.1.2 christos if (((bfd_link_pic (info)
3013 1.1 christos && (!dyn_i->h
3014 1.1 christos || ELF_ST_VISIBILITY (dyn_i->h->other) == STV_DEFAULT
3015 1.1 christos || dyn_i->h->root.type != bfd_link_hash_undefweak))
3016 1.1.1.4 christos || elf64_ia64_dynamic_symbol_p (dyn_i->h))
3017 1.1 christos && (!dyn_i->want_ltoff_fptr
3018 1.1.1.2 christos || !bfd_link_pie (info)
3019 1.1 christos || !dyn_i->h
3020 1.1 christos || dyn_i->h->root.type != bfd_link_hash_undefweak))
3021 1.1 christos {
3022 1.1 christos if (!dyn_i->h || !dyn_i->h->def_dynamic)
3023 1.1 christos {
3024 1.1 christos dyn_r_type = R_IA64_REL64LSB;
3025 1.1 christos addend = value;
3026 1.1 christos }
3027 1.1 christos
3028 1.1.1.4 christos /* VMS: install a FIX32 or FIX64. */
3029 1.1.1.4 christos switch (dyn_r_type)
3030 1.1.1.4 christos {
3031 1.1.1.4 christos case R_IA64_DIR32LSB:
3032 1.1.1.4 christos case R_IA64_FPTR32LSB:
3033 1.1.1.4 christos dyn_r_type = R_IA64_VMS_FIX32;
3034 1.1.1.4 christos break;
3035 1.1.1.4 christos case R_IA64_DIR64LSB:
3036 1.1.1.4 christos case R_IA64_FPTR64LSB:
3037 1.1.1.4 christos dyn_r_type = R_IA64_VMS_FIX64;
3038 1.1.1.4 christos break;
3039 1.1.1.4 christos default:
3040 1.1.1.4 christos BFD_ASSERT (FALSE);
3041 1.1.1.4 christos break;
3042 1.1.1.4 christos }
3043 1.1.1.4 christos elf64_ia64_install_fixup
3044 1.1.1.4 christos (info->output_bfd, ia64_info, dyn_i->h,
3045 1.1.1.4 christos dyn_r_type, got_sec, got_offset, addend);
3046 1.1.1.4 christos }
3047 1.1 christos }
3048 1.1 christos
3049 1.1 christos /* Return the address of the linkage table entry. */
3050 1.1 christos value = (got_sec->output_section->vma
3051 1.1 christos + got_sec->output_offset
3052 1.1 christos + got_offset);
3053 1.1 christos
3054 1.1 christos return value;
3055 1.1 christos }
3056 1.1 christos
3057 1.1 christos /* Fill in a function descriptor consisting of the function's code
3058 1.1 christos address and its global pointer. Return the descriptor's address. */
3059 1.1 christos
3060 1.1 christos static bfd_vma
3061 1.1 christos set_fptr_entry (bfd *abfd, struct bfd_link_info *info,
3062 1.1 christos struct elf64_ia64_dyn_sym_info *dyn_i,
3063 1.1 christos bfd_vma value)
3064 1.1 christos {
3065 1.1 christos struct elf64_ia64_link_hash_table *ia64_info;
3066 1.1 christos asection *fptr_sec;
3067 1.1 christos
3068 1.1 christos ia64_info = elf64_ia64_hash_table (info);
3069 1.1 christos if (ia64_info == NULL)
3070 1.1 christos return 0;
3071 1.1 christos
3072 1.1 christos fptr_sec = ia64_info->fptr_sec;
3073 1.1 christos
3074 1.1 christos if (!dyn_i->fptr_done)
3075 1.1 christos {
3076 1.1 christos dyn_i->fptr_done = 1;
3077 1.1 christos
3078 1.1 christos /* Fill in the function descriptor. */
3079 1.1 christos bfd_put_64 (abfd, value, fptr_sec->contents + dyn_i->fptr_offset);
3080 1.1 christos bfd_put_64 (abfd, _bfd_get_gp_value (abfd),
3081 1.1 christos fptr_sec->contents + dyn_i->fptr_offset + 8);
3082 1.1 christos }
3083 1.1 christos
3084 1.1 christos /* Return the descriptor's address. */
3085 1.1 christos value = (fptr_sec->output_section->vma
3086 1.1 christos + fptr_sec->output_offset
3087 1.1 christos + dyn_i->fptr_offset);
3088 1.1 christos
3089 1.1 christos return value;
3090 1.1 christos }
3091 1.1 christos
3092 1.1 christos /* Fill in a PLTOFF entry consisting of the function's code address
3093 1.1 christos and its global pointer. Return the descriptor's address. */
3094 1.1 christos
3095 1.1 christos static bfd_vma
3096 1.1 christos set_pltoff_entry (bfd *abfd, struct bfd_link_info *info,
3097 1.1 christos struct elf64_ia64_dyn_sym_info *dyn_i,
3098 1.1 christos bfd_vma value, bfd_boolean is_plt)
3099 1.1 christos {
3100 1.1 christos struct elf64_ia64_link_hash_table *ia64_info;
3101 1.1 christos asection *pltoff_sec;
3102 1.1 christos
3103 1.1 christos ia64_info = elf64_ia64_hash_table (info);
3104 1.1 christos if (ia64_info == NULL)
3105 1.1 christos return 0;
3106 1.1 christos
3107 1.1 christos pltoff_sec = ia64_info->pltoff_sec;
3108 1.1 christos
3109 1.1 christos /* Don't do anything if this symbol uses a real PLT entry. In
3110 1.1 christos that case, we'll fill this in during finish_dynamic_symbol. */
3111 1.1 christos if ((! dyn_i->want_plt || is_plt)
3112 1.1 christos && !dyn_i->pltoff_done)
3113 1.1 christos {
3114 1.1 christos bfd_vma gp = _bfd_get_gp_value (abfd);
3115 1.1 christos
3116 1.1 christos /* Fill in the function descriptor. */
3117 1.1 christos bfd_put_64 (abfd, value, pltoff_sec->contents + dyn_i->pltoff_offset);
3118 1.1 christos bfd_put_64 (abfd, gp, pltoff_sec->contents + dyn_i->pltoff_offset + 8);
3119 1.1 christos
3120 1.1 christos /* Install dynamic relocations if needed. */
3121 1.1 christos if (!is_plt
3122 1.1.1.2 christos && bfd_link_pic (info)
3123 1.1 christos && (!dyn_i->h
3124 1.1 christos || ELF_ST_VISIBILITY (dyn_i->h->other) == STV_DEFAULT
3125 1.1 christos || dyn_i->h->root.type != bfd_link_hash_undefweak))
3126 1.1 christos {
3127 1.1.1.4 christos /* VMS: */
3128 1.1.1.4 christos abort ();
3129 1.1 christos }
3130 1.1 christos
3131 1.1 christos dyn_i->pltoff_done = 1;
3132 1.1 christos }
3133 1.1 christos
3134 1.1 christos /* Return the descriptor's address. */
3135 1.1 christos value = (pltoff_sec->output_section->vma
3136 1.1 christos + pltoff_sec->output_offset
3137 1.1 christos + dyn_i->pltoff_offset);
3138 1.1 christos
3139 1.1 christos return value;
3140 1.1 christos }
3141 1.1 christos
3142 1.1 christos /* Called through qsort to sort the .IA_64.unwind section during a
3143 1.1 christos non-relocatable link. Set elf64_ia64_unwind_entry_compare_bfd
3144 1.1 christos to the output bfd so we can do proper endianness frobbing. */
3145 1.1 christos
3146 1.1 christos static bfd *elf64_ia64_unwind_entry_compare_bfd;
3147 1.1 christos
3148 1.1 christos static int
3149 1.1 christos elf64_ia64_unwind_entry_compare (const void * a, const void * b)
3150 1.1 christos {
3151 1.1 christos bfd_vma av, bv;
3152 1.1 christos
3153 1.1 christos av = bfd_get_64 (elf64_ia64_unwind_entry_compare_bfd, a);
3154 1.1 christos bv = bfd_get_64 (elf64_ia64_unwind_entry_compare_bfd, b);
3155 1.1 christos
3156 1.1 christos return (av < bv ? -1 : av > bv ? 1 : 0);
3157 1.1 christos }
3158 1.1 christos
3159 1.1 christos /* Make sure we've got ourselves a nice fat __gp value. */
3160 1.1 christos static bfd_boolean
3161 1.1 christos elf64_ia64_choose_gp (bfd *abfd, struct bfd_link_info *info, bfd_boolean final)
3162 1.1 christos {
3163 1.1 christos bfd_vma min_vma = (bfd_vma) -1, max_vma = 0;
3164 1.1 christos bfd_vma min_short_vma = min_vma, max_short_vma = 0;
3165 1.1 christos struct elf_link_hash_entry *gp;
3166 1.1 christos bfd_vma gp_val;
3167 1.1 christos asection *os;
3168 1.1 christos struct elf64_ia64_link_hash_table *ia64_info;
3169 1.1 christos
3170 1.1 christos ia64_info = elf64_ia64_hash_table (info);
3171 1.1 christos if (ia64_info == NULL)
3172 1.1 christos return FALSE;
3173 1.1 christos
3174 1.1 christos /* Find the min and max vma of all sections marked short. Also collect
3175 1.1 christos min and max vma of any type, for use in selecting a nice gp. */
3176 1.1 christos for (os = abfd->sections; os ; os = os->next)
3177 1.1 christos {
3178 1.1 christos bfd_vma lo, hi;
3179 1.1 christos
3180 1.1 christos if ((os->flags & SEC_ALLOC) == 0)
3181 1.1 christos continue;
3182 1.1 christos
3183 1.1 christos lo = os->vma;
3184 1.1 christos /* When this function is called from elfNN_ia64_final_link
3185 1.1 christos the correct value to use is os->size. When called from
3186 1.1 christos elfNN_ia64_relax_section we are in the middle of section
3187 1.1 christos sizing; some sections will already have os->size set, others
3188 1.1 christos will have os->size zero and os->rawsize the previous size. */
3189 1.1 christos hi = os->vma + (!final && os->rawsize ? os->rawsize : os->size);
3190 1.1 christos if (hi < lo)
3191 1.1 christos hi = (bfd_vma) -1;
3192 1.1 christos
3193 1.1 christos if (min_vma > lo)
3194 1.1 christos min_vma = lo;
3195 1.1 christos if (max_vma < hi)
3196 1.1 christos max_vma = hi;
3197 1.1 christos if (os->flags & SEC_SMALL_DATA)
3198 1.1 christos {
3199 1.1 christos if (min_short_vma > lo)
3200 1.1 christos min_short_vma = lo;
3201 1.1 christos if (max_short_vma < hi)
3202 1.1 christos max_short_vma = hi;
3203 1.1 christos }
3204 1.1 christos }
3205 1.1 christos
3206 1.1 christos if (ia64_info->min_short_sec)
3207 1.1 christos {
3208 1.1 christos if (min_short_vma
3209 1.1 christos > (ia64_info->min_short_sec->vma
3210 1.1 christos + ia64_info->min_short_offset))
3211 1.1 christos min_short_vma = (ia64_info->min_short_sec->vma
3212 1.1 christos + ia64_info->min_short_offset);
3213 1.1 christos if (max_short_vma
3214 1.1 christos < (ia64_info->max_short_sec->vma
3215 1.1 christos + ia64_info->max_short_offset))
3216 1.1 christos max_short_vma = (ia64_info->max_short_sec->vma
3217 1.1 christos + ia64_info->max_short_offset);
3218 1.1 christos }
3219 1.1 christos
3220 1.1 christos /* See if the user wants to force a value. */
3221 1.1 christos gp = elf_link_hash_lookup (elf_hash_table (info), "__gp", FALSE,
3222 1.1 christos FALSE, FALSE);
3223 1.1 christos
3224 1.1 christos if (gp
3225 1.1 christos && (gp->root.type == bfd_link_hash_defined
3226 1.1 christos || gp->root.type == bfd_link_hash_defweak))
3227 1.1 christos {
3228 1.1 christos asection *gp_sec = gp->root.u.def.section;
3229 1.1 christos gp_val = (gp->root.u.def.value
3230 1.1 christos + gp_sec->output_section->vma
3231 1.1 christos + gp_sec->output_offset);
3232 1.1 christos }
3233 1.1 christos else
3234 1.1 christos {
3235 1.1 christos /* Pick a sensible value. */
3236 1.1 christos
3237 1.1 christos if (ia64_info->min_short_sec)
3238 1.1 christos {
3239 1.1 christos bfd_vma short_range = max_short_vma - min_short_vma;
3240 1.1 christos
3241 1.1 christos /* If min_short_sec is set, pick one in the middle bewteen
3242 1.1 christos min_short_vma and max_short_vma. */
3243 1.1 christos if (short_range >= 0x400000)
3244 1.1 christos goto overflow;
3245 1.1 christos gp_val = min_short_vma + short_range / 2;
3246 1.1 christos }
3247 1.1 christos else
3248 1.1 christos {
3249 1.1 christos asection *got_sec = ia64_info->root.sgot;
3250 1.1 christos
3251 1.1 christos /* Start with just the address of the .got. */
3252 1.1 christos if (got_sec)
3253 1.1 christos gp_val = got_sec->output_section->vma;
3254 1.1 christos else if (max_short_vma != 0)
3255 1.1 christos gp_val = min_short_vma;
3256 1.1 christos else if (max_vma - min_vma < 0x200000)
3257 1.1 christos gp_val = min_vma;
3258 1.1 christos else
3259 1.1 christos gp_val = max_vma - 0x200000 + 8;
3260 1.1 christos }
3261 1.1 christos
3262 1.1 christos /* If it is possible to address the entire image, but we
3263 1.1 christos don't with the choice above, adjust. */
3264 1.1 christos if (max_vma - min_vma < 0x400000
3265 1.1 christos && (max_vma - gp_val >= 0x200000
3266 1.1 christos || gp_val - min_vma > 0x200000))
3267 1.1 christos gp_val = min_vma + 0x200000;
3268 1.1 christos else if (max_short_vma != 0)
3269 1.1 christos {
3270 1.1 christos /* If we don't cover all the short data, adjust. */
3271 1.1 christos if (max_short_vma - gp_val >= 0x200000)
3272 1.1 christos gp_val = min_short_vma + 0x200000;
3273 1.1 christos
3274 1.1 christos /* If we're addressing stuff past the end, adjust back. */
3275 1.1 christos if (gp_val > max_vma)
3276 1.1 christos gp_val = max_vma - 0x200000 + 8;
3277 1.1 christos }
3278 1.1 christos }
3279 1.1 christos
3280 1.1 christos /* Validate whether all SHF_IA_64_SHORT sections are within
3281 1.1 christos range of the chosen GP. */
3282 1.1 christos
3283 1.1 christos if (max_short_vma != 0)
3284 1.1 christos {
3285 1.1 christos if (max_short_vma - min_short_vma >= 0x400000)
3286 1.1 christos {
3287 1.1 christos overflow:
3288 1.1.1.4 christos _bfd_error_handler
3289 1.1.1.4 christos /* xgettext:c-format */
3290 1.1.1.5 christos (_("%pB: short data segment overflowed (%#" PRIx64 " >= 0x400000)"),
3291 1.1.1.5 christos abfd, (uint64_t) (max_short_vma - min_short_vma));
3292 1.1 christos return FALSE;
3293 1.1 christos }
3294 1.1 christos else if ((gp_val > min_short_vma
3295 1.1 christos && gp_val - min_short_vma > 0x200000)
3296 1.1 christos || (gp_val < max_short_vma
3297 1.1 christos && max_short_vma - gp_val >= 0x200000))
3298 1.1 christos {
3299 1.1.1.4 christos _bfd_error_handler
3300 1.1.1.5 christos (_("%pB: __gp does not cover short data segment"), abfd);
3301 1.1 christos return FALSE;
3302 1.1 christos }
3303 1.1 christos }
3304 1.1 christos
3305 1.1 christos _bfd_set_gp_value (abfd, gp_val);
3306 1.1 christos
3307 1.1 christos return TRUE;
3308 1.1 christos }
3309 1.1 christos
3310 1.1 christos static bfd_boolean
3311 1.1 christos elf64_ia64_final_link (bfd *abfd, struct bfd_link_info *info)
3312 1.1 christos {
3313 1.1 christos struct elf64_ia64_link_hash_table *ia64_info;
3314 1.1 christos asection *unwind_output_sec;
3315 1.1 christos
3316 1.1 christos ia64_info = elf64_ia64_hash_table (info);
3317 1.1 christos if (ia64_info == NULL)
3318 1.1 christos return FALSE;
3319 1.1 christos
3320 1.1 christos /* Make sure we've got ourselves a nice fat __gp value. */
3321 1.1.1.2 christos if (!bfd_link_relocatable (info))
3322 1.1 christos {
3323 1.1 christos bfd_vma gp_val;
3324 1.1 christos struct elf_link_hash_entry *gp;
3325 1.1 christos
3326 1.1 christos /* We assume after gp is set, section size will only decrease. We
3327 1.1 christos need to adjust gp for it. */
3328 1.1 christos _bfd_set_gp_value (abfd, 0);
3329 1.1 christos if (! elf64_ia64_choose_gp (abfd, info, TRUE))
3330 1.1 christos return FALSE;
3331 1.1 christos gp_val = _bfd_get_gp_value (abfd);
3332 1.1 christos
3333 1.1 christos gp = elf_link_hash_lookup (elf_hash_table (info), "__gp", FALSE,
3334 1.1.1.4 christos FALSE, FALSE);
3335 1.1 christos if (gp)
3336 1.1 christos {
3337 1.1 christos gp->root.type = bfd_link_hash_defined;
3338 1.1 christos gp->root.u.def.value = gp_val;
3339 1.1 christos gp->root.u.def.section = bfd_abs_section_ptr;
3340 1.1 christos }
3341 1.1 christos }
3342 1.1 christos
3343 1.1 christos /* If we're producing a final executable, we need to sort the contents
3344 1.1 christos of the .IA_64.unwind section. Force this section to be relocated
3345 1.1 christos into memory rather than written immediately to the output file. */
3346 1.1 christos unwind_output_sec = NULL;
3347 1.1.1.2 christos if (!bfd_link_relocatable (info))
3348 1.1 christos {
3349 1.1 christos asection *s = bfd_get_section_by_name (abfd, ELF_STRING_ia64_unwind);
3350 1.1 christos if (s)
3351 1.1 christos {
3352 1.1 christos unwind_output_sec = s->output_section;
3353 1.1 christos unwind_output_sec->contents
3354 1.1 christos = bfd_malloc (unwind_output_sec->size);
3355 1.1 christos if (unwind_output_sec->contents == NULL)
3356 1.1 christos return FALSE;
3357 1.1 christos }
3358 1.1 christos }
3359 1.1 christos
3360 1.1 christos /* Invoke the regular ELF backend linker to do all the work. */
3361 1.1 christos if (!bfd_elf_final_link (abfd, info))
3362 1.1 christos return FALSE;
3363 1.1 christos
3364 1.1 christos if (unwind_output_sec)
3365 1.1 christos {
3366 1.1 christos elf64_ia64_unwind_entry_compare_bfd = abfd;
3367 1.1 christos qsort (unwind_output_sec->contents,
3368 1.1 christos (size_t) (unwind_output_sec->size / 24),
3369 1.1 christos 24,
3370 1.1 christos elf64_ia64_unwind_entry_compare);
3371 1.1 christos
3372 1.1 christos if (! bfd_set_section_contents (abfd, unwind_output_sec,
3373 1.1 christos unwind_output_sec->contents, (bfd_vma) 0,
3374 1.1 christos unwind_output_sec->size))
3375 1.1 christos return FALSE;
3376 1.1 christos }
3377 1.1 christos
3378 1.1 christos return TRUE;
3379 1.1 christos }
3380 1.1 christos
3381 1.1 christos static bfd_boolean
3382 1.1 christos elf64_ia64_relocate_section (bfd *output_bfd,
3383 1.1 christos struct bfd_link_info *info,
3384 1.1 christos bfd *input_bfd,
3385 1.1 christos asection *input_section,
3386 1.1 christos bfd_byte *contents,
3387 1.1 christos Elf_Internal_Rela *relocs,
3388 1.1 christos Elf_Internal_Sym *local_syms,
3389 1.1 christos asection **local_sections)
3390 1.1 christos {
3391 1.1 christos struct elf64_ia64_link_hash_table *ia64_info;
3392 1.1 christos Elf_Internal_Shdr *symtab_hdr;
3393 1.1 christos Elf_Internal_Rela *rel;
3394 1.1 christos Elf_Internal_Rela *relend;
3395 1.1 christos bfd_boolean ret_val = TRUE; /* for non-fatal errors */
3396 1.1 christos bfd_vma gp_val;
3397 1.1 christos
3398 1.1 christos symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
3399 1.1 christos ia64_info = elf64_ia64_hash_table (info);
3400 1.1 christos if (ia64_info == NULL)
3401 1.1 christos return FALSE;
3402 1.1 christos
3403 1.1 christos /* Infect various flags from the input section to the output section. */
3404 1.1.1.2 christos if (bfd_link_relocatable (info))
3405 1.1 christos {
3406 1.1 christos bfd_vma flags;
3407 1.1 christos
3408 1.1 christos flags = elf_section_data(input_section)->this_hdr.sh_flags;
3409 1.1 christos flags &= SHF_IA_64_NORECOV;
3410 1.1 christos
3411 1.1 christos elf_section_data(input_section->output_section)
3412 1.1 christos ->this_hdr.sh_flags |= flags;
3413 1.1 christos }
3414 1.1 christos
3415 1.1 christos gp_val = _bfd_get_gp_value (output_bfd);
3416 1.1 christos
3417 1.1 christos rel = relocs;
3418 1.1 christos relend = relocs + input_section->reloc_count;
3419 1.1 christos for (; rel < relend; ++rel)
3420 1.1 christos {
3421 1.1 christos struct elf_link_hash_entry *h;
3422 1.1 christos struct elf64_ia64_dyn_sym_info *dyn_i;
3423 1.1 christos bfd_reloc_status_type r;
3424 1.1 christos reloc_howto_type *howto;
3425 1.1 christos unsigned long r_symndx;
3426 1.1 christos Elf_Internal_Sym *sym;
3427 1.1 christos unsigned int r_type;
3428 1.1 christos bfd_vma value;
3429 1.1 christos asection *sym_sec;
3430 1.1 christos bfd_byte *hit_addr;
3431 1.1 christos bfd_boolean dynamic_symbol_p;
3432 1.1 christos bfd_boolean undef_weak_ref;
3433 1.1 christos
3434 1.1 christos r_type = ELF64_R_TYPE (rel->r_info);
3435 1.1 christos if (r_type > R_IA64_MAX_RELOC_CODE)
3436 1.1 christos {
3437 1.1.1.5 christos /* xgettext:c-format */
3438 1.1.1.5 christos _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
3439 1.1.1.5 christos input_bfd, (int) r_type);
3440 1.1 christos bfd_set_error (bfd_error_bad_value);
3441 1.1 christos ret_val = FALSE;
3442 1.1 christos continue;
3443 1.1 christos }
3444 1.1 christos
3445 1.1 christos howto = ia64_elf_lookup_howto (r_type);
3446 1.1.1.5 christos if (howto == NULL)
3447 1.1.1.5 christos {
3448 1.1.1.5 christos ret_val = FALSE;
3449 1.1.1.5 christos continue;
3450 1.1.1.5 christos }
3451 1.1 christos r_symndx = ELF64_R_SYM (rel->r_info);
3452 1.1 christos h = NULL;
3453 1.1 christos sym = NULL;
3454 1.1 christos sym_sec = NULL;
3455 1.1 christos undef_weak_ref = FALSE;
3456 1.1 christos
3457 1.1 christos if (r_symndx < symtab_hdr->sh_info)
3458 1.1 christos {
3459 1.1 christos /* Reloc against local symbol. */
3460 1.1 christos asection *msec;
3461 1.1 christos sym = local_syms + r_symndx;
3462 1.1 christos sym_sec = local_sections[r_symndx];
3463 1.1 christos msec = sym_sec;
3464 1.1 christos value = _bfd_elf_rela_local_sym (output_bfd, sym, &msec, rel);
3465 1.1.1.2 christos if (!bfd_link_relocatable (info)
3466 1.1 christos && (sym_sec->flags & SEC_MERGE) != 0
3467 1.1 christos && ELF_ST_TYPE (sym->st_info) == STT_SECTION
3468 1.1 christos && sym_sec->sec_info_type == SEC_INFO_TYPE_MERGE)
3469 1.1 christos {
3470 1.1 christos struct elf64_ia64_local_hash_entry *loc_h;
3471 1.1 christos
3472 1.1 christos loc_h = get_local_sym_hash (ia64_info, input_bfd, rel, FALSE);
3473 1.1 christos if (loc_h && ! loc_h->sec_merge_done)
3474 1.1 christos {
3475 1.1 christos struct elf64_ia64_dyn_sym_info *dynent;
3476 1.1 christos unsigned int count;
3477 1.1 christos
3478 1.1 christos for (count = loc_h->count, dynent = loc_h->info;
3479 1.1 christos count != 0;
3480 1.1 christos count--, dynent++)
3481 1.1 christos {
3482 1.1 christos msec = sym_sec;
3483 1.1 christos dynent->addend =
3484 1.1 christos _bfd_merged_section_offset (output_bfd, &msec,
3485 1.1 christos elf_section_data (msec)->
3486 1.1 christos sec_info,
3487 1.1 christos sym->st_value
3488 1.1 christos + dynent->addend);
3489 1.1 christos dynent->addend -= sym->st_value;
3490 1.1 christos dynent->addend += msec->output_section->vma
3491 1.1 christos + msec->output_offset
3492 1.1 christos - sym_sec->output_section->vma
3493 1.1 christos - sym_sec->output_offset;
3494 1.1 christos }
3495 1.1 christos
3496 1.1 christos /* We may have introduced duplicated entries. We need
3497 1.1 christos to remove them properly. */
3498 1.1 christos count = sort_dyn_sym_info (loc_h->info, loc_h->count);
3499 1.1 christos if (count != loc_h->count)
3500 1.1 christos {
3501 1.1 christos loc_h->count = count;
3502 1.1 christos loc_h->sorted_count = count;
3503 1.1 christos }
3504 1.1 christos
3505 1.1 christos loc_h->sec_merge_done = 1;
3506 1.1 christos }
3507 1.1 christos }
3508 1.1 christos }
3509 1.1 christos else
3510 1.1 christos {
3511 1.1 christos bfd_boolean unresolved_reloc;
3512 1.1.1.2 christos bfd_boolean warned, ignored;
3513 1.1 christos struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (input_bfd);
3514 1.1 christos
3515 1.1 christos RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
3516 1.1 christos r_symndx, symtab_hdr, sym_hashes,
3517 1.1 christos h, sym_sec, value,
3518 1.1.1.2 christos unresolved_reloc, warned, ignored);
3519 1.1 christos
3520 1.1 christos if (h->root.type == bfd_link_hash_undefweak)
3521 1.1 christos undef_weak_ref = TRUE;
3522 1.1 christos else if (warned)
3523 1.1 christos continue;
3524 1.1 christos }
3525 1.1 christos
3526 1.1 christos /* For relocs against symbols from removed linkonce sections,
3527 1.1 christos or sections discarded by a linker script, we just want the
3528 1.1 christos section contents zeroed. Avoid any special processing. */
3529 1.1 christos if (sym_sec != NULL && discarded_section (sym_sec))
3530 1.1 christos RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
3531 1.1 christos rel, 1, relend, howto, 0, contents);
3532 1.1 christos
3533 1.1.1.2 christos if (bfd_link_relocatable (info))
3534 1.1 christos continue;
3535 1.1 christos
3536 1.1 christos hit_addr = contents + rel->r_offset;
3537 1.1 christos value += rel->r_addend;
3538 1.1 christos dynamic_symbol_p = elf64_ia64_dynamic_symbol_p (h);
3539 1.1 christos
3540 1.1 christos switch (r_type)
3541 1.1 christos {
3542 1.1 christos case R_IA64_NONE:
3543 1.1 christos case R_IA64_LDXMOV:
3544 1.1 christos continue;
3545 1.1 christos
3546 1.1 christos case R_IA64_IMM14:
3547 1.1 christos case R_IA64_IMM22:
3548 1.1 christos case R_IA64_IMM64:
3549 1.1 christos case R_IA64_DIR32MSB:
3550 1.1 christos case R_IA64_DIR32LSB:
3551 1.1 christos case R_IA64_DIR64MSB:
3552 1.1 christos case R_IA64_DIR64LSB:
3553 1.1 christos /* Install a dynamic relocation for this reloc. */
3554 1.1.1.2 christos if ((dynamic_symbol_p || bfd_link_pic (info))
3555 1.1 christos && r_symndx != 0
3556 1.1 christos && (input_section->flags & SEC_ALLOC) != 0)
3557 1.1 christos {
3558 1.1 christos unsigned int dyn_r_type;
3559 1.1 christos bfd_vma addend;
3560 1.1 christos
3561 1.1 christos switch (r_type)
3562 1.1 christos {
3563 1.1 christos case R_IA64_IMM14:
3564 1.1 christos case R_IA64_IMM22:
3565 1.1 christos case R_IA64_IMM64:
3566 1.1 christos /* ??? People shouldn't be doing non-pic code in
3567 1.1 christos shared libraries nor dynamic executables. */
3568 1.1.1.4 christos _bfd_error_handler
3569 1.1.1.4 christos /* xgettext:c-format */
3570 1.1.1.5 christos (_("%pB: non-pic code with imm relocation against"
3571 1.1.1.4 christos " dynamic symbol `%s'"),
3572 1.1 christos input_bfd,
3573 1.1 christos h ? h->root.root.string
3574 1.1 christos : bfd_elf_sym_name (input_bfd, symtab_hdr, sym,
3575 1.1 christos sym_sec));
3576 1.1 christos ret_val = FALSE;
3577 1.1 christos continue;
3578 1.1 christos
3579 1.1 christos default:
3580 1.1 christos break;
3581 1.1 christos }
3582 1.1 christos
3583 1.1 christos /* If we don't need dynamic symbol lookup, find a
3584 1.1 christos matching RELATIVE relocation. */
3585 1.1 christos dyn_r_type = r_type;
3586 1.1 christos if (dynamic_symbol_p)
3587 1.1 christos {
3588 1.1 christos addend = rel->r_addend;
3589 1.1 christos value = 0;
3590 1.1 christos }
3591 1.1 christos else
3592 1.1 christos {
3593 1.1 christos addend = value;
3594 1.1 christos }
3595 1.1 christos
3596 1.1.1.4 christos /* VMS: install a FIX64. */
3597 1.1.1.4 christos switch (dyn_r_type)
3598 1.1.1.4 christos {
3599 1.1.1.4 christos case R_IA64_DIR32LSB:
3600 1.1.1.4 christos dyn_r_type = R_IA64_VMS_FIX32;
3601 1.1.1.4 christos break;
3602 1.1.1.4 christos case R_IA64_DIR64LSB:
3603 1.1.1.4 christos dyn_r_type = R_IA64_VMS_FIX64;
3604 1.1.1.4 christos break;
3605 1.1.1.4 christos default:
3606 1.1.1.4 christos BFD_ASSERT (FALSE);
3607 1.1.1.4 christos break;
3608 1.1.1.4 christos }
3609 1.1.1.4 christos elf64_ia64_install_fixup
3610 1.1.1.4 christos (output_bfd, ia64_info, h,
3611 1.1.1.4 christos dyn_r_type, input_section, rel->r_offset, addend);
3612 1.1.1.4 christos r = bfd_reloc_ok;
3613 1.1.1.4 christos break;
3614 1.1 christos }
3615 1.1 christos /* Fall through. */
3616 1.1 christos
3617 1.1 christos case R_IA64_LTV32MSB:
3618 1.1 christos case R_IA64_LTV32LSB:
3619 1.1 christos case R_IA64_LTV64MSB:
3620 1.1 christos case R_IA64_LTV64LSB:
3621 1.1 christos r = ia64_elf_install_value (hit_addr, value, r_type);
3622 1.1 christos break;
3623 1.1 christos
3624 1.1 christos case R_IA64_GPREL22:
3625 1.1 christos case R_IA64_GPREL64I:
3626 1.1 christos case R_IA64_GPREL32MSB:
3627 1.1 christos case R_IA64_GPREL32LSB:
3628 1.1 christos case R_IA64_GPREL64MSB:
3629 1.1 christos case R_IA64_GPREL64LSB:
3630 1.1 christos if (dynamic_symbol_p)
3631 1.1 christos {
3632 1.1.1.4 christos _bfd_error_handler
3633 1.1.1.4 christos /* xgettext:c-format */
3634 1.1.1.5 christos (_("%pB: @gprel relocation against dynamic symbol %s"),
3635 1.1 christos input_bfd,
3636 1.1 christos h ? h->root.root.string
3637 1.1 christos : bfd_elf_sym_name (input_bfd, symtab_hdr, sym,
3638 1.1 christos sym_sec));
3639 1.1 christos ret_val = FALSE;
3640 1.1 christos continue;
3641 1.1 christos }
3642 1.1 christos value -= gp_val;
3643 1.1 christos r = ia64_elf_install_value (hit_addr, value, r_type);
3644 1.1 christos break;
3645 1.1 christos
3646 1.1 christos case R_IA64_LTOFF22:
3647 1.1 christos case R_IA64_LTOFF22X:
3648 1.1 christos case R_IA64_LTOFF64I:
3649 1.1.1.4 christos dyn_i = get_dyn_sym_info (ia64_info, h, input_bfd, rel, FALSE);
3650 1.1 christos value = set_got_entry (input_bfd, info, dyn_i,
3651 1.1 christos rel->r_addend, value, R_IA64_DIR64LSB);
3652 1.1 christos value -= gp_val;
3653 1.1 christos r = ia64_elf_install_value (hit_addr, value, r_type);
3654 1.1 christos break;
3655 1.1 christos
3656 1.1 christos case R_IA64_PLTOFF22:
3657 1.1 christos case R_IA64_PLTOFF64I:
3658 1.1 christos case R_IA64_PLTOFF64MSB:
3659 1.1 christos case R_IA64_PLTOFF64LSB:
3660 1.1.1.4 christos dyn_i = get_dyn_sym_info (ia64_info, h, input_bfd, rel, FALSE);
3661 1.1 christos value = set_pltoff_entry (output_bfd, info, dyn_i, value, FALSE);
3662 1.1 christos value -= gp_val;
3663 1.1 christos r = ia64_elf_install_value (hit_addr, value, r_type);
3664 1.1 christos break;
3665 1.1 christos
3666 1.1 christos case R_IA64_FPTR64I:
3667 1.1 christos case R_IA64_FPTR32MSB:
3668 1.1 christos case R_IA64_FPTR32LSB:
3669 1.1 christos case R_IA64_FPTR64MSB:
3670 1.1 christos case R_IA64_FPTR64LSB:
3671 1.1.1.4 christos dyn_i = get_dyn_sym_info (ia64_info, h, input_bfd, rel, FALSE);
3672 1.1 christos if (dyn_i->want_fptr)
3673 1.1 christos {
3674 1.1 christos if (!undef_weak_ref)
3675 1.1 christos value = set_fptr_entry (output_bfd, info, dyn_i, value);
3676 1.1 christos }
3677 1.1.1.2 christos if (!dyn_i->want_fptr || bfd_link_pie (info))
3678 1.1 christos {
3679 1.1 christos /* Otherwise, we expect the dynamic linker to create
3680 1.1 christos the entry. */
3681 1.1 christos
3682 1.1 christos if (dyn_i->want_fptr)
3683 1.1 christos {
3684 1.1 christos if (r_type == R_IA64_FPTR64I)
3685 1.1 christos {
3686 1.1 christos /* We can't represent this without a dynamic symbol.
3687 1.1 christos Adjust the relocation to be against an output
3688 1.1 christos section symbol, which are always present in the
3689 1.1 christos dynamic symbol table. */
3690 1.1 christos /* ??? People shouldn't be doing non-pic code in
3691 1.1 christos shared libraries. Hork. */
3692 1.1.1.4 christos _bfd_error_handler
3693 1.1.1.5 christos (_("%pB: linking non-pic code in a position independent executable"),
3694 1.1 christos input_bfd);
3695 1.1 christos ret_val = FALSE;
3696 1.1 christos continue;
3697 1.1 christos }
3698 1.1 christos }
3699 1.1 christos else
3700 1.1 christos {
3701 1.1 christos value = 0;
3702 1.1 christos }
3703 1.1 christos
3704 1.1.1.4 christos /* VMS: FIXFD. */
3705 1.1.1.4 christos elf64_ia64_install_fixup
3706 1.1.1.4 christos (output_bfd, ia64_info, h, R_IA64_VMS_FIXFD,
3707 1.1.1.4 christos input_section, rel->r_offset, 0);
3708 1.1.1.4 christos r = bfd_reloc_ok;
3709 1.1.1.4 christos break;
3710 1.1 christos }
3711 1.1 christos
3712 1.1 christos r = ia64_elf_install_value (hit_addr, value, r_type);
3713 1.1 christos break;
3714 1.1 christos
3715 1.1 christos case R_IA64_LTOFF_FPTR22:
3716 1.1 christos case R_IA64_LTOFF_FPTR64I:
3717 1.1 christos case R_IA64_LTOFF_FPTR32MSB:
3718 1.1 christos case R_IA64_LTOFF_FPTR32LSB:
3719 1.1 christos case R_IA64_LTOFF_FPTR64MSB:
3720 1.1 christos case R_IA64_LTOFF_FPTR64LSB:
3721 1.1.1.4 christos dyn_i = get_dyn_sym_info (ia64_info, h, input_bfd, rel, FALSE);
3722 1.1.1.4 christos if (dyn_i->want_fptr)
3723 1.1.1.4 christos {
3724 1.1.1.4 christos BFD_ASSERT (h == NULL || !h->def_dynamic);
3725 1.1.1.4 christos if (!undef_weak_ref)
3726 1.1.1.4 christos value = set_fptr_entry (output_bfd, info, dyn_i, value);
3727 1.1.1.4 christos }
3728 1.1.1.4 christos else
3729 1.1.1.4 christos value = 0;
3730 1.1.1.4 christos
3731 1.1.1.4 christos value = set_got_entry (output_bfd, info, dyn_i,
3732 1.1.1.4 christos rel->r_addend, value, R_IA64_FPTR64LSB);
3733 1.1.1.4 christos value -= gp_val;
3734 1.1.1.4 christos r = ia64_elf_install_value (hit_addr, value, r_type);
3735 1.1 christos break;
3736 1.1 christos
3737 1.1 christos case R_IA64_PCREL32MSB:
3738 1.1 christos case R_IA64_PCREL32LSB:
3739 1.1 christos case R_IA64_PCREL64MSB:
3740 1.1 christos case R_IA64_PCREL64LSB:
3741 1.1 christos /* Install a dynamic relocation for this reloc. */
3742 1.1 christos if (dynamic_symbol_p && r_symndx != 0)
3743 1.1 christos {
3744 1.1.1.4 christos /* VMS: doesn't exist ??? */
3745 1.1.1.4 christos abort ();
3746 1.1 christos }
3747 1.1 christos goto finish_pcrel;
3748 1.1 christos
3749 1.1 christos case R_IA64_PCREL21B:
3750 1.1 christos case R_IA64_PCREL60B:
3751 1.1 christos /* We should have created a PLT entry for any dynamic symbol. */
3752 1.1 christos dyn_i = NULL;
3753 1.1 christos if (h)
3754 1.1 christos dyn_i = get_dyn_sym_info (ia64_info, h, NULL, NULL, FALSE);
3755 1.1 christos
3756 1.1 christos if (dyn_i && dyn_i->want_plt2)
3757 1.1 christos {
3758 1.1 christos /* Should have caught this earlier. */
3759 1.1 christos BFD_ASSERT (rel->r_addend == 0);
3760 1.1 christos
3761 1.1 christos value = (ia64_info->root.splt->output_section->vma
3762 1.1 christos + ia64_info->root.splt->output_offset
3763 1.1 christos + dyn_i->plt2_offset);
3764 1.1 christos }
3765 1.1 christos else
3766 1.1 christos {
3767 1.1 christos /* Since there's no PLT entry, Validate that this is
3768 1.1 christos locally defined. */
3769 1.1 christos BFD_ASSERT (undef_weak_ref || sym_sec->output_section != NULL);
3770 1.1 christos
3771 1.1 christos /* If the symbol is undef_weak, we shouldn't be trying
3772 1.1 christos to call it. There's every chance that we'd wind up
3773 1.1 christos with an out-of-range fixup here. Don't bother setting
3774 1.1 christos any value at all. */
3775 1.1 christos if (undef_weak_ref)
3776 1.1 christos continue;
3777 1.1 christos }
3778 1.1 christos goto finish_pcrel;
3779 1.1 christos
3780 1.1 christos case R_IA64_PCREL21BI:
3781 1.1 christos case R_IA64_PCREL21F:
3782 1.1 christos case R_IA64_PCREL21M:
3783 1.1 christos case R_IA64_PCREL22:
3784 1.1 christos case R_IA64_PCREL64I:
3785 1.1 christos /* The PCREL21BI reloc is specifically not intended for use with
3786 1.1 christos dynamic relocs. PCREL21F and PCREL21M are used for speculation
3787 1.1 christos fixup code, and thus probably ought not be dynamic. The
3788 1.1 christos PCREL22 and PCREL64I relocs aren't emitted as dynamic relocs. */
3789 1.1 christos if (dynamic_symbol_p)
3790 1.1 christos {
3791 1.1 christos const char *msg;
3792 1.1 christos
3793 1.1 christos if (r_type == R_IA64_PCREL21BI)
3794 1.1.1.4 christos /* xgettext:c-format */
3795 1.1.1.5 christos msg = _("%pB: @internal branch to dynamic symbol %s");
3796 1.1 christos else if (r_type == R_IA64_PCREL21F || r_type == R_IA64_PCREL21M)
3797 1.1.1.4 christos /* xgettext:c-format */
3798 1.1.1.5 christos msg = _("%pB: speculation fixup to dynamic symbol %s");
3799 1.1 christos else
3800 1.1.1.4 christos /* xgettext:c-format */
3801 1.1.1.5 christos msg = _("%pB: @pcrel relocation against dynamic symbol %s");
3802 1.1.1.4 christos _bfd_error_handler (msg, input_bfd,
3803 1.1.1.4 christos h ? h->root.root.string
3804 1.1.1.4 christos : bfd_elf_sym_name (input_bfd,
3805 1.1.1.4 christos symtab_hdr,
3806 1.1.1.4 christos sym,
3807 1.1.1.4 christos sym_sec));
3808 1.1 christos ret_val = FALSE;
3809 1.1 christos continue;
3810 1.1 christos }
3811 1.1 christos goto finish_pcrel;
3812 1.1 christos
3813 1.1 christos finish_pcrel:
3814 1.1 christos /* Make pc-relative. */
3815 1.1 christos value -= (input_section->output_section->vma
3816 1.1 christos + input_section->output_offset
3817 1.1 christos + rel->r_offset) & ~ (bfd_vma) 0x3;
3818 1.1 christos r = ia64_elf_install_value (hit_addr, value, r_type);
3819 1.1 christos break;
3820 1.1 christos
3821 1.1 christos case R_IA64_SEGREL32MSB:
3822 1.1 christos case R_IA64_SEGREL32LSB:
3823 1.1 christos case R_IA64_SEGREL64MSB:
3824 1.1 christos case R_IA64_SEGREL64LSB:
3825 1.1 christos {
3826 1.1 christos /* Find the segment that contains the output_section. */
3827 1.1 christos Elf_Internal_Phdr *p = _bfd_elf_find_segment_containing_section
3828 1.1 christos (output_bfd, sym_sec->output_section);
3829 1.1 christos
3830 1.1 christos if (p == NULL)
3831 1.1 christos {
3832 1.1 christos r = bfd_reloc_notsupported;
3833 1.1 christos }
3834 1.1 christos else
3835 1.1 christos {
3836 1.1 christos /* The VMA of the segment is the vaddr of the associated
3837 1.1 christos program header. */
3838 1.1 christos if (value > p->p_vaddr)
3839 1.1 christos value -= p->p_vaddr;
3840 1.1 christos else
3841 1.1 christos value = 0;
3842 1.1 christos r = ia64_elf_install_value (hit_addr, value, r_type);
3843 1.1 christos }
3844 1.1 christos break;
3845 1.1 christos }
3846 1.1 christos
3847 1.1 christos case R_IA64_SECREL32MSB:
3848 1.1 christos case R_IA64_SECREL32LSB:
3849 1.1 christos case R_IA64_SECREL64MSB:
3850 1.1 christos case R_IA64_SECREL64LSB:
3851 1.1 christos /* Make output-section relative to section where the symbol
3852 1.1 christos is defined. PR 475 */
3853 1.1 christos if (sym_sec)
3854 1.1 christos value -= sym_sec->output_section->vma;
3855 1.1 christos r = ia64_elf_install_value (hit_addr, value, r_type);
3856 1.1 christos break;
3857 1.1 christos
3858 1.1 christos case R_IA64_IPLTMSB:
3859 1.1 christos case R_IA64_IPLTLSB:
3860 1.1 christos /* Install a dynamic relocation for this reloc. */
3861 1.1.1.2 christos if ((dynamic_symbol_p || bfd_link_pic (info))
3862 1.1 christos && (input_section->flags & SEC_ALLOC) != 0)
3863 1.1 christos {
3864 1.1.1.4 christos /* VMS: FIXFD ?? */
3865 1.1.1.4 christos abort ();
3866 1.1 christos }
3867 1.1 christos
3868 1.1 christos if (r_type == R_IA64_IPLTMSB)
3869 1.1 christos r_type = R_IA64_DIR64MSB;
3870 1.1 christos else
3871 1.1 christos r_type = R_IA64_DIR64LSB;
3872 1.1 christos ia64_elf_install_value (hit_addr, value, r_type);
3873 1.1 christos r = ia64_elf_install_value (hit_addr + 8, gp_val, r_type);
3874 1.1 christos break;
3875 1.1 christos
3876 1.1 christos case R_IA64_TPREL14:
3877 1.1 christos case R_IA64_TPREL22:
3878 1.1 christos case R_IA64_TPREL64I:
3879 1.1 christos r = bfd_reloc_notsupported;
3880 1.1 christos break;
3881 1.1 christos
3882 1.1 christos case R_IA64_DTPREL14:
3883 1.1 christos case R_IA64_DTPREL22:
3884 1.1 christos case R_IA64_DTPREL64I:
3885 1.1 christos case R_IA64_DTPREL32LSB:
3886 1.1 christos case R_IA64_DTPREL32MSB:
3887 1.1 christos case R_IA64_DTPREL64LSB:
3888 1.1 christos case R_IA64_DTPREL64MSB:
3889 1.1 christos r = bfd_reloc_notsupported;
3890 1.1 christos break;
3891 1.1 christos
3892 1.1 christos case R_IA64_LTOFF_TPREL22:
3893 1.1 christos case R_IA64_LTOFF_DTPMOD22:
3894 1.1 christos case R_IA64_LTOFF_DTPREL22:
3895 1.1 christos r = bfd_reloc_notsupported;
3896 1.1 christos break;
3897 1.1 christos
3898 1.1 christos default:
3899 1.1 christos r = bfd_reloc_notsupported;
3900 1.1 christos break;
3901 1.1 christos }
3902 1.1 christos
3903 1.1 christos switch (r)
3904 1.1 christos {
3905 1.1 christos case bfd_reloc_ok:
3906 1.1 christos break;
3907 1.1 christos
3908 1.1 christos case bfd_reloc_undefined:
3909 1.1 christos /* This can happen for global table relative relocs if
3910 1.1 christos __gp is undefined. This is a panic situation so we
3911 1.1 christos don't try to continue. */
3912 1.1 christos (*info->callbacks->undefined_symbol)
3913 1.1 christos (info, "__gp", input_bfd, input_section, rel->r_offset, 1);
3914 1.1 christos return FALSE;
3915 1.1 christos
3916 1.1 christos case bfd_reloc_notsupported:
3917 1.1 christos {
3918 1.1 christos const char *name;
3919 1.1 christos
3920 1.1 christos if (h)
3921 1.1 christos name = h->root.root.string;
3922 1.1 christos else
3923 1.1 christos name = bfd_elf_sym_name (input_bfd, symtab_hdr, sym,
3924 1.1 christos sym_sec);
3925 1.1.1.3 christos (*info->callbacks->warning) (info, _("unsupported reloc"),
3926 1.1.1.3 christos name, input_bfd,
3927 1.1.1.3 christos input_section, rel->r_offset);
3928 1.1 christos ret_val = FALSE;
3929 1.1 christos }
3930 1.1 christos break;
3931 1.1 christos
3932 1.1 christos case bfd_reloc_dangerous:
3933 1.1 christos case bfd_reloc_outofrange:
3934 1.1 christos case bfd_reloc_overflow:
3935 1.1 christos default:
3936 1.1 christos {
3937 1.1 christos const char *name;
3938 1.1 christos
3939 1.1 christos if (h)
3940 1.1 christos name = h->root.root.string;
3941 1.1 christos else
3942 1.1 christos name = bfd_elf_sym_name (input_bfd, symtab_hdr, sym,
3943 1.1 christos sym_sec);
3944 1.1 christos
3945 1.1 christos switch (r_type)
3946 1.1 christos {
3947 1.1 christos case R_IA64_TPREL14:
3948 1.1 christos case R_IA64_TPREL22:
3949 1.1 christos case R_IA64_TPREL64I:
3950 1.1 christos case R_IA64_DTPREL14:
3951 1.1 christos case R_IA64_DTPREL22:
3952 1.1 christos case R_IA64_DTPREL64I:
3953 1.1 christos case R_IA64_DTPREL32LSB:
3954 1.1 christos case R_IA64_DTPREL32MSB:
3955 1.1 christos case R_IA64_DTPREL64LSB:
3956 1.1 christos case R_IA64_DTPREL64MSB:
3957 1.1 christos case R_IA64_LTOFF_TPREL22:
3958 1.1 christos case R_IA64_LTOFF_DTPMOD22:
3959 1.1 christos case R_IA64_LTOFF_DTPREL22:
3960 1.1.1.4 christos _bfd_error_handler
3961 1.1.1.4 christos /* xgettext:c-format */
3962 1.1.1.5 christos (_("%pB: missing TLS section for relocation %s against `%s'"
3963 1.1.1.5 christos " at %#" PRIx64 " in section `%pA'."),
3964 1.1.1.4 christos input_bfd, howto->name, name,
3965 1.1.1.5 christos (uint64_t) rel->r_offset, input_section);
3966 1.1 christos break;
3967 1.1 christos
3968 1.1 christos case R_IA64_PCREL21B:
3969 1.1 christos case R_IA64_PCREL21BI:
3970 1.1 christos case R_IA64_PCREL21M:
3971 1.1 christos case R_IA64_PCREL21F:
3972 1.1 christos if (is_elf_hash_table (info->hash))
3973 1.1 christos {
3974 1.1 christos /* Relaxtion is always performed for ELF output.
3975 1.1 christos Overflow failures for those relocations mean
3976 1.1 christos that the section is too big to relax. */
3977 1.1.1.4 christos _bfd_error_handler
3978 1.1.1.4 christos /* xgettext:c-format */
3979 1.1.1.5 christos (_("%pB: Can't relax br (%s) to `%s' "
3980 1.1.1.5 christos "at %#" PRIx64 " in section `%pA' "
3981 1.1.1.5 christos "with size %#" PRIx64 " (> 0x1000000)."),
3982 1.1.1.5 christos input_bfd, howto->name, name, (uint64_t) rel->r_offset,
3983 1.1.1.5 christos input_section, (uint64_t) input_section->size);
3984 1.1 christos break;
3985 1.1 christos }
3986 1.1.1.4 christos /* Fall through. */
3987 1.1 christos default:
3988 1.1.1.3 christos (*info->callbacks->reloc_overflow) (info,
3989 1.1.1.3 christos &h->root,
3990 1.1.1.3 christos name,
3991 1.1.1.3 christos howto->name,
3992 1.1.1.3 christos (bfd_vma) 0,
3993 1.1.1.3 christos input_bfd,
3994 1.1.1.3 christos input_section,
3995 1.1.1.3 christos rel->r_offset);
3996 1.1 christos break;
3997 1.1 christos }
3998 1.1 christos
3999 1.1 christos ret_val = FALSE;
4000 1.1 christos }
4001 1.1 christos break;
4002 1.1 christos }
4003 1.1 christos }
4004 1.1 christos
4005 1.1 christos return ret_val;
4006 1.1 christos }
4007 1.1 christos
4008 1.1 christos static bfd_boolean
4009 1.1 christos elf64_ia64_finish_dynamic_symbol (bfd *output_bfd,
4010 1.1 christos struct bfd_link_info *info,
4011 1.1 christos struct elf_link_hash_entry *h,
4012 1.1 christos Elf_Internal_Sym *sym)
4013 1.1 christos {
4014 1.1 christos struct elf64_ia64_link_hash_table *ia64_info;
4015 1.1 christos struct elf64_ia64_dyn_sym_info *dyn_i;
4016 1.1 christos
4017 1.1 christos ia64_info = elf64_ia64_hash_table (info);
4018 1.1 christos if (ia64_info == NULL)
4019 1.1 christos return FALSE;
4020 1.1 christos
4021 1.1 christos dyn_i = get_dyn_sym_info (ia64_info, h, NULL, NULL, FALSE);
4022 1.1 christos
4023 1.1 christos /* Fill in the PLT data, if required. */
4024 1.1 christos if (dyn_i && dyn_i->want_plt)
4025 1.1 christos {
4026 1.1 christos bfd_byte *loc;
4027 1.1 christos asection *plt_sec;
4028 1.1 christos bfd_vma plt_addr, pltoff_addr, gp_val;
4029 1.1 christos
4030 1.1 christos gp_val = _bfd_get_gp_value (output_bfd);
4031 1.1 christos
4032 1.1 christos plt_sec = ia64_info->root.splt;
4033 1.1 christos plt_addr = 0; /* Not used as overriden by FIXUPs. */
4034 1.1 christos pltoff_addr = set_pltoff_entry (output_bfd, info, dyn_i, plt_addr, TRUE);
4035 1.1 christos
4036 1.1 christos /* Initialize the FULL PLT entry, if needed. */
4037 1.1 christos if (dyn_i->want_plt2)
4038 1.1 christos {
4039 1.1 christos loc = plt_sec->contents + dyn_i->plt2_offset;
4040 1.1 christos
4041 1.1 christos memcpy (loc, plt_full_entry, PLT_FULL_ENTRY_SIZE);
4042 1.1 christos ia64_elf_install_value (loc, pltoff_addr - gp_val, R_IA64_IMM22);
4043 1.1 christos
4044 1.1 christos /* Mark the symbol as undefined, rather than as defined in the
4045 1.1 christos plt section. Leave the value alone. */
4046 1.1 christos /* ??? We didn't redefine it in adjust_dynamic_symbol in the
4047 1.1 christos first place. But perhaps elflink.c did some for us. */
4048 1.1 christos if (!h->def_regular)
4049 1.1 christos sym->st_shndx = SHN_UNDEF;
4050 1.1 christos }
4051 1.1 christos
4052 1.1 christos /* VMS: FIXFD. */
4053 1.1 christos elf64_ia64_install_fixup
4054 1.1.1.4 christos (output_bfd, ia64_info, h, R_IA64_VMS_FIXFD, ia64_info->pltoff_sec,
4055 1.1.1.4 christos pltoff_addr - (ia64_info->pltoff_sec->output_section->vma
4056 1.1.1.4 christos + ia64_info->pltoff_sec->output_offset), 0);
4057 1.1 christos }
4058 1.1 christos
4059 1.1 christos /* Mark some specially defined symbols as absolute. */
4060 1.1.1.2 christos if (h == ia64_info->root.hdynamic
4061 1.1 christos || h == ia64_info->root.hgot
4062 1.1 christos || h == ia64_info->root.hplt)
4063 1.1 christos sym->st_shndx = SHN_ABS;
4064 1.1 christos
4065 1.1 christos return TRUE;
4066 1.1 christos }
4067 1.1 christos
4068 1.1 christos static bfd_boolean
4069 1.1 christos elf64_ia64_finish_dynamic_sections (bfd *abfd,
4070 1.1 christos struct bfd_link_info *info)
4071 1.1 christos {
4072 1.1 christos struct elf64_ia64_link_hash_table *ia64_info;
4073 1.1 christos bfd *dynobj;
4074 1.1 christos
4075 1.1 christos ia64_info = elf64_ia64_hash_table (info);
4076 1.1 christos if (ia64_info == NULL)
4077 1.1 christos return FALSE;
4078 1.1 christos
4079 1.1 christos dynobj = ia64_info->root.dynobj;
4080 1.1 christos
4081 1.1 christos if (elf_hash_table (info)->dynamic_sections_created)
4082 1.1 christos {
4083 1.1 christos Elf64_External_Dyn *dyncon, *dynconend;
4084 1.1 christos asection *sdyn;
4085 1.1 christos asection *unwind_sec;
4086 1.1 christos bfd_vma gp_val;
4087 1.1 christos unsigned int gp_seg;
4088 1.1 christos bfd_vma gp_off;
4089 1.1 christos Elf_Internal_Phdr *phdr;
4090 1.1 christos Elf_Internal_Phdr *base_phdr;
4091 1.1 christos unsigned int unwind_seg = 0;
4092 1.1 christos unsigned int code_seg = 0;
4093 1.1 christos
4094 1.1 christos sdyn = bfd_get_linker_section (dynobj, ".dynamic");
4095 1.1 christos BFD_ASSERT (sdyn != NULL);
4096 1.1 christos dyncon = (Elf64_External_Dyn *) sdyn->contents;
4097 1.1 christos dynconend = (Elf64_External_Dyn *) (sdyn->contents + sdyn->size);
4098 1.1 christos
4099 1.1 christos gp_val = _bfd_get_gp_value (abfd);
4100 1.1 christos phdr = _bfd_elf_find_segment_containing_section
4101 1.1.1.4 christos (info->output_bfd, ia64_info->pltoff_sec->output_section);
4102 1.1 christos BFD_ASSERT (phdr != NULL);
4103 1.1 christos base_phdr = elf_tdata (info->output_bfd)->phdr;
4104 1.1 christos gp_seg = phdr - base_phdr;
4105 1.1 christos gp_off = gp_val - phdr->p_vaddr;
4106 1.1 christos
4107 1.1 christos unwind_sec = bfd_get_section_by_name (abfd, ELF_STRING_ia64_unwind);
4108 1.1 christos if (unwind_sec != NULL)
4109 1.1.1.4 christos {
4110 1.1.1.4 christos asection *code_sec;
4111 1.1 christos
4112 1.1.1.4 christos phdr = _bfd_elf_find_segment_containing_section (abfd, unwind_sec);
4113 1.1.1.4 christos BFD_ASSERT (phdr != NULL);
4114 1.1.1.4 christos unwind_seg = phdr - base_phdr;
4115 1.1.1.4 christos
4116 1.1.1.4 christos code_sec = bfd_get_section_by_name (abfd, "$CODE$");
4117 1.1.1.4 christos phdr = _bfd_elf_find_segment_containing_section (abfd, code_sec);
4118 1.1.1.4 christos BFD_ASSERT (phdr != NULL);
4119 1.1.1.4 christos code_seg = phdr - base_phdr;
4120 1.1.1.4 christos }
4121 1.1 christos
4122 1.1 christos for (; dyncon < dynconend; dyncon++)
4123 1.1 christos {
4124 1.1 christos Elf_Internal_Dyn dyn;
4125 1.1 christos
4126 1.1 christos bfd_elf64_swap_dyn_in (dynobj, dyncon, &dyn);
4127 1.1 christos
4128 1.1 christos switch (dyn.d_tag)
4129 1.1 christos {
4130 1.1.1.4 christos case DT_IA_64_VMS_FIXUP_RELA_OFF:
4131 1.1.1.4 christos dyn.d_un.d_val +=
4132 1.1.1.4 christos (ia64_info->fixups_sec->output_section->vma
4133 1.1.1.4 christos + ia64_info->fixups_sec->output_offset)
4134 1.1.1.4 christos - (sdyn->output_section->vma + sdyn->output_offset);
4135 1.1.1.4 christos break;
4136 1.1.1.4 christos
4137 1.1.1.4 christos case DT_IA_64_VMS_PLTGOT_OFFSET:
4138 1.1.1.4 christos dyn.d_un.d_val = gp_off;
4139 1.1.1.4 christos break;
4140 1.1.1.4 christos
4141 1.1.1.4 christos case DT_IA_64_VMS_PLTGOT_SEG:
4142 1.1.1.4 christos dyn.d_un.d_val = gp_seg;
4143 1.1.1.4 christos break;
4144 1.1.1.4 christos
4145 1.1.1.4 christos case DT_IA_64_VMS_UNWINDSZ:
4146 1.1.1.4 christos if (unwind_sec == NULL)
4147 1.1.1.4 christos {
4148 1.1.1.4 christos dyn.d_tag = DT_NULL;
4149 1.1.1.4 christos dyn.d_un.d_val = 0xdead;
4150 1.1.1.4 christos }
4151 1.1.1.4 christos else
4152 1.1.1.4 christos dyn.d_un.d_val = unwind_sec->size;
4153 1.1.1.4 christos break;
4154 1.1.1.4 christos
4155 1.1.1.4 christos case DT_IA_64_VMS_UNWIND_CODSEG:
4156 1.1.1.4 christos dyn.d_un.d_val = code_seg;
4157 1.1.1.4 christos break;
4158 1.1.1.4 christos
4159 1.1.1.4 christos case DT_IA_64_VMS_UNWIND_INFOSEG:
4160 1.1.1.4 christos case DT_IA_64_VMS_UNWIND_SEG:
4161 1.1.1.4 christos dyn.d_un.d_val = unwind_seg;
4162 1.1.1.4 christos break;
4163 1.1.1.4 christos
4164 1.1.1.4 christos case DT_IA_64_VMS_UNWIND_OFFSET:
4165 1.1.1.4 christos break;
4166 1.1.1.4 christos
4167 1.1.1.4 christos default:
4168 1.1.1.4 christos /* No need to rewrite the entry. */
4169 1.1.1.4 christos continue;
4170 1.1 christos }
4171 1.1 christos
4172 1.1 christos bfd_elf64_swap_dyn_out (abfd, &dyn, dyncon);
4173 1.1 christos }
4174 1.1 christos }
4175 1.1 christos
4176 1.1 christos /* Handle transfer addresses. */
4177 1.1 christos {
4178 1.1 christos asection *tfr_sec = ia64_info->transfer_sec;
4179 1.1 christos struct elf64_vms_transfer *tfr;
4180 1.1 christos struct elf_link_hash_entry *tfr3;
4181 1.1 christos
4182 1.1 christos tfr = (struct elf64_vms_transfer *)tfr_sec->contents;
4183 1.1 christos bfd_putl32 (6 * 8, tfr->size);
4184 1.1 christos bfd_putl64 (tfr_sec->output_section->vma
4185 1.1.1.4 christos + tfr_sec->output_offset
4186 1.1.1.4 christos + 6 * 8, tfr->tfradr3);
4187 1.1 christos
4188 1.1 christos tfr3 = elf_link_hash_lookup (elf_hash_table (info), "ELF$TFRADR", FALSE,
4189 1.1.1.4 christos FALSE, FALSE);
4190 1.1 christos
4191 1.1 christos if (tfr3
4192 1.1.1.4 christos && (tfr3->root.type == bfd_link_hash_defined
4193 1.1.1.4 christos || tfr3->root.type == bfd_link_hash_defweak))
4194 1.1 christos {
4195 1.1.1.4 christos asection *tfr3_sec = tfr3->root.u.def.section;
4196 1.1.1.4 christos bfd_vma tfr3_val;
4197 1.1 christos
4198 1.1.1.4 christos tfr3_val = (tfr3->root.u.def.value
4199 1.1.1.4 christos + tfr3_sec->output_section->vma
4200 1.1.1.4 christos + tfr3_sec->output_offset);
4201 1.1 christos
4202 1.1.1.4 christos bfd_putl64 (tfr3_val, tfr->tfr3_func);
4203 1.1.1.4 christos bfd_putl64 (_bfd_get_gp_value (info->output_bfd), tfr->tfr3_gp);
4204 1.1 christos }
4205 1.1 christos
4206 1.1 christos /* FIXME: set linker flags,
4207 1.1 christos handle lib$initialize. */
4208 1.1 christos }
4209 1.1 christos
4210 1.1 christos return TRUE;
4211 1.1 christos }
4212 1.1 christos
4213 1.1 christos /* ELF file flag handling: */
4214 1.1 christos
4215 1.1 christos /* Function to keep IA-64 specific file flags. */
4216 1.1 christos static bfd_boolean
4217 1.1 christos elf64_ia64_set_private_flags (bfd *abfd, flagword flags)
4218 1.1 christos {
4219 1.1 christos BFD_ASSERT (!elf_flags_init (abfd)
4220 1.1 christos || elf_elfheader (abfd)->e_flags == flags);
4221 1.1 christos
4222 1.1 christos elf_elfheader (abfd)->e_flags = flags;
4223 1.1 christos elf_flags_init (abfd) = TRUE;
4224 1.1 christos return TRUE;
4225 1.1 christos }
4226 1.1 christos
4227 1.1 christos /* Merge backend specific data from an object file to the output
4228 1.1 christos object file when linking. */
4229 1.1 christos static bfd_boolean
4230 1.1.1.4 christos elf64_ia64_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
4231 1.1 christos {
4232 1.1.1.4 christos bfd *obfd = info->output_bfd;
4233 1.1 christos flagword out_flags;
4234 1.1 christos flagword in_flags;
4235 1.1 christos bfd_boolean ok = TRUE;
4236 1.1 christos
4237 1.1 christos /* Don't even pretend to support mixed-format linking. */
4238 1.1 christos if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
4239 1.1 christos || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
4240 1.1 christos return FALSE;
4241 1.1 christos
4242 1.1 christos in_flags = elf_elfheader (ibfd)->e_flags;
4243 1.1 christos out_flags = elf_elfheader (obfd)->e_flags;
4244 1.1 christos
4245 1.1 christos if (! elf_flags_init (obfd))
4246 1.1 christos {
4247 1.1 christos elf_flags_init (obfd) = TRUE;
4248 1.1 christos elf_elfheader (obfd)->e_flags = in_flags;
4249 1.1 christos
4250 1.1 christos if (bfd_get_arch (obfd) == bfd_get_arch (ibfd)
4251 1.1 christos && bfd_get_arch_info (obfd)->the_default)
4252 1.1 christos {
4253 1.1 christos return bfd_set_arch_mach (obfd, bfd_get_arch (ibfd),
4254 1.1 christos bfd_get_mach (ibfd));
4255 1.1 christos }
4256 1.1 christos
4257 1.1 christos return TRUE;
4258 1.1 christos }
4259 1.1 christos
4260 1.1 christos /* Check flag compatibility. */
4261 1.1 christos if (in_flags == out_flags)
4262 1.1 christos return TRUE;
4263 1.1 christos
4264 1.1 christos /* Output has EF_IA_64_REDUCEDFP set only if all inputs have it set. */
4265 1.1 christos if (!(in_flags & EF_IA_64_REDUCEDFP) && (out_flags & EF_IA_64_REDUCEDFP))
4266 1.1 christos elf_elfheader (obfd)->e_flags &= ~EF_IA_64_REDUCEDFP;
4267 1.1 christos
4268 1.1 christos if ((in_flags & EF_IA_64_TRAPNIL) != (out_flags & EF_IA_64_TRAPNIL))
4269 1.1 christos {
4270 1.1.1.4 christos _bfd_error_handler
4271 1.1.1.5 christos (_("%pB: linking trap-on-NULL-dereference with non-trapping files"),
4272 1.1 christos ibfd);
4273 1.1 christos
4274 1.1 christos bfd_set_error (bfd_error_bad_value);
4275 1.1 christos ok = FALSE;
4276 1.1 christos }
4277 1.1 christos if ((in_flags & EF_IA_64_BE) != (out_flags & EF_IA_64_BE))
4278 1.1 christos {
4279 1.1.1.4 christos _bfd_error_handler
4280 1.1.1.5 christos (_("%pB: linking big-endian files with little-endian files"),
4281 1.1 christos ibfd);
4282 1.1 christos
4283 1.1 christos bfd_set_error (bfd_error_bad_value);
4284 1.1 christos ok = FALSE;
4285 1.1 christos }
4286 1.1 christos if ((in_flags & EF_IA_64_ABI64) != (out_flags & EF_IA_64_ABI64))
4287 1.1 christos {
4288 1.1.1.4 christos _bfd_error_handler
4289 1.1.1.5 christos (_("%pB: linking 64-bit files with 32-bit files"),
4290 1.1 christos ibfd);
4291 1.1 christos
4292 1.1 christos bfd_set_error (bfd_error_bad_value);
4293 1.1 christos ok = FALSE;
4294 1.1 christos }
4295 1.1 christos if ((in_flags & EF_IA_64_CONS_GP) != (out_flags & EF_IA_64_CONS_GP))
4296 1.1 christos {
4297 1.1.1.4 christos _bfd_error_handler
4298 1.1.1.5 christos (_("%pB: linking constant-gp files with non-constant-gp files"),
4299 1.1 christos ibfd);
4300 1.1 christos
4301 1.1 christos bfd_set_error (bfd_error_bad_value);
4302 1.1 christos ok = FALSE;
4303 1.1 christos }
4304 1.1 christos if ((in_flags & EF_IA_64_NOFUNCDESC_CONS_GP)
4305 1.1 christos != (out_flags & EF_IA_64_NOFUNCDESC_CONS_GP))
4306 1.1 christos {
4307 1.1.1.4 christos _bfd_error_handler
4308 1.1.1.5 christos (_("%pB: linking auto-pic files with non-auto-pic files"),
4309 1.1 christos ibfd);
4310 1.1 christos
4311 1.1 christos bfd_set_error (bfd_error_bad_value);
4312 1.1 christos ok = FALSE;
4313 1.1 christos }
4314 1.1 christos
4315 1.1 christos return ok;
4316 1.1 christos }
4317 1.1 christos
4318 1.1 christos static bfd_boolean
4319 1.1 christos elf64_ia64_print_private_bfd_data (bfd *abfd, void * ptr)
4320 1.1 christos {
4321 1.1 christos FILE *file = (FILE *) ptr;
4322 1.1 christos flagword flags = elf_elfheader (abfd)->e_flags;
4323 1.1 christos
4324 1.1 christos BFD_ASSERT (abfd != NULL && ptr != NULL);
4325 1.1 christos
4326 1.1 christos fprintf (file, "private flags = %s%s%s%s%s%s%s%s\n",
4327 1.1 christos (flags & EF_IA_64_TRAPNIL) ? "TRAPNIL, " : "",
4328 1.1 christos (flags & EF_IA_64_EXT) ? "EXT, " : "",
4329 1.1 christos (flags & EF_IA_64_BE) ? "BE, " : "LE, ",
4330 1.1 christos (flags & EF_IA_64_REDUCEDFP) ? "REDUCEDFP, " : "",
4331 1.1 christos (flags & EF_IA_64_CONS_GP) ? "CONS_GP, " : "",
4332 1.1 christos (flags & EF_IA_64_NOFUNCDESC_CONS_GP) ? "NOFUNCDESC_CONS_GP, " : "",
4333 1.1 christos (flags & EF_IA_64_ABSOLUTE) ? "ABSOLUTE, " : "",
4334 1.1 christos (flags & EF_IA_64_ABI64) ? "ABI64" : "ABI32");
4335 1.1 christos
4336 1.1 christos _bfd_elf_print_private_bfd_data (abfd, ptr);
4337 1.1 christos return TRUE;
4338 1.1 christos }
4339 1.1 christos
4340 1.1 christos static enum elf_reloc_type_class
4341 1.1.1.2 christos elf64_ia64_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSED,
4342 1.1.1.2 christos const asection *rel_sec ATTRIBUTE_UNUSED,
4343 1.1.1.2 christos const Elf_Internal_Rela *rela)
4344 1.1 christos {
4345 1.1 christos switch ((int) ELF64_R_TYPE (rela->r_info))
4346 1.1 christos {
4347 1.1 christos case R_IA64_REL32MSB:
4348 1.1 christos case R_IA64_REL32LSB:
4349 1.1 christos case R_IA64_REL64MSB:
4350 1.1 christos case R_IA64_REL64LSB:
4351 1.1 christos return reloc_class_relative;
4352 1.1 christos case R_IA64_IPLTMSB:
4353 1.1 christos case R_IA64_IPLTLSB:
4354 1.1 christos return reloc_class_plt;
4355 1.1 christos case R_IA64_COPY:
4356 1.1 christos return reloc_class_copy;
4357 1.1 christos default:
4358 1.1 christos return reloc_class_normal;
4359 1.1 christos }
4360 1.1 christos }
4361 1.1 christos
4362 1.1 christos static const struct bfd_elf_special_section elf64_ia64_special_sections[] =
4363 1.1 christos {
4364 1.1.1.4 christos { STRING_COMMA_LEN (".sbss"), -1, SHT_NOBITS, SHF_ALLOC + SHF_WRITE + SHF_IA_64_SHORT },
4365 1.1 christos { STRING_COMMA_LEN (".sdata"), -1, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE + SHF_IA_64_SHORT },
4366 1.1.1.4 christos { NULL, 0, 0, 0, 0 }
4367 1.1 christos };
4368 1.1 christos
4369 1.1 christos static bfd_boolean
4370 1.1 christos elf64_ia64_object_p (bfd *abfd)
4371 1.1 christos {
4372 1.1 christos asection *sec;
4373 1.1 christos asection *group, *unwi, *unw;
4374 1.1 christos flagword flags;
4375 1.1 christos const char *name;
4376 1.1 christos char *unwi_name, *unw_name;
4377 1.1 christos bfd_size_type amt;
4378 1.1 christos
4379 1.1 christos if (abfd->flags & DYNAMIC)
4380 1.1 christos return TRUE;
4381 1.1 christos
4382 1.1 christos /* Flags for fake group section. */
4383 1.1 christos flags = (SEC_LINKER_CREATED | SEC_GROUP | SEC_LINK_ONCE
4384 1.1 christos | SEC_EXCLUDE);
4385 1.1 christos
4386 1.1 christos /* We add a fake section group for each .gnu.linkonce.t.* section,
4387 1.1 christos which isn't in a section group, and its unwind sections. */
4388 1.1 christos for (sec = abfd->sections; sec != NULL; sec = sec->next)
4389 1.1 christos {
4390 1.1 christos if (elf_sec_group (sec) == NULL
4391 1.1 christos && ((sec->flags & (SEC_LINK_ONCE | SEC_CODE | SEC_GROUP))
4392 1.1 christos == (SEC_LINK_ONCE | SEC_CODE))
4393 1.1 christos && CONST_STRNEQ (sec->name, ".gnu.linkonce.t."))
4394 1.1 christos {
4395 1.1 christos name = sec->name + 16;
4396 1.1 christos
4397 1.1 christos amt = strlen (name) + sizeof (".gnu.linkonce.ia64unwi.");
4398 1.1 christos unwi_name = bfd_alloc (abfd, amt);
4399 1.1 christos if (!unwi_name)
4400 1.1 christos return FALSE;
4401 1.1 christos
4402 1.1 christos strcpy (stpcpy (unwi_name, ".gnu.linkonce.ia64unwi."), name);
4403 1.1 christos unwi = bfd_get_section_by_name (abfd, unwi_name);
4404 1.1 christos
4405 1.1 christos amt = strlen (name) + sizeof (".gnu.linkonce.ia64unw.");
4406 1.1 christos unw_name = bfd_alloc (abfd, amt);
4407 1.1 christos if (!unw_name)
4408 1.1 christos return FALSE;
4409 1.1 christos
4410 1.1 christos strcpy (stpcpy (unw_name, ".gnu.linkonce.ia64unw."), name);
4411 1.1 christos unw = bfd_get_section_by_name (abfd, unw_name);
4412 1.1 christos
4413 1.1 christos /* We need to create a fake group section for it and its
4414 1.1 christos unwind sections. */
4415 1.1 christos group = bfd_make_section_anyway_with_flags (abfd, name,
4416 1.1 christos flags);
4417 1.1 christos if (group == NULL)
4418 1.1 christos return FALSE;
4419 1.1 christos
4420 1.1 christos /* Move the fake group section to the beginning. */
4421 1.1 christos bfd_section_list_remove (abfd, group);
4422 1.1 christos bfd_section_list_prepend (abfd, group);
4423 1.1 christos
4424 1.1 christos elf_next_in_group (group) = sec;
4425 1.1 christos
4426 1.1 christos elf_group_name (sec) = name;
4427 1.1 christos elf_next_in_group (sec) = sec;
4428 1.1 christos elf_sec_group (sec) = group;
4429 1.1 christos
4430 1.1 christos if (unwi)
4431 1.1 christos {
4432 1.1 christos elf_group_name (unwi) = name;
4433 1.1 christos elf_next_in_group (unwi) = sec;
4434 1.1 christos elf_next_in_group (sec) = unwi;
4435 1.1 christos elf_sec_group (unwi) = group;
4436 1.1 christos }
4437 1.1 christos
4438 1.1 christos if (unw)
4439 1.1 christos {
4440 1.1 christos elf_group_name (unw) = name;
4441 1.1 christos if (unwi)
4442 1.1 christos {
4443 1.1 christos elf_next_in_group (unw) = elf_next_in_group (unwi);
4444 1.1 christos elf_next_in_group (unwi) = unw;
4445 1.1 christos }
4446 1.1 christos else
4447 1.1 christos {
4448 1.1 christos elf_next_in_group (unw) = sec;
4449 1.1 christos elf_next_in_group (sec) = unw;
4450 1.1 christos }
4451 1.1 christos elf_sec_group (unw) = group;
4452 1.1 christos }
4453 1.1 christos
4454 1.1 christos /* Fake SHT_GROUP section header. */
4455 1.1 christos elf_section_data (group)->this_hdr.bfd_section = group;
4456 1.1 christos elf_section_data (group)->this_hdr.sh_type = SHT_GROUP;
4457 1.1 christos }
4458 1.1 christos }
4459 1.1 christos return TRUE;
4460 1.1 christos }
4461 1.1 christos
4462 1.1 christos /* Handle an IA-64 specific section when reading an object file. This
4463 1.1 christos is called when bfd_section_from_shdr finds a section with an unknown
4464 1.1 christos type. */
4465 1.1 christos
4466 1.1 christos static bfd_boolean
4467 1.1 christos elf64_vms_section_from_shdr (bfd *abfd,
4468 1.1 christos Elf_Internal_Shdr *hdr,
4469 1.1 christos const char *name,
4470 1.1 christos int shindex)
4471 1.1 christos {
4472 1.1 christos flagword secflags = 0;
4473 1.1 christos
4474 1.1 christos switch (hdr->sh_type)
4475 1.1 christos {
4476 1.1 christos case SHT_IA_64_VMS_TRACE:
4477 1.1 christos case SHT_IA_64_VMS_DEBUG:
4478 1.1 christos case SHT_IA_64_VMS_DEBUG_STR:
4479 1.1 christos secflags = SEC_DEBUGGING;
4480 1.1 christos break;
4481 1.1 christos
4482 1.1 christos case SHT_IA_64_UNWIND:
4483 1.1 christos case SHT_IA_64_HP_OPT_ANOT:
4484 1.1 christos break;
4485 1.1 christos
4486 1.1 christos case SHT_IA_64_EXT:
4487 1.1 christos if (strcmp (name, ELF_STRING_ia64_archext) != 0)
4488 1.1 christos return FALSE;
4489 1.1 christos break;
4490 1.1 christos
4491 1.1 christos default:
4492 1.1 christos return FALSE;
4493 1.1 christos }
4494 1.1 christos
4495 1.1 christos if (! _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex))
4496 1.1 christos return FALSE;
4497 1.1 christos
4498 1.1 christos if (secflags != 0)
4499 1.1 christos {
4500 1.1 christos asection *newsect = hdr->bfd_section;
4501 1.1 christos
4502 1.1.1.6 christos if (!bfd_set_section_flags (newsect,
4503 1.1.1.6 christos bfd_section_flags (newsect) | secflags))
4504 1.1 christos return FALSE;
4505 1.1 christos }
4506 1.1 christos
4507 1.1 christos return TRUE;
4508 1.1 christos }
4509 1.1 christos
4510 1.1 christos static bfd_boolean
4511 1.1 christos elf64_vms_object_p (bfd *abfd)
4512 1.1 christos {
4513 1.1 christos Elf_Internal_Ehdr *i_ehdrp = elf_elfheader (abfd);
4514 1.1 christos Elf_Internal_Phdr *i_phdr = elf_tdata (abfd)->phdr;
4515 1.1 christos unsigned int i;
4516 1.1 christos unsigned int num_text = 0;
4517 1.1 christos unsigned int num_data = 0;
4518 1.1 christos unsigned int num_rodata = 0;
4519 1.1 christos char name[16];
4520 1.1 christos
4521 1.1 christos if (!elf64_ia64_object_p (abfd))
4522 1.1 christos return FALSE;
4523 1.1 christos
4524 1.1 christos /* Many VMS compilers do not generate sections for the corresponding
4525 1.1 christos segment. This is boring as binutils tools won't be able to disassemble
4526 1.1 christos the code. So we simply create all the missing sections. */
4527 1.1 christos for (i = 0; i < i_ehdrp->e_phnum; i++, i_phdr++)
4528 1.1 christos {
4529 1.1 christos /* Is there a section for this segment? */
4530 1.1 christos bfd_vma base_vma = i_phdr->p_vaddr;
4531 1.1 christos bfd_vma limit_vma = base_vma + i_phdr->p_filesz;
4532 1.1 christos
4533 1.1 christos if (i_phdr->p_type != PT_LOAD)
4534 1.1 christos continue;
4535 1.1 christos
4536 1.1 christos /* We need to cover from base_vms to limit_vma. */
4537 1.1 christos again:
4538 1.1 christos while (base_vma < limit_vma)
4539 1.1 christos {
4540 1.1 christos bfd_vma next_vma = limit_vma;
4541 1.1 christos asection *nsec;
4542 1.1 christos asection *sec;
4543 1.1 christos flagword flags;
4544 1.1 christos char *nname = NULL;
4545 1.1 christos
4546 1.1 christos /* Find a section covering [base_vma;limit_vma) */
4547 1.1 christos for (sec = abfd->sections; sec != NULL; sec = sec->next)
4548 1.1 christos {
4549 1.1 christos /* Skip uninteresting sections (either not in memory or
4550 1.1 christos below base_vma. */
4551 1.1 christos if ((sec->flags & (SEC_ALLOC | SEC_LOAD)) == 0
4552 1.1 christos || sec->vma + sec->size <= base_vma)
4553 1.1 christos continue;
4554 1.1 christos if (sec->vma <= base_vma)
4555 1.1 christos {
4556 1.1 christos /* This section covers (maybe partially) the beginning
4557 1.1 christos of the range. */
4558 1.1 christos base_vma = sec->vma + sec->size;
4559 1.1 christos goto again;
4560 1.1 christos }
4561 1.1 christos if (sec->vma < next_vma)
4562 1.1 christos {
4563 1.1 christos /* This section partially covers the end of the range.
4564 1.1 christos Used to compute the size of the hole. */
4565 1.1 christos next_vma = sec->vma;
4566 1.1 christos }
4567 1.1 christos }
4568 1.1 christos
4569 1.1 christos /* No section covering [base_vma; next_vma). Create a fake one. */
4570 1.1 christos flags = SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS;
4571 1.1 christos if (i_phdr->p_flags & PF_X)
4572 1.1 christos {
4573 1.1 christos flags |= SEC_CODE;
4574 1.1 christos if (num_text++ == 0)
4575 1.1 christos nname = ".text";
4576 1.1 christos else
4577 1.1 christos sprintf (name, ".text$%u", num_text);
4578 1.1 christos }
4579 1.1 christos else if ((i_phdr->p_flags & (PF_R | PF_W)) == PF_R)
4580 1.1 christos {
4581 1.1 christos flags |= SEC_READONLY;
4582 1.1 christos sprintf (name, ".rodata$%u", num_rodata++);
4583 1.1 christos }
4584 1.1 christos else
4585 1.1 christos {
4586 1.1 christos flags |= SEC_DATA;
4587 1.1 christos sprintf (name, ".data$%u", num_data++);
4588 1.1 christos }
4589 1.1 christos
4590 1.1 christos /* Allocate name. */
4591 1.1 christos if (nname == NULL)
4592 1.1 christos {
4593 1.1 christos size_t name_len = strlen (name) + 1;
4594 1.1 christos nname = bfd_alloc (abfd, name_len);
4595 1.1 christos if (nname == NULL)
4596 1.1 christos return FALSE;
4597 1.1 christos memcpy (nname, name, name_len);
4598 1.1 christos }
4599 1.1 christos
4600 1.1 christos /* Create and fill new section. */
4601 1.1 christos nsec = bfd_make_section_anyway_with_flags (abfd, nname, flags);
4602 1.1 christos if (nsec == NULL)
4603 1.1 christos return FALSE;
4604 1.1 christos nsec->vma = base_vma;
4605 1.1 christos nsec->size = next_vma - base_vma;
4606 1.1 christos nsec->filepos = i_phdr->p_offset + (base_vma - i_phdr->p_vaddr);
4607 1.1 christos
4608 1.1 christos base_vma = next_vma;
4609 1.1 christos }
4610 1.1 christos }
4611 1.1 christos return TRUE;
4612 1.1 christos }
4613 1.1 christos
4614 1.1.1.6 christos static bfd_boolean
4615 1.1.1.6 christos elf64_vms_init_file_header (bfd *abfd, struct bfd_link_info *info)
4616 1.1 christos {
4617 1.1.1.6 christos Elf_Internal_Ehdr *i_ehdrp;
4618 1.1.1.6 christos
4619 1.1.1.6 christos if (!_bfd_elf_init_file_header (abfd, info))
4620 1.1.1.6 christos return FALSE;
4621 1.1 christos
4622 1.1.1.6 christos i_ehdrp = elf_elfheader (abfd);
4623 1.1 christos i_ehdrp->e_ident[EI_OSABI] = ELFOSABI_OPENVMS;
4624 1.1 christos i_ehdrp->e_ident[EI_ABIVERSION] = 2;
4625 1.1.1.6 christos return TRUE;
4626 1.1 christos }
4627 1.1 christos
4628 1.1 christos static bfd_boolean
4629 1.1 christos elf64_vms_section_processing (bfd *abfd ATTRIBUTE_UNUSED,
4630 1.1 christos Elf_Internal_Shdr *hdr)
4631 1.1 christos {
4632 1.1 christos if (hdr->bfd_section != NULL)
4633 1.1 christos {
4634 1.1.1.6 christos const char *name = bfd_section_name (hdr->bfd_section);
4635 1.1 christos
4636 1.1 christos if (strcmp (name, ".text") == 0)
4637 1.1 christos hdr->sh_flags |= SHF_IA_64_VMS_SHARED;
4638 1.1 christos else if ((strcmp (name, ".debug") == 0)
4639 1.1 christos || (strcmp (name, ".debug_abbrev") == 0)
4640 1.1 christos || (strcmp (name, ".debug_aranges") == 0)
4641 1.1 christos || (strcmp (name, ".debug_frame") == 0)
4642 1.1 christos || (strcmp (name, ".debug_info") == 0)
4643 1.1 christos || (strcmp (name, ".debug_loc") == 0)
4644 1.1 christos || (strcmp (name, ".debug_macinfo") == 0)
4645 1.1 christos || (strcmp (name, ".debug_pubnames") == 0)
4646 1.1 christos || (strcmp (name, ".debug_pubtypes") == 0))
4647 1.1 christos hdr->sh_type = SHT_IA_64_VMS_DEBUG;
4648 1.1 christos else if ((strcmp (name, ".debug_line") == 0)
4649 1.1 christos || (strcmp (name, ".debug_ranges") == 0)
4650 1.1 christos || (strcmp (name, ".trace_info") == 0)
4651 1.1 christos || (strcmp (name, ".trace_abbrev") == 0)
4652 1.1 christos || (strcmp (name, ".trace_aranges") == 0))
4653 1.1 christos hdr->sh_type = SHT_IA_64_VMS_TRACE;
4654 1.1 christos else if (strcmp (name, ".debug_str") == 0)
4655 1.1 christos hdr->sh_type = SHT_IA_64_VMS_DEBUG_STR;
4656 1.1 christos }
4657 1.1 christos
4658 1.1 christos return TRUE;
4659 1.1 christos }
4660 1.1 christos
4661 1.1 christos /* The final processing done just before writing out a VMS IA-64 ELF
4662 1.1 christos object file. */
4663 1.1 christos
4664 1.1.1.6 christos static bfd_boolean
4665 1.1.1.6 christos elf64_vms_final_write_processing (bfd *abfd)
4666 1.1 christos {
4667 1.1 christos Elf_Internal_Shdr *hdr;
4668 1.1 christos asection *s;
4669 1.1 christos int unwind_info_sect_idx = 0;
4670 1.1 christos
4671 1.1 christos for (s = abfd->sections; s; s = s->next)
4672 1.1 christos {
4673 1.1 christos hdr = &elf_section_data (s)->this_hdr;
4674 1.1 christos
4675 1.1.1.6 christos if (strcmp (bfd_section_name (hdr->bfd_section),
4676 1.1 christos ".IA_64.unwind_info") == 0)
4677 1.1 christos unwind_info_sect_idx = elf_section_data (s)->this_idx;
4678 1.1 christos
4679 1.1 christos switch (hdr->sh_type)
4680 1.1 christos {
4681 1.1 christos case SHT_IA_64_UNWIND:
4682 1.1 christos /* VMS requires sh_info to point to the unwind info section. */
4683 1.1.1.4 christos hdr->sh_info = unwind_info_sect_idx;
4684 1.1 christos break;
4685 1.1 christos }
4686 1.1 christos }
4687 1.1 christos
4688 1.1 christos if (! elf_flags_init (abfd))
4689 1.1 christos {
4690 1.1 christos unsigned long flags = 0;
4691 1.1 christos
4692 1.1 christos if (abfd->xvec->byteorder == BFD_ENDIAN_BIG)
4693 1.1 christos flags |= EF_IA_64_BE;
4694 1.1 christos if (bfd_get_mach (abfd) == bfd_mach_ia64_elf64)
4695 1.1 christos flags |= EF_IA_64_ABI64;
4696 1.1 christos
4697 1.1 christos elf_elfheader (abfd)->e_flags = flags;
4698 1.1 christos elf_flags_init (abfd) = TRUE;
4699 1.1 christos }
4700 1.1.1.6 christos return _bfd_elf_final_write_processing (abfd);
4701 1.1 christos }
4702 1.1 christos
4703 1.1 christos static bfd_boolean
4704 1.1 christos elf64_vms_write_shdrs_and_ehdr (bfd *abfd)
4705 1.1 christos {
4706 1.1 christos unsigned char needed_count[8];
4707 1.1 christos
4708 1.1 christos if (!bfd_elf64_write_shdrs_and_ehdr (abfd))
4709 1.1 christos return FALSE;
4710 1.1 christos
4711 1.1 christos bfd_putl64 (elf_ia64_vms_tdata (abfd)->needed_count, needed_count);
4712 1.1 christos
4713 1.1 christos if (bfd_seek (abfd, sizeof (Elf64_External_Ehdr), SEEK_SET) != 0
4714 1.1 christos || bfd_bwrite (needed_count, 8, abfd) != 8)
4715 1.1 christos return FALSE;
4716 1.1 christos
4717 1.1 christos return TRUE;
4718 1.1 christos }
4719 1.1 christos
4720 1.1 christos static bfd_boolean
4721 1.1 christos elf64_vms_close_and_cleanup (bfd *abfd)
4722 1.1 christos {
4723 1.1 christos if (bfd_get_format (abfd) == bfd_object)
4724 1.1 christos {
4725 1.1 christos long isize;
4726 1.1 christos
4727 1.1 christos /* Pad to 8 byte boundary for IPF/VMS. */
4728 1.1 christos isize = bfd_get_size (abfd);
4729 1.1 christos if ((isize & 7) != 0)
4730 1.1 christos {
4731 1.1 christos int ishort = 8 - (isize & 7);
4732 1.1.1.4 christos bfd_uint64_t pad = 0;
4733 1.1 christos
4734 1.1 christos bfd_seek (abfd, isize, SEEK_SET);
4735 1.1 christos bfd_bwrite (&pad, ishort, abfd);
4736 1.1 christos }
4737 1.1 christos }
4738 1.1 christos
4739 1.1 christos return _bfd_elf_close_and_cleanup (abfd);
4740 1.1 christos }
4741 1.1 christos
4742 1.1 christos /* Add symbols from an ELF object file to the linker hash table. */
4743 1.1 christos
4744 1.1 christos static bfd_boolean
4745 1.1 christos elf64_vms_link_add_object_symbols (bfd *abfd, struct bfd_link_info *info)
4746 1.1 christos {
4747 1.1 christos Elf_Internal_Shdr *hdr;
4748 1.1 christos bfd_size_type symcount;
4749 1.1 christos bfd_size_type extsymcount;
4750 1.1 christos bfd_size_type extsymoff;
4751 1.1 christos struct elf_link_hash_entry **sym_hash;
4752 1.1 christos bfd_boolean dynamic;
4753 1.1 christos Elf_Internal_Sym *isymbuf = NULL;
4754 1.1 christos Elf_Internal_Sym *isym;
4755 1.1 christos Elf_Internal_Sym *isymend;
4756 1.1 christos const struct elf_backend_data *bed;
4757 1.1 christos struct elf_link_hash_table *htab;
4758 1.1 christos bfd_size_type amt;
4759 1.1 christos
4760 1.1 christos htab = elf_hash_table (info);
4761 1.1 christos bed = get_elf_backend_data (abfd);
4762 1.1 christos
4763 1.1 christos if ((abfd->flags & DYNAMIC) == 0)
4764 1.1 christos dynamic = FALSE;
4765 1.1 christos else
4766 1.1 christos {
4767 1.1 christos dynamic = TRUE;
4768 1.1 christos
4769 1.1 christos /* You can't use -r against a dynamic object. Also, there's no
4770 1.1 christos hope of using a dynamic object which does not exactly match
4771 1.1 christos the format of the output file. */
4772 1.1.1.2 christos if (bfd_link_relocatable (info)
4773 1.1 christos || !is_elf_hash_table (htab)
4774 1.1 christos || info->output_bfd->xvec != abfd->xvec)
4775 1.1 christos {
4776 1.1.1.2 christos if (bfd_link_relocatable (info))
4777 1.1 christos bfd_set_error (bfd_error_invalid_operation);
4778 1.1 christos else
4779 1.1 christos bfd_set_error (bfd_error_wrong_format);
4780 1.1 christos goto error_return;
4781 1.1 christos }
4782 1.1 christos }
4783 1.1 christos
4784 1.1 christos if (! dynamic)
4785 1.1 christos {
4786 1.1 christos /* If we are creating a shared library, create all the dynamic
4787 1.1 christos sections immediately. We need to attach them to something,
4788 1.1 christos so we attach them to this BFD, provided it is the right
4789 1.1 christos format. FIXME: If there are no input BFD's of the same
4790 1.1 christos format as the output, we can't make a shared library. */
4791 1.1.1.2 christos if (bfd_link_pic (info)
4792 1.1 christos && is_elf_hash_table (htab)
4793 1.1 christos && info->output_bfd->xvec == abfd->xvec
4794 1.1 christos && !htab->dynamic_sections_created)
4795 1.1 christos {
4796 1.1 christos if (! elf64_ia64_create_dynamic_sections (abfd, info))
4797 1.1 christos goto error_return;
4798 1.1 christos }
4799 1.1 christos }
4800 1.1 christos else if (!is_elf_hash_table (htab))
4801 1.1 christos goto error_return;
4802 1.1 christos else
4803 1.1 christos {
4804 1.1 christos asection *s;
4805 1.1 christos bfd_byte *dynbuf;
4806 1.1 christos bfd_byte *extdyn;
4807 1.1 christos
4808 1.1 christos /* ld --just-symbols and dynamic objects don't mix very well.
4809 1.1 christos ld shouldn't allow it. */
4810 1.1 christos if ((s = abfd->sections) != NULL
4811 1.1 christos && s->sec_info_type == SEC_INFO_TYPE_JUST_SYMS)
4812 1.1 christos abort ();
4813 1.1 christos
4814 1.1 christos /* Be sure there are dynamic sections. */
4815 1.1 christos if (! elf64_ia64_create_dynamic_sections (htab->dynobj, info))
4816 1.1.1.4 christos goto error_return;
4817 1.1 christos
4818 1.1 christos s = bfd_get_section_by_name (abfd, ".dynamic");
4819 1.1 christos if (s == NULL)
4820 1.1.1.4 christos {
4821 1.1.1.4 christos /* VMS libraries do not have dynamic sections. Create one from
4822 1.1.1.4 christos the segment. */
4823 1.1.1.4 christos Elf_Internal_Phdr *phdr;
4824 1.1.1.4 christos unsigned int i, phnum;
4825 1.1.1.4 christos
4826 1.1.1.4 christos phdr = elf_tdata (abfd)->phdr;
4827 1.1.1.4 christos if (phdr == NULL)
4828 1.1.1.4 christos goto error_return;
4829 1.1.1.4 christos phnum = elf_elfheader (abfd)->e_phnum;
4830 1.1.1.4 christos for (i = 0; i < phnum; phdr++)
4831 1.1.1.4 christos if (phdr->p_type == PT_DYNAMIC)
4832 1.1.1.4 christos {
4833 1.1.1.4 christos s = bfd_make_section (abfd, ".dynamic");
4834 1.1.1.4 christos if (s == NULL)
4835 1.1.1.4 christos goto error_return;
4836 1.1.1.4 christos s->vma = phdr->p_vaddr;
4837 1.1.1.4 christos s->lma = phdr->p_paddr;
4838 1.1.1.4 christos s->size = phdr->p_filesz;
4839 1.1.1.4 christos s->filepos = phdr->p_offset;
4840 1.1.1.4 christos s->flags |= SEC_HAS_CONTENTS;
4841 1.1.1.4 christos s->alignment_power = bfd_log2 (phdr->p_align);
4842 1.1.1.4 christos break;
4843 1.1.1.4 christos }
4844 1.1.1.4 christos if (s == NULL)
4845 1.1.1.4 christos goto error_return;
4846 1.1.1.4 christos }
4847 1.1 christos
4848 1.1 christos /* Extract IDENT. */
4849 1.1 christos if (!bfd_malloc_and_get_section (abfd, s, &dynbuf))
4850 1.1.1.4 christos {
4851 1.1 christos error_free_dyn:
4852 1.1.1.4 christos free (dynbuf);
4853 1.1.1.4 christos goto error_return;
4854 1.1.1.4 christos }
4855 1.1 christos
4856 1.1 christos for (extdyn = dynbuf;
4857 1.1.1.4 christos extdyn < dynbuf + s->size;
4858 1.1.1.4 christos extdyn += bed->s->sizeof_dyn)
4859 1.1.1.4 christos {
4860 1.1.1.4 christos Elf_Internal_Dyn dyn;
4861 1.1.1.4 christos
4862 1.1.1.4 christos bed->s->swap_dyn_in (abfd, extdyn, &dyn);
4863 1.1.1.4 christos if (dyn.d_tag == DT_IA_64_VMS_IDENT)
4864 1.1.1.4 christos {
4865 1.1.1.4 christos bfd_uint64_t tagv = dyn.d_un.d_val;
4866 1.1.1.4 christos elf_ia64_vms_ident (abfd) = tagv;
4867 1.1.1.4 christos break;
4868 1.1.1.4 christos }
4869 1.1.1.4 christos }
4870 1.1 christos if (extdyn >= dynbuf + s->size)
4871 1.1.1.4 christos {
4872 1.1.1.4 christos /* Ident not found. */
4873 1.1.1.4 christos goto error_free_dyn;
4874 1.1.1.4 christos }
4875 1.1 christos free (dynbuf);
4876 1.1 christos
4877 1.1 christos /* We do not want to include any of the sections in a dynamic
4878 1.1 christos object in the output file. We hack by simply clobbering the
4879 1.1 christos list of sections in the BFD. This could be handled more
4880 1.1 christos cleanly by, say, a new section flag; the existing
4881 1.1 christos SEC_NEVER_LOAD flag is not the one we want, because that one
4882 1.1 christos still implies that the section takes up space in the output
4883 1.1 christos file. */
4884 1.1 christos bfd_section_list_clear (abfd);
4885 1.1 christos
4886 1.1 christos /* FIXME: should we detect if this library is already included ?
4887 1.1.1.4 christos This should be harmless and shouldn't happen in practice. */
4888 1.1 christos }
4889 1.1 christos
4890 1.1 christos hdr = &elf_tdata (abfd)->symtab_hdr;
4891 1.1 christos symcount = hdr->sh_size / bed->s->sizeof_sym;
4892 1.1 christos
4893 1.1 christos /* The sh_info field of the symtab header tells us where the
4894 1.1 christos external symbols start. We don't care about the local symbols at
4895 1.1 christos this point. */
4896 1.1 christos extsymcount = symcount - hdr->sh_info;
4897 1.1 christos extsymoff = hdr->sh_info;
4898 1.1 christos
4899 1.1 christos sym_hash = NULL;
4900 1.1 christos if (extsymcount != 0)
4901 1.1 christos {
4902 1.1 christos isymbuf = bfd_elf_get_elf_syms (abfd, hdr, extsymcount, extsymoff,
4903 1.1 christos NULL, NULL, NULL);
4904 1.1 christos if (isymbuf == NULL)
4905 1.1 christos goto error_return;
4906 1.1 christos
4907 1.1 christos /* We store a pointer to the hash table entry for each external
4908 1.1 christos symbol. */
4909 1.1 christos amt = extsymcount * sizeof (struct elf_link_hash_entry *);
4910 1.1 christos sym_hash = (struct elf_link_hash_entry **) bfd_alloc (abfd, amt);
4911 1.1 christos if (sym_hash == NULL)
4912 1.1 christos goto error_free_sym;
4913 1.1 christos elf_sym_hashes (abfd) = sym_hash;
4914 1.1 christos }
4915 1.1 christos
4916 1.1 christos for (isym = isymbuf, isymend = isymbuf + extsymcount;
4917 1.1 christos isym < isymend;
4918 1.1 christos isym++, sym_hash++)
4919 1.1 christos {
4920 1.1 christos int bind;
4921 1.1 christos bfd_vma value;
4922 1.1 christos asection *sec, *new_sec;
4923 1.1 christos flagword flags;
4924 1.1 christos const char *name;
4925 1.1 christos struct elf_link_hash_entry *h;
4926 1.1 christos bfd_boolean definition;
4927 1.1 christos bfd_boolean size_change_ok;
4928 1.1 christos bfd_boolean type_change_ok;
4929 1.1 christos bfd_boolean common;
4930 1.1 christos unsigned int old_alignment;
4931 1.1 christos bfd *old_bfd;
4932 1.1 christos
4933 1.1 christos flags = BSF_NO_FLAGS;
4934 1.1 christos sec = NULL;
4935 1.1 christos value = isym->st_value;
4936 1.1 christos *sym_hash = NULL;
4937 1.1 christos common = bed->common_definition (isym);
4938 1.1 christos
4939 1.1 christos bind = ELF_ST_BIND (isym->st_info);
4940 1.1 christos switch (bind)
4941 1.1 christos {
4942 1.1 christos case STB_LOCAL:
4943 1.1 christos /* This should be impossible, since ELF requires that all
4944 1.1 christos global symbols follow all local symbols, and that sh_info
4945 1.1 christos point to the first global symbol. Unfortunately, Irix 5
4946 1.1 christos screws this up. */
4947 1.1 christos continue;
4948 1.1 christos
4949 1.1 christos case STB_GLOBAL:
4950 1.1 christos if (isym->st_shndx != SHN_UNDEF && !common)
4951 1.1 christos flags = BSF_GLOBAL;
4952 1.1 christos break;
4953 1.1 christos
4954 1.1 christos case STB_WEAK:
4955 1.1 christos flags = BSF_WEAK;
4956 1.1 christos break;
4957 1.1 christos
4958 1.1 christos case STB_GNU_UNIQUE:
4959 1.1 christos flags = BSF_GNU_UNIQUE;
4960 1.1 christos break;
4961 1.1 christos
4962 1.1 christos default:
4963 1.1 christos /* Leave it up to the processor backend. */
4964 1.1 christos break;
4965 1.1 christos }
4966 1.1 christos
4967 1.1 christos if (isym->st_shndx == SHN_UNDEF)
4968 1.1 christos sec = bfd_und_section_ptr;
4969 1.1 christos else if (isym->st_shndx == SHN_ABS)
4970 1.1 christos sec = bfd_abs_section_ptr;
4971 1.1 christos else if (isym->st_shndx == SHN_COMMON)
4972 1.1 christos {
4973 1.1 christos sec = bfd_com_section_ptr;
4974 1.1 christos /* What ELF calls the size we call the value. What ELF
4975 1.1 christos calls the value we call the alignment. */
4976 1.1 christos value = isym->st_size;
4977 1.1 christos }
4978 1.1 christos else
4979 1.1 christos {
4980 1.1 christos sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
4981 1.1 christos if (sec == NULL)
4982 1.1 christos sec = bfd_abs_section_ptr;
4983 1.1 christos else if (sec->kept_section)
4984 1.1 christos {
4985 1.1 christos /* Symbols from discarded section are undefined. We keep
4986 1.1 christos its visibility. */
4987 1.1 christos sec = bfd_und_section_ptr;
4988 1.1 christos isym->st_shndx = SHN_UNDEF;
4989 1.1 christos }
4990 1.1 christos else if ((abfd->flags & (EXEC_P | DYNAMIC)) != 0)
4991 1.1 christos value -= sec->vma;
4992 1.1 christos }
4993 1.1 christos
4994 1.1 christos name = bfd_elf_string_from_elf_section (abfd, hdr->sh_link,
4995 1.1 christos isym->st_name);
4996 1.1 christos if (name == NULL)
4997 1.1 christos goto error_free_vers;
4998 1.1 christos
4999 1.1 christos if (bed->elf_add_symbol_hook)
5000 1.1 christos {
5001 1.1 christos if (! (*bed->elf_add_symbol_hook) (abfd, info, isym, &name, &flags,
5002 1.1 christos &sec, &value))
5003 1.1 christos goto error_free_vers;
5004 1.1 christos
5005 1.1 christos /* The hook function sets the name to NULL if this symbol
5006 1.1 christos should be skipped for some reason. */
5007 1.1 christos if (name == NULL)
5008 1.1 christos continue;
5009 1.1 christos }
5010 1.1 christos
5011 1.1 christos /* Sanity check that all possibilities were handled. */
5012 1.1 christos if (sec == NULL)
5013 1.1 christos {
5014 1.1 christos bfd_set_error (bfd_error_bad_value);
5015 1.1 christos goto error_free_vers;
5016 1.1 christos }
5017 1.1 christos
5018 1.1 christos if (bfd_is_und_section (sec)
5019 1.1 christos || bfd_is_com_section (sec))
5020 1.1 christos definition = FALSE;
5021 1.1 christos else
5022 1.1 christos definition = TRUE;
5023 1.1 christos
5024 1.1 christos size_change_ok = FALSE;
5025 1.1 christos type_change_ok = bed->type_change_ok;
5026 1.1 christos old_alignment = 0;
5027 1.1 christos old_bfd = NULL;
5028 1.1 christos new_sec = sec;
5029 1.1 christos
5030 1.1 christos if (! bfd_is_und_section (sec))
5031 1.1.1.4 christos h = elf_link_hash_lookup (htab, name, TRUE, FALSE, FALSE);
5032 1.1 christos else
5033 1.1.1.4 christos h = ((struct elf_link_hash_entry *) bfd_wrapped_link_hash_lookup
5034 1.1.1.4 christos (abfd, info, name, TRUE, FALSE, FALSE));
5035 1.1 christos if (h == NULL)
5036 1.1.1.4 christos goto error_free_sym;
5037 1.1 christos
5038 1.1 christos *sym_hash = h;
5039 1.1 christos
5040 1.1 christos if (is_elf_hash_table (htab))
5041 1.1 christos {
5042 1.1 christos while (h->root.type == bfd_link_hash_indirect
5043 1.1 christos || h->root.type == bfd_link_hash_warning)
5044 1.1 christos h = (struct elf_link_hash_entry *) h->root.u.i.link;
5045 1.1 christos
5046 1.1 christos /* Remember the old alignment if this is a common symbol, so
5047 1.1 christos that we don't reduce the alignment later on. We can't
5048 1.1 christos check later, because _bfd_generic_link_add_one_symbol
5049 1.1 christos will set a default for the alignment which we want to
5050 1.1 christos override. We also remember the old bfd where the existing
5051 1.1 christos definition comes from. */
5052 1.1 christos switch (h->root.type)
5053 1.1 christos {
5054 1.1 christos default:
5055 1.1 christos break;
5056 1.1 christos
5057 1.1 christos case bfd_link_hash_defined:
5058 1.1.1.4 christos if (abfd->selective_search)
5059 1.1.1.4 christos continue;
5060 1.1.1.4 christos /* Fall-through. */
5061 1.1 christos case bfd_link_hash_defweak:
5062 1.1 christos old_bfd = h->root.u.def.section->owner;
5063 1.1 christos break;
5064 1.1 christos
5065 1.1 christos case bfd_link_hash_common:
5066 1.1 christos old_bfd = h->root.u.c.p->section->owner;
5067 1.1 christos old_alignment = h->root.u.c.p->alignment_power;
5068 1.1 christos break;
5069 1.1 christos }
5070 1.1 christos }
5071 1.1 christos
5072 1.1 christos if (! (_bfd_generic_link_add_one_symbol
5073 1.1 christos (info, abfd, name, flags, sec, value, NULL, FALSE, bed->collect,
5074 1.1 christos (struct bfd_link_hash_entry **) sym_hash)))
5075 1.1 christos goto error_free_vers;
5076 1.1 christos
5077 1.1 christos h = *sym_hash;
5078 1.1 christos while (h->root.type == bfd_link_hash_indirect
5079 1.1 christos || h->root.type == bfd_link_hash_warning)
5080 1.1 christos h = (struct elf_link_hash_entry *) h->root.u.i.link;
5081 1.1 christos
5082 1.1 christos *sym_hash = h;
5083 1.1.1.2 christos if (definition)
5084 1.1.1.2 christos h->unique_global = (flags & BSF_GNU_UNIQUE) != 0;
5085 1.1 christos
5086 1.1 christos /* Set the alignment of a common symbol. */
5087 1.1 christos if ((common || bfd_is_com_section (sec))
5088 1.1 christos && h->root.type == bfd_link_hash_common)
5089 1.1 christos {
5090 1.1 christos unsigned int align;
5091 1.1 christos
5092 1.1 christos if (common)
5093 1.1 christos align = bfd_log2 (isym->st_value);
5094 1.1 christos else
5095 1.1 christos {
5096 1.1 christos /* The new symbol is a common symbol in a shared object.
5097 1.1 christos We need to get the alignment from the section. */
5098 1.1 christos align = new_sec->alignment_power;
5099 1.1 christos }
5100 1.1 christos if (align > old_alignment
5101 1.1 christos /* Permit an alignment power of zero if an alignment of one
5102 1.1 christos is specified and no other alignments have been specified. */
5103 1.1 christos || (isym->st_value == 1 && old_alignment == 0))
5104 1.1 christos h->root.u.c.p->alignment_power = align;
5105 1.1 christos else
5106 1.1 christos h->root.u.c.p->alignment_power = old_alignment;
5107 1.1 christos }
5108 1.1 christos
5109 1.1 christos if (is_elf_hash_table (htab))
5110 1.1 christos {
5111 1.1 christos /* Check the alignment when a common symbol is involved. This
5112 1.1 christos can change when a common symbol is overridden by a normal
5113 1.1 christos definition or a common symbol is ignored due to the old
5114 1.1 christos normal definition. We need to make sure the maximum
5115 1.1 christos alignment is maintained. */
5116 1.1 christos if ((old_alignment || common)
5117 1.1 christos && h->root.type != bfd_link_hash_common)
5118 1.1 christos {
5119 1.1 christos unsigned int common_align;
5120 1.1 christos unsigned int normal_align;
5121 1.1 christos unsigned int symbol_align;
5122 1.1 christos bfd *normal_bfd;
5123 1.1 christos bfd *common_bfd;
5124 1.1 christos
5125 1.1 christos symbol_align = ffs (h->root.u.def.value) - 1;
5126 1.1 christos if (h->root.u.def.section->owner != NULL
5127 1.1 christos && (h->root.u.def.section->owner->flags & DYNAMIC) == 0)
5128 1.1 christos {
5129 1.1 christos normal_align = h->root.u.def.section->alignment_power;
5130 1.1 christos if (normal_align > symbol_align)
5131 1.1 christos normal_align = symbol_align;
5132 1.1 christos }
5133 1.1 christos else
5134 1.1 christos normal_align = symbol_align;
5135 1.1 christos
5136 1.1 christos if (old_alignment)
5137 1.1 christos {
5138 1.1 christos common_align = old_alignment;
5139 1.1 christos common_bfd = old_bfd;
5140 1.1 christos normal_bfd = abfd;
5141 1.1 christos }
5142 1.1 christos else
5143 1.1 christos {
5144 1.1 christos common_align = bfd_log2 (isym->st_value);
5145 1.1 christos common_bfd = abfd;
5146 1.1 christos normal_bfd = old_bfd;
5147 1.1 christos }
5148 1.1 christos
5149 1.1 christos if (normal_align < common_align)
5150 1.1 christos {
5151 1.1 christos /* PR binutils/2735 */
5152 1.1 christos if (normal_bfd == NULL)
5153 1.1.1.4 christos _bfd_error_handler
5154 1.1.1.4 christos /* xgettext:c-format */
5155 1.1.1.5 christos (_("warning: alignment %u of common symbol `%s' in %pB"
5156 1.1.1.5 christos " is greater than the alignment (%u) of its section %pA"),
5157 1.1.1.4 christos 1 << common_align, name, common_bfd,
5158 1.1.1.4 christos 1 << normal_align, h->root.u.def.section);
5159 1.1 christos else
5160 1.1.1.4 christos _bfd_error_handler
5161 1.1.1.4 christos /* xgettext:c-format */
5162 1.1.1.5 christos (_("warning: alignment %u of symbol `%s' in %pB"
5163 1.1.1.5 christos " is smaller than %u in %pB"),
5164 1.1.1.4 christos 1 << normal_align, name, normal_bfd,
5165 1.1.1.4 christos 1 << common_align, common_bfd);
5166 1.1 christos }
5167 1.1 christos }
5168 1.1 christos
5169 1.1 christos /* Remember the symbol size if it isn't undefined. */
5170 1.1 christos if ((isym->st_size != 0 && isym->st_shndx != SHN_UNDEF)
5171 1.1 christos && (definition || h->size == 0))
5172 1.1 christos {
5173 1.1 christos if (h->size != 0
5174 1.1 christos && h->size != isym->st_size
5175 1.1 christos && ! size_change_ok)
5176 1.1.1.4 christos _bfd_error_handler
5177 1.1.1.4 christos /* xgettext:c-format */
5178 1.1.1.5 christos (_("warning: size of symbol `%s' changed"
5179 1.1.1.5 christos " from %" PRIu64 " in %pB to %" PRIu64 " in %pB"),
5180 1.1.1.5 christos name, (uint64_t) h->size, old_bfd,
5181 1.1.1.5 christos (uint64_t) isym->st_size, abfd);
5182 1.1 christos
5183 1.1 christos h->size = isym->st_size;
5184 1.1 christos }
5185 1.1 christos
5186 1.1 christos /* If this is a common symbol, then we always want H->SIZE
5187 1.1 christos to be the size of the common symbol. The code just above
5188 1.1 christos won't fix the size if a common symbol becomes larger. We
5189 1.1 christos don't warn about a size change here, because that is
5190 1.1 christos covered by --warn-common. Allow changed between different
5191 1.1 christos function types. */
5192 1.1 christos if (h->root.type == bfd_link_hash_common)
5193 1.1 christos h->size = h->root.u.c.size;
5194 1.1 christos
5195 1.1 christos if (ELF_ST_TYPE (isym->st_info) != STT_NOTYPE
5196 1.1 christos && (definition || h->type == STT_NOTYPE))
5197 1.1 christos {
5198 1.1 christos unsigned int type = ELF_ST_TYPE (isym->st_info);
5199 1.1 christos
5200 1.1 christos if (h->type != type)
5201 1.1 christos {
5202 1.1 christos if (h->type != STT_NOTYPE && ! type_change_ok)
5203 1.1.1.4 christos _bfd_error_handler
5204 1.1.1.4 christos /* xgettext:c-format */
5205 1.1.1.5 christos (_("warning: type of symbol `%s' changed"
5206 1.1.1.5 christos " from %d to %d in %pB"),
5207 1.1.1.4 christos name, h->type, type, abfd);
5208 1.1 christos
5209 1.1 christos h->type = type;
5210 1.1 christos }
5211 1.1 christos }
5212 1.1 christos
5213 1.1 christos /* Set a flag in the hash table entry indicating the type of
5214 1.1 christos reference or definition we just found. Keep a count of
5215 1.1 christos the number of dynamic symbols we find. A dynamic symbol
5216 1.1 christos is one which is referenced or defined by both a regular
5217 1.1 christos object and a shared object. */
5218 1.1 christos if (! dynamic)
5219 1.1 christos {
5220 1.1 christos if (! definition)
5221 1.1 christos {
5222 1.1 christos h->ref_regular = 1;
5223 1.1 christos if (bind != STB_WEAK)
5224 1.1 christos h->ref_regular_nonweak = 1;
5225 1.1 christos }
5226 1.1 christos else
5227 1.1 christos {
5228 1.1.1.4 christos BFD_ASSERT (!h->def_dynamic);
5229 1.1 christos h->def_regular = 1;
5230 1.1 christos }
5231 1.1 christos }
5232 1.1 christos else
5233 1.1 christos {
5234 1.1 christos BFD_ASSERT (definition);
5235 1.1.1.4 christos h->def_dynamic = 1;
5236 1.1.1.4 christos h->dynindx = -2;
5237 1.1.1.4 christos ((struct elf64_ia64_link_hash_entry *)h)->shl = abfd;
5238 1.1 christos }
5239 1.1 christos }
5240 1.1 christos }
5241 1.1 christos
5242 1.1 christos if (isymbuf != NULL)
5243 1.1 christos {
5244 1.1 christos free (isymbuf);
5245 1.1 christos isymbuf = NULL;
5246 1.1 christos }
5247 1.1 christos
5248 1.1 christos /* If this object is the same format as the output object, and it is
5249 1.1 christos not a shared library, then let the backend look through the
5250 1.1 christos relocs.
5251 1.1 christos
5252 1.1 christos This is required to build global offset table entries and to
5253 1.1 christos arrange for dynamic relocs. It is not required for the
5254 1.1 christos particular common case of linking non PIC code, even when linking
5255 1.1 christos against shared libraries, but unfortunately there is no way of
5256 1.1 christos knowing whether an object file has been compiled PIC or not.
5257 1.1 christos Looking through the relocs is not particularly time consuming.
5258 1.1 christos The problem is that we must either (1) keep the relocs in memory,
5259 1.1 christos which causes the linker to require additional runtime memory or
5260 1.1 christos (2) read the relocs twice from the input file, which wastes time.
5261 1.1 christos This would be a good case for using mmap.
5262 1.1 christos
5263 1.1 christos I have no idea how to handle linking PIC code into a file of a
5264 1.1 christos different format. It probably can't be done. */
5265 1.1 christos if (! dynamic
5266 1.1 christos && is_elf_hash_table (htab)
5267 1.1 christos && bed->check_relocs != NULL
5268 1.1 christos && (*bed->relocs_compatible) (abfd->xvec, info->output_bfd->xvec))
5269 1.1 christos {
5270 1.1 christos asection *o;
5271 1.1 christos
5272 1.1 christos for (o = abfd->sections; o != NULL; o = o->next)
5273 1.1 christos {
5274 1.1 christos Elf_Internal_Rela *internal_relocs;
5275 1.1 christos bfd_boolean ok;
5276 1.1 christos
5277 1.1 christos if ((o->flags & SEC_RELOC) == 0
5278 1.1 christos || o->reloc_count == 0
5279 1.1 christos || ((info->strip == strip_all || info->strip == strip_debugger)
5280 1.1 christos && (o->flags & SEC_DEBUGGING) != 0)
5281 1.1 christos || bfd_is_abs_section (o->output_section))
5282 1.1 christos continue;
5283 1.1 christos
5284 1.1 christos internal_relocs = _bfd_elf_link_read_relocs (abfd, o, NULL, NULL,
5285 1.1 christos info->keep_memory);
5286 1.1 christos if (internal_relocs == NULL)
5287 1.1 christos goto error_return;
5288 1.1 christos
5289 1.1 christos ok = (*bed->check_relocs) (abfd, info, o, internal_relocs);
5290 1.1 christos
5291 1.1 christos if (elf_section_data (o)->relocs != internal_relocs)
5292 1.1 christos free (internal_relocs);
5293 1.1 christos
5294 1.1 christos if (! ok)
5295 1.1 christos goto error_return;
5296 1.1 christos }
5297 1.1 christos }
5298 1.1 christos
5299 1.1 christos return TRUE;
5300 1.1 christos
5301 1.1 christos error_free_vers:
5302 1.1 christos error_free_sym:
5303 1.1 christos if (isymbuf != NULL)
5304 1.1 christos free (isymbuf);
5305 1.1 christos error_return:
5306 1.1 christos return FALSE;
5307 1.1 christos }
5308 1.1 christos
5309 1.1 christos static bfd_boolean
5310 1.1 christos elf64_vms_link_add_archive_symbols (bfd *abfd, struct bfd_link_info *info)
5311 1.1 christos {
5312 1.1 christos int pass;
5313 1.1 christos struct bfd_link_hash_entry **pundef;
5314 1.1 christos struct bfd_link_hash_entry **next_pundef;
5315 1.1 christos
5316 1.1 christos /* We only accept VMS libraries. */
5317 1.1 christos if (info->output_bfd->xvec != abfd->xvec)
5318 1.1 christos {
5319 1.1 christos bfd_set_error (bfd_error_wrong_format);
5320 1.1 christos return FALSE;
5321 1.1 christos }
5322 1.1 christos
5323 1.1 christos /* The archive_pass field in the archive itself is used to
5324 1.1 christos initialize PASS, since we may search the same archive multiple
5325 1.1 christos times. */
5326 1.1 christos pass = ++abfd->archive_pass;
5327 1.1 christos
5328 1.1 christos /* Look through the list of undefined symbols. */
5329 1.1 christos for (pundef = &info->hash->undefs; *pundef != NULL; pundef = next_pundef)
5330 1.1 christos {
5331 1.1 christos struct bfd_link_hash_entry *h;
5332 1.1 christos symindex symidx;
5333 1.1 christos bfd *element;
5334 1.1 christos bfd *orig_element;
5335 1.1 christos
5336 1.1 christos h = *pundef;
5337 1.1 christos next_pundef = &(*pundef)->u.undef.next;
5338 1.1 christos
5339 1.1 christos /* When a symbol is defined, it is not necessarily removed from
5340 1.1 christos the list. */
5341 1.1 christos if (h->type != bfd_link_hash_undefined
5342 1.1 christos && h->type != bfd_link_hash_common)
5343 1.1 christos {
5344 1.1 christos /* Remove this entry from the list, for general cleanliness
5345 1.1 christos and because we are going to look through the list again
5346 1.1 christos if we search any more libraries. We can't remove the
5347 1.1 christos entry if it is the tail, because that would lose any
5348 1.1 christos entries we add to the list later on. */
5349 1.1 christos if (*pundef != info->hash->undefs_tail)
5350 1.1.1.4 christos {
5351 1.1.1.4 christos *pundef = *next_pundef;
5352 1.1.1.4 christos next_pundef = pundef;
5353 1.1.1.4 christos }
5354 1.1 christos continue;
5355 1.1 christos }
5356 1.1 christos
5357 1.1 christos /* Look for this symbol in the archive hash table. */
5358 1.1 christos symidx = _bfd_vms_lib_find_symbol (abfd, h->root.string);
5359 1.1 christos if (symidx == BFD_NO_MORE_SYMBOLS)
5360 1.1 christos {
5361 1.1 christos /* Nothing in this slot. */
5362 1.1 christos continue;
5363 1.1 christos }
5364 1.1 christos
5365 1.1 christos element = bfd_get_elt_at_index (abfd, symidx);
5366 1.1 christos if (element == NULL)
5367 1.1 christos return FALSE;
5368 1.1 christos
5369 1.1 christos if (element->archive_pass == -1 || element->archive_pass == pass)
5370 1.1.1.4 christos {
5371 1.1.1.4 christos /* Next symbol if this archive is wrong or already handled. */
5372 1.1.1.4 christos continue;
5373 1.1.1.4 christos }
5374 1.1 christos
5375 1.1 christos orig_element = element;
5376 1.1 christos if (bfd_is_thin_archive (abfd))
5377 1.1.1.4 christos {
5378 1.1.1.4 christos element = _bfd_vms_lib_get_imagelib_file (element);
5379 1.1.1.4 christos if (element == NULL || !bfd_check_format (element, bfd_object))
5380 1.1.1.4 christos {
5381 1.1.1.4 christos orig_element->archive_pass = -1;
5382 1.1.1.4 christos return FALSE;
5383 1.1.1.4 christos }
5384 1.1.1.4 christos }
5385 1.1 christos else if (! bfd_check_format (element, bfd_object))
5386 1.1.1.4 christos {
5387 1.1.1.4 christos element->archive_pass = -1;
5388 1.1.1.4 christos return FALSE;
5389 1.1.1.4 christos }
5390 1.1 christos
5391 1.1 christos /* Unlike the generic linker, we know that this element provides
5392 1.1 christos a definition for an undefined symbol and we know that we want
5393 1.1 christos to include it. We don't need to check anything. */
5394 1.1 christos if (! (*info->callbacks->add_archive_element) (info, element,
5395 1.1.1.4 christos h->root.string, &element))
5396 1.1.1.3 christos continue;
5397 1.1 christos if (! elf64_vms_link_add_object_symbols (element, info))
5398 1.1 christos return FALSE;
5399 1.1 christos
5400 1.1 christos orig_element->archive_pass = pass;
5401 1.1 christos }
5402 1.1 christos
5403 1.1 christos return TRUE;
5404 1.1 christos }
5405 1.1 christos
5406 1.1 christos static bfd_boolean
5407 1.1 christos elf64_vms_bfd_link_add_symbols (bfd *abfd, struct bfd_link_info *info)
5408 1.1 christos {
5409 1.1 christos switch (bfd_get_format (abfd))
5410 1.1 christos {
5411 1.1 christos case bfd_object:
5412 1.1 christos return elf64_vms_link_add_object_symbols (abfd, info);
5413 1.1 christos break;
5414 1.1 christos case bfd_archive:
5415 1.1 christos return elf64_vms_link_add_archive_symbols (abfd, info);
5416 1.1 christos break;
5417 1.1 christos default:
5418 1.1 christos bfd_set_error (bfd_error_wrong_format);
5419 1.1 christos return FALSE;
5420 1.1 christos }
5421 1.1 christos }
5422 1.1 christos
5423 1.1 christos static bfd_boolean
5424 1.1 christos elf64_ia64_vms_mkobject (bfd *abfd)
5425 1.1 christos {
5426 1.1 christos return bfd_elf_allocate_object
5427 1.1 christos (abfd, sizeof (struct elf64_ia64_vms_obj_tdata), IA64_ELF_DATA);
5428 1.1 christos }
5429 1.1 christos
5430 1.1 christos
5431 1.1 christos /* Size-dependent data and functions. */
5432 1.1 christos static const struct elf_size_info elf64_ia64_vms_size_info = {
5433 1.1 christos sizeof (Elf64_External_VMS_Ehdr),
5434 1.1 christos sizeof (Elf64_External_Phdr),
5435 1.1 christos sizeof (Elf64_External_Shdr),
5436 1.1 christos sizeof (Elf64_External_Rel),
5437 1.1 christos sizeof (Elf64_External_Rela),
5438 1.1 christos sizeof (Elf64_External_Sym),
5439 1.1 christos sizeof (Elf64_External_Dyn),
5440 1.1 christos sizeof (Elf_External_Note),
5441 1.1 christos 4,
5442 1.1 christos 1,
5443 1.1 christos 64, 3, /* ARCH_SIZE, LOG_FILE_ALIGN */
5444 1.1 christos ELFCLASS64, EV_CURRENT,
5445 1.1 christos bfd_elf64_write_out_phdrs,
5446 1.1 christos elf64_vms_write_shdrs_and_ehdr,
5447 1.1 christos bfd_elf64_checksum_contents,
5448 1.1 christos bfd_elf64_write_relocs,
5449 1.1 christos bfd_elf64_swap_symbol_in,
5450 1.1 christos bfd_elf64_swap_symbol_out,
5451 1.1 christos bfd_elf64_slurp_reloc_table,
5452 1.1 christos bfd_elf64_slurp_symbol_table,
5453 1.1 christos bfd_elf64_swap_dyn_in,
5454 1.1 christos bfd_elf64_swap_dyn_out,
5455 1.1 christos bfd_elf64_swap_reloc_in,
5456 1.1 christos bfd_elf64_swap_reloc_out,
5457 1.1 christos bfd_elf64_swap_reloca_in,
5458 1.1 christos bfd_elf64_swap_reloca_out
5459 1.1 christos };
5460 1.1 christos
5461 1.1 christos #define ELF_ARCH bfd_arch_ia64
5462 1.1 christos #define ELF_MACHINE_CODE EM_IA_64
5463 1.1 christos #define ELF_MAXPAGESIZE 0x10000 /* 64KB */
5464 1.1 christos #define ELF_COMMONPAGESIZE 0x200 /* 16KB */
5465 1.1 christos
5466 1.1 christos #define elf_backend_section_from_shdr \
5467 1.1 christos elf64_ia64_section_from_shdr
5468 1.1 christos #define elf_backend_section_flags \
5469 1.1 christos elf64_ia64_section_flags
5470 1.1 christos #define elf_backend_fake_sections \
5471 1.1 christos elf64_ia64_fake_sections
5472 1.1 christos #define elf_backend_final_write_processing \
5473 1.1 christos elf64_ia64_final_write_processing
5474 1.1 christos #define elf_backend_add_symbol_hook \
5475 1.1 christos elf64_ia64_add_symbol_hook
5476 1.1 christos #define elf_info_to_howto \
5477 1.1 christos elf64_ia64_info_to_howto
5478 1.1 christos
5479 1.1 christos #define bfd_elf64_bfd_reloc_type_lookup \
5480 1.1 christos ia64_elf_reloc_type_lookup
5481 1.1 christos #define bfd_elf64_bfd_reloc_name_lookup \
5482 1.1 christos ia64_elf_reloc_name_lookup
5483 1.1 christos #define bfd_elf64_bfd_is_local_label_name \
5484 1.1 christos elf64_ia64_is_local_label_name
5485 1.1 christos #define bfd_elf64_bfd_relax_section \
5486 1.1 christos elf64_ia64_relax_section
5487 1.1 christos
5488 1.1 christos #define elf_backend_object_p \
5489 1.1 christos elf64_ia64_object_p
5490 1.1 christos
5491 1.1 christos /* Stuff for the BFD linker: */
5492 1.1 christos #define bfd_elf64_bfd_link_hash_table_create \
5493 1.1 christos elf64_ia64_hash_table_create
5494 1.1 christos #define elf_backend_create_dynamic_sections \
5495 1.1 christos elf64_ia64_create_dynamic_sections
5496 1.1 christos #define elf_backend_check_relocs \
5497 1.1 christos elf64_ia64_check_relocs
5498 1.1 christos #define elf_backend_adjust_dynamic_symbol \
5499 1.1 christos elf64_ia64_adjust_dynamic_symbol
5500 1.1 christos #define elf_backend_size_dynamic_sections \
5501 1.1 christos elf64_ia64_size_dynamic_sections
5502 1.1 christos #define elf_backend_omit_section_dynsym \
5503 1.1.1.5 christos _bfd_elf_omit_section_dynsym_all
5504 1.1 christos #define elf_backend_relocate_section \
5505 1.1 christos elf64_ia64_relocate_section
5506 1.1 christos #define elf_backend_finish_dynamic_symbol \
5507 1.1 christos elf64_ia64_finish_dynamic_symbol
5508 1.1 christos #define elf_backend_finish_dynamic_sections \
5509 1.1 christos elf64_ia64_finish_dynamic_sections
5510 1.1 christos #define bfd_elf64_bfd_final_link \
5511 1.1 christos elf64_ia64_final_link
5512 1.1 christos
5513 1.1 christos #define bfd_elf64_bfd_merge_private_bfd_data \
5514 1.1 christos elf64_ia64_merge_private_bfd_data
5515 1.1 christos #define bfd_elf64_bfd_set_private_flags \
5516 1.1 christos elf64_ia64_set_private_flags
5517 1.1 christos #define bfd_elf64_bfd_print_private_bfd_data \
5518 1.1 christos elf64_ia64_print_private_bfd_data
5519 1.1 christos
5520 1.1 christos #define elf_backend_plt_readonly 1
5521 1.1 christos #define elf_backend_want_plt_sym 0
5522 1.1 christos #define elf_backend_plt_alignment 5
5523 1.1 christos #define elf_backend_got_header_size 0
5524 1.1 christos #define elf_backend_want_got_plt 1
5525 1.1 christos #define elf_backend_may_use_rel_p 1
5526 1.1 christos #define elf_backend_may_use_rela_p 1
5527 1.1 christos #define elf_backend_default_use_rela_p 1
5528 1.1 christos #define elf_backend_want_dynbss 0
5529 1.1 christos #define elf_backend_hide_symbol elf64_ia64_hash_hide_symbol
5530 1.1 christos #define elf_backend_fixup_symbol _bfd_elf_link_hash_fixup_symbol
5531 1.1 christos #define elf_backend_reloc_type_class elf64_ia64_reloc_type_class
5532 1.1 christos #define elf_backend_rela_normal 1
5533 1.1 christos #define elf_backend_special_sections elf64_ia64_special_sections
5534 1.1 christos #define elf_backend_default_execstack 0
5535 1.1 christos
5536 1.1 christos /* FIXME: PR 290: The Intel C compiler generates SHT_IA_64_UNWIND with
5537 1.1 christos SHF_LINK_ORDER. But it doesn't set the sh_link or sh_info fields.
5538 1.1 christos We don't want to flood users with so many error messages. We turn
5539 1.1 christos off the warning for now. It will be turned on later when the Intel
5540 1.1 christos compiler is fixed. */
5541 1.1 christos #define elf_backend_link_order_error_handler NULL
5542 1.1 christos
5543 1.1 christos /* VMS-specific vectors. */
5544 1.1 christos
5545 1.1 christos #undef TARGET_LITTLE_SYM
5546 1.1.1.2 christos #define TARGET_LITTLE_SYM ia64_elf64_vms_vec
5547 1.1 christos #undef TARGET_LITTLE_NAME
5548 1.1 christos #define TARGET_LITTLE_NAME "elf64-ia64-vms"
5549 1.1 christos #undef TARGET_BIG_SYM
5550 1.1 christos #undef TARGET_BIG_NAME
5551 1.1 christos
5552 1.1 christos /* These are VMS specific functions. */
5553 1.1 christos
5554 1.1 christos #undef elf_backend_object_p
5555 1.1 christos #define elf_backend_object_p elf64_vms_object_p
5556 1.1 christos
5557 1.1 christos #undef elf_backend_section_from_shdr
5558 1.1 christos #define elf_backend_section_from_shdr elf64_vms_section_from_shdr
5559 1.1 christos
5560 1.1.1.6 christos #undef elf_backend_init_file_header
5561 1.1.1.6 christos #define elf_backend_init_file_header elf64_vms_init_file_header
5562 1.1 christos
5563 1.1 christos #undef elf_backend_section_processing
5564 1.1 christos #define elf_backend_section_processing elf64_vms_section_processing
5565 1.1 christos
5566 1.1 christos #undef elf_backend_final_write_processing
5567 1.1 christos #define elf_backend_final_write_processing elf64_vms_final_write_processing
5568 1.1 christos
5569 1.1 christos #undef bfd_elf64_close_and_cleanup
5570 1.1 christos #define bfd_elf64_close_and_cleanup elf64_vms_close_and_cleanup
5571 1.1 christos
5572 1.1 christos #undef elf_backend_section_from_bfd_section
5573 1.1 christos
5574 1.1 christos #undef elf_backend_symbol_processing
5575 1.1 christos
5576 1.1 christos #undef elf_backend_want_p_paddr_set_to_zero
5577 1.1 christos
5578 1.1 christos #undef ELF_OSABI
5579 1.1 christos #define ELF_OSABI ELFOSABI_OPENVMS
5580 1.1 christos
5581 1.1 christos #undef ELF_MAXPAGESIZE
5582 1.1 christos #define ELF_MAXPAGESIZE 0x10000 /* 64KB */
5583 1.1 christos
5584 1.1 christos #undef elf64_bed
5585 1.1 christos #define elf64_bed elf64_ia64_vms_bed
5586 1.1 christos
5587 1.1 christos #define elf_backend_size_info elf64_ia64_vms_size_info
5588 1.1 christos
5589 1.1 christos /* Use VMS-style archives (in particular, don't use the standard coff
5590 1.1 christos archive format). */
5591 1.1 christos #define bfd_elf64_archive_functions
5592 1.1 christos
5593 1.1 christos #undef bfd_elf64_archive_p
5594 1.1 christos #define bfd_elf64_archive_p _bfd_vms_lib_ia64_archive_p
5595 1.1 christos #undef bfd_elf64_write_archive_contents
5596 1.1 christos #define bfd_elf64_write_archive_contents _bfd_vms_lib_write_archive_contents
5597 1.1 christos #undef bfd_elf64_mkarchive
5598 1.1 christos #define bfd_elf64_mkarchive _bfd_vms_lib_ia64_mkarchive
5599 1.1 christos
5600 1.1 christos #define bfd_elf64_archive_slurp_armap \
5601 1.1 christos _bfd_vms_lib_slurp_armap
5602 1.1 christos #define bfd_elf64_archive_slurp_extended_name_table \
5603 1.1 christos _bfd_vms_lib_slurp_extended_name_table
5604 1.1 christos #define bfd_elf64_archive_construct_extended_name_table \
5605 1.1 christos _bfd_vms_lib_construct_extended_name_table
5606 1.1 christos #define bfd_elf64_archive_truncate_arname \
5607 1.1 christos _bfd_vms_lib_truncate_arname
5608 1.1 christos #define bfd_elf64_archive_write_armap \
5609 1.1 christos _bfd_vms_lib_write_armap
5610 1.1 christos #define bfd_elf64_archive_read_ar_hdr \
5611 1.1 christos _bfd_vms_lib_read_ar_hdr
5612 1.1 christos #define bfd_elf64_archive_write_ar_hdr \
5613 1.1 christos _bfd_vms_lib_write_ar_hdr
5614 1.1 christos #define bfd_elf64_archive_openr_next_archived_file \
5615 1.1 christos _bfd_vms_lib_openr_next_archived_file
5616 1.1 christos #define bfd_elf64_archive_get_elt_at_index \
5617 1.1 christos _bfd_vms_lib_get_elt_at_index
5618 1.1 christos #define bfd_elf64_archive_generic_stat_arch_elt \
5619 1.1 christos _bfd_vms_lib_generic_stat_arch_elt
5620 1.1 christos #define bfd_elf64_archive_update_armap_timestamp \
5621 1.1 christos _bfd_vms_lib_update_armap_timestamp
5622 1.1 christos
5623 1.1 christos /* VMS link methods. */
5624 1.1 christos #undef bfd_elf64_bfd_link_add_symbols
5625 1.1.1.4 christos #define bfd_elf64_bfd_link_add_symbols elf64_vms_bfd_link_add_symbols
5626 1.1 christos
5627 1.1 christos #undef elf_backend_want_got_sym
5628 1.1.1.4 christos #define elf_backend_want_got_sym 0
5629 1.1 christos
5630 1.1 christos #undef bfd_elf64_mkobject
5631 1.1 christos #define bfd_elf64_mkobject elf64_ia64_vms_mkobject
5632 1.1 christos
5633 1.1 christos /* Redefine to align segments on block size. */
5634 1.1 christos #undef ELF_MAXPAGESIZE
5635 1.1 christos #define ELF_MAXPAGESIZE 0x200 /* 512B */
5636 1.1 christos
5637 1.1 christos #undef elf_backend_want_got_plt
5638 1.1 christos #define elf_backend_want_got_plt 0
5639 1.1 christos
5640 1.1 christos #include "elf64-target.h"
5641