peicode.h revision 1.1.1.7 1 1.1 skrll /* Support for the generic parts of PE/PEI, for BFD.
2 1.1.1.6 christos Copyright (C) 1995-2018 Free Software Foundation, Inc.
3 1.1 skrll Written by Cygnus Solutions.
4 1.1 skrll
5 1.1 skrll This file is part of BFD, the Binary File Descriptor library.
6 1.1 skrll
7 1.1 skrll This program is free software; you can redistribute it and/or modify
8 1.1 skrll it under the terms of the GNU General Public License as published by
9 1.1 skrll the Free Software Foundation; either version 3 of the License, or
10 1.1 skrll (at your option) any later version.
11 1.1 skrll
12 1.1 skrll This program is distributed in the hope that it will be useful,
13 1.1 skrll but WITHOUT ANY WARRANTY; without even the implied warranty of
14 1.1 skrll MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 1.1 skrll GNU General Public License for more details.
16 1.1 skrll
17 1.1 skrll You should have received a copy of the GNU General Public License
18 1.1 skrll along with this program; if not, write to the Free Software
19 1.1 skrll Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
20 1.1 skrll MA 02110-1301, USA. */
21 1.1 skrll
22 1.1 skrll
23 1.1 skrll /* Most of this hacked by Steve Chamberlain,
24 1.1 skrll sac (at) cygnus.com
25 1.1 skrll
26 1.1 skrll PE/PEI rearrangement (and code added): Donn Terry
27 1.1.1.6 christos Softway Systems, Inc. */
28 1.1 skrll
29 1.1 skrll /* Hey look, some documentation [and in a place you expect to find it]!
30 1.1 skrll
31 1.1 skrll The main reference for the pei format is "Microsoft Portable Executable
32 1.1 skrll and Common Object File Format Specification 4.1". Get it if you need to
33 1.1 skrll do some serious hacking on this code.
34 1.1 skrll
35 1.1 skrll Another reference:
36 1.1 skrll "Peering Inside the PE: A Tour of the Win32 Portable Executable
37 1.1 skrll File Format", MSJ 1994, Volume 9.
38 1.1 skrll
39 1.1 skrll The *sole* difference between the pe format and the pei format is that the
40 1.1 skrll latter has an MSDOS 2.0 .exe header on the front that prints the message
41 1.1 skrll "This app must be run under Windows." (or some such).
42 1.1 skrll (FIXME: Whether that statement is *really* true or not is unknown.
43 1.1 skrll Are there more subtle differences between pe and pei formats?
44 1.1 skrll For now assume there aren't. If you find one, then for God sakes
45 1.1 skrll document it here!)
46 1.1 skrll
47 1.1 skrll The Microsoft docs use the word "image" instead of "executable" because
48 1.1 skrll the former can also refer to a DLL (shared library). Confusion can arise
49 1.1 skrll because the `i' in `pei' also refers to "image". The `pe' format can
50 1.1 skrll also create images (i.e. executables), it's just that to run on a win32
51 1.1 skrll system you need to use the pei format.
52 1.1 skrll
53 1.1 skrll FIXME: Please add more docs here so the next poor fool that has to hack
54 1.1 skrll on this code has a chance of getting something accomplished without
55 1.1 skrll wasting too much time. */
56 1.1 skrll
57 1.1 skrll #include "libpei.h"
58 1.1 skrll
59 1.1 skrll static bfd_boolean (*pe_saved_coff_bfd_print_private_bfd_data) (bfd *, void *) =
60 1.1 skrll #ifndef coff_bfd_print_private_bfd_data
61 1.1 skrll NULL;
62 1.1 skrll #else
63 1.1 skrll coff_bfd_print_private_bfd_data;
64 1.1 skrll #undef coff_bfd_print_private_bfd_data
65 1.1 skrll #endif
66 1.1 skrll
67 1.1.1.6 christos static bfd_boolean pe_print_private_bfd_data (bfd *, void *);
68 1.1 skrll #define coff_bfd_print_private_bfd_data pe_print_private_bfd_data
69 1.1 skrll
70 1.1 skrll static bfd_boolean (*pe_saved_coff_bfd_copy_private_bfd_data) (bfd *, bfd *) =
71 1.1 skrll #ifndef coff_bfd_copy_private_bfd_data
72 1.1 skrll NULL;
73 1.1 skrll #else
74 1.1 skrll coff_bfd_copy_private_bfd_data;
75 1.1 skrll #undef coff_bfd_copy_private_bfd_data
76 1.1 skrll #endif
77 1.1 skrll
78 1.1.1.6 christos static bfd_boolean pe_bfd_copy_private_bfd_data (bfd *, bfd *);
79 1.1 skrll #define coff_bfd_copy_private_bfd_data pe_bfd_copy_private_bfd_data
80 1.1 skrll
81 1.1.1.6 christos #define coff_mkobject pe_mkobject
82 1.1 skrll #define coff_mkobject_hook pe_mkobject_hook
83 1.1 skrll
84 1.1 skrll #ifdef COFF_IMAGE_WITH_PE
85 1.1 skrll /* This structure contains static variables used by the ILF code. */
86 1.1 skrll typedef asection * asection_ptr;
87 1.1 skrll
88 1.1 skrll typedef struct
89 1.1 skrll {
90 1.1 skrll bfd * abfd;
91 1.1 skrll bfd_byte * data;
92 1.1 skrll struct bfd_in_memory * bim;
93 1.1.1.6 christos unsigned short magic;
94 1.1 skrll
95 1.1 skrll arelent * reltab;
96 1.1.1.6 christos unsigned int relcount;
97 1.1 skrll
98 1.1.1.6 christos coff_symbol_type * sym_cache;
99 1.1.1.6 christos coff_symbol_type * sym_ptr;
100 1.1.1.6 christos unsigned int sym_index;
101 1.1 skrll
102 1.1.1.6 christos unsigned int * sym_table;
103 1.1.1.6 christos unsigned int * table_ptr;
104 1.1 skrll
105 1.1 skrll combined_entry_type * native_syms;
106 1.1 skrll combined_entry_type * native_ptr;
107 1.1 skrll
108 1.1 skrll coff_symbol_type ** sym_ptr_table;
109 1.1 skrll coff_symbol_type ** sym_ptr_ptr;
110 1.1 skrll
111 1.1 skrll unsigned int sec_index;
112 1.1 skrll
113 1.1.1.6 christos char * string_table;
114 1.1.1.6 christos char * string_ptr;
115 1.1 skrll char * end_string_ptr;
116 1.1 skrll
117 1.1.1.6 christos SYMENT * esym_table;
118 1.1.1.6 christos SYMENT * esym_ptr;
119 1.1 skrll
120 1.1 skrll struct internal_reloc * int_reltab;
121 1.1 skrll }
122 1.1 skrll pe_ILF_vars;
123 1.1 skrll #endif /* COFF_IMAGE_WITH_PE */
124 1.1.1.4 christos
125 1.1.1.4 christos const bfd_target *coff_real_object_p
126 1.1.1.4 christos (bfd *, unsigned, struct internal_filehdr *, struct internal_aouthdr *);
127 1.1 skrll
128 1.1 skrll #ifndef NO_COFF_RELOCS
130 1.1 skrll static void
131 1.1 skrll coff_swap_reloc_in (bfd * abfd, void * src, void * dst)
132 1.1 skrll {
133 1.1 skrll RELOC *reloc_src = (RELOC *) src;
134 1.1 skrll struct internal_reloc *reloc_dst = (struct internal_reloc *) dst;
135 1.1 skrll
136 1.1 skrll reloc_dst->r_vaddr = H_GET_32 (abfd, reloc_src->r_vaddr);
137 1.1 skrll reloc_dst->r_symndx = H_GET_S32 (abfd, reloc_src->r_symndx);
138 1.1 skrll reloc_dst->r_type = H_GET_16 (abfd, reloc_src->r_type);
139 1.1 skrll #ifdef SWAP_IN_RELOC_OFFSET
140 1.1 skrll reloc_dst->r_offset = SWAP_IN_RELOC_OFFSET (abfd, reloc_src->r_offset);
141 1.1 skrll #endif
142 1.1 skrll }
143 1.1 skrll
144 1.1 skrll static unsigned int
145 1.1 skrll coff_swap_reloc_out (bfd * abfd, void * src, void * dst)
146 1.1 skrll {
147 1.1 skrll struct internal_reloc *reloc_src = (struct internal_reloc *) src;
148 1.1 skrll struct external_reloc *reloc_dst = (struct external_reloc *) dst;
149 1.1 skrll
150 1.1 skrll H_PUT_32 (abfd, reloc_src->r_vaddr, reloc_dst->r_vaddr);
151 1.1 skrll H_PUT_32 (abfd, reloc_src->r_symndx, reloc_dst->r_symndx);
152 1.1 skrll H_PUT_16 (abfd, reloc_src->r_type, reloc_dst->r_type);
153 1.1.1.4 christos
154 1.1 skrll #ifdef SWAP_OUT_RELOC_OFFSET
155 1.1 skrll SWAP_OUT_RELOC_OFFSET (abfd, reloc_src->r_offset, reloc_dst->r_offset);
156 1.1 skrll #endif
157 1.1 skrll #ifdef SWAP_OUT_RELOC_EXTRA
158 1.1 skrll SWAP_OUT_RELOC_EXTRA (abfd, reloc_src, reloc_dst);
159 1.1 skrll #endif
160 1.1 skrll return RELSZ;
161 1.1 skrll }
162 1.1 skrll #endif /* not NO_COFF_RELOCS */
163 1.1.1.4 christos
164 1.1.1.4 christos #ifdef COFF_IMAGE_WITH_PE
165 1.1.1.4 christos #undef FILHDR
166 1.1.1.4 christos #define FILHDR struct external_PEI_IMAGE_hdr
167 1.1.1.4 christos #endif
168 1.1 skrll
169 1.1 skrll static void
170 1.1 skrll coff_swap_filehdr_in (bfd * abfd, void * src, void * dst)
171 1.1 skrll {
172 1.1 skrll FILHDR *filehdr_src = (FILHDR *) src;
173 1.1 skrll struct internal_filehdr *filehdr_dst = (struct internal_filehdr *) dst;
174 1.1 skrll
175 1.1 skrll filehdr_dst->f_magic = H_GET_16 (abfd, filehdr_src->f_magic);
176 1.1 skrll filehdr_dst->f_nscns = H_GET_16 (abfd, filehdr_src->f_nscns);
177 1.1 skrll filehdr_dst->f_timdat = H_GET_32 (abfd, filehdr_src->f_timdat);
178 1.1 skrll filehdr_dst->f_nsyms = H_GET_32 (abfd, filehdr_src->f_nsyms);
179 1.1 skrll filehdr_dst->f_flags = H_GET_16 (abfd, filehdr_src->f_flags);
180 1.1 skrll filehdr_dst->f_symptr = H_GET_32 (abfd, filehdr_src->f_symptr);
181 1.1 skrll
182 1.1 skrll /* Other people's tools sometimes generate headers with an nsyms but
183 1.1 skrll a zero symptr. */
184 1.1 skrll if (filehdr_dst->f_nsyms != 0 && filehdr_dst->f_symptr == 0)
185 1.1 skrll {
186 1.1 skrll filehdr_dst->f_nsyms = 0;
187 1.1 skrll filehdr_dst->f_flags |= F_LSYMS;
188 1.1 skrll }
189 1.1 skrll
190 1.1 skrll filehdr_dst->f_opthdr = H_GET_16 (abfd, filehdr_src-> f_opthdr);
191 1.1 skrll }
192 1.1 skrll
193 1.1 skrll #ifdef COFF_IMAGE_WITH_PE
194 1.1 skrll # define coff_swap_filehdr_out _bfd_XXi_only_swap_filehdr_out
195 1.1 skrll #elif defined COFF_WITH_pex64
196 1.1 skrll # define coff_swap_filehdr_out _bfd_pex64_only_swap_filehdr_out
197 1.1 skrll #elif defined COFF_WITH_pep
198 1.1 skrll # define coff_swap_filehdr_out _bfd_pep_only_swap_filehdr_out
199 1.1 skrll #else
200 1.1 skrll # define coff_swap_filehdr_out _bfd_pe_only_swap_filehdr_out
201 1.1 skrll #endif
202 1.1 skrll
203 1.1 skrll static void
204 1.1 skrll coff_swap_scnhdr_in (bfd * abfd, void * ext, void * in)
205 1.1 skrll {
206 1.1 skrll SCNHDR *scnhdr_ext = (SCNHDR *) ext;
207 1.1 skrll struct internal_scnhdr *scnhdr_int = (struct internal_scnhdr *) in;
208 1.1 skrll
209 1.1 skrll memcpy (scnhdr_int->s_name, scnhdr_ext->s_name, sizeof (scnhdr_int->s_name));
210 1.1 skrll
211 1.1 skrll scnhdr_int->s_vaddr = GET_SCNHDR_VADDR (abfd, scnhdr_ext->s_vaddr);
212 1.1 skrll scnhdr_int->s_paddr = GET_SCNHDR_PADDR (abfd, scnhdr_ext->s_paddr);
213 1.1 skrll scnhdr_int->s_size = GET_SCNHDR_SIZE (abfd, scnhdr_ext->s_size);
214 1.1 skrll scnhdr_int->s_scnptr = GET_SCNHDR_SCNPTR (abfd, scnhdr_ext->s_scnptr);
215 1.1 skrll scnhdr_int->s_relptr = GET_SCNHDR_RELPTR (abfd, scnhdr_ext->s_relptr);
216 1.1 skrll scnhdr_int->s_lnnoptr = GET_SCNHDR_LNNOPTR (abfd, scnhdr_ext->s_lnnoptr);
217 1.1 skrll scnhdr_int->s_flags = H_GET_32 (abfd, scnhdr_ext->s_flags);
218 1.1 skrll
219 1.1 skrll /* MS handles overflow of line numbers by carrying into the reloc
220 1.1 skrll field (it appears). Since it's supposed to be zero for PE
221 1.1 skrll *IMAGE* format, that's safe. This is still a bit iffy. */
222 1.1 skrll #ifdef COFF_IMAGE_WITH_PE
223 1.1 skrll scnhdr_int->s_nlnno = (H_GET_16 (abfd, scnhdr_ext->s_nlnno)
224 1.1 skrll + (H_GET_16 (abfd, scnhdr_ext->s_nreloc) << 16));
225 1.1 skrll scnhdr_int->s_nreloc = 0;
226 1.1 skrll #else
227 1.1 skrll scnhdr_int->s_nreloc = H_GET_16 (abfd, scnhdr_ext->s_nreloc);
228 1.1 skrll scnhdr_int->s_nlnno = H_GET_16 (abfd, scnhdr_ext->s_nlnno);
229 1.1 skrll #endif
230 1.1 skrll
231 1.1 skrll if (scnhdr_int->s_vaddr != 0)
232 1.1 skrll {
233 1.1 skrll scnhdr_int->s_vaddr += pe_data (abfd)->pe_opthdr.ImageBase;
234 1.1 skrll /* Do not cut upper 32-bits for 64-bit vma. */
235 1.1 skrll #ifndef COFF_WITH_pex64
236 1.1 skrll scnhdr_int->s_vaddr &= 0xffffffff;
237 1.1 skrll #endif
238 1.1 skrll }
239 1.1 skrll
240 1.1 skrll #ifndef COFF_NO_HACK_SCNHDR_SIZE
241 1.1 skrll /* If this section holds uninitialized data and is from an object file
242 1.1 skrll or from an executable image that has not initialized the field,
243 1.1 skrll or if the image is an executable file and the physical size is padded,
244 1.1 skrll use the virtual size (stored in s_paddr) instead. */
245 1.1 skrll if (scnhdr_int->s_paddr > 0
246 1.1.1.2 christos && (((scnhdr_int->s_flags & IMAGE_SCN_CNT_UNINITIALIZED_DATA) != 0
247 1.1.1.6 christos && (! bfd_pei_p (abfd) || scnhdr_int->s_size == 0))
248 1.1 skrll || (bfd_pei_p (abfd) && (scnhdr_int->s_size > scnhdr_int->s_paddr))))
249 1.1 skrll /* This code used to set scnhdr_int->s_paddr to 0. However,
250 1.1 skrll coff_set_alignment_hook stores s_paddr in virt_size, which
251 1.1 skrll only works if it correctly holds the virtual size of the
252 1.1 skrll section. */
253 1.1 skrll scnhdr_int->s_size = scnhdr_int->s_paddr;
254 1.1 skrll #endif
255 1.1 skrll }
256 1.1 skrll
257 1.1 skrll static bfd_boolean
258 1.1 skrll pe_mkobject (bfd * abfd)
259 1.1 skrll {
260 1.1 skrll pe_data_type *pe;
261 1.1 skrll bfd_size_type amt = sizeof (pe_data_type);
262 1.1 skrll
263 1.1 skrll abfd->tdata.pe_obj_data = (struct pe_tdata *) bfd_zalloc (abfd, amt);
264 1.1 skrll
265 1.1 skrll if (abfd->tdata.pe_obj_data == 0)
266 1.1 skrll return FALSE;
267 1.1 skrll
268 1.1 skrll pe = pe_data (abfd);
269 1.1 skrll
270 1.1 skrll pe->coff.pe = 1;
271 1.1 skrll
272 1.1 skrll /* in_reloc_p is architecture dependent. */
273 1.1 skrll pe->in_reloc_p = in_reloc_p;
274 1.1.1.4 christos
275 1.1 skrll memset (& pe->pe_opthdr, 0, sizeof pe->pe_opthdr);
276 1.1 skrll return TRUE;
277 1.1 skrll }
278 1.1 skrll
279 1.1 skrll /* Create the COFF backend specific information. */
280 1.1 skrll
281 1.1 skrll static void *
282 1.1 skrll pe_mkobject_hook (bfd * abfd,
283 1.1 skrll void * filehdr,
284 1.1 skrll void * aouthdr ATTRIBUTE_UNUSED)
285 1.1 skrll {
286 1.1 skrll struct internal_filehdr *internal_f = (struct internal_filehdr *) filehdr;
287 1.1 skrll pe_data_type *pe;
288 1.1 skrll
289 1.1 skrll if (! pe_mkobject (abfd))
290 1.1 skrll return NULL;
291 1.1 skrll
292 1.1 skrll pe = pe_data (abfd);
293 1.1 skrll pe->coff.sym_filepos = internal_f->f_symptr;
294 1.1 skrll /* These members communicate important constants about the symbol
295 1.1 skrll table to GDB's symbol-reading code. These `constants'
296 1.1 skrll unfortunately vary among coff implementations... */
297 1.1 skrll pe->coff.local_n_btmask = N_BTMASK;
298 1.1 skrll pe->coff.local_n_btshft = N_BTSHFT;
299 1.1 skrll pe->coff.local_n_tmask = N_TMASK;
300 1.1 skrll pe->coff.local_n_tshift = N_TSHIFT;
301 1.1 skrll pe->coff.local_symesz = SYMESZ;
302 1.1 skrll pe->coff.local_auxesz = AUXESZ;
303 1.1 skrll pe->coff.local_linesz = LINESZ;
304 1.1 skrll
305 1.1 skrll pe->coff.timestamp = internal_f->f_timdat;
306 1.1 skrll
307 1.1 skrll obj_raw_syment_count (abfd) =
308 1.1 skrll obj_conv_table_size (abfd) =
309 1.1 skrll internal_f->f_nsyms;
310 1.1 skrll
311 1.1 skrll pe->real_flags = internal_f->f_flags;
312 1.1 skrll
313 1.1 skrll if ((internal_f->f_flags & F_DLL) != 0)
314 1.1 skrll pe->dll = 1;
315 1.1 skrll
316 1.1 skrll if ((internal_f->f_flags & IMAGE_FILE_DEBUG_STRIPPED) == 0)
317 1.1 skrll abfd->flags |= HAS_DEBUG;
318 1.1 skrll
319 1.1 skrll #ifdef COFF_IMAGE_WITH_PE
320 1.1 skrll if (aouthdr)
321 1.1 skrll pe->pe_opthdr = ((struct internal_aouthdr *) aouthdr)->pe;
322 1.1 skrll #endif
323 1.1 skrll
324 1.1 skrll #ifdef ARM
325 1.1 skrll if (! _bfd_coff_arm_set_private_flags (abfd, internal_f->f_flags))
326 1.1 skrll coff_data (abfd) ->flags = 0;
327 1.1 skrll #endif
328 1.1 skrll
329 1.1 skrll return (void *) pe;
330 1.1 skrll }
331 1.1 skrll
332 1.1 skrll static bfd_boolean
333 1.1 skrll pe_print_private_bfd_data (bfd *abfd, void * vfile)
334 1.1 skrll {
335 1.1 skrll FILE *file = (FILE *) vfile;
336 1.1 skrll
337 1.1 skrll if (!_bfd_XX_print_private_bfd_data_common (abfd, vfile))
338 1.1 skrll return FALSE;
339 1.1 skrll
340 1.1 skrll if (pe_saved_coff_bfd_print_private_bfd_data == NULL)
341 1.1 skrll return TRUE;
342 1.1 skrll
343 1.1 skrll fputc ('\n', file);
344 1.1 skrll
345 1.1 skrll return pe_saved_coff_bfd_print_private_bfd_data (abfd, vfile);
346 1.1 skrll }
347 1.1 skrll
348 1.1 skrll /* Copy any private info we understand from the input bfd
349 1.1 skrll to the output bfd. */
350 1.1 skrll
351 1.1 skrll static bfd_boolean
352 1.1 skrll pe_bfd_copy_private_bfd_data (bfd *ibfd, bfd *obfd)
353 1.1 skrll {
354 1.1 skrll /* PR binutils/716: Copy the large address aware flag.
355 1.1 skrll XXX: Should we be copying other flags or other fields in the pe_data()
356 1.1 skrll structure ? */
357 1.1 skrll if (pe_data (obfd) != NULL
358 1.1 skrll && pe_data (ibfd) != NULL
359 1.1 skrll && pe_data (ibfd)->real_flags & IMAGE_FILE_LARGE_ADDRESS_AWARE)
360 1.1.1.4 christos pe_data (obfd)->real_flags |= IMAGE_FILE_LARGE_ADDRESS_AWARE;
361 1.1 skrll
362 1.1 skrll if (!_bfd_XX_bfd_copy_private_bfd_data_common (ibfd, obfd))
363 1.1 skrll return FALSE;
364 1.1 skrll
365 1.1 skrll if (pe_saved_coff_bfd_copy_private_bfd_data)
366 1.1 skrll return pe_saved_coff_bfd_copy_private_bfd_data (ibfd, obfd);
367 1.1 skrll
368 1.1 skrll return TRUE;
369 1.1 skrll }
370 1.1 skrll
371 1.1 skrll #define coff_bfd_copy_private_section_data \
372 1.1 skrll _bfd_XX_bfd_copy_private_section_data
373 1.1 skrll
374 1.1 skrll #define coff_get_symbol_info _bfd_XX_get_symbol_info
375 1.1 skrll
376 1.1 skrll #ifdef COFF_IMAGE_WITH_PE
377 1.1 skrll
378 1.1 skrll /* Code to handle Microsoft's Image Library Format.
380 1.1 skrll Also known as LINK6 format.
381 1.1 skrll Documentation about this format can be found at:
382 1.1 skrll
383 1.1 skrll http://msdn.microsoft.com/library/specs/pecoff_section8.htm */
384 1.1 skrll
385 1.1 skrll /* The following constants specify the sizes of the various data
386 1.1 skrll structures that we have to create in order to build a bfd describing
387 1.1 skrll an ILF object file. The final "+ 1" in the definitions of SIZEOF_IDATA6
388 1.1 skrll and SIZEOF_IDATA7 below is to allow for the possibility that we might
389 1.1 skrll need a padding byte in order to ensure 16 bit alignment for the section's
390 1.1 skrll contents.
391 1.1 skrll
392 1.1 skrll The value for SIZEOF_ILF_STRINGS is computed as follows:
393 1.1 skrll
394 1.1 skrll There will be NUM_ILF_SECTIONS section symbols. Allow 9 characters
395 1.1 skrll per symbol for their names (longest section name is .idata$x).
396 1.1 skrll
397 1.1 skrll There will be two symbols for the imported value, one the symbol name
398 1.1 skrll and one with _imp__ prefixed. Allowing for the terminating nul's this
399 1.1 skrll is strlen (symbol_name) * 2 + 8 + 21 + strlen (source_dll).
400 1.1 skrll
401 1.1 skrll The strings in the string table must start STRING__SIZE_SIZE bytes into
402 1.1 skrll the table in order to for the string lookup code in coffgen/coffcode to
403 1.1.1.6 christos work. */
404 1.1.1.6 christos #define NUM_ILF_RELOCS 8
405 1.1 skrll #define NUM_ILF_SECTIONS 6
406 1.1 skrll #define NUM_ILF_SYMS (2 + NUM_ILF_SECTIONS)
407 1.1 skrll
408 1.1 skrll #define SIZEOF_ILF_SYMS (NUM_ILF_SYMS * sizeof (* vars.sym_cache))
409 1.1 skrll #define SIZEOF_ILF_SYM_TABLE (NUM_ILF_SYMS * sizeof (* vars.sym_table))
410 1.1 skrll #define SIZEOF_ILF_NATIVE_SYMS (NUM_ILF_SYMS * sizeof (* vars.native_syms))
411 1.1 skrll #define SIZEOF_ILF_SYM_PTR_TABLE (NUM_ILF_SYMS * sizeof (* vars.sym_ptr_table))
412 1.1 skrll #define SIZEOF_ILF_EXT_SYMS (NUM_ILF_SYMS * sizeof (* vars.esym_table))
413 1.1 skrll #define SIZEOF_ILF_RELOCS (NUM_ILF_RELOCS * sizeof (* vars.reltab))
414 1.1 skrll #define SIZEOF_ILF_INT_RELOCS (NUM_ILF_RELOCS * sizeof (* vars.int_reltab))
415 1.1 skrll #define SIZEOF_ILF_STRINGS (strlen (symbol_name) * 2 + 8 \
416 1.1 skrll + 21 + strlen (source_dll) \
417 1.1 skrll + NUM_ILF_SECTIONS * 9 \
418 1.1 skrll + STRING_SIZE_SIZE)
419 1.1 skrll #define SIZEOF_IDATA2 (5 * 4)
420 1.1 skrll
421 1.1 skrll /* For PEx64 idata4 & 5 have thumb size of 8 bytes. */
422 1.1 skrll #ifdef COFF_WITH_pex64
423 1.1 skrll #define SIZEOF_IDATA4 (2 * 4)
424 1.1 skrll #define SIZEOF_IDATA5 (2 * 4)
425 1.1 skrll #else
426 1.1 skrll #define SIZEOF_IDATA4 (1 * 4)
427 1.1 skrll #define SIZEOF_IDATA5 (1 * 4)
428 1.1 skrll #endif
429 1.1 skrll
430 1.1.1.6 christos #define SIZEOF_IDATA6 (2 + strlen (symbol_name) + 1 + 1)
431 1.1 skrll #define SIZEOF_IDATA7 (strlen (source_dll) + 1 + 1)
432 1.1 skrll #define SIZEOF_ILF_SECTIONS (NUM_ILF_SECTIONS * sizeof (struct coff_section_tdata))
433 1.1 skrll
434 1.1 skrll #define ILF_DATA_SIZE \
435 1.1 skrll + SIZEOF_ILF_SYMS \
436 1.1 skrll + SIZEOF_ILF_SYM_TABLE \
437 1.1 skrll + SIZEOF_ILF_NATIVE_SYMS \
438 1.1 skrll + SIZEOF_ILF_SYM_PTR_TABLE \
439 1.1 skrll + SIZEOF_ILF_EXT_SYMS \
440 1.1 skrll + SIZEOF_ILF_RELOCS \
441 1.1 skrll + SIZEOF_ILF_INT_RELOCS \
442 1.1 skrll + SIZEOF_ILF_STRINGS \
443 1.1 skrll + SIZEOF_IDATA2 \
444 1.1 skrll + SIZEOF_IDATA4 \
445 1.1 skrll + SIZEOF_IDATA5 \
446 1.1 skrll + SIZEOF_IDATA6 \
447 1.1 skrll + SIZEOF_IDATA7 \
448 1.1 skrll + SIZEOF_ILF_SECTIONS \
449 1.1 skrll + MAX_TEXT_SECTION_SIZE
450 1.1 skrll
451 1.1 skrll /* Create an empty relocation against the given symbol. */
452 1.1.1.6 christos
453 1.1.1.6 christos static void
454 1.1.1.6 christos pe_ILF_make_a_symbol_reloc (pe_ILF_vars * vars,
455 1.1.1.6 christos bfd_vma address,
456 1.1.1.6 christos bfd_reloc_code_real_type reloc,
457 1.1 skrll struct bfd_symbol ** sym,
458 1.1 skrll unsigned int sym_index)
459 1.1 skrll {
460 1.1 skrll arelent * entry;
461 1.1 skrll struct internal_reloc * internal;
462 1.1 skrll
463 1.1 skrll entry = vars->reltab + vars->relcount;
464 1.1 skrll internal = vars->int_reltab + vars->relcount;
465 1.1 skrll
466 1.1 skrll entry->address = address;
467 1.1 skrll entry->addend = 0;
468 1.1 skrll entry->howto = bfd_reloc_type_lookup (vars->abfd, reloc);
469 1.1 skrll entry->sym_ptr_ptr = sym;
470 1.1 skrll
471 1.1 skrll internal->r_vaddr = address;
472 1.1 skrll internal->r_symndx = sym_index;
473 1.1 skrll internal->r_type = entry->howto->type;
474 1.1 skrll
475 1.1 skrll vars->relcount ++;
476 1.1 skrll
477 1.1 skrll BFD_ASSERT (vars->relcount <= NUM_ILF_RELOCS);
478 1.1 skrll }
479 1.1 skrll
480 1.1 skrll /* Create an empty relocation against the given section. */
481 1.1.1.6 christos
482 1.1.1.6 christos static void
483 1.1 skrll pe_ILF_make_a_reloc (pe_ILF_vars * vars,
484 1.1.1.6 christos bfd_vma address,
485 1.1 skrll bfd_reloc_code_real_type reloc,
486 1.1 skrll asection_ptr sec)
487 1.1 skrll {
488 1.1 skrll pe_ILF_make_a_symbol_reloc (vars, address, reloc, sec->symbol_ptr_ptr,
489 1.1 skrll coff_section_data (vars->abfd, sec)->i);
490 1.1 skrll }
491 1.1 skrll
492 1.1 skrll /* Move the queued relocs into the given section. */
493 1.1 skrll
494 1.1 skrll static void
495 1.1 skrll pe_ILF_save_relocs (pe_ILF_vars * vars,
496 1.1 skrll asection_ptr sec)
497 1.1 skrll {
498 1.1 skrll /* Make sure that there is somewhere to store the internal relocs. */
499 1.1 skrll if (coff_section_data (vars->abfd, sec) == NULL)
500 1.1 skrll /* We should probably return an error indication here. */
501 1.1 skrll abort ();
502 1.1 skrll
503 1.1 skrll coff_section_data (vars->abfd, sec)->relocs = vars->int_reltab;
504 1.1 skrll coff_section_data (vars->abfd, sec)->keep_relocs = TRUE;
505 1.1 skrll
506 1.1 skrll sec->relocation = vars->reltab;
507 1.1 skrll sec->reloc_count = vars->relcount;
508 1.1 skrll sec->flags |= SEC_RELOC;
509 1.1 skrll
510 1.1 skrll vars->reltab += vars->relcount;
511 1.1 skrll vars->int_reltab += vars->relcount;
512 1.1 skrll vars->relcount = 0;
513 1.1 skrll
514 1.1 skrll BFD_ASSERT ((bfd_byte *) vars->int_reltab < (bfd_byte *) vars->string_table);
515 1.1 skrll }
516 1.1 skrll
517 1.1 skrll /* Create a global symbol and add it to the relevant tables. */
518 1.1 skrll
519 1.1 skrll static void
520 1.1 skrll pe_ILF_make_a_symbol (pe_ILF_vars * vars,
521 1.1 skrll const char * prefix,
522 1.1 skrll const char * symbol_name,
523 1.1 skrll asection_ptr section,
524 1.1 skrll flagword extra_flags)
525 1.1 skrll {
526 1.1 skrll coff_symbol_type * sym;
527 1.1 skrll combined_entry_type * ent;
528 1.1 skrll SYMENT * esym;
529 1.1 skrll unsigned short sclass;
530 1.1 skrll
531 1.1 skrll if (extra_flags & BSF_LOCAL)
532 1.1 skrll sclass = C_STAT;
533 1.1 skrll else
534 1.1 skrll sclass = C_EXT;
535 1.1 skrll
536 1.1 skrll #ifdef THUMBPEMAGIC
537 1.1 skrll if (vars->magic == THUMBPEMAGIC)
538 1.1 skrll {
539 1.1 skrll if (extra_flags & BSF_FUNCTION)
540 1.1 skrll sclass = C_THUMBEXTFUNC;
541 1.1 skrll else if (extra_flags & BSF_LOCAL)
542 1.1 skrll sclass = C_THUMBSTAT;
543 1.1 skrll else
544 1.1 skrll sclass = C_THUMBEXT;
545 1.1 skrll }
546 1.1 skrll #endif
547 1.1 skrll
548 1.1 skrll BFD_ASSERT (vars->sym_index < NUM_ILF_SYMS);
549 1.1 skrll
550 1.1 skrll sym = vars->sym_ptr;
551 1.1 skrll ent = vars->native_ptr;
552 1.1 skrll esym = vars->esym_ptr;
553 1.1 skrll
554 1.1 skrll /* Copy the symbol's name into the string table. */
555 1.1 skrll sprintf (vars->string_ptr, "%s%s", prefix, symbol_name);
556 1.1.1.3 christos
557 1.1 skrll if (section == NULL)
558 1.1 skrll section = bfd_und_section_ptr;
559 1.1 skrll
560 1.1 skrll /* Initialise the external symbol. */
561 1.1 skrll H_PUT_32 (vars->abfd, vars->string_ptr - vars->string_table,
562 1.1 skrll esym->e.e.e_offset);
563 1.1 skrll H_PUT_16 (vars->abfd, section->target_index, esym->e_scnum);
564 1.1 skrll esym->e_sclass[0] = sclass;
565 1.1 skrll
566 1.1 skrll /* The following initialisations are unnecessary - the memory is
567 1.1 skrll zero initialised. They are just kept here as reminders. */
568 1.1.1.6 christos
569 1.1.1.6 christos /* Initialise the internal symbol structure. */
570 1.1 skrll ent->u.syment.n_sclass = sclass;
571 1.1.1.4 christos ent->u.syment.n_scnum = section->target_index;
572 1.1 skrll ent->u.syment._n._n_n._n_offset = (bfd_hostptr_t) sym;
573 1.1 skrll ent->is_sym = TRUE;
574 1.1 skrll
575 1.1 skrll sym->symbol.the_bfd = vars->abfd;
576 1.1 skrll sym->symbol.name = vars->string_ptr;
577 1.1.1.6 christos sym->symbol.flags = BSF_EXPORT | BSF_GLOBAL | extra_flags;
578 1.1 skrll sym->symbol.section = section;
579 1.1 skrll sym->native = ent;
580 1.1 skrll
581 1.1 skrll * vars->table_ptr = vars->sym_index;
582 1.1 skrll * vars->sym_ptr_ptr = sym;
583 1.1 skrll
584 1.1 skrll /* Adjust pointers for the next symbol. */
585 1.1 skrll vars->sym_index ++;
586 1.1 skrll vars->sym_ptr ++;
587 1.1 skrll vars->sym_ptr_ptr ++;
588 1.1 skrll vars->table_ptr ++;
589 1.1 skrll vars->native_ptr ++;
590 1.1 skrll vars->esym_ptr ++;
591 1.1 skrll vars->string_ptr += strlen (symbol_name) + strlen (prefix) + 1;
592 1.1 skrll
593 1.1 skrll BFD_ASSERT (vars->string_ptr < vars->end_string_ptr);
594 1.1 skrll }
595 1.1 skrll
596 1.1 skrll /* Create a section. */
597 1.1 skrll
598 1.1 skrll static asection_ptr
599 1.1 skrll pe_ILF_make_a_section (pe_ILF_vars * vars,
600 1.1 skrll const char * name,
601 1.1 skrll unsigned int size,
602 1.1 skrll flagword extra_flags)
603 1.1 skrll {
604 1.1 skrll asection_ptr sec;
605 1.1 skrll flagword flags;
606 1.1 skrll
607 1.1 skrll sec = bfd_make_section_old_way (vars->abfd, name);
608 1.1 skrll if (sec == NULL)
609 1.1 skrll return NULL;
610 1.1 skrll
611 1.1 skrll flags = SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_KEEP | SEC_IN_MEMORY;
612 1.1 skrll
613 1.1.1.4 christos bfd_set_section_flags (vars->abfd, sec, flags | extra_flags);
614 1.1 skrll
615 1.1 skrll (void) bfd_set_section_alignment (vars->abfd, sec, 2);
616 1.1 skrll
617 1.1 skrll /* Check that we will not run out of space. */
618 1.1 skrll BFD_ASSERT (vars->data + size < vars->bim->buffer + vars->bim->size);
619 1.1 skrll
620 1.1 skrll /* Set the section size and contents. The actual
621 1.1 skrll contents are filled in by our parent. */
622 1.1 skrll bfd_set_section_size (vars->abfd, sec, (bfd_size_type) size);
623 1.1 skrll sec->contents = vars->data;
624 1.1 skrll sec->target_index = vars->sec_index ++;
625 1.1 skrll
626 1.1 skrll /* Advance data pointer in the vars structure. */
627 1.1 skrll vars->data += size;
628 1.1 skrll
629 1.1 skrll /* Skip the padding byte if it was not needed.
630 1.1 skrll The logic here is that if the string length is odd,
631 1.1 skrll then the entire string length, including the null byte,
632 1.1 skrll is even and so the extra, padding byte, is not needed. */
633 1.1 skrll if (size & 1)
634 1.1.1.4 christos vars->data --;
635 1.1.1.4 christos
636 1.1.1.4 christos # if (GCC_VERSION >= 3000)
637 1.1.1.4 christos /* PR 18758: See note in pe_ILF_buid_a_bfd. We must make sure that we
638 1.1.1.4 christos preserve host alignment requirements. We test 'size' rather than
639 1.1.1.4 christos vars.data as we cannot perform binary arithmetic on pointers. We assume
640 1.1.1.4 christos that vars.data was sufficiently aligned upon entry to this function.
641 1.1.1.4 christos The BFD_ASSERTs in this functions will warn us if we run out of room,
642 1.1.1.4 christos but we should already have enough padding built in to ILF_DATA_SIZE. */
643 1.1.1.4 christos {
644 1.1.1.4 christos unsigned int alignment = __alignof__ (struct coff_section_tdata);
645 1.1.1.4 christos
646 1.1.1.4 christos if (size & (alignment - 1))
647 1.1.1.4 christos vars->data += alignment - (size & (alignment - 1));
648 1.1 skrll }
649 1.1 skrll #endif
650 1.1 skrll /* Create a coff_section_tdata structure for our use. */
651 1.1 skrll sec->used_by_bfd = (struct coff_section_tdata *) vars->data;
652 1.1 skrll vars->data += sizeof (struct coff_section_tdata);
653 1.1 skrll
654 1.1 skrll BFD_ASSERT (vars->data <= vars->bim->buffer + vars->bim->size);
655 1.1 skrll
656 1.1 skrll /* Create a symbol to refer to this section. */
657 1.1 skrll pe_ILF_make_a_symbol (vars, "", name, sec, BSF_LOCAL);
658 1.1 skrll
659 1.1 skrll /* Cache the index to the symbol in the coff_section_data structure. */
660 1.1 skrll coff_section_data (vars->abfd, sec)->i = vars->sym_index - 1;
661 1.1 skrll
662 1.1 skrll return sec;
663 1.1 skrll }
664 1.1 skrll
665 1.1 skrll /* This structure contains the code that goes into the .text section
666 1.1 skrll in order to perform a jump into the DLL lookup table. The entries
667 1.1 skrll in the table are index by the magic number used to represent the
668 1.1 skrll machine type in the PE file. The contents of the data[] arrays in
669 1.1 skrll these entries are stolen from the jtab[] arrays in ld/pe-dll.c.
670 1.1 skrll The SIZE field says how many bytes in the DATA array are actually
671 1.1 skrll used. The OFFSET field says where in the data array the address
672 1.1 skrll of the .idata$5 section should be placed. */
673 1.1 skrll #define MAX_TEXT_SECTION_SIZE 32
674 1.1 skrll
675 1.1 skrll typedef struct
676 1.1 skrll {
677 1.1 skrll unsigned short magic;
678 1.1 skrll unsigned char data[MAX_TEXT_SECTION_SIZE];
679 1.1 skrll unsigned int size;
680 1.1 skrll unsigned int offset;
681 1.1 skrll }
682 1.1 skrll jump_table;
683 1.1 skrll
684 1.1 skrll static jump_table jtab[] =
685 1.1 skrll {
686 1.1 skrll #ifdef I386MAGIC
687 1.1 skrll { I386MAGIC,
688 1.1 skrll { 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x90, 0x90 },
689 1.1 skrll 8, 2
690 1.1 skrll },
691 1.1 skrll #endif
692 1.1 skrll
693 1.1 skrll #ifdef AMD64MAGIC
694 1.1 skrll { AMD64MAGIC,
695 1.1 skrll { 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x90, 0x90 },
696 1.1 skrll 8, 2
697 1.1 skrll },
698 1.1 skrll #endif
699 1.1 skrll
700 1.1 skrll #ifdef MC68MAGIC
701 1.1 skrll { MC68MAGIC,
702 1.1 skrll { /* XXX fill me in */ },
703 1.1 skrll 0, 0
704 1.1 skrll },
705 1.1 skrll #endif
706 1.1 skrll
707 1.1 skrll #ifdef MIPS_ARCH_MAGIC_WINCE
708 1.1 skrll { MIPS_ARCH_MAGIC_WINCE,
709 1.1 skrll { 0x00, 0x00, 0x08, 0x3c, 0x00, 0x00, 0x08, 0x8d,
710 1.1 skrll 0x08, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00 },
711 1.1 skrll 16, 0
712 1.1 skrll },
713 1.1 skrll #endif
714 1.1 skrll
715 1.1 skrll #ifdef SH_ARCH_MAGIC_WINCE
716 1.1 skrll { SH_ARCH_MAGIC_WINCE,
717 1.1 skrll { 0x01, 0xd0, 0x02, 0x60, 0x2b, 0x40,
718 1.1 skrll 0x09, 0x00, 0x00, 0x00, 0x00, 0x00 },
719 1.1 skrll 12, 8
720 1.1 skrll },
721 1.1 skrll #endif
722 1.1 skrll
723 1.1 skrll #ifdef ARMPEMAGIC
724 1.1 skrll { ARMPEMAGIC,
725 1.1 skrll { 0x00, 0xc0, 0x9f, 0xe5, 0x00, 0xf0,
726 1.1 skrll 0x9c, 0xe5, 0x00, 0x00, 0x00, 0x00},
727 1.1 skrll 12, 8
728 1.1 skrll },
729 1.1 skrll #endif
730 1.1 skrll
731 1.1 skrll #ifdef THUMBPEMAGIC
732 1.1 skrll { THUMBPEMAGIC,
733 1.1 skrll { 0x40, 0xb4, 0x02, 0x4e, 0x36, 0x68, 0xb4, 0x46,
734 1.1 skrll 0x40, 0xbc, 0x60, 0x47, 0x00, 0x00, 0x00, 0x00 },
735 1.1 skrll 16, 12
736 1.1 skrll },
737 1.1 skrll #endif
738 1.1 skrll { 0, { 0 }, 0, 0 }
739 1.1 skrll };
740 1.1 skrll
741 1.1 skrll #ifndef NUM_ENTRIES
742 1.1 skrll #define NUM_ENTRIES(a) (sizeof (a) / sizeof (a)[0])
743 1.1 skrll #endif
744 1.1 skrll
745 1.1 skrll /* Build a full BFD from the information supplied in a ILF object. */
746 1.1.1.6 christos
747 1.1 skrll static bfd_boolean
748 1.1.1.6 christos pe_ILF_build_a_bfd (bfd * abfd,
749 1.1.1.6 christos unsigned int magic,
750 1.1 skrll char * symbol_name,
751 1.1 skrll char * source_dll,
752 1.1 skrll unsigned int ordinal,
753 1.1.1.6 christos unsigned int types)
754 1.1.1.6 christos {
755 1.1 skrll bfd_byte * ptr;
756 1.1.1.6 christos pe_ILF_vars vars;
757 1.1.1.6 christos struct internal_filehdr internal_f;
758 1.1.1.6 christos unsigned int import_type;
759 1.1.1.6 christos unsigned int import_name_type;
760 1.1.1.6 christos asection_ptr id4, id5, id6 = NULL, text = NULL;
761 1.1 skrll coff_symbol_type ** imp_sym;
762 1.1 skrll unsigned int imp_index;
763 1.1 skrll
764 1.1 skrll /* Decode and verify the types field of the ILF structure. */
765 1.1 skrll import_type = types & 0x3;
766 1.1 skrll import_name_type = (types & 0x1c) >> 2;
767 1.1 skrll
768 1.1 skrll switch (import_type)
769 1.1 skrll {
770 1.1 skrll case IMPORT_CODE:
771 1.1 skrll case IMPORT_DATA:
772 1.1 skrll break;
773 1.1 skrll
774 1.1.1.6 christos case IMPORT_CONST:
775 1.1.1.7 christos /* XXX code yet to be written. */
776 1.1 skrll /* xgettext:c-format */
777 1.1 skrll _bfd_error_handler (_("%pB: unhandled import type; %x"),
778 1.1 skrll abfd, import_type);
779 1.1 skrll return FALSE;
780 1.1.1.6 christos
781 1.1.1.7 christos default:
782 1.1 skrll /* xgettext:c-format */
783 1.1 skrll _bfd_error_handler (_("%pB: unrecognized import type; %x"),
784 1.1 skrll abfd, import_type);
785 1.1 skrll return FALSE;
786 1.1 skrll }
787 1.1 skrll
788 1.1 skrll switch (import_name_type)
789 1.1 skrll {
790 1.1 skrll case IMPORT_ORDINAL:
791 1.1 skrll case IMPORT_NAME:
792 1.1 skrll case IMPORT_NAME_NOPREFIX:
793 1.1 skrll case IMPORT_NAME_UNDECORATE:
794 1.1 skrll break;
795 1.1.1.6 christos
796 1.1.1.7 christos default:
797 1.1 skrll /* xgettext:c-format */
798 1.1 skrll _bfd_error_handler (_("%pB: unrecognized import name type; %x"),
799 1.1 skrll abfd, import_name_type);
800 1.1 skrll return FALSE;
801 1.1 skrll }
802 1.1 skrll
803 1.1 skrll /* Initialise local variables.
804 1.1 skrll
805 1.1 skrll Note these are kept in a structure rather than being
806 1.1 skrll declared as statics since bfd frowns on global variables.
807 1.1 skrll
808 1.1.1.2 christos We are going to construct the contents of the BFD in memory,
809 1.1.1.2 christos so allocate all the space that we will need right now. */
810 1.1.1.2 christos vars.bim
811 1.1 skrll = (struct bfd_in_memory *) bfd_malloc ((bfd_size_type) sizeof (*vars.bim));
812 1.1 skrll if (vars.bim == NULL)
813 1.1.1.2 christos return FALSE;
814 1.1 skrll
815 1.1 skrll ptr = (bfd_byte *) bfd_zmalloc ((bfd_size_type) ILF_DATA_SIZE);
816 1.1.1.2 christos vars.bim->buffer = ptr;
817 1.1.1.2 christos vars.bim->size = ILF_DATA_SIZE;
818 1.1 skrll if (ptr == NULL)
819 1.1 skrll goto error_return;
820 1.1 skrll
821 1.1 skrll /* Initialise the pointers to regions of the memory and the
822 1.1 skrll other contents of the pe_ILF_vars structure as well. */
823 1.1 skrll vars.sym_cache = (coff_symbol_type *) ptr;
824 1.1 skrll vars.sym_ptr = (coff_symbol_type *) ptr;
825 1.1 skrll vars.sym_index = 0;
826 1.1 skrll ptr += SIZEOF_ILF_SYMS;
827 1.1 skrll
828 1.1 skrll vars.sym_table = (unsigned int *) ptr;
829 1.1 skrll vars.table_ptr = (unsigned int *) ptr;
830 1.1 skrll ptr += SIZEOF_ILF_SYM_TABLE;
831 1.1 skrll
832 1.1 skrll vars.native_syms = (combined_entry_type *) ptr;
833 1.1 skrll vars.native_ptr = (combined_entry_type *) ptr;
834 1.1 skrll ptr += SIZEOF_ILF_NATIVE_SYMS;
835 1.1 skrll
836 1.1 skrll vars.sym_ptr_table = (coff_symbol_type **) ptr;
837 1.1 skrll vars.sym_ptr_ptr = (coff_symbol_type **) ptr;
838 1.1 skrll ptr += SIZEOF_ILF_SYM_PTR_TABLE;
839 1.1 skrll
840 1.1 skrll vars.esym_table = (SYMENT *) ptr;
841 1.1 skrll vars.esym_ptr = (SYMENT *) ptr;
842 1.1 skrll ptr += SIZEOF_ILF_EXT_SYMS;
843 1.1 skrll
844 1.1 skrll vars.reltab = (arelent *) ptr;
845 1.1 skrll vars.relcount = 0;
846 1.1 skrll ptr += SIZEOF_ILF_RELOCS;
847 1.1 skrll
848 1.1 skrll vars.int_reltab = (struct internal_reloc *) ptr;
849 1.1 skrll ptr += SIZEOF_ILF_INT_RELOCS;
850 1.1 skrll
851 1.1 skrll vars.string_table = (char *) ptr;
852 1.1 skrll vars.string_ptr = (char *) ptr + STRING_SIZE_SIZE;
853 1.1 skrll ptr += SIZEOF_ILF_STRINGS;
854 1.1 skrll vars.end_string_ptr = (char *) ptr;
855 1.1 skrll
856 1.1.1.4 christos /* The remaining space in bim->buffer is used
857 1.1.1.4 christos by the pe_ILF_make_a_section() function. */
858 1.1.1.4 christos # if (GCC_VERSION >= 3000)
859 1.1.1.4 christos /* PR 18758: Make sure that the data area is sufficiently aligned for
860 1.1.1.4 christos pointers on the host. __alignof__ is a gcc extension, hence the test
861 1.1.1.4 christos above. For other compilers we will have to assume that the alignment is
862 1.1.1.4 christos unimportant, or else extra code can be added here and in
863 1.1.1.4 christos pe_ILF_make_a_section.
864 1.1.1.4 christos
865 1.1.1.4 christos Note - we cannot test 'ptr' directly as it is illegal to perform binary
866 1.1.1.4 christos arithmetic on pointers, but we know that the strings section is the only
867 1.1.1.4 christos one that might end on an unaligned boundary. */
868 1.1.1.4 christos {
869 1.1.1.4 christos unsigned int alignment = __alignof__ (char *);
870 1.1.1.4 christos
871 1.1.1.4 christos if (SIZEOF_ILF_STRINGS & (alignment - 1))
872 1.1.1.4 christos ptr += alignment - (SIZEOF_ILF_STRINGS & (alignment - 1));
873 1.1.1.4 christos }
874 1.1 skrll #endif
875 1.1 skrll
876 1.1 skrll vars.data = ptr;
877 1.1 skrll vars.abfd = abfd;
878 1.1 skrll vars.sec_index = 0;
879 1.1 skrll vars.magic = magic;
880 1.1 skrll
881 1.1 skrll /* Create the initial .idata$<n> sections:
882 1.1 skrll [.idata$2: Import Directory Table -- not needed]
883 1.1 skrll .idata$4: Import Lookup Table
884 1.1 skrll .idata$5: Import Address Table
885 1.1 skrll
886 1.1 skrll Note we do not create a .idata$3 section as this is
887 1.1 skrll created for us by the linker script. */
888 1.1 skrll id4 = pe_ILF_make_a_section (& vars, ".idata$4", SIZEOF_IDATA4, 0);
889 1.1.1.2 christos id5 = pe_ILF_make_a_section (& vars, ".idata$5", SIZEOF_IDATA5, 0);
890 1.1 skrll if (id4 == NULL || id5 == NULL)
891 1.1 skrll goto error_return;
892 1.1 skrll
893 1.1 skrll /* Fill in the contents of these sections. */
894 1.1 skrll if (import_name_type == IMPORT_ORDINAL)
895 1.1.1.6 christos {
896 1.1.1.6 christos if (ordinal == 0)
897 1.1 skrll /* See PR 20907 for a reproducer. */
898 1.1 skrll goto error_return;
899 1.1 skrll
900 1.1 skrll #ifdef COFF_WITH_pex64
901 1.1 skrll ((unsigned int *) id4->contents)[0] = ordinal;
902 1.1 skrll ((unsigned int *) id4->contents)[1] = 0x80000000;
903 1.1 skrll ((unsigned int *) id5->contents)[0] = ordinal;
904 1.1 skrll ((unsigned int *) id5->contents)[1] = 0x80000000;
905 1.1 skrll #else
906 1.1 skrll * (unsigned int *) id4->contents = ordinal | 0x80000000;
907 1.1 skrll * (unsigned int *) id5->contents = ordinal | 0x80000000;
908 1.1 skrll #endif
909 1.1 skrll }
910 1.1 skrll else
911 1.1 skrll {
912 1.1 skrll char * symbol;
913 1.1 skrll unsigned int len;
914 1.1 skrll
915 1.1 skrll /* Create .idata$6 - the Hint Name Table. */
916 1.1.1.2 christos id6 = pe_ILF_make_a_section (& vars, ".idata$6", SIZEOF_IDATA6, 0);
917 1.1 skrll if (id6 == NULL)
918 1.1 skrll goto error_return;
919 1.1 skrll
920 1.1 skrll /* If necessary, trim the import symbol name. */
921 1.1 skrll symbol = symbol_name;
922 1.1 skrll
923 1.1 skrll /* As used by MS compiler, '_', '@', and '?' are alternative
924 1.1 skrll forms of USER_LABEL_PREFIX, with '?' for c++ mangled names,
925 1.1 skrll '@' used for fastcall (in C), '_' everywhere else. Only one
926 1.1 skrll of these is used for a symbol. We strip this leading char for
927 1.1 skrll IMPORT_NAME_NOPREFIX and IMPORT_NAME_UNDECORATE as per the
928 1.1 skrll PE COFF 6.0 spec (section 8.3, Import Name Type). */
929 1.1 skrll
930 1.1 skrll if (import_name_type != IMPORT_NAME)
931 1.1.1.4 christos {
932 1.1.1.3 christos char c = symbol[0];
933 1.1.1.3 christos
934 1.1.1.3 christos /* Check that we don't remove for targets with empty
935 1.1.1.3 christos USER_LABEL_PREFIX the leading underscore. */
936 1.1 skrll if ((c == '_' && abfd->xvec->symbol_leading_char != 0)
937 1.1 skrll || c == '@' || c == '?')
938 1.1.1.4 christos symbol++;
939 1.1 skrll }
940 1.1 skrll
941 1.1 skrll len = strlen (symbol);
942 1.1 skrll if (import_name_type == IMPORT_NAME_UNDECORATE)
943 1.1 skrll {
944 1.1 skrll /* Truncate at the first '@'. */
945 1.1 skrll char *at = strchr (symbol, '@');
946 1.1 skrll
947 1.1 skrll if (at != NULL)
948 1.1 skrll len = at - symbol;
949 1.1 skrll }
950 1.1 skrll
951 1.1 skrll id6->contents[0] = ordinal & 0xff;
952 1.1 skrll id6->contents[1] = ordinal >> 8;
953 1.1 skrll
954 1.1 skrll memcpy ((char *) id6->contents + 2, symbol, len);
955 1.1 skrll id6->contents[len + 2] = '\0';
956 1.1 skrll }
957 1.1 skrll
958 1.1 skrll if (import_name_type != IMPORT_ORDINAL)
959 1.1 skrll {
960 1.1 skrll pe_ILF_make_a_reloc (&vars, (bfd_vma) 0, BFD_RELOC_RVA, id6);
961 1.1 skrll pe_ILF_save_relocs (&vars, id4);
962 1.1 skrll
963 1.1 skrll pe_ILF_make_a_reloc (&vars, (bfd_vma) 0, BFD_RELOC_RVA, id6);
964 1.1 skrll pe_ILF_save_relocs (&vars, id5);
965 1.1.1.5 christos }
966 1.1.1.5 christos
967 1.1.1.5 christos /* Create an import symbol. */
968 1.1.1.5 christos pe_ILF_make_a_symbol (& vars, "__imp_", symbol_name, id5, 0);
969 1.1.1.5 christos imp_sym = vars.sym_ptr_ptr - 1;
970 1.1 skrll imp_index = vars.sym_index - 1;
971 1.1 skrll
972 1.1 skrll /* Create extra sections depending upon the type of import we are dealing with. */
973 1.1 skrll switch (import_type)
974 1.1 skrll {
975 1.1 skrll int i;
976 1.1.1.5 christos
977 1.1.1.6 christos case IMPORT_CODE:
978 1.1 skrll /* CODE functions are special, in that they get a trampoline that
979 1.1 skrll jumps to the main import symbol. Create a .text section to hold it.
980 1.1 skrll First we need to look up its contents in the jump table. */
981 1.1 skrll for (i = NUM_ENTRIES (jtab); i--;)
982 1.1 skrll {
983 1.1 skrll if (jtab[i].size == 0)
984 1.1 skrll continue;
985 1.1 skrll if (jtab[i].magic == magic)
986 1.1 skrll break;
987 1.1 skrll }
988 1.1 skrll /* If we did not find a matching entry something is wrong. */
989 1.1 skrll if (i < 0)
990 1.1 skrll abort ();
991 1.1 skrll
992 1.1 skrll /* Create the .text section. */
993 1.1.1.2 christos text = pe_ILF_make_a_section (& vars, ".text", jtab[i].size, SEC_CODE);
994 1.1 skrll if (text == NULL)
995 1.1 skrll goto error_return;
996 1.1 skrll
997 1.1 skrll /* Copy in the jump code. */
998 1.1 skrll memcpy (text->contents, jtab[i].data, jtab[i].size);
999 1.1 skrll
1000 1.1 skrll /* Create a reloc for the data in the text section. */
1001 1.1 skrll #ifdef MIPS_ARCH_MAGIC_WINCE
1002 1.1 skrll if (magic == MIPS_ARCH_MAGIC_WINCE)
1003 1.1 skrll {
1004 1.1 skrll pe_ILF_make_a_symbol_reloc (&vars, (bfd_vma) 0, BFD_RELOC_HI16_S,
1005 1.1 skrll (struct bfd_symbol **) imp_sym,
1006 1.1 skrll imp_index);
1007 1.1 skrll pe_ILF_make_a_reloc (&vars, (bfd_vma) 0, BFD_RELOC_LO16, text);
1008 1.1 skrll pe_ILF_make_a_symbol_reloc (&vars, (bfd_vma) 4, BFD_RELOC_LO16,
1009 1.1 skrll (struct bfd_symbol **) imp_sym,
1010 1.1 skrll imp_index);
1011 1.1 skrll }
1012 1.1.1.4 christos else
1013 1.1.1.4 christos #endif
1014 1.1.1.4 christos #ifdef AMD64MAGIC
1015 1.1.1.4 christos if (magic == AMD64MAGIC)
1016 1.1.1.4 christos {
1017 1.1.1.4 christos pe_ILF_make_a_symbol_reloc (&vars, (bfd_vma) jtab[i].offset,
1018 1.1.1.4 christos BFD_RELOC_32_PCREL, (asymbol **) imp_sym,
1019 1.1.1.4 christos imp_index);
1020 1.1.1.4 christos }
1021 1.1 skrll else
1022 1.1 skrll #endif
1023 1.1 skrll pe_ILF_make_a_symbol_reloc (&vars, (bfd_vma) jtab[i].offset,
1024 1.1 skrll BFD_RELOC_32, (asymbol **) imp_sym,
1025 1.1 skrll imp_index);
1026 1.1 skrll
1027 1.1 skrll pe_ILF_save_relocs (& vars, text);
1028 1.1 skrll break;
1029 1.1 skrll
1030 1.1 skrll case IMPORT_DATA:
1031 1.1 skrll break;
1032 1.1 skrll
1033 1.1 skrll default:
1034 1.1 skrll /* XXX code not yet written. */
1035 1.1 skrll abort ();
1036 1.1 skrll }
1037 1.1 skrll
1038 1.1 skrll /* Initialise the bfd. */
1039 1.1 skrll memset (& internal_f, 0, sizeof (internal_f));
1040 1.1 skrll
1041 1.1 skrll internal_f.f_magic = magic;
1042 1.1 skrll internal_f.f_symptr = 0;
1043 1.1 skrll internal_f.f_nsyms = 0;
1044 1.1 skrll internal_f.f_flags = F_AR32WR | F_LNNO; /* XXX is this correct ? */
1045 1.1 skrll
1046 1.1.1.2 christos if ( ! bfd_set_start_address (abfd, (bfd_vma) 0)
1047 1.1 skrll || ! bfd_coff_set_arch_mach_hook (abfd, & internal_f))
1048 1.1 skrll goto error_return;
1049 1.1.1.2 christos
1050 1.1 skrll if (bfd_coff_mkobject_hook (abfd, (void *) & internal_f, NULL) == NULL)
1051 1.1 skrll goto error_return;
1052 1.1 skrll
1053 1.1 skrll coff_data (abfd)->pe = 1;
1054 1.1 skrll #ifdef THUMBPEMAGIC
1055 1.1 skrll if (vars.magic == THUMBPEMAGIC)
1056 1.1 skrll /* Stop some linker warnings about thumb code not supporting interworking. */
1057 1.1 skrll coff_data (abfd)->flags |= F_INTERWORK | F_INTERWORK_SET;
1058 1.1 skrll #endif
1059 1.1 skrll
1060 1.1 skrll /* Switch from file contents to memory contents. */
1061 1.1 skrll bfd_cache_close (abfd);
1062 1.1 skrll
1063 1.1.1.2 christos abfd->iostream = (void *) vars.bim;
1064 1.1 skrll abfd->flags |= BFD_IN_MEMORY /* | HAS_LOCALS */;
1065 1.1.1.2 christos abfd->iovec = &_bfd_memory_iovec;
1066 1.1 skrll abfd->where = 0;
1067 1.1 skrll abfd->origin = 0;
1068 1.1 skrll obj_sym_filepos (abfd) = 0;
1069 1.1 skrll
1070 1.1 skrll /* Now create a symbol describing the imported value. */
1071 1.1 skrll switch (import_type)
1072 1.1 skrll {
1073 1.1 skrll case IMPORT_CODE:
1074 1.1 skrll pe_ILF_make_a_symbol (& vars, "", symbol_name, text,
1075 1.1 skrll BSF_NOT_AT_END | BSF_FUNCTION);
1076 1.1 skrll
1077 1.1 skrll break;
1078 1.1 skrll
1079 1.1 skrll case IMPORT_DATA:
1080 1.1 skrll /* Nothing to do here. */
1081 1.1 skrll break;
1082 1.1 skrll
1083 1.1 skrll default:
1084 1.1 skrll /* XXX code not yet written. */
1085 1.1 skrll abort ();
1086 1.1.1.5 christos }
1087 1.1.1.5 christos
1088 1.1.1.5 christos /* Create an import symbol for the DLL, without the .dll suffix. */
1089 1.1.1.5 christos ptr = (bfd_byte *) strrchr (source_dll, '.');
1090 1.1.1.5 christos if (ptr)
1091 1.1.1.5 christos * ptr = 0;
1092 1.1.1.5 christos pe_ILF_make_a_symbol (& vars, "__IMPORT_DESCRIPTOR_", source_dll, NULL, 0);
1093 1.1.1.5 christos if (ptr)
1094 1.1 skrll * ptr = '.';
1095 1.1 skrll
1096 1.1 skrll /* Point the bfd at the symbol table. */
1097 1.1 skrll obj_symbols (abfd) = vars.sym_cache;
1098 1.1 skrll bfd_get_symcount (abfd) = vars.sym_index;
1099 1.1 skrll
1100 1.1 skrll obj_raw_syments (abfd) = vars.native_syms;
1101 1.1 skrll obj_raw_syment_count (abfd) = vars.sym_index;
1102 1.1 skrll
1103 1.1 skrll obj_coff_external_syms (abfd) = (void *) vars.esym_table;
1104 1.1 skrll obj_coff_keep_syms (abfd) = TRUE;
1105 1.1 skrll
1106 1.1 skrll obj_convert (abfd) = vars.sym_table;
1107 1.1 skrll obj_conv_table_size (abfd) = vars.sym_index;
1108 1.1 skrll
1109 1.1 skrll obj_coff_strings (abfd) = vars.string_table;
1110 1.1 skrll obj_coff_keep_strings (abfd) = TRUE;
1111 1.1 skrll
1112 1.1 skrll abfd->flags |= HAS_SYMS;
1113 1.1.1.2 christos
1114 1.1.1.2 christos return TRUE;
1115 1.1.1.2 christos
1116 1.1.1.2 christos error_return:
1117 1.1.1.2 christos if (vars.bim->buffer != NULL)
1118 1.1.1.2 christos free (vars.bim->buffer);
1119 1.1 skrll free (vars.bim);
1120 1.1 skrll return FALSE;
1121 1.1 skrll }
1122 1.1 skrll
1123 1.1 skrll /* We have detected a Image Library Format archive element.
1124 1.1 skrll Decode the element and return the appropriate target. */
1125 1.1 skrll
1126 1.1 skrll static const bfd_target *
1127 1.1.1.6 christos pe_ILF_object_p (bfd * abfd)
1128 1.1.1.6 christos {
1129 1.1.1.6 christos bfd_byte buffer[14];
1130 1.1.1.6 christos bfd_byte * ptr;
1131 1.1.1.6 christos char * symbol_name;
1132 1.1.1.6 christos char * source_dll;
1133 1.1.1.6 christos unsigned int machine;
1134 1.1.1.6 christos bfd_size_type size;
1135 1.1.1.6 christos unsigned int ordinal;
1136 1.1 skrll unsigned int types;
1137 1.1.1.4 christos unsigned int magic;
1138 1.1 skrll
1139 1.1.1.4 christos /* Upon entry the first six bytes of the ILF header have
1140 1.1 skrll already been read. Now read the rest of the header. */
1141 1.1 skrll if (bfd_bread (buffer, (bfd_size_type) 14, abfd) != 14)
1142 1.1 skrll return NULL;
1143 1.1 skrll
1144 1.1 skrll ptr = buffer;
1145 1.1 skrll
1146 1.1 skrll machine = H_GET_16 (abfd, ptr);
1147 1.1 skrll ptr += 2;
1148 1.1 skrll
1149 1.1 skrll /* Check that the machine type is recognised. */
1150 1.1 skrll magic = 0;
1151 1.1 skrll
1152 1.1 skrll switch (machine)
1153 1.1 skrll {
1154 1.1 skrll case IMAGE_FILE_MACHINE_UNKNOWN:
1155 1.1 skrll case IMAGE_FILE_MACHINE_ALPHA:
1156 1.1 skrll case IMAGE_FILE_MACHINE_ALPHA64:
1157 1.1 skrll case IMAGE_FILE_MACHINE_IA64:
1158 1.1 skrll break;
1159 1.1 skrll
1160 1.1 skrll case IMAGE_FILE_MACHINE_I386:
1161 1.1 skrll #ifdef I386MAGIC
1162 1.1 skrll magic = I386MAGIC;
1163 1.1 skrll #endif
1164 1.1 skrll break;
1165 1.1 skrll
1166 1.1 skrll case IMAGE_FILE_MACHINE_AMD64:
1167 1.1 skrll #ifdef AMD64MAGIC
1168 1.1 skrll magic = AMD64MAGIC;
1169 1.1 skrll #endif
1170 1.1 skrll break;
1171 1.1 skrll
1172 1.1 skrll case IMAGE_FILE_MACHINE_R3000:
1173 1.1 skrll case IMAGE_FILE_MACHINE_R4000:
1174 1.1 skrll case IMAGE_FILE_MACHINE_R10000:
1175 1.1 skrll
1176 1.1 skrll case IMAGE_FILE_MACHINE_MIPS16:
1177 1.1 skrll case IMAGE_FILE_MACHINE_MIPSFPU:
1178 1.1 skrll case IMAGE_FILE_MACHINE_MIPSFPU16:
1179 1.1 skrll #ifdef MIPS_ARCH_MAGIC_WINCE
1180 1.1 skrll magic = MIPS_ARCH_MAGIC_WINCE;
1181 1.1 skrll #endif
1182 1.1 skrll break;
1183 1.1 skrll
1184 1.1 skrll case IMAGE_FILE_MACHINE_SH3:
1185 1.1 skrll case IMAGE_FILE_MACHINE_SH4:
1186 1.1 skrll #ifdef SH_ARCH_MAGIC_WINCE
1187 1.1 skrll magic = SH_ARCH_MAGIC_WINCE;
1188 1.1 skrll #endif
1189 1.1 skrll break;
1190 1.1 skrll
1191 1.1 skrll case IMAGE_FILE_MACHINE_ARM:
1192 1.1 skrll #ifdef ARMPEMAGIC
1193 1.1 skrll magic = ARMPEMAGIC;
1194 1.1 skrll #endif
1195 1.1 skrll break;
1196 1.1 skrll
1197 1.1 skrll case IMAGE_FILE_MACHINE_THUMB:
1198 1.1 skrll #ifdef THUMBPEMAGIC
1199 1.1 skrll {
1200 1.1 skrll extern const bfd_target TARGET_LITTLE_SYM;
1201 1.1 skrll
1202 1.1 skrll if (abfd->xvec == & TARGET_LITTLE_SYM)
1203 1.1 skrll magic = THUMBPEMAGIC;
1204 1.1 skrll }
1205 1.1 skrll #endif
1206 1.1 skrll break;
1207 1.1 skrll
1208 1.1 skrll case IMAGE_FILE_MACHINE_POWERPC:
1209 1.1 skrll /* We no longer support PowerPC. */
1210 1.1.1.6 christos default:
1211 1.1.1.7 christos _bfd_error_handler
1212 1.1 skrll /* xgettext:c-format */
1213 1.1 skrll (_("%pB: unrecognised machine type (0x%x)"
1214 1.1 skrll " in Import Library Format archive"),
1215 1.1 skrll abfd, machine);
1216 1.1 skrll bfd_set_error (bfd_error_malformed_archive);
1217 1.1 skrll
1218 1.1 skrll return NULL;
1219 1.1 skrll break;
1220 1.1 skrll }
1221 1.1 skrll
1222 1.1 skrll if (magic == 0)
1223 1.1.1.6 christos {
1224 1.1.1.7 christos _bfd_error_handler
1225 1.1 skrll /* xgettext:c-format */
1226 1.1 skrll (_("%pB: recognised but unhandled machine type (0x%x)"
1227 1.1 skrll " in Import Library Format archive"),
1228 1.1 skrll abfd, machine);
1229 1.1 skrll bfd_set_error (bfd_error_wrong_format);
1230 1.1 skrll
1231 1.1 skrll return NULL;
1232 1.1 skrll }
1233 1.1 skrll
1234 1.1 skrll /* We do not bother to check the date.
1235 1.1 skrll date = H_GET_32 (abfd, ptr); */
1236 1.1 skrll ptr += 4;
1237 1.1 skrll
1238 1.1 skrll size = H_GET_32 (abfd, ptr);
1239 1.1 skrll ptr += 4;
1240 1.1 skrll
1241 1.1 skrll if (size == 0)
1242 1.1.1.7 christos {
1243 1.1 skrll _bfd_error_handler
1244 1.1 skrll (_("%pB: size field is zero in Import Library Format header"), abfd);
1245 1.1 skrll bfd_set_error (bfd_error_malformed_archive);
1246 1.1 skrll
1247 1.1 skrll return NULL;
1248 1.1 skrll }
1249 1.1 skrll
1250 1.1 skrll ordinal = H_GET_16 (abfd, ptr);
1251 1.1 skrll ptr += 2;
1252 1.1 skrll
1253 1.1 skrll types = H_GET_16 (abfd, ptr);
1254 1.1 skrll /* ptr += 2; */
1255 1.1.1.2 christos
1256 1.1 skrll /* Now read in the two strings that follow. */
1257 1.1 skrll ptr = (bfd_byte *) bfd_alloc (abfd, size);
1258 1.1 skrll if (ptr == NULL)
1259 1.1 skrll return NULL;
1260 1.1 skrll
1261 1.1 skrll if (bfd_bread (ptr, size, abfd) != size)
1262 1.1 skrll {
1263 1.1 skrll bfd_release (abfd, ptr);
1264 1.1 skrll return NULL;
1265 1.1 skrll }
1266 1.1.1.6 christos
1267 1.1.1.6 christos symbol_name = (char *) ptr;
1268 1.1 skrll /* See PR 20905 for an example of where the strnlen is necessary. */
1269 1.1 skrll source_dll = symbol_name + strnlen (symbol_name, size - 1) + 1;
1270 1.1 skrll
1271 1.1 skrll /* Verify that the strings are null terminated. */
1272 1.1 skrll if (ptr[size - 1] != 0
1273 1.1 skrll || (bfd_size_type) ((bfd_byte *) source_dll - ptr) >= size)
1274 1.1.1.7 christos {
1275 1.1 skrll _bfd_error_handler
1276 1.1 skrll (_("%pB: string not null terminated in ILF object file"), abfd);
1277 1.1 skrll bfd_set_error (bfd_error_malformed_archive);
1278 1.1 skrll bfd_release (abfd, ptr);
1279 1.1 skrll return NULL;
1280 1.1 skrll }
1281 1.1 skrll
1282 1.1 skrll /* Now construct the bfd. */
1283 1.1 skrll if (! pe_ILF_build_a_bfd (abfd, magic, symbol_name,
1284 1.1 skrll source_dll, ordinal, types))
1285 1.1 skrll {
1286 1.1 skrll bfd_release (abfd, ptr);
1287 1.1 skrll return NULL;
1288 1.1 skrll }
1289 1.1 skrll
1290 1.1 skrll return abfd->xvec;
1291 1.1.1.4 christos }
1292 1.1.1.6 christos
1293 1.1.1.4 christos static void
1294 1.1.1.4 christos pe_bfd_read_buildid (bfd *abfd)
1295 1.1.1.4 christos {
1296 1.1.1.4 christos pe_data_type *pe = pe_data (abfd);
1297 1.1.1.4 christos struct internal_extra_pe_aouthdr *extra = &pe->pe_opthdr;
1298 1.1.1.4 christos asection *section;
1299 1.1.1.4 christos bfd_byte *data = 0;
1300 1.1.1.4 christos bfd_size_type dataoff;
1301 1.1.1.4 christos unsigned int i;
1302 1.1.1.4 christos bfd_vma addr = extra->DataDirectory[PE_DEBUG_DATA].VirtualAddress;
1303 1.1.1.4 christos bfd_size_type size = extra->DataDirectory[PE_DEBUG_DATA].Size;
1304 1.1.1.4 christos
1305 1.1.1.4 christos if (size == 0)
1306 1.1.1.4 christos return;
1307 1.1.1.4 christos
1308 1.1.1.6 christos addr += extra->ImageBase;
1309 1.1.1.4 christos
1310 1.1.1.4 christos /* Search for the section containing the DebugDirectory. */
1311 1.1.1.4 christos for (section = abfd->sections; section != NULL; section = section->next)
1312 1.1.1.6 christos {
1313 1.1.1.4 christos if ((addr >= section->vma) && (addr < (section->vma + section->size)))
1314 1.1.1.4 christos break;
1315 1.1.1.4 christos }
1316 1.1.1.6 christos
1317 1.1.1.6 christos if (section == NULL)
1318 1.1.1.6 christos return;
1319 1.1.1.6 christos
1320 1.1.1.6 christos if (!(section->flags & SEC_HAS_CONTENTS))
1321 1.1.1.6 christos return;
1322 1.1.1.6 christos
1323 1.1.1.6 christos dataoff = addr - section->vma;
1324 1.1.1.6 christos
1325 1.1.1.6 christos /* PR 20605 and 22373: Make sure that the data is really there.
1326 1.1.1.6 christos Note - since we are dealing with unsigned quantities we have
1327 1.1.1.6 christos to be careful to check for potential overflows. */
1328 1.1.1.4 christos if (dataoff >= section->size
1329 1.1.1.7 christos || size > section->size - dataoff)
1330 1.1.1.7 christos {
1331 1.1.1.7 christos _bfd_error_handler
1332 1.1.1.4 christos (_("%pB: error: debug data ends beyond end of debug directory"),
1333 1.1.1.4 christos abfd);
1334 1.1.1.4 christos return;
1335 1.1.1.4 christos }
1336 1.1.1.4 christos
1337 1.1.1.4 christos /* Read the whole section. */
1338 1.1.1.4 christos if (!bfd_malloc_and_get_section (abfd, section, &data))
1339 1.1.1.4 christos {
1340 1.1.1.4 christos if (data != NULL)
1341 1.1.1.4 christos free (data);
1342 1.1.1.4 christos return;
1343 1.1.1.4 christos }
1344 1.1.1.4 christos
1345 1.1.1.4 christos /* Search for a CodeView entry in the DebugDirectory */
1346 1.1.1.4 christos for (i = 0; i < size / sizeof (struct external_IMAGE_DEBUG_DIRECTORY); i++)
1347 1.1.1.4 christos {
1348 1.1.1.4 christos struct external_IMAGE_DEBUG_DIRECTORY *ext
1349 1.1.1.4 christos = &((struct external_IMAGE_DEBUG_DIRECTORY *)(data + dataoff))[i];
1350 1.1.1.4 christos struct internal_IMAGE_DEBUG_DIRECTORY idd;
1351 1.1.1.4 christos
1352 1.1.1.4 christos _bfd_XXi_swap_debugdir_in (abfd, ext, &idd);
1353 1.1.1.6 christos
1354 1.1.1.6 christos if (idd.Type == PE_IMAGE_DEBUG_TYPE_CODEVIEW)
1355 1.1.1.6 christos {
1356 1.1.1.6 christos char buffer[256 + 1];
1357 1.1.1.6 christos CODEVIEW_INFO *cvinfo = (CODEVIEW_INFO *) buffer;
1358 1.1.1.6 christos
1359 1.1.1.6 christos /*
1360 1.1.1.6 christos The debug entry doesn't have to have to be in a section, in which
1361 1.1.1.6 christos case AddressOfRawData is 0, so always use PointerToRawData.
1362 1.1.1.6 christos */
1363 1.1.1.6 christos if (_bfd_XXi_slurp_codeview_record (abfd,
1364 1.1.1.6 christos (file_ptr) idd.PointerToRawData,
1365 1.1.1.6 christos idd.SizeOfData, cvinfo))
1366 1.1.1.6 christos {
1367 1.1.1.6 christos struct bfd_build_id* build_id = bfd_alloc (abfd,
1368 1.1.1.6 christos sizeof (struct bfd_build_id) + cvinfo->SignatureLength);
1369 1.1.1.6 christos if (build_id)
1370 1.1.1.6 christos {
1371 1.1.1.6 christos build_id->size = cvinfo->SignatureLength;
1372 1.1.1.6 christos memcpy(build_id->data, cvinfo->Signature,
1373 1.1.1.6 christos cvinfo->SignatureLength);
1374 1.1.1.6 christos abfd->build_id = build_id;
1375 1.1.1.6 christos }
1376 1.1.1.6 christos }
1377 1.1.1.4 christos break;
1378 1.1.1.4 christos }
1379 1.1.1.4 christos }
1380 1.1 skrll }
1381 1.1 skrll
1382 1.1 skrll static const bfd_target *
1383 1.1.1.4 christos pe_bfd_object_p (bfd * abfd)
1384 1.1.1.7 christos {
1385 1.1 skrll bfd_byte buffer[6];
1386 1.1.1.4 christos struct external_DOS_hdr dos_hdr;
1387 1.1.1.4 christos struct external_PEI_IMAGE_hdr image_hdr;
1388 1.1.1.4 christos struct internal_filehdr internal_f;
1389 1.1 skrll struct internal_aouthdr internal_a;
1390 1.1.1.4 christos file_ptr opt_hdr_size;
1391 1.1 skrll file_ptr offset;
1392 1.1 skrll const bfd_target *result;
1393 1.1.1.4 christos
1394 1.1 skrll /* Detect if this a Microsoft Import Library Format element. */
1395 1.1.1.4 christos /* First read the beginning of the header. */
1396 1.1 skrll if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0
1397 1.1 skrll || bfd_bread (buffer, (bfd_size_type) 6, abfd) != 6)
1398 1.1 skrll {
1399 1.1 skrll if (bfd_get_error () != bfd_error_system_call)
1400 1.1 skrll bfd_set_error (bfd_error_wrong_format);
1401 1.1 skrll return NULL;
1402 1.1.1.4 christos }
1403 1.1.1.4 christos
1404 1.1.1.4 christos /* Then check the magic and the version (only 0 is supported). */
1405 1.1 skrll if (H_GET_32 (abfd, buffer) == 0xffff0000
1406 1.1 skrll && H_GET_16 (abfd, buffer + 4) == 0)
1407 1.1 skrll return pe_ILF_object_p (abfd);
1408 1.1 skrll
1409 1.1 skrll if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0
1410 1.1 skrll || bfd_bread (&dos_hdr, (bfd_size_type) sizeof (dos_hdr), abfd)
1411 1.1 skrll != sizeof (dos_hdr))
1412 1.1 skrll {
1413 1.1 skrll if (bfd_get_error () != bfd_error_system_call)
1414 1.1 skrll bfd_set_error (bfd_error_wrong_format);
1415 1.1 skrll return NULL;
1416 1.1 skrll }
1417 1.1 skrll
1418 1.1.1.7 christos /* There are really two magic numbers involved; the magic number
1419 1.1 skrll that says this is a NT executable (PEI) and the magic number that
1420 1.1 skrll determines the architecture. The former is IMAGE_DOS_SIGNATURE, stored in
1421 1.1 skrll the e_magic field. The latter is stored in the f_magic field.
1422 1.1 skrll If the NT magic number isn't valid, the architecture magic number
1423 1.1 skrll could be mimicked by some other field (specifically, the number
1424 1.1 skrll of relocs in section 3). Since this routine can only be called
1425 1.1 skrll correctly for a PEI file, check the e_magic number here, and, if
1426 1.1.1.7 christos it doesn't match, clobber the f_magic number so that we don't get
1427 1.1 skrll a false match. */
1428 1.1 skrll if (H_GET_16 (abfd, dos_hdr.e_magic) != IMAGE_DOS_SIGNATURE)
1429 1.1 skrll {
1430 1.1 skrll bfd_set_error (bfd_error_wrong_format);
1431 1.1 skrll return NULL;
1432 1.1 skrll }
1433 1.1 skrll
1434 1.1 skrll offset = H_GET_32 (abfd, dos_hdr.e_lfanew);
1435 1.1 skrll if (bfd_seek (abfd, offset, SEEK_SET) != 0
1436 1.1 skrll || (bfd_bread (&image_hdr, (bfd_size_type) sizeof (image_hdr), abfd)
1437 1.1 skrll != sizeof (image_hdr)))
1438 1.1 skrll {
1439 1.1 skrll if (bfd_get_error () != bfd_error_system_call)
1440 1.1 skrll bfd_set_error (bfd_error_wrong_format);
1441 1.1 skrll return NULL;
1442 1.1 skrll }
1443 1.1 skrll
1444 1.1 skrll if (H_GET_32 (abfd, image_hdr.nt_signature) != 0x4550)
1445 1.1 skrll {
1446 1.1 skrll bfd_set_error (bfd_error_wrong_format);
1447 1.1 skrll return NULL;
1448 1.1.1.4 christos }
1449 1.1.1.4 christos
1450 1.1.1.4 christos /* Swap file header, so that we get the location for calling
1451 1.1.1.4 christos real_object_p. */
1452 1.1.1.4 christos bfd_coff_swap_filehdr_in (abfd, &image_hdr, &internal_f);
1453 1.1.1.4 christos
1454 1.1 skrll if (! bfd_coff_bad_format_hook (abfd, &internal_f)
1455 1.1.1.4 christos || internal_f.f_opthdr > bfd_coff_aoutsz (abfd))
1456 1.1 skrll {
1457 1.1 skrll bfd_set_error (bfd_error_wrong_format);
1458 1.1 skrll return NULL;
1459 1.1.1.4 christos }
1460 1.1.1.4 christos
1461 1.1.1.4 christos /* Read the optional header, which has variable size. */
1462 1.1.1.4 christos opt_hdr_size = internal_f.f_opthdr;
1463 1.1.1.4 christos
1464 1.1.1.4 christos if (opt_hdr_size != 0)
1465 1.1.1.4 christos {
1466 1.1.1.4 christos bfd_size_type amt = opt_hdr_size;
1467 1.1.1.4 christos void * opthdr;
1468 1.1.1.4 christos
1469 1.1.1.4 christos /* PR 17521 file: 230-131433-0.004. */
1470 1.1.1.4 christos if (amt < sizeof (PEAOUTHDR))
1471 1.1.1.4 christos amt = sizeof (PEAOUTHDR);
1472 1.1.1.4 christos
1473 1.1.1.4 christos opthdr = bfd_zalloc (abfd, amt);
1474 1.1.1.4 christos if (opthdr == NULL)
1475 1.1.1.4 christos return NULL;
1476 1.1.1.4 christos if (bfd_bread (opthdr, opt_hdr_size, abfd)
1477 1.1.1.4 christos != (bfd_size_type) opt_hdr_size)
1478 1.1.1.4 christos return NULL;
1479 1.1.1.4 christos
1480 1.1.1.4 christos bfd_set_error (bfd_error_no_error);
1481 1.1.1.4 christos bfd_coff_swap_aouthdr_in (abfd, opthdr, & internal_a);
1482 1.1.1.4 christos if (bfd_get_error () != bfd_error_no_error)
1483 1.1.1.4 christos return NULL;
1484 1.1.1.4 christos }
1485 1.1.1.4 christos
1486 1.1.1.6 christos
1487 1.1.1.6 christos result = coff_real_object_p (abfd, internal_f.f_nscns, &internal_f,
1488 1.1.1.6 christos (opt_hdr_size != 0
1489 1.1.1.4 christos ? &internal_a
1490 1.1.1.4 christos : (struct internal_aouthdr *) NULL));
1491 1.1.1.4 christos
1492 1.1.1.4 christos
1493 1.1.1.4 christos if (result)
1494 1.1.1.4 christos {
1495 1.1.1.4 christos /* Now the whole header has been processed, see if there is a build-id */
1496 1.1.1.4 christos pe_bfd_read_buildid(abfd);
1497 1.1.1.4 christos }
1498 1.1 skrll
1499 1.1 skrll return result;
1500 1.1 skrll }
1501 1.1 skrll
1502 #define coff_object_p pe_bfd_object_p
1503 #endif /* COFF_IMAGE_WITH_PE */
1504