1*fae548d3Szrj /* BFD back-end for AMD 64 COFF files.
2*fae548d3Szrj Copyright (C) 2006-2020 Free Software Foundation, Inc.
3*fae548d3Szrj
4*fae548d3Szrj This file is part of BFD, the Binary File Descriptor library.
5*fae548d3Szrj
6*fae548d3Szrj This program is free software; you can redistribute it and/or modify
7*fae548d3Szrj it under the terms of the GNU General Public License as published by
8*fae548d3Szrj the Free Software Foundation; either version 3 of the License, or
9*fae548d3Szrj (at your option) any later version.
10*fae548d3Szrj
11*fae548d3Szrj This program is distributed in the hope that it will be useful,
12*fae548d3Szrj but WITHOUT ANY WARRANTY; without even the implied warranty of
13*fae548d3Szrj MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14*fae548d3Szrj GNU General Public License for more details.
15*fae548d3Szrj
16*fae548d3Szrj You should have received a copy of the GNU General Public License
17*fae548d3Szrj along with this program; if not, write to the Free Software
18*fae548d3Szrj Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
19*fae548d3Szrj MA 02110-1301, USA.
20*fae548d3Szrj
21*fae548d3Szrj Written by Kai Tietz, OneVision Software GmbH&CoKg. */
22*fae548d3Szrj
23*fae548d3Szrj #ifndef COFF_WITH_pex64
24*fae548d3Szrj #define COFF_WITH_pex64
25*fae548d3Szrj #endif
26*fae548d3Szrj
27*fae548d3Szrj /* Note we have to make sure not to include headers twice.
28*fae548d3Szrj Not all headers are wrapped in #ifdef guards, so we define
29*fae548d3Szrj PEI_HEADERS to prevent double including here. */
30*fae548d3Szrj #ifndef PEI_HEADERS
31*fae548d3Szrj #include "sysdep.h"
32*fae548d3Szrj #include "bfd.h"
33*fae548d3Szrj #include "libbfd.h"
34*fae548d3Szrj #include "coff/x86_64.h"
35*fae548d3Szrj #include "coff/internal.h"
36*fae548d3Szrj #include "coff/pe.h"
37*fae548d3Szrj #include "libcoff.h"
38*fae548d3Szrj #include "libiberty.h"
39*fae548d3Szrj #endif
40*fae548d3Szrj
41*fae548d3Szrj #define BADMAG(x) AMD64BADMAG(x)
42*fae548d3Szrj
43*fae548d3Szrj #ifdef COFF_WITH_pex64
44*fae548d3Szrj # undef AOUTSZ
45*fae548d3Szrj # define AOUTSZ PEPAOUTSZ
46*fae548d3Szrj # define PEAOUTHDR PEPAOUTHDR
47*fae548d3Szrj #endif
48*fae548d3Szrj
49*fae548d3Szrj #define COFF_DEFAULT_SECTION_ALIGNMENT_POWER (2)
50*fae548d3Szrj
51*fae548d3Szrj /* The page size is a guess based on ELF. */
52*fae548d3Szrj
53*fae548d3Szrj #define COFF_PAGE_SIZE 0x1000
54*fae548d3Szrj
55*fae548d3Szrj /* All users of this file have bfd_octets_per_byte (abfd, sec) == 1. */
56*fae548d3Szrj #define OCTETS_PER_BYTE(ABFD, SEC) 1
57*fae548d3Szrj
58*fae548d3Szrj /* For some reason when using AMD COFF the value stored in the .text
59*fae548d3Szrj section for a reference to a common symbol is the value itself plus
60*fae548d3Szrj any desired offset. Ian Taylor, Cygnus Support. */
61*fae548d3Szrj
62*fae548d3Szrj /* If we are producing relocatable output, we need to do some
63*fae548d3Szrj adjustments to the object file that are not done by the
64*fae548d3Szrj bfd_perform_relocation function. This function is called by every
65*fae548d3Szrj reloc type to make any required adjustments. */
66*fae548d3Szrj
67*fae548d3Szrj static bfd_reloc_status_type
coff_amd64_reloc(bfd * abfd,arelent * reloc_entry,asymbol * symbol,void * data,asection * input_section ATTRIBUTE_UNUSED,bfd * output_bfd,char ** error_message ATTRIBUTE_UNUSED)68*fae548d3Szrj coff_amd64_reloc (bfd *abfd,
69*fae548d3Szrj arelent *reloc_entry,
70*fae548d3Szrj asymbol *symbol,
71*fae548d3Szrj void * data,
72*fae548d3Szrj asection *input_section ATTRIBUTE_UNUSED,
73*fae548d3Szrj bfd *output_bfd,
74*fae548d3Szrj char **error_message ATTRIBUTE_UNUSED)
75*fae548d3Szrj {
76*fae548d3Szrj symvalue diff;
77*fae548d3Szrj
78*fae548d3Szrj #if !defined(COFF_WITH_PE)
79*fae548d3Szrj if (output_bfd == NULL)
80*fae548d3Szrj return bfd_reloc_continue;
81*fae548d3Szrj #endif
82*fae548d3Szrj
83*fae548d3Szrj if (bfd_is_com_section (symbol->section))
84*fae548d3Szrj {
85*fae548d3Szrj #if !defined(COFF_WITH_PE)
86*fae548d3Szrj /* We are relocating a common symbol. The current value in the
87*fae548d3Szrj object file is ORIG + OFFSET, where ORIG is the value of the
88*fae548d3Szrj common symbol as seen by the object file when it was compiled
89*fae548d3Szrj (this may be zero if the symbol was undefined) and OFFSET is
90*fae548d3Szrj the offset into the common symbol (normally zero, but may be
91*fae548d3Szrj non-zero when referring to a field in a common structure).
92*fae548d3Szrj ORIG is the negative of reloc_entry->addend, which is set by
93*fae548d3Szrj the CALC_ADDEND macro below. We want to replace the value in
94*fae548d3Szrj the object file with NEW + OFFSET, where NEW is the value of
95*fae548d3Szrj the common symbol which we are going to put in the final
96*fae548d3Szrj object file. NEW is symbol->value. */
97*fae548d3Szrj diff = symbol->value + reloc_entry->addend;
98*fae548d3Szrj #else
99*fae548d3Szrj /* In PE mode, we do not offset the common symbol. */
100*fae548d3Szrj diff = reloc_entry->addend;
101*fae548d3Szrj #endif
102*fae548d3Szrj }
103*fae548d3Szrj else
104*fae548d3Szrj {
105*fae548d3Szrj /* For some reason bfd_perform_relocation always effectively
106*fae548d3Szrj ignores the addend for a COFF target when producing
107*fae548d3Szrj relocatable output. This seems to be always wrong for 386
108*fae548d3Szrj COFF, so we handle the addend here instead. */
109*fae548d3Szrj #if defined(COFF_WITH_PE)
110*fae548d3Szrj if (output_bfd == NULL)
111*fae548d3Szrj {
112*fae548d3Szrj reloc_howto_type *howto = reloc_entry->howto;
113*fae548d3Szrj
114*fae548d3Szrj /* Although PC relative relocations are very similar between
115*fae548d3Szrj PE and non-PE formats, but they are off by 1 << howto->size
116*fae548d3Szrj bytes. For the external relocation, PE is very different
117*fae548d3Szrj from others. See md_apply_fix3 () in gas/config/tc-amd64.c.
118*fae548d3Szrj When we link PE and non-PE object files together to
119*fae548d3Szrj generate a non-PE executable, we have to compensate it
120*fae548d3Szrj here. */
121*fae548d3Szrj if(howto->pc_relative && howto->pcrel_offset)
122*fae548d3Szrj diff = -(1 << howto->size);
123*fae548d3Szrj else if(symbol->flags & BSF_WEAK)
124*fae548d3Szrj diff = reloc_entry->addend - symbol->value;
125*fae548d3Szrj else
126*fae548d3Szrj diff = -reloc_entry->addend;
127*fae548d3Szrj }
128*fae548d3Szrj else
129*fae548d3Szrj #endif
130*fae548d3Szrj diff = reloc_entry->addend;
131*fae548d3Szrj }
132*fae548d3Szrj
133*fae548d3Szrj #if defined(COFF_WITH_PE)
134*fae548d3Szrj /* FIXME: How should this case be handled? */
135*fae548d3Szrj if (reloc_entry->howto->type == R_AMD64_IMAGEBASE
136*fae548d3Szrj && output_bfd != NULL
137*fae548d3Szrj && bfd_get_flavour (output_bfd) == bfd_target_coff_flavour)
138*fae548d3Szrj diff -= pe_data (output_bfd)->pe_opthdr.ImageBase;
139*fae548d3Szrj #endif
140*fae548d3Szrj
141*fae548d3Szrj #define DOIT(x) \
142*fae548d3Szrj x = ((x & ~howto->dst_mask) | (((x & howto->src_mask) + diff) & howto->dst_mask))
143*fae548d3Szrj
144*fae548d3Szrj if (diff != 0)
145*fae548d3Szrj {
146*fae548d3Szrj reloc_howto_type *howto = reloc_entry->howto;
147*fae548d3Szrj bfd_size_type octets = (reloc_entry->address
148*fae548d3Szrj * OCTETS_PER_BYTE (abfd, input_section));
149*fae548d3Szrj unsigned char *addr = (unsigned char *) data + octets;
150*fae548d3Szrj
151*fae548d3Szrj if (!bfd_reloc_offset_in_range (howto, abfd, input_section, octets))
152*fae548d3Szrj return bfd_reloc_outofrange;
153*fae548d3Szrj
154*fae548d3Szrj switch (howto->size)
155*fae548d3Szrj {
156*fae548d3Szrj case 0:
157*fae548d3Szrj {
158*fae548d3Szrj char x = bfd_get_8 (abfd, addr);
159*fae548d3Szrj DOIT (x);
160*fae548d3Szrj bfd_put_8 (abfd, x, addr);
161*fae548d3Szrj }
162*fae548d3Szrj break;
163*fae548d3Szrj
164*fae548d3Szrj case 1:
165*fae548d3Szrj {
166*fae548d3Szrj short x = bfd_get_16 (abfd, addr);
167*fae548d3Szrj DOIT (x);
168*fae548d3Szrj bfd_put_16 (abfd, (bfd_vma) x, addr);
169*fae548d3Szrj }
170*fae548d3Szrj break;
171*fae548d3Szrj
172*fae548d3Szrj case 2:
173*fae548d3Szrj {
174*fae548d3Szrj long x = bfd_get_32 (abfd, addr);
175*fae548d3Szrj DOIT (x);
176*fae548d3Szrj bfd_put_32 (abfd, (bfd_vma) x, addr);
177*fae548d3Szrj }
178*fae548d3Szrj break;
179*fae548d3Szrj
180*fae548d3Szrj case 4:
181*fae548d3Szrj {
182*fae548d3Szrj bfd_uint64_t x = bfd_get_64 (abfd, addr);
183*fae548d3Szrj DOIT (x);
184*fae548d3Szrj bfd_put_64 (abfd, x, addr);
185*fae548d3Szrj }
186*fae548d3Szrj break;
187*fae548d3Szrj
188*fae548d3Szrj default:
189*fae548d3Szrj bfd_set_error (bfd_error_bad_value);
190*fae548d3Szrj return bfd_reloc_notsupported;
191*fae548d3Szrj }
192*fae548d3Szrj }
193*fae548d3Szrj
194*fae548d3Szrj /* Now let bfd_perform_relocation finish everything up. */
195*fae548d3Szrj return bfd_reloc_continue;
196*fae548d3Szrj }
197*fae548d3Szrj
198*fae548d3Szrj #if defined(COFF_WITH_PE)
199*fae548d3Szrj /* Return TRUE if this relocation should appear in the output .reloc
200*fae548d3Szrj section. */
201*fae548d3Szrj
202*fae548d3Szrj static bfd_boolean
in_reloc_p(bfd * abfd ATTRIBUTE_UNUSED,reloc_howto_type * howto)203*fae548d3Szrj in_reloc_p (bfd *abfd ATTRIBUTE_UNUSED, reloc_howto_type *howto)
204*fae548d3Szrj {
205*fae548d3Szrj return ! howto->pc_relative && howto->type != R_AMD64_IMAGEBASE
206*fae548d3Szrj && howto->type != R_AMD64_SECREL;
207*fae548d3Szrj }
208*fae548d3Szrj #endif /* COFF_WITH_PE */
209*fae548d3Szrj
210*fae548d3Szrj #ifndef PCRELOFFSET
211*fae548d3Szrj #define PCRELOFFSET TRUE
212*fae548d3Szrj #endif
213*fae548d3Szrj
214*fae548d3Szrj static reloc_howto_type howto_table[] =
215*fae548d3Szrj {
216*fae548d3Szrj EMPTY_HOWTO (0),
217*fae548d3Szrj HOWTO (R_AMD64_DIR64, /* type 1*/
218*fae548d3Szrj 0, /* rightshift */
219*fae548d3Szrj 4, /* size (0 = byte, 1 = short, 2 = long, 4 = long long) */
220*fae548d3Szrj 64, /* bitsize */
221*fae548d3Szrj FALSE, /* pc_relative */
222*fae548d3Szrj 0, /* bitpos */
223*fae548d3Szrj complain_overflow_bitfield, /* complain_on_overflow */
224*fae548d3Szrj coff_amd64_reloc, /* special_function */
225*fae548d3Szrj "R_X86_64_64", /* name */
226*fae548d3Szrj TRUE, /* partial_inplace */
227*fae548d3Szrj 0xffffffffffffffffll, /* src_mask */
228*fae548d3Szrj 0xffffffffffffffffll, /* dst_mask */
229*fae548d3Szrj TRUE), /* pcrel_offset */
230*fae548d3Szrj HOWTO (R_AMD64_DIR32, /* type 2 */
231*fae548d3Szrj 0, /* rightshift */
232*fae548d3Szrj 2, /* size (0 = byte, 1 = short, 2 = long) */
233*fae548d3Szrj 32, /* bitsize */
234*fae548d3Szrj FALSE, /* pc_relative */
235*fae548d3Szrj 0, /* bitpos */
236*fae548d3Szrj complain_overflow_bitfield, /* complain_on_overflow */
237*fae548d3Szrj coff_amd64_reloc, /* special_function */
238*fae548d3Szrj "R_X86_64_32", /* name */
239*fae548d3Szrj TRUE, /* partial_inplace */
240*fae548d3Szrj 0xffffffff, /* src_mask */
241*fae548d3Szrj 0xffffffff, /* dst_mask */
242*fae548d3Szrj TRUE), /* pcrel_offset */
243*fae548d3Szrj /* PE IMAGE_REL_AMD64_ADDR32NB relocation (3). */
244*fae548d3Szrj HOWTO (R_AMD64_IMAGEBASE, /* type */
245*fae548d3Szrj 0, /* rightshift */
246*fae548d3Szrj 2, /* size (0 = byte, 1 = short, 2 = long) */
247*fae548d3Szrj 32, /* bitsize */
248*fae548d3Szrj FALSE, /* pc_relative */
249*fae548d3Szrj 0, /* bitpos */
250*fae548d3Szrj complain_overflow_bitfield, /* complain_on_overflow */
251*fae548d3Szrj coff_amd64_reloc, /* special_function */
252*fae548d3Szrj "rva32", /* name */
253*fae548d3Szrj TRUE, /* partial_inplace */
254*fae548d3Szrj 0xffffffff, /* src_mask */
255*fae548d3Szrj 0xffffffff, /* dst_mask */
256*fae548d3Szrj FALSE), /* pcrel_offset */
257*fae548d3Szrj /* 32-bit longword PC relative relocation (4). */
258*fae548d3Szrj HOWTO (R_AMD64_PCRLONG, /* type 4 */
259*fae548d3Szrj 0, /* rightshift */
260*fae548d3Szrj 2, /* size (0 = byte, 1 = short, 2 = long) */
261*fae548d3Szrj 32, /* bitsize */
262*fae548d3Szrj TRUE, /* pc_relative */
263*fae548d3Szrj 0, /* bitpos */
264*fae548d3Szrj complain_overflow_signed, /* complain_on_overflow */
265*fae548d3Szrj coff_amd64_reloc, /* special_function */
266*fae548d3Szrj "R_X86_64_PC32", /* name */
267*fae548d3Szrj TRUE, /* partial_inplace */
268*fae548d3Szrj 0xffffffff, /* src_mask */
269*fae548d3Szrj 0xffffffff, /* dst_mask */
270*fae548d3Szrj PCRELOFFSET), /* pcrel_offset */
271*fae548d3Szrj
272*fae548d3Szrj HOWTO (R_AMD64_PCRLONG_1, /* type 5 */
273*fae548d3Szrj 0, /* rightshift */
274*fae548d3Szrj 2, /* size (0 = byte, 1 = short, 2 = long) */
275*fae548d3Szrj 32, /* bitsize */
276*fae548d3Szrj TRUE, /* pc_relative */
277*fae548d3Szrj 0, /* bitpos */
278*fae548d3Szrj complain_overflow_signed, /* complain_on_overflow */
279*fae548d3Szrj coff_amd64_reloc, /* special_function */
280*fae548d3Szrj "DISP32+1", /* name */
281*fae548d3Szrj TRUE, /* partial_inplace */
282*fae548d3Szrj 0xffffffff, /* src_mask */
283*fae548d3Szrj 0xffffffff, /* dst_mask */
284*fae548d3Szrj PCRELOFFSET), /* pcrel_offset */
285*fae548d3Szrj HOWTO (R_AMD64_PCRLONG_2, /* type 6 */
286*fae548d3Szrj 0, /* rightshift */
287*fae548d3Szrj 2, /* size (0 = byte, 1 = short, 2 = long) */
288*fae548d3Szrj 32, /* bitsize */
289*fae548d3Szrj TRUE, /* pc_relative */
290*fae548d3Szrj 0, /* bitpos */
291*fae548d3Szrj complain_overflow_signed, /* complain_on_overflow */
292*fae548d3Szrj coff_amd64_reloc, /* special_function */
293*fae548d3Szrj "DISP32+2", /* name */
294*fae548d3Szrj TRUE, /* partial_inplace */
295*fae548d3Szrj 0xffffffff, /* src_mask */
296*fae548d3Szrj 0xffffffff, /* dst_mask */
297*fae548d3Szrj PCRELOFFSET), /* pcrel_offset */
298*fae548d3Szrj HOWTO (R_AMD64_PCRLONG_3, /* type 7 */
299*fae548d3Szrj 0, /* rightshift */
300*fae548d3Szrj 2, /* size (0 = byte, 1 = short, 2 = long) */
301*fae548d3Szrj 32, /* bitsize */
302*fae548d3Szrj TRUE, /* pc_relative */
303*fae548d3Szrj 0, /* bitpos */
304*fae548d3Szrj complain_overflow_signed, /* complain_on_overflow */
305*fae548d3Szrj coff_amd64_reloc, /* special_function */
306*fae548d3Szrj "DISP32+3", /* name */
307*fae548d3Szrj TRUE, /* partial_inplace */
308*fae548d3Szrj 0xffffffff, /* src_mask */
309*fae548d3Szrj 0xffffffff, /* dst_mask */
310*fae548d3Szrj PCRELOFFSET), /* pcrel_offset */
311*fae548d3Szrj HOWTO (R_AMD64_PCRLONG_4, /* type 8 */
312*fae548d3Szrj 0, /* rightshift */
313*fae548d3Szrj 2, /* size (0 = byte, 1 = short, 2 = long) */
314*fae548d3Szrj 32, /* bitsize */
315*fae548d3Szrj TRUE, /* pc_relative */
316*fae548d3Szrj 0, /* bitpos */
317*fae548d3Szrj complain_overflow_signed, /* complain_on_overflow */
318*fae548d3Szrj coff_amd64_reloc, /* special_function */
319*fae548d3Szrj "DISP32+4", /* name */
320*fae548d3Szrj TRUE, /* partial_inplace */
321*fae548d3Szrj 0xffffffff, /* src_mask */
322*fae548d3Szrj 0xffffffff, /* dst_mask */
323*fae548d3Szrj PCRELOFFSET), /* pcrel_offset */
324*fae548d3Szrj HOWTO (R_AMD64_PCRLONG_5, /* type 9 */
325*fae548d3Szrj 0, /* rightshift */
326*fae548d3Szrj 2, /* size (0 = byte, 1 = short, 2 = long) */
327*fae548d3Szrj 32, /* bitsize */
328*fae548d3Szrj TRUE, /* pc_relative */
329*fae548d3Szrj 0, /* bitpos */
330*fae548d3Szrj complain_overflow_signed, /* complain_on_overflow */
331*fae548d3Szrj coff_amd64_reloc, /* special_function */
332*fae548d3Szrj "DISP32+5", /* name */
333*fae548d3Szrj TRUE, /* partial_inplace */
334*fae548d3Szrj 0xffffffff, /* src_mask */
335*fae548d3Szrj 0xffffffff, /* dst_mask */
336*fae548d3Szrj PCRELOFFSET), /* pcrel_offset */
337*fae548d3Szrj EMPTY_HOWTO (10), /* R_AMD64_SECTION 10 */
338*fae548d3Szrj #if defined(COFF_WITH_PE)
339*fae548d3Szrj /* 32-bit longword section relative relocation (11). */
340*fae548d3Szrj HOWTO (R_AMD64_SECREL, /* type */
341*fae548d3Szrj 0, /* rightshift */
342*fae548d3Szrj 2, /* size (0 = byte, 1 = short, 2 = long) */
343*fae548d3Szrj 32, /* bitsize */
344*fae548d3Szrj FALSE, /* pc_relative */
345*fae548d3Szrj 0, /* bitpos */
346*fae548d3Szrj complain_overflow_bitfield, /* complain_on_overflow */
347*fae548d3Szrj coff_amd64_reloc, /* special_function */
348*fae548d3Szrj "secrel32", /* name */
349*fae548d3Szrj TRUE, /* partial_inplace */
350*fae548d3Szrj 0xffffffff, /* src_mask */
351*fae548d3Szrj 0xffffffff, /* dst_mask */
352*fae548d3Szrj TRUE), /* pcrel_offset */
353*fae548d3Szrj #else
354*fae548d3Szrj EMPTY_HOWTO (11),
355*fae548d3Szrj #endif
356*fae548d3Szrj EMPTY_HOWTO (12),
357*fae548d3Szrj EMPTY_HOWTO (13),
358*fae548d3Szrj #ifndef DONT_EXTEND_AMD64
359*fae548d3Szrj HOWTO (R_AMD64_PCRQUAD,
360*fae548d3Szrj 0, /* rightshift */
361*fae548d3Szrj 4, /* size (0 = byte, 1 = short, 2 = long) */
362*fae548d3Szrj 64, /* bitsize */
363*fae548d3Szrj TRUE, /* pc_relative */
364*fae548d3Szrj 0, /* bitpos */
365*fae548d3Szrj complain_overflow_signed, /* complain_on_overflow */
366*fae548d3Szrj coff_amd64_reloc, /* special_function */
367*fae548d3Szrj "R_X86_64_PC64", /* name */
368*fae548d3Szrj TRUE, /* partial_inplace */
369*fae548d3Szrj 0xffffffffffffffffll, /* src_mask */
370*fae548d3Szrj 0xffffffffffffffffll, /* dst_mask */
371*fae548d3Szrj PCRELOFFSET), /* pcrel_offset */
372*fae548d3Szrj #else
373*fae548d3Szrj EMPTY_HOWTO (14),
374*fae548d3Szrj #endif
375*fae548d3Szrj /* Byte relocation (15). */
376*fae548d3Szrj HOWTO (R_RELBYTE, /* type */
377*fae548d3Szrj 0, /* rightshift */
378*fae548d3Szrj 0, /* size (0 = byte, 1 = short, 2 = long) */
379*fae548d3Szrj 8, /* bitsize */
380*fae548d3Szrj FALSE, /* pc_relative */
381*fae548d3Szrj 0, /* bitpos */
382*fae548d3Szrj complain_overflow_bitfield, /* complain_on_overflow */
383*fae548d3Szrj coff_amd64_reloc, /* special_function */
384*fae548d3Szrj "R_X86_64_8", /* name */
385*fae548d3Szrj TRUE, /* partial_inplace */
386*fae548d3Szrj 0x000000ff, /* src_mask */
387*fae548d3Szrj 0x000000ff, /* dst_mask */
388*fae548d3Szrj PCRELOFFSET), /* pcrel_offset */
389*fae548d3Szrj /* 16-bit word relocation (16). */
390*fae548d3Szrj HOWTO (R_RELWORD, /* type */
391*fae548d3Szrj 0, /* rightshift */
392*fae548d3Szrj 1, /* size (0 = byte, 1 = short, 2 = long) */
393*fae548d3Szrj 16, /* bitsize */
394*fae548d3Szrj FALSE, /* pc_relative */
395*fae548d3Szrj 0, /* bitpos */
396*fae548d3Szrj complain_overflow_bitfield, /* complain_on_overflow */
397*fae548d3Szrj coff_amd64_reloc, /* special_function */
398*fae548d3Szrj "R_X86_64_16", /* name */
399*fae548d3Szrj TRUE, /* partial_inplace */
400*fae548d3Szrj 0x0000ffff, /* src_mask */
401*fae548d3Szrj 0x0000ffff, /* dst_mask */
402*fae548d3Szrj PCRELOFFSET), /* pcrel_offset */
403*fae548d3Szrj /* 32-bit longword relocation (17). */
404*fae548d3Szrj HOWTO (R_RELLONG, /* type */
405*fae548d3Szrj 0, /* rightshift */
406*fae548d3Szrj 2, /* size (0 = byte, 1 = short, 2 = long) */
407*fae548d3Szrj 32, /* bitsize */
408*fae548d3Szrj FALSE, /* pc_relative */
409*fae548d3Szrj 0, /* bitpos */
410*fae548d3Szrj complain_overflow_bitfield, /* complain_on_overflow */
411*fae548d3Szrj coff_amd64_reloc, /* special_function */
412*fae548d3Szrj "R_X86_64_32S", /* name */
413*fae548d3Szrj TRUE, /* partial_inplace */
414*fae548d3Szrj 0xffffffff, /* src_mask */
415*fae548d3Szrj 0xffffffff, /* dst_mask */
416*fae548d3Szrj PCRELOFFSET), /* pcrel_offset */
417*fae548d3Szrj /* Byte PC relative relocation (18). */
418*fae548d3Szrj HOWTO (R_PCRBYTE, /* type */
419*fae548d3Szrj 0, /* rightshift */
420*fae548d3Szrj 0, /* size (0 = byte, 1 = short, 2 = long) */
421*fae548d3Szrj 8, /* bitsize */
422*fae548d3Szrj TRUE, /* pc_relative */
423*fae548d3Szrj 0, /* bitpos */
424*fae548d3Szrj complain_overflow_signed, /* complain_on_overflow */
425*fae548d3Szrj coff_amd64_reloc, /* special_function */
426*fae548d3Szrj "R_X86_64_PC8", /* name */
427*fae548d3Szrj TRUE, /* partial_inplace */
428*fae548d3Szrj 0x000000ff, /* src_mask */
429*fae548d3Szrj 0x000000ff, /* dst_mask */
430*fae548d3Szrj PCRELOFFSET), /* pcrel_offset */
431*fae548d3Szrj /* 16-bit word PC relative relocation (19). */
432*fae548d3Szrj HOWTO (R_PCRWORD, /* type */
433*fae548d3Szrj 0, /* rightshift */
434*fae548d3Szrj 1, /* size (0 = byte, 1 = short, 2 = long) */
435*fae548d3Szrj 16, /* bitsize */
436*fae548d3Szrj TRUE, /* pc_relative */
437*fae548d3Szrj 0, /* bitpos */
438*fae548d3Szrj complain_overflow_signed, /* complain_on_overflow */
439*fae548d3Szrj coff_amd64_reloc, /* special_function */
440*fae548d3Szrj "R_X86_64_PC16", /* name */
441*fae548d3Szrj TRUE, /* partial_inplace */
442*fae548d3Szrj 0x0000ffff, /* src_mask */
443*fae548d3Szrj 0x0000ffff, /* dst_mask */
444*fae548d3Szrj PCRELOFFSET), /* pcrel_offset */
445*fae548d3Szrj /* 32-bit longword PC relative relocation (20). */
446*fae548d3Szrj HOWTO (R_PCRLONG, /* type */
447*fae548d3Szrj 0, /* rightshift */
448*fae548d3Szrj 2, /* size (0 = byte, 1 = short, 2 = long) */
449*fae548d3Szrj 32, /* bitsize */
450*fae548d3Szrj TRUE, /* pc_relative */
451*fae548d3Szrj 0, /* bitpos */
452*fae548d3Szrj complain_overflow_signed, /* complain_on_overflow */
453*fae548d3Szrj coff_amd64_reloc, /* special_function */
454*fae548d3Szrj "R_X86_64_PC32", /* name */
455*fae548d3Szrj TRUE, /* partial_inplace */
456*fae548d3Szrj 0xffffffff, /* src_mask */
457*fae548d3Szrj 0xffffffff, /* dst_mask */
458*fae548d3Szrj PCRELOFFSET) /* pcrel_offset */
459*fae548d3Szrj };
460*fae548d3Szrj
461*fae548d3Szrj #define NUM_HOWTOS ARRAY_SIZE (howto_table)
462*fae548d3Szrj
463*fae548d3Szrj /* Turn a howto into a reloc nunmber */
464*fae548d3Szrj
465*fae548d3Szrj #define SELECT_RELOC(x,howto) { x.r_type = howto->type; }
466*fae548d3Szrj #define I386 1 /* Customize coffcode.h */
467*fae548d3Szrj #define AMD64 1
468*fae548d3Szrj
469*fae548d3Szrj #define RTYPE2HOWTO(cache_ptr, dst) \
470*fae548d3Szrj ((cache_ptr)->howto = \
471*fae548d3Szrj ((dst)->r_type < NUM_HOWTOS) \
472*fae548d3Szrj ? howto_table + (dst)->r_type \
473*fae548d3Szrj : NULL)
474*fae548d3Szrj
475*fae548d3Szrj /* For 386 COFF a STYP_NOLOAD | STYP_BSS section is part of a shared
476*fae548d3Szrj library. On some other COFF targets STYP_BSS is normally
477*fae548d3Szrj STYP_NOLOAD. */
478*fae548d3Szrj #define BSS_NOLOAD_IS_SHARED_LIBRARY
479*fae548d3Szrj
480*fae548d3Szrj /* Compute the addend of a reloc. If the reloc is to a common symbol,
481*fae548d3Szrj the object file contains the value of the common symbol. By the
482*fae548d3Szrj time this is called, the linker may be using a different symbol
483*fae548d3Szrj from a different object file with a different value. Therefore, we
484*fae548d3Szrj hack wildly to locate the original symbol from this file so that we
485*fae548d3Szrj can make the correct adjustment. This macro sets coffsym to the
486*fae548d3Szrj symbol from the original file, and uses it to set the addend value
487*fae548d3Szrj correctly. If this is not a common symbol, the usual addend
488*fae548d3Szrj calculation is done, except that an additional tweak is needed for
489*fae548d3Szrj PC relative relocs.
490*fae548d3Szrj FIXME: This macro refers to symbols and asect; these are from the
491*fae548d3Szrj calling function, not the macro arguments. */
492*fae548d3Szrj
493*fae548d3Szrj #define CALC_ADDEND(abfd, ptr, reloc, cache_ptr) \
494*fae548d3Szrj { \
495*fae548d3Szrj coff_symbol_type *coffsym = NULL; \
496*fae548d3Szrj \
497*fae548d3Szrj if (ptr && bfd_asymbol_bfd (ptr) != abfd) \
498*fae548d3Szrj coffsym = (obj_symbols (abfd) \
499*fae548d3Szrj + (cache_ptr->sym_ptr_ptr - symbols)); \
500*fae548d3Szrj else if (ptr) \
501*fae548d3Szrj coffsym = coff_symbol_from (ptr); \
502*fae548d3Szrj \
503*fae548d3Szrj if (coffsym != NULL \
504*fae548d3Szrj && coffsym->native->u.syment.n_scnum == 0) \
505*fae548d3Szrj cache_ptr->addend = - coffsym->native->u.syment.n_value; \
506*fae548d3Szrj else if (ptr && bfd_asymbol_bfd (ptr) == abfd \
507*fae548d3Szrj && ptr->section != NULL) \
508*fae548d3Szrj cache_ptr->addend = - (ptr->section->vma + ptr->value); \
509*fae548d3Szrj else \
510*fae548d3Szrj cache_ptr->addend = 0; \
511*fae548d3Szrj if (ptr && reloc.r_type < NUM_HOWTOS \
512*fae548d3Szrj && howto_table[reloc.r_type].pc_relative) \
513*fae548d3Szrj cache_ptr->addend += asect->vma; \
514*fae548d3Szrj }
515*fae548d3Szrj
516*fae548d3Szrj /* We use the special COFF backend linker. For normal AMD64 COFF, we
517*fae548d3Szrj can use the generic relocate_section routine. For PE, we need our
518*fae548d3Szrj own routine. */
519*fae548d3Szrj
520*fae548d3Szrj #if !defined(COFF_WITH_PE)
521*fae548d3Szrj
522*fae548d3Szrj #define coff_relocate_section _bfd_coff_generic_relocate_section
523*fae548d3Szrj
524*fae548d3Szrj #else /* COFF_WITH_PE */
525*fae548d3Szrj
526*fae548d3Szrj /* The PE relocate section routine. The only difference between this
527*fae548d3Szrj and the regular routine is that we don't want to do anything for a
528*fae548d3Szrj relocatable link. */
529*fae548d3Szrj
530*fae548d3Szrj static bfd_boolean
coff_pe_amd64_relocate_section(bfd * output_bfd,struct bfd_link_info * info,bfd * input_bfd,asection * input_section,bfd_byte * contents,struct internal_reloc * relocs,struct internal_syment * syms,asection ** sections)531*fae548d3Szrj coff_pe_amd64_relocate_section (bfd *output_bfd,
532*fae548d3Szrj struct bfd_link_info *info,
533*fae548d3Szrj bfd *input_bfd,
534*fae548d3Szrj asection *input_section,
535*fae548d3Szrj bfd_byte *contents,
536*fae548d3Szrj struct internal_reloc *relocs,
537*fae548d3Szrj struct internal_syment *syms,
538*fae548d3Szrj asection **sections)
539*fae548d3Szrj {
540*fae548d3Szrj if (bfd_link_relocatable (info))
541*fae548d3Szrj return TRUE;
542*fae548d3Szrj
543*fae548d3Szrj return _bfd_coff_generic_relocate_section (output_bfd, info, input_bfd,input_section, contents,relocs, syms, sections);
544*fae548d3Szrj }
545*fae548d3Szrj
546*fae548d3Szrj #define coff_relocate_section coff_pe_amd64_relocate_section
547*fae548d3Szrj
548*fae548d3Szrj #endif /* COFF_WITH_PE */
549*fae548d3Szrj
550*fae548d3Szrj /* Convert an rtype to howto for the COFF backend linker. */
551*fae548d3Szrj
552*fae548d3Szrj static reloc_howto_type *
coff_amd64_rtype_to_howto(bfd * abfd ATTRIBUTE_UNUSED,asection * sec,struct internal_reloc * rel,struct coff_link_hash_entry * h,struct internal_syment * sym,bfd_vma * addendp)553*fae548d3Szrj coff_amd64_rtype_to_howto (bfd *abfd ATTRIBUTE_UNUSED,
554*fae548d3Szrj asection *sec,
555*fae548d3Szrj struct internal_reloc *rel,
556*fae548d3Szrj struct coff_link_hash_entry *h,
557*fae548d3Szrj struct internal_syment *sym,
558*fae548d3Szrj bfd_vma *addendp)
559*fae548d3Szrj {
560*fae548d3Szrj reloc_howto_type *howto;
561*fae548d3Szrj
562*fae548d3Szrj if (rel->r_type >= NUM_HOWTOS)
563*fae548d3Szrj {
564*fae548d3Szrj bfd_set_error (bfd_error_bad_value);
565*fae548d3Szrj return NULL;
566*fae548d3Szrj }
567*fae548d3Szrj howto = howto_table + rel->r_type;
568*fae548d3Szrj
569*fae548d3Szrj #if defined(COFF_WITH_PE)
570*fae548d3Szrj /* Cancel out code in _bfd_coff_generic_relocate_section. */
571*fae548d3Szrj *addendp = 0;
572*fae548d3Szrj if (rel->r_type >= R_AMD64_PCRLONG_1 && rel->r_type <= R_AMD64_PCRLONG_5)
573*fae548d3Szrj {
574*fae548d3Szrj *addendp -= (bfd_vma)(rel->r_type - R_AMD64_PCRLONG);
575*fae548d3Szrj rel->r_type = R_AMD64_PCRLONG;
576*fae548d3Szrj }
577*fae548d3Szrj #endif
578*fae548d3Szrj
579*fae548d3Szrj if (howto->pc_relative)
580*fae548d3Szrj *addendp += sec->vma;
581*fae548d3Szrj
582*fae548d3Szrj if (sym != NULL && sym->n_scnum == 0 && sym->n_value != 0)
583*fae548d3Szrj {
584*fae548d3Szrj /* This is a common symbol. The section contents include the
585*fae548d3Szrj size (sym->n_value) as an addend. The relocate_section
586*fae548d3Szrj function will be adding in the final value of the symbol. We
587*fae548d3Szrj need to subtract out the current size in order to get the
588*fae548d3Szrj correct result. */
589*fae548d3Szrj BFD_ASSERT (h != NULL);
590*fae548d3Szrj
591*fae548d3Szrj #if !defined(COFF_WITH_PE)
592*fae548d3Szrj /* I think we *do* want to bypass this. If we don't, I have
593*fae548d3Szrj seen some data parameters get the wrong relocation address.
594*fae548d3Szrj If I link two versions with and without this section bypassed
595*fae548d3Szrj and then do a binary comparison, the addresses which are
596*fae548d3Szrj different can be looked up in the map. The case in which
597*fae548d3Szrj this section has been bypassed has addresses which correspond
598*fae548d3Szrj to values I can find in the map. */
599*fae548d3Szrj *addendp -= sym->n_value;
600*fae548d3Szrj #endif
601*fae548d3Szrj }
602*fae548d3Szrj
603*fae548d3Szrj #if !defined(COFF_WITH_PE)
604*fae548d3Szrj /* If the output symbol is common (in which case this must be a
605*fae548d3Szrj relocatable link), we need to add in the final size of the
606*fae548d3Szrj common symbol. */
607*fae548d3Szrj if (h != NULL && h->root.type == bfd_link_hash_common)
608*fae548d3Szrj *addendp += h->root.u.c.size;
609*fae548d3Szrj #endif
610*fae548d3Szrj
611*fae548d3Szrj #if defined(COFF_WITH_PE)
612*fae548d3Szrj if (howto->pc_relative)
613*fae548d3Szrj {
614*fae548d3Szrj #ifndef DONT_EXTEND_AMD64
615*fae548d3Szrj if (rel->r_type == R_AMD64_PCRQUAD)
616*fae548d3Szrj *addendp -= 8;
617*fae548d3Szrj else
618*fae548d3Szrj #endif
619*fae548d3Szrj *addendp -= 4;
620*fae548d3Szrj
621*fae548d3Szrj /* If the symbol is defined, then the generic code is going to
622*fae548d3Szrj add back the symbol value in order to cancel out an
623*fae548d3Szrj adjustment it made to the addend. However, we set the addend
624*fae548d3Szrj to 0 at the start of this function. We need to adjust here,
625*fae548d3Szrj to avoid the adjustment the generic code will make. FIXME:
626*fae548d3Szrj This is getting a bit hackish. */
627*fae548d3Szrj if (sym != NULL && sym->n_scnum != 0)
628*fae548d3Szrj *addendp -= sym->n_value;
629*fae548d3Szrj }
630*fae548d3Szrj
631*fae548d3Szrj if (rel->r_type == R_AMD64_IMAGEBASE
632*fae548d3Szrj && (bfd_get_flavour (sec->output_section->owner) == bfd_target_coff_flavour))
633*fae548d3Szrj *addendp -= pe_data (sec->output_section->owner)->pe_opthdr.ImageBase;
634*fae548d3Szrj
635*fae548d3Szrj if (rel->r_type == R_AMD64_SECREL)
636*fae548d3Szrj {
637*fae548d3Szrj bfd_vma osect_vma;
638*fae548d3Szrj
639*fae548d3Szrj if (h && (h->root.type == bfd_link_hash_defined
640*fae548d3Szrj || h->root.type == bfd_link_hash_defweak))
641*fae548d3Szrj osect_vma = h->root.u.def.section->output_section->vma;
642*fae548d3Szrj else
643*fae548d3Szrj {
644*fae548d3Szrj asection *s;
645*fae548d3Szrj int i;
646*fae548d3Szrj
647*fae548d3Szrj /* Sigh, the only way to get the section to offset against
648*fae548d3Szrj is to find it the hard way. */
649*fae548d3Szrj for (s = abfd->sections, i = 1; i < sym->n_scnum; i++)
650*fae548d3Szrj s = s->next;
651*fae548d3Szrj
652*fae548d3Szrj osect_vma = s->output_section->vma;
653*fae548d3Szrj }
654*fae548d3Szrj
655*fae548d3Szrj *addendp -= osect_vma;
656*fae548d3Szrj }
657*fae548d3Szrj #endif
658*fae548d3Szrj
659*fae548d3Szrj return howto;
660*fae548d3Szrj }
661*fae548d3Szrj
662*fae548d3Szrj #define coff_bfd_reloc_type_lookup coff_amd64_reloc_type_lookup
663*fae548d3Szrj #define coff_bfd_reloc_name_lookup coff_amd64_reloc_name_lookup
664*fae548d3Szrj
665*fae548d3Szrj static reloc_howto_type *
coff_amd64_reloc_type_lookup(bfd * abfd ATTRIBUTE_UNUSED,bfd_reloc_code_real_type code)666*fae548d3Szrj coff_amd64_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED, bfd_reloc_code_real_type code)
667*fae548d3Szrj {
668*fae548d3Szrj switch (code)
669*fae548d3Szrj {
670*fae548d3Szrj case BFD_RELOC_RVA:
671*fae548d3Szrj return howto_table + R_AMD64_IMAGEBASE;
672*fae548d3Szrj case BFD_RELOC_32:
673*fae548d3Szrj return howto_table + R_AMD64_DIR32;
674*fae548d3Szrj case BFD_RELOC_64:
675*fae548d3Szrj return howto_table + R_AMD64_DIR64;
676*fae548d3Szrj case BFD_RELOC_64_PCREL:
677*fae548d3Szrj #ifndef DONT_EXTEND_AMD64
678*fae548d3Szrj return howto_table + R_AMD64_PCRQUAD;
679*fae548d3Szrj #else
680*fae548d3Szrj /* Fall through. */
681*fae548d3Szrj #endif
682*fae548d3Szrj case BFD_RELOC_32_PCREL:
683*fae548d3Szrj return howto_table + R_AMD64_PCRLONG;
684*fae548d3Szrj case BFD_RELOC_X86_64_32S:
685*fae548d3Szrj return howto_table + R_RELLONG;
686*fae548d3Szrj case BFD_RELOC_16:
687*fae548d3Szrj return howto_table + R_RELWORD;
688*fae548d3Szrj case BFD_RELOC_16_PCREL:
689*fae548d3Szrj return howto_table + R_PCRWORD;
690*fae548d3Szrj case BFD_RELOC_8:
691*fae548d3Szrj return howto_table + R_RELBYTE;
692*fae548d3Szrj case BFD_RELOC_8_PCREL:
693*fae548d3Szrj return howto_table + R_PCRBYTE;
694*fae548d3Szrj #if defined(COFF_WITH_PE)
695*fae548d3Szrj case BFD_RELOC_32_SECREL:
696*fae548d3Szrj return howto_table + R_AMD64_SECREL;
697*fae548d3Szrj #endif
698*fae548d3Szrj default:
699*fae548d3Szrj BFD_FAIL ();
700*fae548d3Szrj return 0;
701*fae548d3Szrj }
702*fae548d3Szrj }
703*fae548d3Szrj
704*fae548d3Szrj static reloc_howto_type *
coff_amd64_reloc_name_lookup(bfd * abfd ATTRIBUTE_UNUSED,const char * r_name)705*fae548d3Szrj coff_amd64_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
706*fae548d3Szrj const char *r_name)
707*fae548d3Szrj {
708*fae548d3Szrj unsigned int i;
709*fae548d3Szrj
710*fae548d3Szrj for (i = 0; i < NUM_HOWTOS; i++)
711*fae548d3Szrj if (howto_table[i].name != NULL
712*fae548d3Szrj && strcasecmp (howto_table[i].name, r_name) == 0)
713*fae548d3Szrj return &howto_table[i];
714*fae548d3Szrj
715*fae548d3Szrj return NULL;
716*fae548d3Szrj }
717*fae548d3Szrj
718*fae548d3Szrj #define coff_rtype_to_howto coff_amd64_rtype_to_howto
719*fae548d3Szrj
720*fae548d3Szrj #ifdef TARGET_UNDERSCORE
721*fae548d3Szrj
722*fae548d3Szrj /* If amd64 gcc uses underscores for symbol names, then it does not use
723*fae548d3Szrj a leading dot for local labels, so if TARGET_UNDERSCORE is defined
724*fae548d3Szrj we treat all symbols starting with L as local. */
725*fae548d3Szrj
726*fae548d3Szrj static bfd_boolean
coff_amd64_is_local_label_name(bfd * abfd,const char * name)727*fae548d3Szrj coff_amd64_is_local_label_name (bfd *abfd, const char *name)
728*fae548d3Szrj {
729*fae548d3Szrj if (name[0] == 'L')
730*fae548d3Szrj return TRUE;
731*fae548d3Szrj
732*fae548d3Szrj return _bfd_coff_is_local_label_name (abfd, name);
733*fae548d3Szrj }
734*fae548d3Szrj
735*fae548d3Szrj #define coff_bfd_is_local_label_name coff_amd64_is_local_label_name
736*fae548d3Szrj
737*fae548d3Szrj #endif /* TARGET_UNDERSCORE */
738*fae548d3Szrj
739*fae548d3Szrj #ifndef bfd_pe_print_pdata
740*fae548d3Szrj #define bfd_pe_print_pdata NULL
741*fae548d3Szrj #endif
742*fae548d3Szrj
743*fae548d3Szrj #include "coffcode.h"
744*fae548d3Szrj
745*fae548d3Szrj #ifdef PE
746*fae548d3Szrj #define amd64coff_object_p pe_bfd_object_p
747*fae548d3Szrj #else
748*fae548d3Szrj #define amd64coff_object_p coff_object_p
749*fae548d3Szrj #endif
750*fae548d3Szrj
751*fae548d3Szrj const bfd_target
752*fae548d3Szrj #ifdef TARGET_SYM
753*fae548d3Szrj TARGET_SYM =
754*fae548d3Szrj #else
755*fae548d3Szrj x86_64_coff_vec =
756*fae548d3Szrj #endif
757*fae548d3Szrj {
758*fae548d3Szrj #ifdef TARGET_NAME
759*fae548d3Szrj TARGET_NAME,
760*fae548d3Szrj #else
761*fae548d3Szrj "coff-x86-64", /* Name. */
762*fae548d3Szrj #endif
763*fae548d3Szrj bfd_target_coff_flavour,
764*fae548d3Szrj BFD_ENDIAN_LITTLE, /* Data byte order is little. */
765*fae548d3Szrj BFD_ENDIAN_LITTLE, /* Header byte order is little. */
766*fae548d3Szrj
767*fae548d3Szrj (HAS_RELOC | EXEC_P /* Object flags. */
768*fae548d3Szrj | HAS_LINENO | HAS_DEBUG
769*fae548d3Szrj | HAS_SYMS | HAS_LOCALS | WP_TEXT | D_PAGED | BFD_COMPRESS | BFD_DECOMPRESS),
770*fae548d3Szrj
771*fae548d3Szrj (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC /* Section flags. */
772*fae548d3Szrj #if defined(COFF_WITH_PE)
773*fae548d3Szrj | SEC_LINK_ONCE | SEC_LINK_DUPLICATES | SEC_READONLY | SEC_DEBUGGING
774*fae548d3Szrj #endif
775*fae548d3Szrj | SEC_CODE | SEC_DATA | SEC_EXCLUDE ),
776*fae548d3Szrj
777*fae548d3Szrj #ifdef TARGET_UNDERSCORE
778*fae548d3Szrj TARGET_UNDERSCORE, /* Leading underscore. */
779*fae548d3Szrj #else
780*fae548d3Szrj 0, /* Leading underscore. */
781*fae548d3Szrj #endif
782*fae548d3Szrj '/', /* Ar_pad_char. */
783*fae548d3Szrj 15, /* Ar_max_namelen. */
784*fae548d3Szrj 0, /* match priority. */
785*fae548d3Szrj
786*fae548d3Szrj bfd_getl64, bfd_getl_signed_64, bfd_putl64,
787*fae548d3Szrj bfd_getl32, bfd_getl_signed_32, bfd_putl32,
788*fae548d3Szrj bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* Data. */
789*fae548d3Szrj bfd_getl64, bfd_getl_signed_64, bfd_putl64,
790*fae548d3Szrj bfd_getl32, bfd_getl_signed_32, bfd_putl32,
791*fae548d3Szrj bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* Hdrs. */
792*fae548d3Szrj
793*fae548d3Szrj /* Note that we allow an object file to be treated as a core file as well. */
794*fae548d3Szrj { /* bfd_check_format. */
795*fae548d3Szrj _bfd_dummy_target,
796*fae548d3Szrj amd64coff_object_p,
797*fae548d3Szrj bfd_generic_archive_p,
798*fae548d3Szrj amd64coff_object_p
799*fae548d3Szrj },
800*fae548d3Szrj { /* bfd_set_format. */
801*fae548d3Szrj _bfd_bool_bfd_false_error,
802*fae548d3Szrj coff_mkobject,
803*fae548d3Szrj _bfd_generic_mkarchive,
804*fae548d3Szrj _bfd_bool_bfd_false_error
805*fae548d3Szrj },
806*fae548d3Szrj { /* bfd_write_contents. */
807*fae548d3Szrj _bfd_bool_bfd_false_error,
808*fae548d3Szrj coff_write_object_contents,
809*fae548d3Szrj _bfd_write_archive_contents,
810*fae548d3Szrj _bfd_bool_bfd_false_error
811*fae548d3Szrj },
812*fae548d3Szrj
813*fae548d3Szrj BFD_JUMP_TABLE_GENERIC (coff),
814*fae548d3Szrj BFD_JUMP_TABLE_COPY (coff),
815*fae548d3Szrj BFD_JUMP_TABLE_CORE (_bfd_nocore),
816*fae548d3Szrj BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff),
817*fae548d3Szrj BFD_JUMP_TABLE_SYMBOLS (coff),
818*fae548d3Szrj BFD_JUMP_TABLE_RELOCS (coff),
819*fae548d3Szrj BFD_JUMP_TABLE_WRITE (coff),
820*fae548d3Szrj BFD_JUMP_TABLE_LINK (coff),
821*fae548d3Szrj BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
822*fae548d3Szrj
823*fae548d3Szrj NULL,
824*fae548d3Szrj
825*fae548d3Szrj COFF_SWAP_TABLE
826*fae548d3Szrj };
827