ld signed overflow fix
[deliverable/binutils-gdb.git] / ld / pe-dll.c
1 /* Routines to help build PEI-format DLLs (Win32 etc)
2 Copyright (C) 1998-2019 Free Software Foundation, Inc.
3 Written by DJ Delorie <dj@cygnus.com>
4
5 This file is part of the GNU Binutils.
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
20 MA 02110-1301, USA. */
21
22 #include "sysdep.h"
23 #include "bfd.h"
24 #include "bfdlink.h"
25 #include "libiberty.h"
26 #include "filenames.h"
27 #include "safe-ctype.h"
28 #include "ctf-api.h"
29
30 #include <time.h>
31
32 #include "ld.h"
33 #include "ldexp.h"
34 #include "ldlang.h"
35 #include "ldwrite.h"
36 #include "ldmisc.h"
37 #include <ldgram.h>
38 #include "ldmain.h"
39 #include "ldfile.h"
40 #include "ldemul.h"
41 #include "coff/internal.h"
42 #include "../bfd/libcoff.h"
43 #include "deffile.h"
44
45 #ifdef pe_use_x86_64
46
47 #define PE_IDATA4_SIZE 8
48 #define PE_IDATA5_SIZE 8
49 #include "pep-dll.h"
50 #undef AOUTSZ
51 #define AOUTSZ PEPAOUTSZ
52 #define PEAOUTHDR PEPAOUTHDR
53
54 #else
55
56 #include "pe-dll.h"
57
58 #endif
59
60 #ifndef PE_IDATA4_SIZE
61 #define PE_IDATA4_SIZE 4
62 #endif
63
64 #ifndef PE_IDATA5_SIZE
65 #define PE_IDATA5_SIZE 4
66 #endif
67
68 /* This file turns a regular Windows PE image into a DLL. Because of
69 the complexity of this operation, it has been broken down into a
70 number of separate modules which are all called by the main function
71 at the end of this file. This function is not re-entrant and is
72 normally only called once, so static variables are used to reduce
73 the number of parameters and return values required.
74
75 See also: ld/emultempl/pe.em and ld/emultempl/pep.em. */
76
77 /* Auto-import feature by Paul Sokolovsky
78
79 Quick facts:
80
81 1. With this feature on, DLL clients can import variables from DLL
82 without any concern from their side (for example, without any source
83 code modifications).
84
85 2. This is done completely in bounds of the PE specification (to be fair,
86 there's a place where it pokes nose out of, but in practice it works).
87 So, resulting module can be used with any other PE compiler/linker.
88
89 3. Auto-import is fully compatible with standard import method and they
90 can be mixed together.
91
92 4. Overheads: space: 8 bytes per imported symbol, plus 20 for each
93 reference to it; load time: negligible; virtual/physical memory: should be
94 less than effect of DLL relocation, and I sincerely hope it doesn't affect
95 DLL sharability (too much).
96
97 Idea
98
99 The obvious and only way to get rid of dllimport insanity is to make client
100 access variable directly in the DLL, bypassing extra dereference. I.e.,
101 whenever client contains something like
102
103 mov dll_var,%eax,
104
105 address of dll_var in the command should be relocated to point into loaded
106 DLL. The aim is to make OS loader do so, and than make ld help with that.
107 Import section of PE made following way: there's a vector of structures
108 each describing imports from particular DLL. Each such structure points
109 to two other parallel vectors: one holding imported names, and one which
110 will hold address of corresponding imported name. So, the solution is
111 de-vectorize these structures, making import locations be sparse and
112 pointing directly into code. Before continuing, it is worth a note that,
113 while authors strives to make PE act ELF-like, there're some other people
114 make ELF act PE-like: elfvector, ;-) .
115
116 Implementation
117
118 For each reference of data symbol to be imported from DLL (to set of which
119 belong symbols with name <sym>, if __imp_<sym> is found in implib), the
120 import fixup entry is generated. That entry is of type
121 IMAGE_IMPORT_DESCRIPTOR and stored in .idata$2 subsection. Each
122 fixup entry contains pointer to symbol's address within .text section
123 (marked with __fuN_<sym> symbol, where N is integer), pointer to DLL name
124 (so, DLL name is referenced by multiple entries), and pointer to symbol
125 name thunk. Symbol name thunk is singleton vector (__nm_th_<symbol>)
126 pointing to IMAGE_IMPORT_BY_NAME structure (__nm_<symbol>) directly
127 containing imported name. Here comes that "on the edge" problem mentioned
128 above: PE specification rambles that name vector (OriginalFirstThunk)
129 should run in parallel with addresses vector (FirstThunk), i.e. that they
130 should have same number of elements and terminated with zero. We violate
131 this, since FirstThunk points directly into machine code. But in practice,
132 OS loader implemented the sane way: it goes through OriginalFirstThunk and
133 puts addresses to FirstThunk, not something else. It once again should be
134 noted that dll and symbol name structures are reused across fixup entries
135 and should be there anyway to support standard import stuff, so sustained
136 overhead is 20 bytes per reference. Other question is whether having several
137 IMAGE_IMPORT_DESCRIPTORS for the same DLL is possible. Answer is yes, it is
138 done even by native compiler/linker (libth32's functions are in fact reside
139 in windows9x kernel32.dll, so if you use it, you have two
140 IMAGE_IMPORT_DESCRIPTORS for kernel32.dll). Yet other question is whether
141 referencing the same PE structures several times is valid. The answer is why
142 not, prohibiting that (detecting violation) would require more work on
143 behalf of loader than not doing it.
144
145 See also: ld/emultempl/pe.em and ld/emultempl/pep.em. */
146
147 static void add_bfd_to_link (bfd *, const char *, struct bfd_link_info *);
148
149 /* For emultempl/pe.em. */
150
151 def_file * pe_def_file = 0;
152 int pe_dll_export_everything = 0;
153 int pe_dll_exclude_all_symbols = 0;
154 int pe_dll_do_default_excludes = 1;
155 int pe_dll_kill_ats = 0;
156 int pe_dll_stdcall_aliases = 0;
157 int pe_dll_warn_dup_exports = 0;
158 int pe_dll_compat_implib = 0;
159 int pe_dll_extra_pe_debug = 0;
160 int pe_use_nul_prefixed_import_tables = 0;
161 int pe_use_coff_long_section_names = -1;
162 int pe_leading_underscore = -1;
163
164 /* Static variables and types. */
165
166 static bfd_vma image_base;
167 static bfd *filler_bfd;
168 static struct bfd_section *edata_s, *reloc_s;
169 static unsigned char *edata_d, *reloc_d;
170 static size_t edata_sz, reloc_sz;
171 static int runtime_pseudo_relocs_created = 0;
172 static bfd_boolean runtime_pseudp_reloc_v2_init = FALSE;
173
174 typedef struct
175 {
176 const char *name;
177 int len;
178 }
179 autofilter_entry_type;
180
181 typedef struct
182 {
183 const char *target_name;
184 const char *object_target;
185 unsigned int imagebase_reloc;
186 int pe_arch;
187 int bfd_arch;
188 bfd_boolean underscored;
189 const autofilter_entry_type* autofilter_symbollist;
190 }
191 pe_details_type;
192
193 static const autofilter_entry_type autofilter_symbollist_generic[] =
194 {
195 { STRING_COMMA_LEN ("_NULL_IMPORT_DESCRIPTOR") },
196 /* Entry point symbols. */
197 { STRING_COMMA_LEN ("DllMain") },
198 { STRING_COMMA_LEN ("DllMainCRTStartup") },
199 { STRING_COMMA_LEN ("_DllMainCRTStartup") },
200 /* Runtime pseudo-reloc. */
201 { STRING_COMMA_LEN ("_pei386_runtime_relocator") },
202 { STRING_COMMA_LEN ("do_pseudo_reloc") },
203 { NULL, 0 }
204 };
205
206 static const autofilter_entry_type autofilter_symbollist_i386[] =
207 {
208 { STRING_COMMA_LEN ("_NULL_IMPORT_DESCRIPTOR") },
209 /* Entry point symbols, and entry hooks. */
210 { STRING_COMMA_LEN ("cygwin_crt0") },
211 #ifdef pe_use_x86_64
212 { STRING_COMMA_LEN ("DllMain") },
213 { STRING_COMMA_LEN ("DllEntryPoint") },
214 { STRING_COMMA_LEN ("DllMainCRTStartup") },
215 { STRING_COMMA_LEN ("_cygwin_dll_entry") },
216 { STRING_COMMA_LEN ("_cygwin_crt0_common") },
217 { STRING_COMMA_LEN ("_cygwin_noncygwin_dll_entry") },
218 #else
219 { STRING_COMMA_LEN ("DllMain@12") },
220 { STRING_COMMA_LEN ("DllEntryPoint@0") },
221 { STRING_COMMA_LEN ("DllMainCRTStartup@12") },
222 { STRING_COMMA_LEN ("_cygwin_dll_entry@12") },
223 { STRING_COMMA_LEN ("_cygwin_crt0_common@8") },
224 { STRING_COMMA_LEN ("_cygwin_noncygwin_dll_entry@12") },
225 { STRING_COMMA_LEN ("cygwin_attach_dll") },
226 #endif
227 { STRING_COMMA_LEN ("cygwin_premain0") },
228 { STRING_COMMA_LEN ("cygwin_premain1") },
229 { STRING_COMMA_LEN ("cygwin_premain2") },
230 { STRING_COMMA_LEN ("cygwin_premain3") },
231 /* Runtime pseudo-reloc. */
232 { STRING_COMMA_LEN ("_pei386_runtime_relocator") },
233 { STRING_COMMA_LEN ("do_pseudo_reloc") },
234 /* Global vars that should not be exported. */
235 { STRING_COMMA_LEN ("impure_ptr") },
236 { STRING_COMMA_LEN ("_impure_ptr") },
237 { STRING_COMMA_LEN ("_fmode") },
238 { STRING_COMMA_LEN ("environ") },
239 { STRING_COMMA_LEN ("__dso_handle") },
240 { NULL, 0 }
241 };
242
243 #define PE_ARCH_i386 1
244 #define PE_ARCH_sh 2
245 #define PE_ARCH_mips 3
246 #define PE_ARCH_arm 4
247 #define PE_ARCH_arm_wince 5
248
249 /* Don't make it constant as underscore mode gets possibly overriden
250 by target or -(no-)leading-underscore option. */
251 static pe_details_type pe_detail_list[] =
252 {
253 {
254 #ifdef pe_use_x86_64
255 "pei-x86-64",
256 "pe-x86-64",
257 3 /* R_IMAGEBASE */,
258 #else
259 "pei-i386",
260 "pe-i386",
261 7 /* R_IMAGEBASE */,
262 #endif
263 PE_ARCH_i386,
264 bfd_arch_i386,
265 #ifdef pe_use_x86_64
266 FALSE,
267 #else
268 TRUE,
269 #endif
270 autofilter_symbollist_i386
271 },
272 #ifdef pe_use_x86_64
273 {
274 "pei-x86-64",
275 "pe-bigobj-x86-64",
276 3 /* R_IMAGEBASE */,
277 PE_ARCH_i386,
278 bfd_arch_i386,
279 FALSE,
280 autofilter_symbollist_i386
281 },
282 #endif
283 {
284 "pei-shl",
285 "pe-shl",
286 16 /* R_SH_IMAGEBASE */,
287 PE_ARCH_sh,
288 bfd_arch_sh,
289 TRUE,
290 autofilter_symbollist_generic
291 },
292 {
293 "pei-mips",
294 "pe-mips",
295 34 /* MIPS_R_RVA */,
296 PE_ARCH_mips,
297 bfd_arch_mips,
298 FALSE,
299 autofilter_symbollist_generic
300 },
301 {
302 "pei-arm-little",
303 "pe-arm-little",
304 11 /* ARM_RVA32 */,
305 PE_ARCH_arm,
306 bfd_arch_arm,
307 TRUE,
308 autofilter_symbollist_generic
309 },
310 {
311 "pei-arm-wince-little",
312 "pe-arm-wince-little",
313 2, /* ARM_RVA32 on Windows CE, see bfd/coff-arm.c. */
314 PE_ARCH_arm_wince,
315 bfd_arch_arm,
316 FALSE,
317 autofilter_symbollist_generic
318 },
319 { NULL, NULL, 0, 0, 0, FALSE, NULL }
320 };
321
322 static const pe_details_type *pe_details;
323
324 /* Do not specify library suffix explicitly, to allow for dllized versions. */
325 static const autofilter_entry_type autofilter_liblist[] =
326 {
327 { STRING_COMMA_LEN ("libcegcc") },
328 { STRING_COMMA_LEN ("libcygwin") },
329 { STRING_COMMA_LEN ("libgcc") },
330 { STRING_COMMA_LEN ("libgcc_s") },
331 { STRING_COMMA_LEN ("libstdc++") },
332 { STRING_COMMA_LEN ("libmingw32") },
333 { STRING_COMMA_LEN ("libmingwex") },
334 { STRING_COMMA_LEN ("libg2c") },
335 { STRING_COMMA_LEN ("libsupc++") },
336 { STRING_COMMA_LEN ("libobjc") },
337 { STRING_COMMA_LEN ("libgcj") },
338 { STRING_COMMA_LEN ("libmsvcrt") },
339 { STRING_COMMA_LEN ("libmsvcrt-os") },
340 { STRING_COMMA_LEN ("libucrtbase") },
341 { NULL, 0 }
342 };
343
344 /* Regardless of the suffix issue mentioned above, we must ensure that
345 we do not falsely match on a leading substring, such as when libtool
346 builds libstdc++ as a DLL using libsupc++convenience.a as an intermediate.
347 This routine ensures that the leading part of the name matches and that
348 it is followed by only an optional version suffix and a file extension,
349 returning zero if so or -1 if not. */
350 static int libnamencmp (const char *libname, const autofilter_entry_type *afptr)
351 {
352 if (filename_ncmp (libname, afptr->name, afptr->len))
353 return -1;
354
355 libname += afptr->len;
356
357 /* Be liberal in interpreting what counts as a version suffix; we
358 accept anything that has a dash to separate it from the name and
359 begins with a digit. */
360 if (libname[0] == '-')
361 {
362 if (!ISDIGIT (*++libname))
363 return -1;
364 /* Ensure the filename has an extension. */
365 while (*++libname != '.')
366 if (!*libname)
367 return -1;
368 }
369 else if (libname[0] != '.')
370 return -1;
371
372 return 0;
373 }
374
375 static const autofilter_entry_type autofilter_objlist[] =
376 {
377 { STRING_COMMA_LEN ("crt0.o") },
378 { STRING_COMMA_LEN ("crt1.o") },
379 { STRING_COMMA_LEN ("crt2.o") },
380 { STRING_COMMA_LEN ("dllcrt1.o") },
381 { STRING_COMMA_LEN ("dllcrt2.o") },
382 { STRING_COMMA_LEN ("gcrt0.o") },
383 { STRING_COMMA_LEN ("gcrt1.o") },
384 { STRING_COMMA_LEN ("gcrt2.o") },
385 { STRING_COMMA_LEN ("crtbegin.o") },
386 { STRING_COMMA_LEN ("crtend.o") },
387 { NULL, 0 }
388 };
389
390 static const autofilter_entry_type autofilter_symbolprefixlist[] =
391 {
392 /* _imp_ is treated specially, as it is always underscored. */
393 /* { STRING_COMMA_LEN ("_imp_") }, */
394 /* Don't export some c++ symbols. */
395 { STRING_COMMA_LEN ("__rtti_") },
396 { STRING_COMMA_LEN ("__builtin_") },
397 /* Don't re-export auto-imported symbols. */
398 { STRING_COMMA_LEN ("__nm_") },
399 /* Don't export symbols specifying internal DLL layout. */
400 { STRING_COMMA_LEN ("_head_") },
401 { STRING_COMMA_LEN ("_IMPORT_DESCRIPTOR_") },
402 /* Don't export section labels or artificial symbols
403 (eg ".weak.foo". */
404 { STRING_COMMA_LEN (".") },
405 { NULL, 0 }
406 };
407
408 static const autofilter_entry_type autofilter_symbolsuffixlist[] =
409 {
410 { STRING_COMMA_LEN ("_iname") },
411 { STRING_COMMA_LEN ("_NULL_THUNK_DATA") },
412 { NULL, 0 }
413 };
414
415 #define U(str) (pe_details->underscored ? "_" str : str)
416
417 void
418 pe_dll_id_target (const char *target)
419 {
420 int i;
421
422 for (i = 0; pe_detail_list[i].target_name; i++)
423 if (strcmp (pe_detail_list[i].target_name, target) == 0
424 || strcmp (pe_detail_list[i].object_target, target) == 0)
425 {
426 int u = pe_leading_underscore; /* Underscoring mode. -1 for use default. */
427 if (u == -1)
428 bfd_get_target_info (target, NULL, NULL, &u, NULL);
429 if (u == -1)
430 abort ();
431 pe_detail_list[i].underscored = (u != 0 ? TRUE : FALSE);
432 pe_details = pe_detail_list + i;
433 pe_leading_underscore = (u != 0 ? 1 : 0);
434 return;
435 }
436 einfo (_("%X%P: unsupported PEI architecture: %s\n"), target);
437 exit (1);
438 }
439
440 /* Helper functions for qsort. Relocs must be sorted so that we can write
441 them out by pages. */
442
443 typedef struct
444 {
445 bfd_vma vma;
446 char type;
447 short extra;
448 int idx;
449 }
450 reloc_data_type;
451
452 static int
453 reloc_sort (const void *va, const void *vb)
454 {
455 const reloc_data_type *a = (const reloc_data_type *) va;
456 const reloc_data_type *b = (const reloc_data_type *) vb;
457
458 if (a->vma > b->vma)
459 return 1;
460 if (a->vma < b->vma)
461 return -1;
462 if (a->idx > b->idx)
463 return 1;
464 if (a->idx < b->idx)
465 return -1;
466 return 0;
467 }
468
469 static int
470 pe_export_sort (const void *va, const void *vb)
471 {
472 const def_file_export *a = va;
473 const def_file_export *b = vb;
474 char *an = a->name;
475 char *bn = b->name;
476 if (a->its_name)
477 an = a->its_name;
478 if (b->its_name)
479 bn = b->its_name;
480
481 return strcmp (an, bn);
482 }
483
484 /* Read and process the .DEF file. */
485
486 /* These correspond to the entries in pe_def_file->exports[]. I use
487 exported_symbol_sections[i] to tag whether or not the symbol was
488 defined, since we can't export symbols we don't have. */
489
490 static bfd_vma *exported_symbol_offsets;
491 static struct bfd_section **exported_symbol_sections;
492 static int export_table_size;
493 static int count_exported;
494 static int count_exported_byname;
495 static int count_with_ordinals;
496 static const char *dll_name;
497 static int min_ordinal, max_ordinal;
498 static int *exported_symbols;
499
500 typedef struct exclude_list_struct
501 {
502 char *string;
503 struct exclude_list_struct *next;
504 exclude_type type;
505 }
506 exclude_list_struct;
507
508 static struct exclude_list_struct *excludes = 0;
509
510 void
511 pe_dll_add_excludes (const char *new_excludes, const exclude_type type)
512 {
513 char *local_copy;
514 char *exclude_string;
515
516 local_copy = xstrdup (new_excludes);
517
518 exclude_string = strtok (local_copy, ",:");
519 for (; exclude_string; exclude_string = strtok (NULL, ",:"))
520 {
521 struct exclude_list_struct *new_exclude;
522
523 new_exclude = xmalloc (sizeof (struct exclude_list_struct));
524 new_exclude->string = xmalloc (strlen (exclude_string) + 1);
525 strcpy (new_exclude->string, exclude_string);
526 new_exclude->type = type;
527 new_exclude->next = excludes;
528 excludes = new_exclude;
529 }
530
531 free (local_copy);
532 }
533
534 static bfd_boolean
535 is_import (const char* n)
536 {
537 return (CONST_STRNEQ (n, "__imp_"));
538 }
539
540 /* abfd is a bfd containing n (or NULL)
541 It can be used for contextual checks. */
542
543 static int
544 auto_export (bfd *abfd, def_file *d, const char *n)
545 {
546 def_file_export key;
547 struct exclude_list_struct *ex;
548 const autofilter_entry_type *afptr;
549 const char * libname = NULL;
550
551 if (abfd && abfd->my_archive)
552 libname = lbasename (abfd->my_archive->filename);
553
554 key.name = key.its_name = (char *) n;
555
556 /* Return false if n is in the d->exports table. */
557 if (bsearch (&key, d->exports, d->num_exports,
558 sizeof (pe_def_file->exports[0]), pe_export_sort))
559 return 0;
560
561 if (pe_dll_do_default_excludes)
562 {
563 const char * p;
564 int len;
565
566 if (pe_dll_extra_pe_debug)
567 printf ("considering exporting: %s, abfd=%p, abfd->my_arc=%p\n",
568 n, abfd, abfd->my_archive);
569
570 /* First of all, make context checks:
571 Don't export anything from standard libs. */
572 if (libname)
573 {
574 afptr = autofilter_liblist;
575
576 while (afptr->name)
577 {
578 if (libnamencmp (libname, afptr) == 0 )
579 return 0;
580 afptr++;
581 }
582 }
583
584 /* Next, exclude symbols from certain startup objects. */
585
586 if (abfd && (p = lbasename (abfd->filename)))
587 {
588 afptr = autofilter_objlist;
589 while (afptr->name)
590 {
591 if (strcmp (p, afptr->name) == 0)
592 return 0;
593 afptr++;
594 }
595 }
596
597 /* Don't try to blindly exclude all symbols
598 that begin with '__'; this was tried and
599 it is too restrictive. Instead we have
600 a target specific list to use: */
601 afptr = pe_details->autofilter_symbollist;
602
603 while (afptr->name)
604 {
605 if (strcmp (n, afptr->name) == 0)
606 return 0;
607
608 afptr++;
609 }
610
611 /* Next, exclude symbols starting with ... */
612 afptr = autofilter_symbolprefixlist;
613 while (afptr->name)
614 {
615 if (strncmp (n, afptr->name, afptr->len) == 0)
616 return 0;
617
618 afptr++;
619 }
620
621 /* Finally, exclude symbols ending with ... */
622 len = strlen (n);
623 afptr = autofilter_symbolsuffixlist;
624 while (afptr->name)
625 {
626 if ((len >= afptr->len)
627 /* Add 1 to insure match with trailing '\0'. */
628 && strncmp (n + len - afptr->len, afptr->name,
629 afptr->len + 1) == 0)
630 return 0;
631
632 afptr++;
633 }
634 }
635
636 for (ex = excludes; ex; ex = ex->next)
637 {
638 if (ex->type == EXCLUDELIBS)
639 {
640 if (libname
641 && ((filename_cmp (libname, ex->string) == 0)
642 || (strcasecmp ("ALL", ex->string) == 0)))
643 return 0;
644 }
645 else if (ex->type == EXCLUDEFORIMPLIB)
646 {
647 if (filename_cmp (abfd->filename, ex->string) == 0)
648 return 0;
649 }
650 else if (strcmp (n, ex->string) == 0)
651 return 0;
652 }
653
654 return 1;
655 }
656
657 static void
658 process_def_file_and_drectve (bfd *abfd ATTRIBUTE_UNUSED, struct bfd_link_info *info)
659 {
660 int i, j;
661 struct bfd_link_hash_entry *blhe;
662 bfd *b;
663 struct bfd_section *s;
664 def_file_export *e = 0;
665 bfd_boolean resort_needed;
666
667 if (!pe_def_file)
668 pe_def_file = def_file_empty ();
669
670 /* First, run around to all the objects looking for the .drectve
671 sections, and push those into the def file too. */
672 for (b = info->input_bfds; b; b = b->link.next)
673 {
674 s = bfd_get_section_by_name (b, ".drectve");
675 if (s)
676 {
677 long size = s->size;
678 char *buf = xmalloc (size);
679
680 bfd_get_section_contents (b, s, buf, 0, size);
681 def_file_add_directive (pe_def_file, buf, size);
682 free (buf);
683 }
684 }
685
686 /* Process aligned common symbol information from the
687 .drectve sections now; common symbol allocation is
688 done before final link, so it will be too late to
689 process them in process_embedded_commands() called
690 from _bfd_coff_link_input_bfd(). */
691 if (pe_def_file->aligncomms)
692 {
693 def_file_aligncomm *ac = pe_def_file->aligncomms;
694 while (ac)
695 {
696 struct coff_link_hash_entry *sym_hash;
697 sym_hash = coff_link_hash_lookup (coff_hash_table (info),
698 ac->symbol_name, FALSE, FALSE, FALSE);
699 if (sym_hash && sym_hash->root.type == bfd_link_hash_common
700 && sym_hash->root.u.c.p->alignment_power < (unsigned) ac->alignment)
701 {
702 sym_hash->root.u.c.p->alignment_power = (unsigned) ac->alignment;
703 }
704 ac = ac->next;
705 }
706 }
707
708 /* If we are building an executable and there is nothing
709 to export, we do not build an export table at all. */
710 if (bfd_link_executable (info) && pe_def_file->num_exports == 0
711 && (!pe_dll_export_everything || pe_dll_exclude_all_symbols))
712 return;
713
714 /* Now, maybe export everything else the default way. */
715 if ((pe_dll_export_everything || pe_def_file->num_exports == 0)
716 && !pe_dll_exclude_all_symbols)
717 {
718 for (b = info->input_bfds; b; b = b->link.next)
719 {
720 asymbol **symbols;
721 int nsyms;
722
723 if (!bfd_generic_link_read_symbols (b))
724 {
725 einfo (_("%F%P: %pB: could not read symbols: %E\n"), b);
726 return;
727 }
728
729 symbols = bfd_get_outsymbols (b);
730 nsyms = bfd_get_symcount (b);
731
732 for (j = 0; j < nsyms; j++)
733 {
734 /* We should export symbols which are either global or not
735 anything at all. (.bss data is the latter)
736 We should not export undefined symbols. */
737 bfd_boolean would_export
738 = (symbols[j]->section != bfd_und_section_ptr
739 && ((symbols[j]->flags & BSF_GLOBAL)
740 || (symbols[j]->flags == 0)));
741 if (link_info.version_info && would_export)
742 would_export
743 = !bfd_hide_sym_by_version (link_info.version_info,
744 symbols[j]->name);
745 if (would_export)
746 {
747 const char *sn = symbols[j]->name;
748
749 /* We should not re-export imported stuff. */
750 {
751 char *name;
752 if (is_import (sn))
753 continue;
754
755 name = xmalloc (strlen ("__imp_") + strlen (sn) + 1);
756 sprintf (name, "%s%s", "__imp_", sn);
757
758 blhe = bfd_link_hash_lookup (info->hash, name,
759 FALSE, FALSE, FALSE);
760 free (name);
761
762 if (blhe && blhe->type == bfd_link_hash_defined)
763 continue;
764 }
765
766 if (pe_details->underscored && *sn == '_')
767 sn++;
768
769 if (auto_export (b, pe_def_file, sn))
770 {
771 int is_dup = 0;
772 def_file_export *p;
773
774 p = def_file_add_export (pe_def_file, sn, 0, -1,
775 NULL, &is_dup);
776 /* Fill data flag properly, from dlltool.c. */
777 if (!is_dup)
778 p->flag_data = !(symbols[j]->flags & BSF_FUNCTION);
779 }
780 }
781 }
782 }
783 }
784
785 #undef NE
786 #define NE pe_def_file->num_exports
787
788 /* Don't create an empty export table. */
789 if (NE == 0)
790 return;
791
792 resort_needed = FALSE;
793
794 /* Canonicalize the export list. */
795 if (pe_dll_kill_ats)
796 {
797 for (i = 0; i < NE; i++)
798 {
799 /* Check for fastcall/stdcall-decoration, but ignore
800 C++ mangled names. */
801 if (pe_def_file->exports[i].name[0] != '?'
802 && strchr (pe_def_file->exports[i].name, '@'))
803 {
804 /* This will preserve internal_name, which may have been
805 pointing to the same memory as name, or might not
806 have. */
807 int lead_at = (*pe_def_file->exports[i].name == '@');
808 char *tmp = xstrdup (pe_def_file->exports[i].name + lead_at);
809 char *tmp_at = strrchr (tmp, '@');
810
811 if (tmp_at)
812 *tmp_at = 0;
813 else
814 einfo (_("%X%P: cannot export %s: invalid export name\n"),
815 pe_def_file->exports[i].name);
816 pe_def_file->exports[i].name = tmp;
817 resort_needed = TRUE;
818 }
819 }
820 }
821
822 /* Re-sort the exports table as we have possibly changed the order
823 by removing leading @. */
824 if (resort_needed)
825 qsort (pe_def_file->exports, NE, sizeof (pe_def_file->exports[0]),
826 pe_export_sort);
827
828 if (pe_dll_stdcall_aliases)
829 {
830 for (i = 0; i < NE; i++)
831 {
832 if (is_import (pe_def_file->exports[i].name))
833 continue;
834
835 if (strchr (pe_def_file->exports[i].name, '@'))
836 {
837 int is_dup = 1;
838 int lead_at = (*pe_def_file->exports[i].name == '@');
839 char *tmp = xstrdup (pe_def_file->exports[i].name + lead_at);
840
841 *(strchr (tmp, '@')) = 0;
842 if (auto_export (NULL, pe_def_file, tmp))
843 def_file_add_export (pe_def_file, tmp,
844 pe_def_file->exports[i].internal_name,
845 -1, NULL, &is_dup);
846 if (is_dup)
847 free (tmp);
848 }
849 }
850 }
851
852 /* Convenience, but watch out for it changing. */
853 e = pe_def_file->exports;
854
855 for (i = 0, j = 0; i < NE; i++)
856 {
857 if (i > 0 && strcmp (e[i].name, e[i - 1].name) == 0)
858 {
859 /* This is a duplicate. */
860 if (e[j - 1].ordinal != -1
861 && e[i].ordinal != -1
862 && e[j - 1].ordinal != e[i].ordinal)
863 {
864 if (pe_dll_warn_dup_exports)
865 /* xgettext:c-format */
866 einfo (_("%X%P: error, duplicate EXPORT with ordinals: %s (%d vs %d)\n"),
867 e[j - 1].name, e[j - 1].ordinal, e[i].ordinal);
868 }
869 else
870 {
871 if (pe_dll_warn_dup_exports)
872 /* xgettext:c-format */
873 einfo (_("%P: warning, duplicate EXPORT: %s\n"),
874 e[j - 1].name);
875 }
876
877 if (e[i].ordinal != -1)
878 e[j - 1].ordinal = e[i].ordinal;
879 e[j - 1].flag_private |= e[i].flag_private;
880 e[j - 1].flag_constant |= e[i].flag_constant;
881 e[j - 1].flag_noname |= e[i].flag_noname;
882 e[j - 1].flag_data |= e[i].flag_data;
883 if (e[i].name)
884 free (e[i].name);
885 if (e[i].internal_name)
886 free (e[i].internal_name);
887 if (e[i].its_name)
888 free (e[i].its_name);
889 }
890 else
891 {
892 if (i != j)
893 e[j] = e[i];
894 j++;
895 }
896 }
897 pe_def_file->num_exports = j; /* == NE */
898
899 exported_symbol_offsets = xmalloc (NE * sizeof (bfd_vma));
900 exported_symbol_sections = xmalloc (NE * sizeof (struct bfd_section *));
901
902 memset (exported_symbol_sections, 0, NE * sizeof (struct bfd_section *));
903 max_ordinal = 0;
904 min_ordinal = 65536;
905 count_exported = 0;
906 count_exported_byname = 0;
907 count_with_ordinals = 0;
908
909 for (i = 0; i < NE; i++)
910 {
911 char *int_name = pe_def_file->exports[i].internal_name;
912 char *name;
913
914 /* PR 19803: Make sure that any exported symbol does not get garbage collected. */
915 lang_add_gc_name (int_name);
916
917 name = xmalloc (strlen (int_name) + 2);
918 if (pe_details->underscored && int_name[0] != '@')
919 {
920 *name = '_';
921 strcpy (name + 1, int_name);
922
923 /* PR 19803: The alias must be preserved as well. */
924 lang_add_gc_name (xstrdup (name));
925 }
926 else
927 strcpy (name, int_name);
928
929 blhe = bfd_link_hash_lookup (info->hash,
930 name,
931 FALSE, FALSE, TRUE);
932
933 if (blhe
934 && (blhe->type == bfd_link_hash_defined
935 || (blhe->type == bfd_link_hash_common)))
936 {
937 count_exported++;
938 if (!pe_def_file->exports[i].flag_noname)
939 count_exported_byname++;
940
941 /* Only fill in the sections. The actual offsets are computed
942 in fill_exported_offsets() after common symbols are laid
943 out. */
944 if (blhe->type == bfd_link_hash_defined)
945 exported_symbol_sections[i] = blhe->u.def.section;
946 else
947 exported_symbol_sections[i] = blhe->u.c.p->section;
948
949 if (pe_def_file->exports[i].ordinal != -1)
950 {
951 if (max_ordinal < pe_def_file->exports[i].ordinal)
952 max_ordinal = pe_def_file->exports[i].ordinal;
953 if (min_ordinal > pe_def_file->exports[i].ordinal)
954 min_ordinal = pe_def_file->exports[i].ordinal;
955 count_with_ordinals++;
956 }
957 }
958 /* Check for forward exports. These are indicated in DEF files by an
959 export directive of the form NAME1 = MODULE-NAME.EXTERNAL-NAME
960 but we must take care not to be fooled when the user wants to export
961 a symbol that actually really has a dot in it, so we only check
962 for them here, after real defined symbols have already been matched. */
963 else if (strchr (int_name, '.'))
964 {
965 count_exported++;
966 if (!pe_def_file->exports[i].flag_noname)
967 count_exported_byname++;
968
969 pe_def_file->exports[i].flag_forward = 1;
970
971 if (pe_def_file->exports[i].ordinal != -1)
972 {
973 if (max_ordinal < pe_def_file->exports[i].ordinal)
974 max_ordinal = pe_def_file->exports[i].ordinal;
975 if (min_ordinal > pe_def_file->exports[i].ordinal)
976 min_ordinal = pe_def_file->exports[i].ordinal;
977 count_with_ordinals++;
978 }
979 }
980 else if (blhe && blhe->type == bfd_link_hash_undefined)
981 {
982 /* xgettext:c-format */
983 einfo (_("%X%P: cannot export %s: symbol not defined\n"),
984 int_name);
985 }
986 else if (blhe)
987 {
988 /* xgettext:c-format */
989 einfo (_("%X%P: cannot export %s: symbol wrong type (%d vs %d)\n"),
990 int_name,
991 blhe->type, bfd_link_hash_defined);
992 }
993 else
994 {
995 /* xgettext:c-format */
996 einfo (_("%X%P: cannot export %s: symbol not found\n"),
997 int_name);
998 }
999 free (name);
1000 }
1001 }
1002
1003 /* Build the bfd that will contain .edata and .reloc sections. */
1004
1005 static void
1006 build_filler_bfd (int include_edata)
1007 {
1008 lang_input_statement_type *filler_file;
1009 filler_file = lang_add_input_file ("dll stuff",
1010 lang_input_file_is_fake_enum,
1011 NULL);
1012 filler_file->the_bfd = filler_bfd = bfd_create ("dll stuff",
1013 link_info.output_bfd);
1014 if (filler_bfd == NULL
1015 || !bfd_set_arch_mach (filler_bfd,
1016 bfd_get_arch (link_info.output_bfd),
1017 bfd_get_mach (link_info.output_bfd)))
1018 {
1019 einfo (_("%F%P: can not create BFD: %E\n"));
1020 return;
1021 }
1022
1023 if (include_edata)
1024 {
1025 edata_s = bfd_make_section_old_way (filler_bfd, ".edata");
1026 if (edata_s == NULL
1027 || !bfd_set_section_flags (edata_s, (SEC_HAS_CONTENTS
1028 | SEC_ALLOC
1029 | SEC_LOAD
1030 | SEC_KEEP
1031 | SEC_IN_MEMORY)))
1032 {
1033 einfo (_("%X%P: can not create .edata section: %E\n"));
1034 return;
1035 }
1036 bfd_set_section_size (edata_s, edata_sz);
1037 }
1038
1039 reloc_s = bfd_make_section_old_way (filler_bfd, ".reloc");
1040 if (reloc_s == NULL
1041 || !bfd_set_section_flags (reloc_s, (SEC_HAS_CONTENTS
1042 | SEC_ALLOC
1043 | SEC_LOAD
1044 | SEC_KEEP
1045 | SEC_IN_MEMORY)))
1046 {
1047 einfo (_("%X%P: can not create .reloc section: %E\n"));
1048 return;
1049 }
1050
1051 bfd_set_section_size (reloc_s, 0);
1052
1053 ldlang_add_file (filler_file);
1054 }
1055
1056 /* Gather all the exported symbols and build the .edata section. */
1057
1058 static void
1059 generate_edata (bfd *abfd, struct bfd_link_info *info ATTRIBUTE_UNUSED)
1060 {
1061 int i, next_ordinal;
1062 int name_table_size = 0;
1063 const char *dlnp;
1064
1065 /* First, we need to know how many exported symbols there are,
1066 and what the range of ordinals is. */
1067 if (pe_def_file->name)
1068 dll_name = pe_def_file->name;
1069 else
1070 {
1071 dll_name = abfd->filename;
1072
1073 for (dlnp = dll_name; *dlnp; dlnp++)
1074 if (*dlnp == '\\' || *dlnp == '/' || *dlnp == ':')
1075 dll_name = dlnp + 1;
1076 }
1077
1078 if (count_with_ordinals && max_ordinal > count_exported)
1079 {
1080 if (min_ordinal > max_ordinal - count_exported + 1)
1081 min_ordinal = max_ordinal - count_exported + 1;
1082 }
1083 else
1084 {
1085 min_ordinal = 1;
1086 max_ordinal = count_exported;
1087 }
1088
1089 export_table_size = max_ordinal - min_ordinal + 1;
1090 exported_symbols = xmalloc (export_table_size * sizeof (int));
1091 for (i = 0; i < export_table_size; i++)
1092 exported_symbols[i] = -1;
1093
1094 /* Now we need to assign ordinals to those that don't have them. */
1095 for (i = 0; i < NE; i++)
1096 {
1097 if (exported_symbol_sections[i]
1098 || pe_def_file->exports[i].flag_forward)
1099 {
1100 if (pe_def_file->exports[i].ordinal != -1)
1101 {
1102 int ei = pe_def_file->exports[i].ordinal - min_ordinal;
1103 int pi = exported_symbols[ei];
1104
1105 if (pi != -1)
1106 {
1107 /* xgettext:c-format */
1108 einfo (_("%X%P: error: ordinal used twice: %d (%s vs %s)\n"),
1109 pe_def_file->exports[i].ordinal,
1110 pe_def_file->exports[i].name,
1111 pe_def_file->exports[pi].name);
1112 }
1113 exported_symbols[ei] = i;
1114 }
1115 if (pe_def_file->exports[i].its_name)
1116 name_table_size += strlen (pe_def_file->exports[i].its_name) + 1;
1117 else
1118 name_table_size += strlen (pe_def_file->exports[i].name) + 1;
1119 }
1120
1121 /* Reserve space for the forward name. */
1122 if (pe_def_file->exports[i].flag_forward)
1123 {
1124 name_table_size += strlen (pe_def_file->exports[i].internal_name) + 1;
1125 }
1126 }
1127
1128 next_ordinal = min_ordinal;
1129 for (i = 0; i < NE; i++)
1130 if ((exported_symbol_sections[i]
1131 || pe_def_file->exports[i].flag_forward)
1132 && pe_def_file->exports[i].ordinal == -1)
1133 {
1134 while (exported_symbols[next_ordinal - min_ordinal] != -1)
1135 next_ordinal++;
1136
1137 exported_symbols[next_ordinal - min_ordinal] = i;
1138 pe_def_file->exports[i].ordinal = next_ordinal;
1139 }
1140
1141 /* PR 12969: Check for more than 1^16 ordinals. */
1142 if (max_ordinal > 65535 || next_ordinal > 65535)
1143 /* xgettext:c-format */
1144 einfo(_("%X%P: error: export ordinal too large: %d\n"),
1145 max_ordinal > next_ordinal ? max_ordinal : next_ordinal);
1146
1147 /* OK, now we can allocate some memory. */
1148 edata_sz = (40 /* directory */
1149 + 4 * export_table_size /* addresses */
1150 + 4 * count_exported_byname /* name ptrs */
1151 + 2 * count_exported_byname /* ordinals */
1152 + name_table_size + strlen (dll_name) + 1);
1153 }
1154
1155 /* Fill the exported symbol offsets. The preliminary work has already
1156 been done in process_def_file_and_drectve(). */
1157
1158 static void
1159 fill_exported_offsets (bfd *abfd ATTRIBUTE_UNUSED, struct bfd_link_info *info)
1160 {
1161 int i;
1162 struct bfd_link_hash_entry *blhe;
1163
1164 for (i = 0; i < pe_def_file->num_exports; i++)
1165 {
1166 char *name;
1167
1168 name = xmalloc (strlen (pe_def_file->exports[i].internal_name) + 2);
1169 if (pe_details->underscored
1170 && *pe_def_file->exports[i].internal_name != '@')
1171 {
1172 *name = '_';
1173 strcpy (name + 1, pe_def_file->exports[i].internal_name);
1174 }
1175 else
1176 strcpy (name, pe_def_file->exports[i].internal_name);
1177
1178 blhe = bfd_link_hash_lookup (info->hash,
1179 name,
1180 FALSE, FALSE, TRUE);
1181
1182 if (blhe && blhe->type == bfd_link_hash_defined)
1183 exported_symbol_offsets[i] = blhe->u.def.value;
1184
1185 free (name);
1186 }
1187 }
1188
1189 static void
1190 fill_edata (bfd *abfd, struct bfd_link_info *info ATTRIBUTE_UNUSED)
1191 {
1192 int s, hint;
1193 unsigned char *edirectory;
1194 unsigned char *eaddresses;
1195 unsigned char *enameptrs;
1196 unsigned char *eordinals;
1197 char *enamestr;
1198
1199 edata_d = xmalloc (edata_sz);
1200
1201 /* Note use of array pointer math here. */
1202 edirectory = edata_d;
1203 eaddresses = edirectory + 40;
1204 enameptrs = eaddresses + 4 * export_table_size;
1205 eordinals = enameptrs + 4 * count_exported_byname;
1206 enamestr = (char *) eordinals + 2 * count_exported_byname;
1207
1208 #define ERVA(ptr) (((unsigned char *)(ptr) - edata_d) \
1209 + edata_s->output_section->vma - image_base)
1210
1211 memset (edata_d, 0, edata_sz);
1212
1213 if (pe_data (abfd)->insert_timestamp)
1214 H_PUT_32 (abfd, time (0), edata_d + 4);
1215
1216 if (pe_def_file->version_major != -1)
1217 {
1218 bfd_put_16 (abfd, pe_def_file->version_major, edata_d + 8);
1219 bfd_put_16 (abfd, pe_def_file->version_minor, edata_d + 10);
1220 }
1221
1222 bfd_put_32 (abfd, ERVA (enamestr), edata_d + 12);
1223 strcpy (enamestr, dll_name);
1224 enamestr += strlen (enamestr) + 1;
1225 bfd_put_32 (abfd, min_ordinal, edata_d + 16);
1226 bfd_put_32 (abfd, export_table_size, edata_d + 20);
1227 bfd_put_32 (abfd, count_exported_byname, edata_d + 24);
1228 bfd_put_32 (abfd, ERVA (eaddresses), edata_d + 28);
1229 bfd_put_32 (abfd, ERVA (enameptrs), edata_d + 32);
1230 bfd_put_32 (abfd, ERVA (eordinals), edata_d + 36);
1231
1232 fill_exported_offsets (abfd, info);
1233
1234 /* Ok, now for the filling in part.
1235 Scan alphabetically - ie the ordering in the exports[] table,
1236 rather than by ordinal - the ordering in the exported_symbol[]
1237 table. See dlltool.c and:
1238 http://sources.redhat.com/ml/binutils/2003-04/msg00379.html
1239 for more information. */
1240 hint = 0;
1241 for (s = 0; s < NE; s++)
1242 {
1243 struct bfd_section *ssec = exported_symbol_sections[s];
1244 if (pe_def_file->exports[s].ordinal != -1
1245 && (pe_def_file->exports[s].flag_forward || ssec != NULL))
1246 {
1247 int ord = pe_def_file->exports[s].ordinal;
1248
1249 if (pe_def_file->exports[s].flag_forward)
1250 {
1251 bfd_put_32 (abfd, ERVA (enamestr),
1252 eaddresses + 4 * (ord - min_ordinal));
1253
1254 strcpy (enamestr, pe_def_file->exports[s].internal_name);
1255 enamestr += strlen (pe_def_file->exports[s].internal_name) + 1;
1256 }
1257 else
1258 {
1259 bfd_vma srva = (exported_symbol_offsets[s]
1260 + ssec->output_section->vma
1261 + ssec->output_offset);
1262
1263 bfd_put_32 (abfd, srva - image_base,
1264 eaddresses + 4 * (ord - min_ordinal));
1265 }
1266
1267 if (!pe_def_file->exports[s].flag_noname)
1268 {
1269 char *ename = pe_def_file->exports[s].name;
1270 if (pe_def_file->exports[s].its_name)
1271 ename = pe_def_file->exports[s].its_name;
1272
1273 bfd_put_32 (abfd, ERVA (enamestr), enameptrs);
1274 enameptrs += 4;
1275 strcpy (enamestr, ename);
1276 enamestr += strlen (enamestr) + 1;
1277 bfd_put_16 (abfd, ord - min_ordinal, eordinals);
1278 eordinals += 2;
1279 pe_def_file->exports[s].hint = hint++;
1280 }
1281 }
1282 }
1283 }
1284
1285
1286 static struct bfd_section *current_sec;
1287
1288 static void
1289 pe_walk_relocs (struct bfd_link_info *info,
1290 char *name,
1291 const char *symname,
1292 struct bfd_hash_table *import_hash,
1293 void (*cb) (arelent *, asection *, char *, const char *))
1294 {
1295 bfd *b;
1296 asection *s;
1297
1298 for (b = info->input_bfds; b; b = b->link.next)
1299 {
1300 asymbol **symbols;
1301
1302 if (!bfd_generic_link_read_symbols (b))
1303 {
1304 einfo (_("%F%P: %pB: could not read symbols: %E\n"), b);
1305 return;
1306 }
1307
1308 symbols = bfd_get_outsymbols (b);
1309
1310 for (s = b->sections; s; s = s->next)
1311 {
1312 arelent **relocs;
1313 int relsize, nrelocs, i;
1314 int flags = bfd_section_flags (s);
1315
1316 /* Skip discarded linkonce sections. */
1317 if (flags & SEC_LINK_ONCE
1318 && s->output_section == bfd_abs_section_ptr)
1319 continue;
1320
1321 current_sec = s;
1322
1323 relsize = bfd_get_reloc_upper_bound (b, s);
1324 relocs = xmalloc (relsize);
1325 nrelocs = bfd_canonicalize_reloc (b, s, relocs, symbols);
1326
1327 for (i = 0; i < nrelocs; i++)
1328 {
1329 struct bfd_symbol *sym = *relocs[i]->sym_ptr_ptr;
1330
1331 /* Warning: the callback needs to be passed NAME directly. */
1332 if (import_hash)
1333 {
1334 if (bfd_hash_lookup (import_hash, sym->name, FALSE, FALSE))
1335 {
1336 strcpy (name, sym->name);
1337 cb (relocs[i], s, name, symname);
1338 }
1339 }
1340 else
1341 {
1342 if (strcmp (name, sym->name) == 0)
1343 cb (relocs[i], s, name, symname);
1344 }
1345 }
1346
1347 free (relocs);
1348
1349 /* Warning: the allocated symbols are remembered in BFD and reused
1350 later, so don't free them! */
1351 /* free (symbols); */
1352 }
1353 }
1354 }
1355
1356 void
1357 pe_find_data_imports (const char *symhead,
1358 void (*cb) (arelent *, asection *, char *, const char *))
1359 {
1360 struct bfd_link_hash_entry *undef;
1361 const size_t headlen = strlen (symhead);
1362 size_t namelen = 0;
1363 char *buf, *name;
1364 struct bfd_hash_table *import_hash;
1365
1366 for (undef = link_info.hash->undefs; undef; undef = undef->u.undef.next)
1367 if (undef->type == bfd_link_hash_undefined)
1368 {
1369 size_t len = strlen (undef->root.string);
1370 if (namelen < len)
1371 namelen = len;
1372 }
1373 if (namelen == 0)
1374 return;
1375
1376 /* For the pseudo-relocation support version 2, we can collect the symbols
1377 that are subject to auto-import and adjust the relocations en masse. */
1378 if (link_info.pei386_runtime_pseudo_reloc == 2)
1379 {
1380 import_hash
1381 = (struct bfd_hash_table *) xmalloc (sizeof (struct bfd_hash_table));
1382 if (!bfd_hash_table_init (import_hash,
1383 bfd_hash_newfunc,
1384 sizeof (struct bfd_hash_entry)))
1385 einfo (_("%F%P: bfd_hash_table_init failed: %E\n"));
1386 }
1387 else
1388 import_hash = NULL;
1389
1390 /* We are being a bit cunning here. The buffer will have space for
1391 prefixes at the beginning. The prefix is modified here and in a
1392 number of functions called from this function. */
1393 #define PREFIX_LEN 32
1394 buf = xmalloc (PREFIX_LEN + namelen + 1);
1395 name = buf + PREFIX_LEN;
1396
1397 for (undef = link_info.hash->undefs; undef; undef = undef->u.undef.next)
1398 if (undef->type == bfd_link_hash_undefined)
1399 {
1400 struct bfd_link_hash_entry *sym;
1401 char *impname;
1402
1403 if (pe_dll_extra_pe_debug)
1404 printf ("%s:%s\n", __FUNCTION__, undef->root.string);
1405
1406 strcpy (name, undef->root.string);
1407 impname = name - (sizeof "__imp_" - 1);
1408 memcpy (impname, "__imp_", sizeof "__imp_" - 1);
1409
1410 sym = bfd_link_hash_lookup (link_info.hash, impname, 0, 0, 1);
1411
1412 if (sym && sym->type == bfd_link_hash_defined)
1413 {
1414 if (import_hash)
1415 bfd_hash_lookup (import_hash, undef->root.string, TRUE, FALSE);
1416 else
1417 {
1418 bfd *b = sym->u.def.section->owner;
1419 const char *symname = NULL;
1420 asymbol **symbols;
1421 int nsyms, i;
1422
1423 if (!bfd_generic_link_read_symbols (b))
1424 {
1425 einfo (_("%F%P: %pB: could not read symbols: %E\n"), b);
1426 return;
1427 }
1428
1429 symbols = bfd_get_outsymbols (b);
1430 nsyms = bfd_get_symcount (b);
1431
1432 for (i = 0; i < nsyms; i++)
1433 if (strncmp (symbols[i]->name, symhead, headlen) == 0)
1434 {
1435 if (pe_dll_extra_pe_debug)
1436 printf ("->%s\n", symbols[i]->name);
1437
1438 symname = symbols[i]->name + headlen;
1439 break;
1440 }
1441
1442 /* If the symobl isn't part of an import table, there is no
1443 point in building a fixup, this would give rise to link
1444 errors for mangled symbols instead of the original one. */
1445 if (symname)
1446 pe_walk_relocs (&link_info, name, symname, NULL, cb);
1447 else
1448 continue;
1449 }
1450
1451 /* Let's differentiate it somehow from defined. */
1452 undef->type = bfd_link_hash_defweak;
1453 undef->u.def.value = sym->u.def.value;
1454 undef->u.def.section = sym->u.def.section;
1455
1456 /* We replace the original name with the __imp_ prefixed one, this
1457 1) may trash memory 2) leads to duplicate symbols. But this is
1458 better than having a misleading name that can confuse GDB. */
1459 undef->root.string = sym->root.string;
1460
1461 if (link_info.pei386_auto_import == -1)
1462 {
1463 static bfd_boolean warned = FALSE;
1464
1465 info_msg (_("Info: resolving %s by linking to %s "
1466 "(auto-import)\n"), name, impname);
1467
1468 /* PR linker/4844. */
1469 if (!warned)
1470 {
1471 einfo (_("%P: warning: auto-importing has been activated "
1472 "without --enable-auto-import specified on the "
1473 "command line; this should work unless it "
1474 "involves constant data structures referencing "
1475 "symbols from auto-imported DLLs\n"));
1476 warned = TRUE;
1477 }
1478 }
1479 }
1480 }
1481
1482 /* If we have the import hash table, walk the relocations only once. */
1483 if (import_hash)
1484 {
1485 pe_walk_relocs (&link_info, name, NULL, import_hash, cb);
1486 bfd_hash_table_free (import_hash);
1487 free (import_hash);
1488 }
1489
1490 free (buf);
1491 }
1492
1493 /* Gather all the relocations and build the .reloc section. */
1494
1495 static void
1496 generate_reloc (bfd *abfd, struct bfd_link_info *info)
1497 {
1498
1499 /* For .reloc stuff. */
1500 reloc_data_type *reloc_data;
1501 int total_relocs = 0;
1502 int i;
1503 bfd_vma sec_page = (bfd_vma) -1;
1504 bfd_vma page_ptr, page_count;
1505 int bi;
1506 bfd *b;
1507 struct bfd_section *s;
1508
1509 total_relocs = 0;
1510 for (b = info->input_bfds; b; b = b->link.next)
1511 for (s = b->sections; s; s = s->next)
1512 total_relocs += s->reloc_count;
1513
1514 reloc_data = xmalloc (total_relocs * sizeof (reloc_data_type));
1515
1516 total_relocs = 0;
1517 bi = 0;
1518 for (bi = 0, b = info->input_bfds; b; bi++, b = b->link.next)
1519 {
1520 arelent **relocs;
1521 int relsize, nrelocs;
1522
1523 for (s = b->sections; s; s = s->next)
1524 {
1525 bfd_vma sec_vma = s->output_section->vma + s->output_offset;
1526 asymbol **symbols;
1527
1528 /* If it's not loaded, we don't need to relocate it this way. */
1529 if (!(s->output_section->flags & SEC_LOAD))
1530 continue;
1531
1532 /* I don't know why there would be a reloc for these, but I've
1533 seen it happen - DJ */
1534 if (s->output_section == bfd_abs_section_ptr)
1535 continue;
1536
1537 if (s->output_section->vma == 0)
1538 {
1539 /* Huh? Shouldn't happen, but punt if it does. */
1540 einfo (_("%P: zero vma section reloc detected: `%s' #%d f=%d\n"),
1541 s->output_section->name, s->output_section->index,
1542 s->output_section->flags);
1543 continue;
1544 }
1545
1546 if (!bfd_generic_link_read_symbols (b))
1547 {
1548 einfo (_("%F%P: %pB: could not read symbols: %E\n"), b);
1549 return;
1550 }
1551
1552 symbols = bfd_get_outsymbols (b);
1553 relsize = bfd_get_reloc_upper_bound (b, s);
1554 relocs = xmalloc (relsize);
1555 nrelocs = bfd_canonicalize_reloc (b, s, relocs, symbols);
1556
1557 for (i = 0; i < nrelocs; i++)
1558 {
1559 if (pe_dll_extra_pe_debug)
1560 {
1561 struct bfd_symbol *sym = *relocs[i]->sym_ptr_ptr;
1562 printf ("rel: %s\n", sym->name);
1563 }
1564 if (!relocs[i]->howto->pc_relative
1565 && relocs[i]->howto->type != pe_details->imagebase_reloc)
1566 {
1567 struct bfd_symbol *sym = *relocs[i]->sym_ptr_ptr;
1568
1569 /* Don't create relocs for undefined weak symbols. */
1570 if (sym->flags == BSF_WEAK)
1571 {
1572 struct bfd_link_hash_entry *blhe
1573 = bfd_wrapped_link_hash_lookup (abfd, info, sym->name,
1574 FALSE, FALSE, FALSE);
1575 if (blhe && blhe->type == bfd_link_hash_undefweak)
1576 {
1577 /* Check aux sym and see if it is defined or not. */
1578 struct coff_link_hash_entry *h, *h2;
1579 h = (struct coff_link_hash_entry *)blhe;
1580 if (h->symbol_class != C_NT_WEAK || h->numaux != 1)
1581 continue;
1582 h2 = h->auxbfd->tdata.coff_obj_data->sym_hashes
1583 [h->aux->x_sym.x_tagndx.l];
1584 /* We don't want a base reloc if the aux sym is not
1585 found, undefined, or if it is the constant ABS
1586 zero default value. (We broaden that slightly by
1587 not testing the value, just the section; there's
1588 no reason we'd want a reference to any absolute
1589 address to get relocated during rebasing). */
1590 if (!h2 || h2->root.type == bfd_link_hash_undefined
1591 || h2->root.u.def.section == bfd_abs_section_ptr)
1592 continue;
1593 }
1594 else if (!blhe || blhe->type != bfd_link_hash_defined)
1595 continue;
1596 }
1597 /* Nor for Dwarf FDE references to discarded sections. */
1598 else if (bfd_is_abs_section (sym->section->output_section))
1599 {
1600 /* We only ignore relocs from .eh_frame sections, as
1601 they are discarded by the final link rather than
1602 resolved against the kept section. */
1603 if (!strcmp (s->name, ".eh_frame"))
1604 continue;
1605 }
1606
1607 reloc_data[total_relocs].vma = sec_vma + relocs[i]->address;
1608 reloc_data[total_relocs].idx = total_relocs;
1609
1610 #define BITS_AND_SHIFT(bits, shift) (bits * 1000 | shift)
1611
1612 switch BITS_AND_SHIFT (relocs[i]->howto->bitsize,
1613 relocs[i]->howto->rightshift)
1614 {
1615 #ifdef pe_use_x86_64
1616 case BITS_AND_SHIFT (64, 0):
1617 reloc_data[total_relocs].type = 10;
1618 total_relocs++;
1619 break;
1620 #endif
1621 case BITS_AND_SHIFT (32, 0):
1622 reloc_data[total_relocs].type = 3;
1623 total_relocs++;
1624 break;
1625 case BITS_AND_SHIFT (16, 0):
1626 reloc_data[total_relocs].type = 2;
1627 total_relocs++;
1628 break;
1629 case BITS_AND_SHIFT (16, 16):
1630 reloc_data[total_relocs].type = 4;
1631 /* FIXME: we can't know the symbol's right value
1632 yet, but we probably can safely assume that
1633 CE will relocate us in 64k blocks, so leaving
1634 it zero is safe. */
1635 reloc_data[total_relocs].extra = 0;
1636 total_relocs++;
1637 break;
1638 case BITS_AND_SHIFT (26, 2):
1639 reloc_data[total_relocs].type = 5;
1640 total_relocs++;
1641 break;
1642 case BITS_AND_SHIFT (24, 2):
1643 /* FIXME: 0 is ARM_26D, it is defined in bfd/coff-arm.c
1644 Those ARM_xxx definitions should go in proper
1645 header someday. */
1646 if (relocs[i]->howto->type == 0
1647 /* Older GNU linkers used 5 instead of 0 for this reloc. */
1648 || relocs[i]->howto->type == 5)
1649 /* This is an ARM_26D reloc, which is an ARM_26 reloc
1650 that has already been fully processed during a
1651 previous link stage, so ignore it here. */
1652 break;
1653 /* Fall through. */
1654 default:
1655 /* xgettext:c-format */
1656 einfo (_("%X%P: error: %d-bit reloc in dll\n"),
1657 relocs[i]->howto->bitsize);
1658 break;
1659 }
1660 }
1661 }
1662 free (relocs);
1663 /* Warning: the allocated symbols are remembered in BFD and
1664 reused later, so don't free them! */
1665 }
1666 }
1667
1668 /* At this point, we have total_relocs relocation addresses in
1669 reloc_addresses, which are all suitable for the .reloc section.
1670 We must now create the new sections. */
1671 qsort (reloc_data, total_relocs, sizeof (*reloc_data), reloc_sort);
1672
1673 for (i = 0; i < total_relocs; i++)
1674 {
1675 bfd_vma this_page = (reloc_data[i].vma >> 12);
1676
1677 if (this_page != sec_page)
1678 {
1679 reloc_sz = (reloc_sz + 3) & ~3; /* 4-byte align. */
1680 reloc_sz += 8;
1681 sec_page = this_page;
1682 }
1683
1684 reloc_sz += 2;
1685
1686 if (reloc_data[i].type == 4)
1687 reloc_sz += 2;
1688 }
1689
1690 reloc_sz = (reloc_sz + 3) & ~3; /* 4-byte align. */
1691 reloc_d = xmalloc (reloc_sz);
1692 sec_page = (bfd_vma) -1;
1693 reloc_sz = 0;
1694 page_ptr = (bfd_vma) -1;
1695 page_count = 0;
1696
1697 for (i = 0; i < total_relocs; i++)
1698 {
1699 bfd_vma rva = reloc_data[i].vma - image_base;
1700 bfd_vma this_page = (rva & ~0xfff);
1701
1702 if (this_page != sec_page)
1703 {
1704 while (reloc_sz & 3)
1705 reloc_d[reloc_sz++] = 0;
1706
1707 if (page_ptr != (bfd_vma) -1)
1708 bfd_put_32 (abfd, reloc_sz - page_ptr, reloc_d + page_ptr + 4);
1709
1710 bfd_put_32 (abfd, this_page, reloc_d + reloc_sz);
1711 page_ptr = reloc_sz;
1712 reloc_sz += 8;
1713 sec_page = this_page;
1714 page_count = 0;
1715 }
1716
1717 bfd_put_16 (abfd, (rva & 0xfff) + (reloc_data[i].type << 12),
1718 reloc_d + reloc_sz);
1719 reloc_sz += 2;
1720
1721 if (reloc_data[i].type == 4)
1722 {
1723 bfd_put_16 (abfd, reloc_data[i].extra, reloc_d + reloc_sz);
1724 reloc_sz += 2;
1725 }
1726
1727 page_count++;
1728 }
1729
1730 while (reloc_sz & 3)
1731 reloc_d[reloc_sz++] = 0;
1732
1733 if (page_ptr != (bfd_vma) -1)
1734 bfd_put_32 (abfd, reloc_sz - page_ptr, reloc_d + page_ptr + 4);
1735
1736 while (reloc_sz < reloc_s->size)
1737 reloc_d[reloc_sz++] = 0;
1738 }
1739
1740 /* Given the exiting def_file structure, print out a .DEF file that
1741 corresponds to it. */
1742
1743 static void
1744 quoteput (char *s, FILE *f, int needs_quotes)
1745 {
1746 char *cp;
1747
1748 for (cp = s; *cp; cp++)
1749 if (*cp == '\''
1750 || *cp == '"'
1751 || *cp == '\\'
1752 || ISSPACE (*cp)
1753 || *cp == ','
1754 || *cp == ';')
1755 needs_quotes = 1;
1756
1757 if (needs_quotes)
1758 {
1759 putc ('"', f);
1760
1761 while (*s)
1762 {
1763 if (*s == '"' || *s == '\\')
1764 putc ('\\', f);
1765
1766 putc (*s, f);
1767 s++;
1768 }
1769
1770 putc ('"', f);
1771 }
1772 else
1773 fputs (s, f);
1774 }
1775
1776 void
1777 pe_dll_generate_def_file (const char *pe_out_def_filename)
1778 {
1779 int i;
1780 FILE *out = fopen (pe_out_def_filename, "w");
1781
1782 if (out == NULL)
1783 /* xgettext:c-format */
1784 einfo (_("%P: can't open output def file %s\n"),
1785 pe_out_def_filename);
1786
1787 if (pe_def_file)
1788 {
1789 if (pe_def_file->name)
1790 {
1791 if (pe_def_file->is_dll)
1792 fprintf (out, "LIBRARY ");
1793 else
1794 fprintf (out, "NAME ");
1795
1796 quoteput (pe_def_file->name, out, 1);
1797
1798 if (pe_data (link_info.output_bfd)->pe_opthdr.ImageBase)
1799 {
1800 fprintf (out, " BASE=0x");
1801 fprintf_vma (out, ((bfd_vma) pe_data (link_info.output_bfd)->pe_opthdr.ImageBase));
1802 }
1803 fprintf (out, "\n");
1804 }
1805
1806 if (pe_def_file->description)
1807 {
1808 fprintf (out, "DESCRIPTION ");
1809 quoteput (pe_def_file->description, out, 1);
1810 fprintf (out, "\n");
1811 }
1812
1813 if (pe_def_file->version_minor != -1)
1814 fprintf (out, "VERSION %d.%d\n", pe_def_file->version_major,
1815 pe_def_file->version_minor);
1816 else if (pe_def_file->version_major != -1)
1817 fprintf (out, "VERSION %d\n", pe_def_file->version_major);
1818
1819 if (pe_def_file->stack_reserve != -1 || pe_def_file->heap_reserve != -1)
1820 fprintf (out, "\n");
1821
1822 if (pe_def_file->stack_commit != -1)
1823 fprintf (out, "STACKSIZE 0x%x,0x%x\n",
1824 pe_def_file->stack_reserve, pe_def_file->stack_commit);
1825 else if (pe_def_file->stack_reserve != -1)
1826 fprintf (out, "STACKSIZE 0x%x\n", pe_def_file->stack_reserve);
1827
1828 if (pe_def_file->heap_commit != -1)
1829 fprintf (out, "HEAPSIZE 0x%x,0x%x\n",
1830 pe_def_file->heap_reserve, pe_def_file->heap_commit);
1831 else if (pe_def_file->heap_reserve != -1)
1832 fprintf (out, "HEAPSIZE 0x%x\n", pe_def_file->heap_reserve);
1833
1834 if (pe_def_file->num_section_defs > 0)
1835 {
1836 fprintf (out, "\nSECTIONS\n\n");
1837
1838 for (i = 0; i < pe_def_file->num_section_defs; i++)
1839 {
1840 fprintf (out, " ");
1841 quoteput (pe_def_file->section_defs[i].name, out, 0);
1842
1843 if (pe_def_file->section_defs[i].class)
1844 {
1845 fprintf (out, " CLASS ");
1846 quoteput (pe_def_file->section_defs[i].class, out, 0);
1847 }
1848
1849 if (pe_def_file->section_defs[i].flag_read)
1850 fprintf (out, " READ");
1851
1852 if (pe_def_file->section_defs[i].flag_write)
1853 fprintf (out, " WRITE");
1854
1855 if (pe_def_file->section_defs[i].flag_execute)
1856 fprintf (out, " EXECUTE");
1857
1858 if (pe_def_file->section_defs[i].flag_shared)
1859 fprintf (out, " SHARED");
1860
1861 fprintf (out, "\n");
1862 }
1863 }
1864
1865 if (pe_def_file->num_exports > 0)
1866 {
1867 fprintf (out, "EXPORTS\n");
1868
1869 for (i = 0; i < pe_def_file->num_exports; i++)
1870 {
1871 def_file_export *e = pe_def_file->exports + i;
1872 fprintf (out, " ");
1873 quoteput (e->name, out, 0);
1874
1875 if (e->internal_name && strcmp (e->internal_name, e->name))
1876 {
1877 fprintf (out, " = ");
1878 quoteput (e->internal_name, out, 0);
1879 }
1880
1881 if (e->ordinal != -1)
1882 fprintf (out, " @%d", e->ordinal);
1883
1884 if (e->flag_private)
1885 fprintf (out, " PRIVATE");
1886
1887 if (e->flag_constant)
1888 fprintf (out, " CONSTANT");
1889
1890 if (e->flag_noname)
1891 fprintf (out, " NONAME");
1892
1893 if (e->flag_data)
1894 fprintf (out, " DATA");
1895
1896 fprintf (out, "\n");
1897 }
1898 }
1899
1900 if (pe_def_file->num_imports > 0)
1901 {
1902 fprintf (out, "\nIMPORTS\n\n");
1903
1904 for (i = 0; i < pe_def_file->num_imports; i++)
1905 {
1906 def_file_import *im = pe_def_file->imports + i;
1907 fprintf (out, " ");
1908
1909 if (im->internal_name
1910 && (!im->name || strcmp (im->internal_name, im->name)))
1911 {
1912 quoteput (im->internal_name, out, 0);
1913 fprintf (out, " = ");
1914 }
1915
1916 quoteput (im->module->name, out, 0);
1917 fprintf (out, ".");
1918
1919 if (im->name)
1920 quoteput (im->name, out, 0);
1921 else
1922 fprintf (out, "%d", im->ordinal);
1923
1924 if (im->its_name)
1925 {
1926 fprintf (out, " == ");
1927 quoteput (im->its_name, out, 0);
1928 }
1929
1930 fprintf (out, "\n");
1931 }
1932 }
1933 }
1934 else
1935 fprintf (out, _("; no contents available\n"));
1936
1937 if (fclose (out) == EOF)
1938 /* xgettext:c-format */
1939 einfo (_("%P: error closing file `%s'\n"), pe_out_def_filename);
1940 }
1941
1942 /* Generate the import library. */
1943
1944 static asymbol **symtab;
1945 static int symptr;
1946 static int tmp_seq;
1947 static const char *dll_filename;
1948 static char *dll_symname;
1949
1950 #define UNDSEC bfd_und_section_ptr
1951
1952 static asection *
1953 quick_section (bfd *abfd, const char *name, int flags, int align)
1954 {
1955 asection *sec;
1956 asymbol *sym;
1957
1958 sec = bfd_make_section_old_way (abfd, name);
1959 bfd_set_section_flags (sec, flags | SEC_ALLOC | SEC_LOAD | SEC_KEEP);
1960 bfd_set_section_alignment (sec, align);
1961 /* Remember to undo this before trying to link internally! */
1962 sec->output_section = sec;
1963
1964 sym = bfd_make_empty_symbol (abfd);
1965 symtab[symptr++] = sym;
1966 sym->name = sec->name;
1967 sym->section = sec;
1968 sym->flags = BSF_LOCAL;
1969 sym->value = 0;
1970
1971 return sec;
1972 }
1973
1974 static void
1975 quick_symbol (bfd *abfd,
1976 const char *n1,
1977 const char *n2,
1978 const char *n3,
1979 asection *sec,
1980 int flags,
1981 int addr)
1982 {
1983 asymbol *sym;
1984 char *name = xmalloc (strlen (n1) + strlen (n2) + strlen (n3) + 1);
1985
1986 strcpy (name, n1);
1987 strcat (name, n2);
1988 strcat (name, n3);
1989 sym = bfd_make_empty_symbol (abfd);
1990 sym->name = name;
1991 sym->section = sec;
1992 sym->flags = flags;
1993 sym->value = addr;
1994 symtab[symptr++] = sym;
1995 }
1996
1997 static arelent *reltab = 0;
1998 static int relcount = 0, relsize = 0;
1999
2000 static void
2001 quick_reloc (bfd *abfd, bfd_size_type address, int which_howto, int symidx)
2002 {
2003 if (relcount >= relsize - 1)
2004 {
2005 relsize += 10;
2006 if (reltab)
2007 reltab = xrealloc (reltab, relsize * sizeof (arelent));
2008 else
2009 reltab = xmalloc (relsize * sizeof (arelent));
2010 }
2011 reltab[relcount].address = address;
2012 reltab[relcount].addend = 0;
2013 reltab[relcount].howto = bfd_reloc_type_lookup (abfd, which_howto);
2014 reltab[relcount].sym_ptr_ptr = symtab + symidx;
2015 relcount++;
2016 }
2017
2018 static void
2019 save_relocs (asection *sec)
2020 {
2021 int i;
2022
2023 sec->relocation = reltab;
2024 sec->reloc_count = relcount;
2025 sec->orelocation = xmalloc ((relcount + 1) * sizeof (arelent *));
2026 for (i = 0; i < relcount; i++)
2027 sec->orelocation[i] = sec->relocation + i;
2028 sec->orelocation[relcount] = 0;
2029 sec->flags |= SEC_RELOC;
2030 reltab = 0;
2031 relcount = relsize = 0;
2032 }
2033
2034 /* .section .idata$2
2035 .global __head_my_dll
2036 __head_my_dll:
2037 .rva hname
2038 .long 0
2039 .long 0
2040 .rva __my_dll_iname
2041 .rva fthunk
2042
2043 .section .idata$5
2044 .long 0
2045 fthunk:
2046
2047 .section .idata$4
2048 .long 0
2049 hname: */
2050
2051 static bfd *
2052 make_head (bfd *parent)
2053 {
2054 asection *id2, *id5, *id4;
2055 unsigned char *d2, *d5, *d4;
2056 char *oname;
2057 bfd *abfd;
2058
2059 oname = xmalloc (20);
2060 sprintf (oname, "d%06d.o", tmp_seq);
2061 tmp_seq++;
2062
2063 abfd = bfd_create (oname, parent);
2064 bfd_find_target (pe_details->object_target, abfd);
2065 bfd_make_writable (abfd);
2066
2067 bfd_set_format (abfd, bfd_object);
2068 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2069
2070 symptr = 0;
2071 symtab = xmalloc (6 * sizeof (asymbol *));
2072 id2 = quick_section (abfd, ".idata$2", SEC_HAS_CONTENTS, 2);
2073 id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
2074 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
2075 quick_symbol (abfd, U ("_head_"), dll_symname, "", id2, BSF_GLOBAL, 0);
2076 quick_symbol (abfd, U (""), dll_symname, "_iname", UNDSEC, BSF_GLOBAL, 0);
2077
2078 /* OK, pay attention here. I got confused myself looking back at
2079 it. We create a four-byte section to mark the beginning of the
2080 list, and we include an offset of 4 in the section, so that the
2081 pointer to the list points to the *end* of this section, which is
2082 the start of the list of sections from other objects. */
2083
2084 bfd_set_section_size (id2, 20);
2085 d2 = xmalloc (20);
2086 id2->contents = d2;
2087 memset (d2, 0, 20);
2088 if (pe_use_nul_prefixed_import_tables)
2089 d2[0] = d2[16] = PE_IDATA5_SIZE; /* Reloc addend. */
2090 quick_reloc (abfd, 0, BFD_RELOC_RVA, 2);
2091 quick_reloc (abfd, 12, BFD_RELOC_RVA, 4);
2092 quick_reloc (abfd, 16, BFD_RELOC_RVA, 1);
2093 save_relocs (id2);
2094
2095 if (pe_use_nul_prefixed_import_tables)
2096 bfd_set_section_size (id5, PE_IDATA5_SIZE);
2097 else
2098 bfd_set_section_size (id5, 0);
2099 d5 = xmalloc (PE_IDATA5_SIZE);
2100 id5->contents = d5;
2101 memset (d5, 0, PE_IDATA5_SIZE);
2102 if (pe_use_nul_prefixed_import_tables)
2103 bfd_set_section_size (id4, PE_IDATA4_SIZE);
2104 else
2105 bfd_set_section_size (id4, 0);
2106 d4 = xmalloc (PE_IDATA4_SIZE);
2107 id4->contents = d4;
2108 memset (d4, 0, PE_IDATA4_SIZE);
2109
2110 bfd_set_symtab (abfd, symtab, symptr);
2111
2112 bfd_set_section_contents (abfd, id2, d2, 0, 20);
2113 if (pe_use_nul_prefixed_import_tables)
2114 {
2115 bfd_set_section_contents (abfd, id5, d5, 0, PE_IDATA5_SIZE);
2116 bfd_set_section_contents (abfd, id4, d4, 0, PE_IDATA4_SIZE);
2117 }
2118 else
2119 {
2120 bfd_set_section_contents (abfd, id5, d5, 0, 0);
2121 bfd_set_section_contents (abfd, id4, d4, 0, 0);
2122 }
2123
2124 bfd_make_readable (abfd);
2125 return abfd;
2126 }
2127
2128 /* .section .idata$4
2129 .long 0
2130 [.long 0] for PE+
2131 .section .idata$5
2132 .long 0
2133 [.long 0] for PE+
2134 .section idata$7
2135 .global __my_dll_iname
2136 __my_dll_iname:
2137 .asciz "my.dll" */
2138
2139 static bfd *
2140 make_tail (bfd *parent)
2141 {
2142 asection *id4, *id5, *id7;
2143 unsigned char *d4, *d5, *d7;
2144 int len;
2145 char *oname;
2146 bfd *abfd;
2147
2148 oname = xmalloc (20);
2149 sprintf (oname, "d%06d.o", tmp_seq);
2150 tmp_seq++;
2151
2152 abfd = bfd_create (oname, parent);
2153 bfd_find_target (pe_details->object_target, abfd);
2154 bfd_make_writable (abfd);
2155
2156 bfd_set_format (abfd, bfd_object);
2157 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2158
2159 symptr = 0;
2160 symtab = xmalloc (5 * sizeof (asymbol *));
2161 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
2162 id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
2163 id7 = quick_section (abfd, ".idata$7", SEC_HAS_CONTENTS, 2);
2164 quick_symbol (abfd, U (""), dll_symname, "_iname", id7, BSF_GLOBAL, 0);
2165
2166 bfd_set_section_size (id4, PE_IDATA4_SIZE);
2167 d4 = xmalloc (PE_IDATA4_SIZE);
2168 id4->contents = d4;
2169 memset (d4, 0, PE_IDATA4_SIZE);
2170
2171 bfd_set_section_size (id5, PE_IDATA5_SIZE);
2172 d5 = xmalloc (PE_IDATA5_SIZE);
2173 id5->contents = d5;
2174 memset (d5, 0, PE_IDATA5_SIZE);
2175
2176 len = strlen (dll_filename) + 1;
2177 if (len & 1)
2178 len++;
2179 bfd_set_section_size (id7, len);
2180 d7 = xmalloc (len);
2181 id7->contents = d7;
2182 strcpy ((char *) d7, dll_filename);
2183 /* If len was odd, the above
2184 strcpy leaves behind an undefined byte. That is harmless,
2185 but we set it to 0 just so the binary dumps are pretty. */
2186 d7[len - 1] = 0;
2187
2188 bfd_set_symtab (abfd, symtab, symptr);
2189
2190 bfd_set_section_contents (abfd, id4, d4, 0, PE_IDATA4_SIZE);
2191 bfd_set_section_contents (abfd, id5, d5, 0, PE_IDATA5_SIZE);
2192 bfd_set_section_contents (abfd, id7, d7, 0, len);
2193
2194 bfd_make_readable (abfd);
2195 return abfd;
2196 }
2197
2198 /* .text
2199 .global _function
2200 .global ___imp_function
2201 .global __imp__function
2202 _function:
2203 jmp *__imp__function:
2204
2205 .section idata$7
2206 .long __head_my_dll
2207
2208 .section .idata$5
2209 ___imp_function:
2210 __imp__function:
2211 iat?
2212 .section .idata$4
2213 iat?
2214 .section .idata$6
2215 ID<ordinal>:
2216 .short <hint>
2217 .asciz "function" xlate? (add underscore, kill at) */
2218
2219 static const unsigned char jmp_ix86_bytes[] =
2220 {
2221 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x90, 0x90
2222 };
2223
2224 /* _function:
2225 mov.l ip+8,r0
2226 mov.l @r0,r0
2227 jmp @r0
2228 nop
2229 .dw __imp_function */
2230
2231 static const unsigned char jmp_sh_bytes[] =
2232 {
2233 0x01, 0xd0, 0x02, 0x60, 0x2b, 0x40, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00
2234 };
2235
2236 /* _function:
2237 lui $t0,<high:__imp_function>
2238 lw $t0,<low:__imp_function>
2239 jr $t0
2240 nop */
2241
2242 static const unsigned char jmp_mips_bytes[] =
2243 {
2244 0x00, 0x00, 0x08, 0x3c, 0x00, 0x00, 0x08, 0x8d,
2245 0x08, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00
2246 };
2247
2248 static const unsigned char jmp_arm_bytes[] =
2249 {
2250 0x00, 0xc0, 0x9f, 0xe5, /* ldr ip, [pc] */
2251 0x00, 0xf0, 0x9c, 0xe5, /* ldr pc, [ip] */
2252 0, 0, 0, 0
2253 };
2254
2255
2256 static bfd *
2257 make_one (def_file_export *exp, bfd *parent, bfd_boolean include_jmp_stub)
2258 {
2259 asection *tx, *id7, *id5, *id4, *id6;
2260 unsigned char *td = NULL, *d7, *d5, *d4, *d6 = NULL;
2261 int len;
2262 char *oname;
2263 bfd *abfd;
2264 const unsigned char *jmp_bytes = NULL;
2265 int jmp_byte_count = 0;
2266
2267 /* Include the jump stub section only if it is needed. A jump
2268 stub is needed if the symbol being imported <sym> is a function
2269 symbol and there is at least one undefined reference to that
2270 symbol. In other words, if all the import references to <sym> are
2271 explicitly through _declspec(dllimport) then the jump stub is not
2272 needed. */
2273 if (include_jmp_stub)
2274 {
2275 switch (pe_details->pe_arch)
2276 {
2277 case PE_ARCH_i386:
2278 jmp_bytes = jmp_ix86_bytes;
2279 jmp_byte_count = sizeof (jmp_ix86_bytes);
2280 break;
2281 case PE_ARCH_sh:
2282 jmp_bytes = jmp_sh_bytes;
2283 jmp_byte_count = sizeof (jmp_sh_bytes);
2284 break;
2285 case PE_ARCH_mips:
2286 jmp_bytes = jmp_mips_bytes;
2287 jmp_byte_count = sizeof (jmp_mips_bytes);
2288 break;
2289 case PE_ARCH_arm:
2290 case PE_ARCH_arm_wince:
2291 jmp_bytes = jmp_arm_bytes;
2292 jmp_byte_count = sizeof (jmp_arm_bytes);
2293 break;
2294 default:
2295 abort ();
2296 }
2297 }
2298
2299 oname = xmalloc (20);
2300 sprintf (oname, "d%06d.o", tmp_seq);
2301 tmp_seq++;
2302
2303 abfd = bfd_create (oname, parent);
2304 bfd_find_target (pe_details->object_target, abfd);
2305 bfd_make_writable (abfd);
2306
2307 bfd_set_format (abfd, bfd_object);
2308 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2309
2310 symptr = 0;
2311 symtab = xmalloc (12 * sizeof (asymbol *));
2312
2313 tx = quick_section (abfd, ".text", SEC_CODE | SEC_HAS_CONTENTS | SEC_READONLY, 2);
2314 id7 = quick_section (abfd, ".idata$7", SEC_HAS_CONTENTS, 2);
2315 id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
2316 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
2317 id6 = quick_section (abfd, ".idata$6", SEC_HAS_CONTENTS, 2);
2318
2319 if (*exp->internal_name == '@')
2320 {
2321 quick_symbol (abfd, U ("_head_"), dll_symname, "", UNDSEC,
2322 BSF_GLOBAL, 0);
2323 if (include_jmp_stub)
2324 quick_symbol (abfd, "", exp->internal_name, "", tx, BSF_GLOBAL, 0);
2325 quick_symbol (abfd, "__imp_", exp->internal_name, "", id5,
2326 BSF_GLOBAL, 0);
2327 /* Fastcall applies only to functions,
2328 so no need for auto-import symbol. */
2329 }
2330 else
2331 {
2332 quick_symbol (abfd, U ("_head_"), dll_symname, "", UNDSEC,
2333 BSF_GLOBAL, 0);
2334 if (include_jmp_stub)
2335 quick_symbol (abfd, U (""), exp->internal_name, "", tx,
2336 BSF_GLOBAL, 0);
2337 quick_symbol (abfd, "__imp_", U (""), exp->internal_name, id5,
2338 BSF_GLOBAL, 0);
2339 /* Symbol to reference ord/name of imported
2340 data symbol, used to implement auto-import. */
2341 if (exp->flag_data)
2342 quick_symbol (abfd, "__nm_", U (""), exp->internal_name, id6,
2343 BSF_GLOBAL,0);
2344 }
2345 if (pe_dll_compat_implib)
2346 quick_symbol (abfd, "___imp_", exp->internal_name, "", id5,
2347 BSF_GLOBAL, 0);
2348
2349 if (include_jmp_stub)
2350 {
2351 bfd_set_section_size (tx, jmp_byte_count);
2352 td = xmalloc (jmp_byte_count);
2353 tx->contents = td;
2354 memcpy (td, jmp_bytes, jmp_byte_count);
2355
2356 switch (pe_details->pe_arch)
2357 {
2358 case PE_ARCH_i386:
2359 #ifdef pe_use_x86_64
2360 quick_reloc (abfd, 2, BFD_RELOC_32_PCREL, 2);
2361 #else
2362 /* Mark this object as SAFESEH compatible. */
2363 quick_symbol (abfd, "", "@feat.00", "", bfd_abs_section_ptr,
2364 BSF_LOCAL, 1);
2365 quick_reloc (abfd, 2, BFD_RELOC_32, 2);
2366 #endif
2367 break;
2368 case PE_ARCH_sh:
2369 quick_reloc (abfd, 8, BFD_RELOC_32, 2);
2370 break;
2371 case PE_ARCH_mips:
2372 quick_reloc (abfd, 0, BFD_RELOC_HI16_S, 2);
2373 quick_reloc (abfd, 0, BFD_RELOC_LO16, 0); /* MIPS_R_PAIR */
2374 quick_reloc (abfd, 4, BFD_RELOC_LO16, 2);
2375 break;
2376 case PE_ARCH_arm:
2377 case PE_ARCH_arm_wince:
2378 quick_reloc (abfd, 8, BFD_RELOC_32, 2);
2379 break;
2380 default:
2381 abort ();
2382 }
2383 save_relocs (tx);
2384 }
2385 else
2386 bfd_set_section_size (tx, 0);
2387
2388 bfd_set_section_size (id7, 4);
2389 d7 = xmalloc (4);
2390 id7->contents = d7;
2391 memset (d7, 0, 4);
2392 quick_reloc (abfd, 0, BFD_RELOC_RVA, 5);
2393 save_relocs (id7);
2394
2395 bfd_set_section_size (id5, PE_IDATA5_SIZE);
2396 d5 = xmalloc (PE_IDATA5_SIZE);
2397 id5->contents = d5;
2398 memset (d5, 0, PE_IDATA5_SIZE);
2399
2400 if (exp->flag_noname)
2401 {
2402 d5[0] = exp->ordinal;
2403 d5[1] = exp->ordinal >> 8;
2404 d5[PE_IDATA5_SIZE - 1] = 0x80;
2405 }
2406 else
2407 {
2408 quick_reloc (abfd, 0, BFD_RELOC_RVA, 4);
2409 save_relocs (id5);
2410 }
2411
2412 bfd_set_section_size (id4, PE_IDATA4_SIZE);
2413 d4 = xmalloc (PE_IDATA4_SIZE);
2414 id4->contents = d4;
2415 memset (d4, 0, PE_IDATA4_SIZE);
2416
2417 if (exp->flag_noname)
2418 {
2419 d4[0] = exp->ordinal;
2420 d4[1] = exp->ordinal >> 8;
2421 d4[PE_IDATA4_SIZE - 1] = 0x80;
2422 }
2423 else
2424 {
2425 quick_reloc (abfd, 0, BFD_RELOC_RVA, 4);
2426 save_relocs (id4);
2427 }
2428
2429 if (exp->flag_noname)
2430 {
2431 len = 0;
2432 bfd_set_section_size (id6, 0);
2433 }
2434 else
2435 {
2436 int ord;
2437
2438 /* { short, asciz } */
2439 if (exp->its_name)
2440 len = 2 + strlen (exp->its_name) + 1;
2441 else
2442 len = 2 + strlen (exp->name) + 1;
2443 if (len & 1)
2444 len++;
2445 bfd_set_section_size (id6, len);
2446 d6 = xmalloc (len);
2447 id6->contents = d6;
2448 memset (d6, 0, len);
2449
2450 /* PR 20880: Use exp->hint as a backup, just in case exp->ordinal
2451 contains an invalid value (-1). */
2452 ord = (exp->ordinal >= 0) ? exp->ordinal : exp->hint;
2453 d6[0] = ord;
2454 d6[1] = ord >> 8;
2455
2456 if (exp->its_name)
2457 strcpy ((char*) d6 + 2, exp->its_name);
2458 else
2459 strcpy ((char *) d6 + 2, exp->name);
2460 }
2461
2462 bfd_set_symtab (abfd, symtab, symptr);
2463
2464 if (include_jmp_stub)
2465 bfd_set_section_contents (abfd, tx, td, 0, jmp_byte_count);
2466 bfd_set_section_contents (abfd, id7, d7, 0, 4);
2467 bfd_set_section_contents (abfd, id5, d5, 0, PE_IDATA5_SIZE);
2468 bfd_set_section_contents (abfd, id4, d4, 0, PE_IDATA4_SIZE);
2469 if (!exp->flag_noname)
2470 bfd_set_section_contents (abfd, id6, d6, 0, len);
2471
2472 bfd_make_readable (abfd);
2473 return abfd;
2474 }
2475
2476 static bfd *
2477 make_singleton_name_thunk (const char *import, bfd *parent)
2478 {
2479 /* Name thunks go to idata$4. */
2480 asection *id4;
2481 unsigned char *d4;
2482 char *oname;
2483 bfd *abfd;
2484
2485 oname = xmalloc (20);
2486 sprintf (oname, "nmth%06d.o", tmp_seq);
2487 tmp_seq++;
2488
2489 abfd = bfd_create (oname, parent);
2490 bfd_find_target (pe_details->object_target, abfd);
2491 bfd_make_writable (abfd);
2492
2493 bfd_set_format (abfd, bfd_object);
2494 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2495
2496 symptr = 0;
2497 symtab = xmalloc (3 * sizeof (asymbol *));
2498 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
2499 quick_symbol (abfd, "__nm_thnk_", import, "", id4, BSF_GLOBAL, 0);
2500 quick_symbol (abfd, "__nm_", import, "", UNDSEC, BSF_GLOBAL, 0);
2501
2502 /* We need space for the real thunk and for the null terminator. */
2503 bfd_set_section_size (id4, PE_IDATA4_SIZE * 2);
2504 d4 = xmalloc (PE_IDATA4_SIZE * 2);
2505 id4->contents = d4;
2506 memset (d4, 0, PE_IDATA4_SIZE * 2);
2507 quick_reloc (abfd, 0, BFD_RELOC_RVA, 2);
2508 save_relocs (id4);
2509
2510 bfd_set_symtab (abfd, symtab, symptr);
2511
2512 bfd_set_section_contents (abfd, id4, d4, 0, PE_IDATA4_SIZE * 2);
2513
2514 bfd_make_readable (abfd);
2515 return abfd;
2516 }
2517
2518 static const char *
2519 make_import_fixup_mark (arelent *rel, char *name)
2520 {
2521 /* We convert reloc to symbol, for later reference. */
2522 static unsigned int counter;
2523 struct bfd_symbol *sym = *rel->sym_ptr_ptr;
2524 bfd *abfd = bfd_asymbol_bfd (sym);
2525 struct bfd_link_hash_entry *bh;
2526 char *fixup_name, buf[26];
2527 size_t prefix_len;
2528
2529 /* "name" buffer has space before the symbol name for prefixes. */
2530 sprintf (buf, "__fu%d_", counter++);
2531 prefix_len = strlen (buf);
2532 fixup_name = name - prefix_len;
2533 memcpy (fixup_name, buf, prefix_len);
2534
2535 bh = NULL;
2536 bfd_coff_link_add_one_symbol (&link_info, abfd, fixup_name, BSF_GLOBAL,
2537 current_sec, /* sym->section, */
2538 rel->address, NULL, TRUE, FALSE, &bh);
2539
2540 return bh->root.string;
2541 }
2542
2543 /* .section .idata$2
2544 .rva __nm_thnk_SYM (singleton thunk with name of func)
2545 .long 0
2546 .long 0
2547 .rva __my_dll_iname (name of dll)
2548 .rva __fuNN_SYM (pointer to reference (address) in text) */
2549
2550 static bfd *
2551 make_import_fixup_entry (const char *name,
2552 const char *fixup_name,
2553 const char *symname,
2554 bfd *parent)
2555 {
2556 asection *id2;
2557 unsigned char *d2;
2558 char *oname;
2559 bfd *abfd;
2560
2561 oname = xmalloc (20);
2562 sprintf (oname, "fu%06d.o", tmp_seq);
2563 tmp_seq++;
2564
2565 abfd = bfd_create (oname, parent);
2566 bfd_find_target (pe_details->object_target, abfd);
2567 bfd_make_writable (abfd);
2568
2569 bfd_set_format (abfd, bfd_object);
2570 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2571
2572 symptr = 0;
2573 symtab = xmalloc (6 * sizeof (asymbol *));
2574 id2 = quick_section (abfd, ".idata$2", SEC_HAS_CONTENTS, 2);
2575
2576 quick_symbol (abfd, "__nm_thnk_", name, "", UNDSEC, BSF_GLOBAL, 0);
2577 quick_symbol (abfd, U (""), symname, "_iname", UNDSEC, BSF_GLOBAL, 0);
2578 quick_symbol (abfd, "", fixup_name, "", UNDSEC, BSF_GLOBAL, 0);
2579
2580 bfd_set_section_size (id2, 20);
2581 d2 = xmalloc (20);
2582 id2->contents = d2;
2583 memset (d2, 0, 20);
2584
2585 quick_reloc (abfd, 0, BFD_RELOC_RVA, 1);
2586 quick_reloc (abfd, 12, BFD_RELOC_RVA, 2);
2587 quick_reloc (abfd, 16, BFD_RELOC_RVA, 3);
2588 save_relocs (id2);
2589
2590 bfd_set_symtab (abfd, symtab, symptr);
2591
2592 bfd_set_section_contents (abfd, id2, d2, 0, 20);
2593
2594 bfd_make_readable (abfd);
2595 return abfd;
2596 }
2597
2598 /* .section .rdata_runtime_pseudo_reloc
2599 .long addend
2600 .rva __fuNN_SYM (pointer to reference (address) in text) */
2601
2602 static bfd *
2603 make_runtime_pseudo_reloc (const char *name ATTRIBUTE_UNUSED,
2604 const char *fixup_name,
2605 bfd_vma addend ATTRIBUTE_UNUSED,
2606 bfd_vma bitsize,
2607 bfd *parent)
2608 {
2609 asection *rt_rel;
2610 unsigned char *rt_rel_d;
2611 char *oname;
2612 bfd *abfd;
2613 bfd_size_type size;
2614
2615 oname = xmalloc (20);
2616 sprintf (oname, "rtr%06d.o", tmp_seq);
2617 tmp_seq++;
2618
2619 abfd = bfd_create (oname, parent);
2620 bfd_find_target (pe_details->object_target, abfd);
2621 bfd_make_writable (abfd);
2622
2623 bfd_set_format (abfd, bfd_object);
2624 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2625
2626 if (link_info.pei386_runtime_pseudo_reloc == 2)
2627 {
2628 if (runtime_pseudp_reloc_v2_init)
2629 size = 3 * sizeof (asymbol *);
2630 else
2631 size = 6 * sizeof (asymbol *);
2632 }
2633 else
2634 size = 2 * sizeof (asymbol *);
2635
2636 symptr = 0;
2637 symtab = xmalloc (size);
2638
2639 rt_rel
2640 = quick_section (abfd, ".rdata_runtime_pseudo_reloc", SEC_HAS_CONTENTS, 2);
2641
2642 quick_symbol (abfd, "", fixup_name, "", UNDSEC, BSF_GLOBAL, 0);
2643
2644 if (link_info.pei386_runtime_pseudo_reloc == 2)
2645 {
2646 size = 12;
2647 if (!runtime_pseudp_reloc_v2_init)
2648 {
2649 size += 12;
2650 runtime_pseudp_reloc_v2_init = TRUE;
2651 }
2652
2653 quick_symbol (abfd, "__imp_", name, "", UNDSEC, BSF_GLOBAL, 0);
2654
2655 bfd_set_section_size (rt_rel, size);
2656 rt_rel_d = xmalloc (size);
2657 rt_rel->contents = rt_rel_d;
2658 memset (rt_rel_d, 0, size);
2659 quick_reloc (abfd, size - 8, BFD_RELOC_RVA, 1);
2660 quick_reloc (abfd, size - 12, BFD_RELOC_RVA, 2);
2661 bfd_put_32 (abfd, bitsize, rt_rel_d + (size - 4));
2662 if (size != 12)
2663 bfd_put_32 (abfd, 1, rt_rel_d + 8);
2664 save_relocs (rt_rel);
2665
2666 bfd_set_symtab (abfd, symtab, symptr);
2667
2668 bfd_set_section_contents (abfd, rt_rel, rt_rel_d, 0, size);
2669 }
2670 else
2671 {
2672 bfd_set_section_size (rt_rel, 8);
2673 rt_rel_d = xmalloc (8);
2674 rt_rel->contents = rt_rel_d;
2675 memset (rt_rel_d, 0, 8);
2676
2677 bfd_put_32 (abfd, addend, rt_rel_d);
2678 quick_reloc (abfd, 4, BFD_RELOC_RVA, 1);
2679
2680 save_relocs (rt_rel);
2681
2682 bfd_set_symtab (abfd, symtab, symptr);
2683
2684 bfd_set_section_contents (abfd, rt_rel, rt_rel_d, 0, 8);
2685 }
2686
2687 bfd_make_readable (abfd);
2688 return abfd;
2689 }
2690
2691 /* .section .rdata
2692 .rva __pei386_runtime_relocator */
2693
2694 static bfd *
2695 pe_create_runtime_relocator_reference (bfd *parent)
2696 {
2697 asection *extern_rt_rel;
2698 unsigned char *extern_rt_rel_d;
2699 char *oname;
2700 bfd *abfd;
2701
2702 oname = xmalloc (20);
2703 sprintf (oname, "ertr%06d.o", tmp_seq);
2704 tmp_seq++;
2705
2706 abfd = bfd_create (oname, parent);
2707 bfd_find_target (pe_details->object_target, abfd);
2708 bfd_make_writable (abfd);
2709
2710 bfd_set_format (abfd, bfd_object);
2711 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2712
2713 symptr = 0;
2714 symtab = xmalloc (2 * sizeof (asymbol *));
2715 extern_rt_rel = quick_section (abfd, ".rdata", SEC_HAS_CONTENTS, 2);
2716
2717 quick_symbol (abfd, "", U ("_pei386_runtime_relocator"), "", UNDSEC,
2718 BSF_NO_FLAGS, 0);
2719
2720 bfd_set_section_size (extern_rt_rel, PE_IDATA5_SIZE);
2721 extern_rt_rel_d = xcalloc (1, PE_IDATA5_SIZE);
2722 extern_rt_rel->contents = extern_rt_rel_d;
2723
2724 quick_reloc (abfd, 0, BFD_RELOC_RVA, 1);
2725 save_relocs (extern_rt_rel);
2726
2727 bfd_set_symtab (abfd, symtab, symptr);
2728
2729 bfd_set_section_contents (abfd, extern_rt_rel, extern_rt_rel_d, 0, PE_IDATA5_SIZE);
2730
2731 bfd_make_readable (abfd);
2732 return abfd;
2733 }
2734
2735 void
2736 pe_create_import_fixup (arelent *rel, asection *s, bfd_vma addend, char *name,
2737 const char *symname)
2738 {
2739 const char *fixup_name = make_import_fixup_mark (rel, name);
2740 bfd *b;
2741
2742 /* This is the original implementation of the auto-import feature, which
2743 primarily relied on the OS loader to patch things up with some help
2744 from the pseudo-relocator to overcome the main limitation. See the
2745 comment at the beginning of the file for an overview of the feature. */
2746 if (link_info.pei386_runtime_pseudo_reloc != 2)
2747 {
2748 struct bfd_link_hash_entry *name_thunk_sym;
2749 /* name buffer is allocated with space at beginning for prefixes. */
2750 char *thname = name - (sizeof "__nm_thnk_" - 1);
2751 memcpy (thname, "__nm_thnk_", sizeof "__nm_thnk_" - 1);
2752 name_thunk_sym = bfd_link_hash_lookup (link_info.hash, thname, 0, 0, 1);
2753
2754 if (!(name_thunk_sym && name_thunk_sym->type == bfd_link_hash_defined))
2755 {
2756 b = make_singleton_name_thunk (name, link_info.output_bfd);
2757 add_bfd_to_link (b, b->filename, &link_info);
2758
2759 /* If we ever use autoimport, we have to cast text section writable. */
2760 config.text_read_only = FALSE;
2761 link_info.output_bfd->flags &= ~WP_TEXT;
2762 }
2763
2764 if (addend == 0 || link_info.pei386_runtime_pseudo_reloc == 1)
2765 {
2766 b = make_import_fixup_entry (name, fixup_name, symname,
2767 link_info.output_bfd);
2768 add_bfd_to_link (b, b->filename, &link_info);
2769 }
2770 }
2771
2772 /* In the original implementation, the pseudo-relocator was only used when
2773 the addend was not null. In the new implementation, the OS loader is
2774 completely bypassed and the pseudo-relocator does the entire work. */
2775 if ((addend != 0 && link_info.pei386_runtime_pseudo_reloc == 1)
2776 || link_info.pei386_runtime_pseudo_reloc == 2)
2777 {
2778 if (pe_dll_extra_pe_debug)
2779 printf ("creating runtime pseudo-reloc entry for %s (addend=%d)\n",
2780 fixup_name, (int) addend);
2781
2782 b = make_runtime_pseudo_reloc (name, fixup_name, addend, rel->howto->bitsize,
2783 link_info.output_bfd);
2784 add_bfd_to_link (b, b->filename, &link_info);
2785
2786 if (runtime_pseudo_relocs_created++ == 0)
2787 {
2788 b = pe_create_runtime_relocator_reference (link_info.output_bfd);
2789 add_bfd_to_link (b, b->filename, &link_info);
2790 }
2791 }
2792
2793 else if (addend != 0)
2794 einfo (_("%X%P: %C: variable '%pT' can't be auto-imported; please read the documentation for ld's --enable-auto-import for details\n"),
2795 s->owner, s, rel->address, (*rel->sym_ptr_ptr)->name);
2796 }
2797
2798 void
2799 pe_dll_generate_implib (def_file *def, const char *impfilename, struct bfd_link_info *info)
2800 {
2801 int i;
2802 bfd *ar_head;
2803 bfd *ar_tail;
2804 bfd *outarch;
2805 bfd *ibfd;
2806 bfd *head = 0;
2807
2808 dll_filename = (def->name) ? def->name : dll_name;
2809 dll_symname = xstrdup (dll_filename);
2810 for (i = 0; dll_symname[i]; i++)
2811 if (!ISALNUM (dll_symname[i]))
2812 dll_symname[i] = '_';
2813
2814 unlink_if_ordinary (impfilename);
2815
2816 outarch = bfd_openw (impfilename, 0);
2817
2818 if (!outarch)
2819 {
2820 /* xgettext:c-format */
2821 einfo (_("%X%P: can't open .lib file: %s\n"), impfilename);
2822 return;
2823 }
2824
2825 if (verbose)
2826 /* xgettext:c-format */
2827 info_msg (_("Creating library file: %s\n"), impfilename);
2828
2829 bfd_set_format (outarch, bfd_archive);
2830 outarch->has_armap = 1;
2831
2832 /* Work out a reasonable size of things to put onto one line. */
2833 ar_head = make_head (outarch);
2834
2835 /* Iterate the input BFDs, looking for exclude-modules-for-implib. */
2836 for (ibfd = info->input_bfds; ibfd; ibfd = ibfd->link.next)
2837 {
2838 /* Iterate the exclude list. */
2839 struct exclude_list_struct *ex;
2840 char found;
2841 for (ex = excludes, found = 0; ex && !found; ex = ex->next)
2842 {
2843 if (ex->type != EXCLUDEFORIMPLIB)
2844 continue;
2845 found = (filename_cmp (ex->string, ibfd->filename) == 0);
2846 }
2847 /* If it matched, we must open a fresh BFD for it (the original
2848 input BFD is still needed for the DLL's final link) and add
2849 it into the archive member chain. */
2850 if (found)
2851 {
2852 bfd *newbfd = bfd_openr (ibfd->my_archive
2853 ? ibfd->my_archive->filename : ibfd->filename, NULL);
2854 if (!newbfd)
2855 {
2856 einfo (_("%X%P: bfd_openr %s: %E\n"), ibfd->filename);
2857 return;
2858 }
2859 if (ibfd->my_archive)
2860 {
2861 /* Must now iterate through archive until we find the
2862 required member. A minor shame that we'll open the
2863 archive once per member that we require from it, and
2864 leak those archive bfds rather than reuse them. */
2865 bfd *arbfd = newbfd;
2866 if (!bfd_check_format_matches (arbfd, bfd_archive, NULL))
2867 {
2868 einfo (_("%X%P: %s(%s): can't find member in non-archive file"),
2869 ibfd->my_archive->filename, ibfd->filename);
2870 return;
2871 }
2872 newbfd = NULL;
2873 while ((newbfd = bfd_openr_next_archived_file (arbfd, newbfd)) != 0)
2874 {
2875 if (filename_cmp (newbfd->filename, ibfd->filename) == 0)
2876 break;
2877 }
2878 if (!newbfd)
2879 {
2880 einfo (_("%X%P: %s(%s): can't find member in archive"),
2881 ibfd->my_archive->filename, ibfd->filename);
2882 return;
2883 }
2884 }
2885 newbfd->archive_next = head;
2886 head = newbfd;
2887 }
2888 }
2889
2890 for (i = 0; i < def->num_exports; i++)
2891 {
2892 /* The import library doesn't know about the internal name. */
2893 char *internal = def->exports[i].internal_name;
2894 bfd *n;
2895
2896 /* Don't add PRIVATE entries to import lib. */
2897 if (pe_def_file->exports[i].flag_private)
2898 continue;
2899
2900 def->exports[i].internal_name = def->exports[i].name;
2901
2902 /* PR 19803: If a symbol has been discard due to garbage
2903 collection then do not create any exports for it. */
2904 {
2905 struct coff_link_hash_entry *h;
2906
2907 h = coff_link_hash_lookup (coff_hash_table (info), internal,
2908 FALSE, FALSE, FALSE);
2909 if (h != NULL
2910 /* If the symbol is hidden and undefined then it
2911 has been swept up by garbage collection. */
2912 && h->symbol_class == C_HIDDEN
2913 && h->root.u.def.section == bfd_und_section_ptr)
2914 continue;
2915
2916 /* If necessary, check with an underscore prefix as well. */
2917 if (pe_details->underscored && internal[0] != '@')
2918 {
2919 char *name;
2920
2921 name = xmalloc (strlen (internal) + 2);
2922 sprintf (name, "_%s", internal);
2923
2924 h = coff_link_hash_lookup (coff_hash_table (info), name,
2925 FALSE, FALSE, FALSE);
2926 free (name);
2927
2928 if (h != NULL
2929 /* If the symbol is hidden and undefined then it
2930 has been swept up by garbage collection. */
2931 && h->symbol_class == C_HIDDEN
2932 && h->root.u.def.section == bfd_und_section_ptr)
2933 continue;
2934 }
2935 }
2936
2937 n = make_one (def->exports + i, outarch,
2938 ! (def->exports + i)->flag_data);
2939 n->archive_next = head;
2940 head = n;
2941 def->exports[i].internal_name = internal;
2942 }
2943
2944 ar_tail = make_tail (outarch);
2945
2946 if (ar_head == NULL || ar_tail == NULL)
2947 return;
2948
2949 /* Now stick them all into the archive. */
2950 ar_head->archive_next = head;
2951 ar_tail->archive_next = ar_head;
2952 head = ar_tail;
2953
2954 if (! bfd_set_archive_head (outarch, head))
2955 einfo ("%X%P: bfd_set_archive_head: %E\n");
2956
2957 if (! bfd_close (outarch))
2958 einfo ("%X%P: bfd_close %s: %E\n", impfilename);
2959
2960 while (head != NULL)
2961 {
2962 bfd *n = head->archive_next;
2963 bfd_close (head);
2964 head = n;
2965 }
2966 }
2967
2968 static int undef_count = 0;
2969
2970 struct key_value
2971 {
2972 char *key;
2973 const char *oname;
2974 };
2975
2976 static struct key_value *udef_table;
2977
2978 static int undef_sort_cmp (const void *l1, const void *r1)
2979 {
2980 const struct key_value *l = l1;
2981 const struct key_value *r = r1;
2982
2983 return strcmp (l->key, r->key);
2984 }
2985
2986 static struct bfd_link_hash_entry *
2987 pe_find_cdecl_alias_match (struct bfd_link_info *linfo, char *name)
2988 {
2989 struct bfd_link_hash_entry *h = NULL;
2990 struct key_value *kv;
2991 struct key_value key;
2992 char *at, *lname = xmalloc (strlen (name) + 3);
2993
2994 strcpy (lname, name);
2995
2996 at = strchr (lname + (lname[0] == '@'), '@');
2997 if (at)
2998 at[1] = 0;
2999
3000 key.key = lname;
3001 kv = bsearch (&key, udef_table, undef_count, sizeof (struct key_value),
3002 undef_sort_cmp);
3003
3004 if (kv)
3005 {
3006 h = bfd_link_hash_lookup (linfo->hash, kv->oname, FALSE, FALSE, FALSE);
3007 if (h->type == bfd_link_hash_undefined)
3008 goto return_h;
3009 }
3010
3011 if (lname[0] == '?')
3012 goto return_NULL;
3013
3014 if (at || lname[0] == '@')
3015 {
3016 if (lname[0] == '@')
3017 {
3018 if (pe_details->underscored)
3019 lname[0] = '_';
3020 else
3021 strcpy (lname, lname + 1);
3022 key.key = lname;
3023 kv = bsearch (&key, udef_table, undef_count,
3024 sizeof (struct key_value), undef_sort_cmp);
3025 if (kv)
3026 {
3027 h = bfd_link_hash_lookup (linfo->hash, kv->oname, FALSE, FALSE, FALSE);
3028 if (h->type == bfd_link_hash_undefined)
3029 goto return_h;
3030 }
3031 }
3032 if (at)
3033 *strchr (lname, '@') = 0;
3034 key.key = lname;
3035 kv = bsearch (&key, udef_table, undef_count,
3036 sizeof (struct key_value), undef_sort_cmp);
3037 if (kv)
3038 {
3039 h = bfd_link_hash_lookup (linfo->hash, kv->oname, FALSE, FALSE, FALSE);
3040 if (h->type == bfd_link_hash_undefined)
3041 goto return_h;
3042 }
3043 goto return_NULL;
3044 }
3045
3046 strcat (lname, "@");
3047 key.key = lname;
3048 kv = bsearch (&key, udef_table, undef_count,
3049 sizeof (struct key_value), undef_sort_cmp);
3050
3051 if (kv)
3052 {
3053 h = bfd_link_hash_lookup (linfo->hash, kv->oname, FALSE, FALSE, FALSE);
3054 if (h->type == bfd_link_hash_undefined)
3055 goto return_h;
3056 }
3057
3058 if (lname[0] == '_' && pe_details->underscored)
3059 lname[0] = '@';
3060 else
3061 {
3062 memmove (lname + 1, lname, strlen (lname) + 1);
3063 lname[0] = '@';
3064 }
3065 key.key = lname;
3066
3067 kv = bsearch (&key, udef_table, undef_count,
3068 sizeof (struct key_value), undef_sort_cmp);
3069
3070 if (kv)
3071 {
3072 h = bfd_link_hash_lookup (linfo->hash, kv->oname, FALSE, FALSE, FALSE);
3073 if (h->type == bfd_link_hash_undefined)
3074 goto return_h;
3075 }
3076
3077 return_NULL:
3078 h = NULL;
3079 return_h:
3080 free (lname);
3081 return h;
3082 }
3083
3084 static bfd_boolean
3085 pe_undef_count (struct bfd_link_hash_entry *h ATTRIBUTE_UNUSED,
3086 void *inf ATTRIBUTE_UNUSED)
3087 {
3088 if (h->type == bfd_link_hash_undefined)
3089 undef_count++;
3090 return TRUE;
3091 }
3092
3093 static bfd_boolean
3094 pe_undef_fill (struct bfd_link_hash_entry *h, void *inf ATTRIBUTE_UNUSED)
3095 {
3096 if (h->type == bfd_link_hash_undefined)
3097 {
3098 char *at;
3099
3100 udef_table[undef_count].key = xstrdup (h->root.string);
3101 at = strchr (udef_table[undef_count].key
3102 + (udef_table[undef_count].key[0] == '@'), '@');
3103 if (at)
3104 at[1] = 0;
3105 udef_table[undef_count].oname = h->root.string;
3106 undef_count++;
3107 }
3108 return TRUE;
3109 }
3110
3111 static void
3112 pe_create_undef_table (void)
3113 {
3114 undef_count = 0;
3115
3116 /* count undefined symbols */
3117
3118 bfd_link_hash_traverse (link_info.hash, pe_undef_count, "");
3119
3120 /* create and fill the corresponding table */
3121 udef_table = xmalloc (undef_count * sizeof (struct key_value));
3122
3123 undef_count = 0;
3124 bfd_link_hash_traverse (link_info.hash, pe_undef_fill, "");
3125
3126 /* sort items */
3127 qsort (udef_table, undef_count, sizeof (struct key_value), undef_sort_cmp);
3128 }
3129
3130 static void
3131 add_bfd_to_link (bfd *abfd, const char *name, struct bfd_link_info *linfo)
3132 {
3133 lang_input_statement_type *fake_file;
3134
3135 fake_file = lang_add_input_file (name,
3136 lang_input_file_is_fake_enum,
3137 NULL);
3138 fake_file->the_bfd = abfd;
3139 ldlang_add_file (fake_file);
3140
3141 if (!bfd_link_add_symbols (abfd, linfo))
3142 einfo (_("%X%P: add symbols %s: %E\n"), name);
3143 }
3144
3145 void
3146 pe_process_import_defs (bfd *output_bfd, struct bfd_link_info *linfo)
3147 {
3148 int i, j;
3149 def_file_module *module;
3150 def_file_import *imp;
3151
3152 pe_dll_id_target (bfd_get_target (output_bfd));
3153
3154 if (!pe_def_file)
3155 return;
3156
3157 imp = pe_def_file->imports;
3158
3159 pe_create_undef_table ();
3160
3161 for (module = pe_def_file->modules; module; module = module->next)
3162 {
3163 int do_this_dll = 0;
3164
3165 for (i = 0; i < pe_def_file->num_imports && imp[i].module != module; i++)
3166 ;
3167 if (i >= pe_def_file->num_imports)
3168 continue;
3169
3170 dll_filename = module->name;
3171 dll_symname = xstrdup (module->name);
3172 for (j = 0; dll_symname[j]; j++)
3173 if (!ISALNUM (dll_symname[j]))
3174 dll_symname[j] = '_';
3175
3176 for (; i < pe_def_file->num_imports && imp[i].module == module; i++)
3177 {
3178 def_file_export exp;
3179 struct bfd_link_hash_entry *blhe;
3180 int lead_at = (*imp[i].internal_name == '@');
3181 /* See if we need this import. */
3182 size_t len = strlen (imp[i].internal_name);
3183 char *name = xmalloc (len + 2 + 6);
3184 bfd_boolean include_jmp_stub = FALSE;
3185 bfd_boolean is_cdecl = FALSE;
3186 bfd_boolean is_undef = FALSE;
3187
3188 if (!lead_at && strchr (imp[i].internal_name, '@') == NULL)
3189 is_cdecl = TRUE;
3190
3191 if (lead_at)
3192 sprintf (name, "%s", imp[i].internal_name);
3193 else
3194 sprintf (name, "%s%s",U (""), imp[i].internal_name);
3195
3196 blhe = bfd_link_hash_lookup (linfo->hash, name,
3197 FALSE, FALSE, FALSE);
3198
3199 /* Include the jump stub for <sym> only if the <sym>
3200 is undefined. */
3201 if (!blhe || (blhe && blhe->type != bfd_link_hash_undefined))
3202 {
3203 if (lead_at)
3204 sprintf (name, "%s%s", "__imp_", imp[i].internal_name);
3205 else
3206 sprintf (name, "%s%s%s", "__imp_", U (""),
3207 imp[i].internal_name);
3208
3209 blhe = bfd_link_hash_lookup (linfo->hash, name,
3210 FALSE, FALSE, FALSE);
3211 if (blhe)
3212 is_undef = (blhe->type == bfd_link_hash_undefined);
3213 }
3214 else
3215 {
3216 include_jmp_stub = TRUE;
3217 is_undef = (blhe->type == bfd_link_hash_undefined);
3218 }
3219
3220 if (is_cdecl && (!blhe || (blhe && blhe->type != bfd_link_hash_undefined)))
3221 {
3222 sprintf (name, "%s%s",U (""), imp[i].internal_name);
3223 blhe = pe_find_cdecl_alias_match (linfo, name);
3224 include_jmp_stub = TRUE;
3225 if (blhe)
3226 is_undef = (blhe->type == bfd_link_hash_undefined);
3227 }
3228
3229 free (name);
3230
3231 if (is_undef)
3232 {
3233 bfd *one;
3234 /* We do. */
3235 if (!do_this_dll)
3236 {
3237 bfd *ar_head = make_head (output_bfd);
3238 add_bfd_to_link (ar_head, ar_head->filename, linfo);
3239 do_this_dll = 1;
3240 }
3241 exp.internal_name = imp[i].internal_name;
3242 exp.name = imp[i].name;
3243 exp.its_name = imp[i].its_name;
3244 exp.ordinal = imp[i].ordinal;
3245 exp.hint = exp.ordinal >= 0 ? exp.ordinal : 0;
3246 exp.flag_private = 0;
3247 exp.flag_constant = 0;
3248 exp.flag_data = imp[i].data;
3249 exp.flag_noname = exp.name ? 0 : 1;
3250 one = make_one (&exp, output_bfd, (! exp.flag_data) && include_jmp_stub);
3251 add_bfd_to_link (one, one->filename, linfo);
3252 }
3253 }
3254 if (do_this_dll)
3255 {
3256 bfd *ar_tail = make_tail (output_bfd);
3257 add_bfd_to_link (ar_tail, ar_tail->filename, linfo);
3258 }
3259
3260 free (dll_symname);
3261 }
3262
3263 while (undef_count)
3264 {
3265 --undef_count;
3266 free (udef_table[undef_count].key);
3267 }
3268 free (udef_table);
3269 }
3270
3271 /* We were handed a *.DLL file. Parse it and turn it into a set of
3272 IMPORTS directives in the def file. Return TRUE if the file was
3273 handled, FALSE if not. */
3274
3275 static unsigned int
3276 pe_get16 (bfd *abfd, int where)
3277 {
3278 unsigned char b[2];
3279
3280 bfd_seek (abfd, (file_ptr) where, SEEK_SET);
3281 bfd_bread (b, (bfd_size_type) 2, abfd);
3282 return b[0] + (b[1] << 8);
3283 }
3284
3285 static unsigned int
3286 pe_get32 (bfd *abfd, int where)
3287 {
3288 unsigned char b[4];
3289
3290 bfd_seek (abfd, (file_ptr) where, SEEK_SET);
3291 bfd_bread (b, (bfd_size_type) 4, abfd);
3292 return b[0] + (b[1] << 8) + (b[2] << 16) + ((unsigned) b[3] << 24);
3293 }
3294
3295 static unsigned int
3296 pe_as32 (void *ptr)
3297 {
3298 unsigned char *b = ptr;
3299
3300 return b[0] + (b[1] << 8) + (b[2] << 16) + ((unsigned) b[3] << 24);
3301 }
3302
3303 bfd_boolean
3304 pe_implied_import_dll (const char *filename)
3305 {
3306 bfd *dll;
3307 bfd_vma pe_header_offset, opthdr_ofs, num_entries, i;
3308 bfd_vma export_rva, export_size, nsections, secptr, expptr;
3309 bfd_vma exp_funcbase;
3310 unsigned char *expdata;
3311 char *erva;
3312 bfd_vma name_rvas, nexp;
3313 const char *dllname;
3314 /* Initialization with start > end guarantees that is_data
3315 will not be set by mistake, and avoids compiler warning. */
3316 bfd_vma data_start = 1;
3317 bfd_vma data_end = 0;
3318 bfd_vma rdata_start = 1;
3319 bfd_vma rdata_end = 0;
3320 bfd_vma bss_start = 1;
3321 bfd_vma bss_end = 0;
3322 int from;
3323
3324 /* No, I can't use bfd here. kernel32.dll puts its export table in
3325 the middle of the .rdata section. */
3326 dll = bfd_openr (filename, pe_details->target_name);
3327 if (!dll)
3328 {
3329 einfo (_("%X%P: open %s: %E\n"), filename);
3330 return FALSE;
3331 }
3332
3333 /* PEI dlls seem to be bfd_objects. */
3334 if (!bfd_check_format (dll, bfd_object))
3335 {
3336 einfo (_("%X%P: %s: this doesn't appear to be a DLL\n"), filename);
3337 return FALSE;
3338 }
3339
3340 /* Get pe_header, optional header and numbers of directory entries. */
3341 pe_header_offset = pe_get32 (dll, 0x3c);
3342 opthdr_ofs = pe_header_offset + 4 + 20;
3343 #ifdef pe_use_x86_64
3344 num_entries = pe_get32 (dll, opthdr_ofs + 92 + 4 * 4); /* & NumberOfRvaAndSizes. */
3345 #else
3346 num_entries = pe_get32 (dll, opthdr_ofs + 92);
3347 #endif
3348
3349 /* No import or export directory entry. */
3350 if (num_entries < 1)
3351 return FALSE;
3352
3353 #ifdef pe_use_x86_64
3354 export_rva = pe_get32 (dll, opthdr_ofs + 96 + 4 * 4);
3355 export_size = pe_get32 (dll, opthdr_ofs + 100 + 4 * 4);
3356 #else
3357 export_rva = pe_get32 (dll, opthdr_ofs + 96);
3358 export_size = pe_get32 (dll, opthdr_ofs + 100);
3359 #endif
3360
3361 /* No export table - nothing to export. */
3362 if (export_size == 0)
3363 return FALSE;
3364
3365 nsections = pe_get16 (dll, pe_header_offset + 4 + 2);
3366 secptr = (pe_header_offset + 4 + 20 +
3367 pe_get16 (dll, pe_header_offset + 4 + 16));
3368 expptr = 0;
3369
3370 /* Get the rva and size of the export section. */
3371 for (i = 0; i < nsections; i++)
3372 {
3373 char sname[8];
3374 bfd_vma secptr1 = secptr + 40 * i;
3375 bfd_vma vaddr = pe_get32 (dll, secptr1 + 12);
3376 bfd_vma vsize = pe_get32 (dll, secptr1 + 16);
3377 bfd_vma fptr = pe_get32 (dll, secptr1 + 20);
3378
3379 bfd_seek (dll, (file_ptr) secptr1, SEEK_SET);
3380 bfd_bread (sname, (bfd_size_type) 8, dll);
3381
3382 if (vaddr <= export_rva && vaddr + vsize > export_rva)
3383 {
3384 expptr = fptr + (export_rva - vaddr);
3385 if (export_rva + export_size > vaddr + vsize)
3386 export_size = vsize - (export_rva - vaddr);
3387 break;
3388 }
3389 }
3390
3391 /* Scan sections and store the base and size of the
3392 data and bss segments in data/base_start/end. */
3393 for (i = 0; i < nsections; i++)
3394 {
3395 bfd_vma secptr1 = secptr + 40 * i;
3396 bfd_vma vsize = pe_get32 (dll, secptr1 + 8);
3397 bfd_vma vaddr = pe_get32 (dll, secptr1 + 12);
3398 bfd_vma flags = pe_get32 (dll, secptr1 + 36);
3399 char sec_name[9];
3400
3401 sec_name[8] = '\0';
3402 bfd_seek (dll, (file_ptr) secptr1 + 0, SEEK_SET);
3403 bfd_bread (sec_name, (bfd_size_type) 8, dll);
3404
3405 if (strcmp(sec_name,".data") == 0)
3406 {
3407 data_start = vaddr;
3408 data_end = vaddr + vsize;
3409
3410 if (pe_dll_extra_pe_debug)
3411 printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n",
3412 __FUNCTION__, sec_name, (unsigned long) vaddr,
3413 (unsigned long) (vaddr + vsize), (unsigned long) flags);
3414 }
3415 else if (strcmp(sec_name,".rdata") == 0)
3416 {
3417 rdata_start = vaddr;
3418 rdata_end = vaddr + vsize;
3419
3420 if (pe_dll_extra_pe_debug)
3421 printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n",
3422 __FUNCTION__, sec_name, (unsigned long) vaddr,
3423 (unsigned long) (vaddr + vsize), (unsigned long) flags);
3424 }
3425 else if (strcmp (sec_name,".bss") == 0)
3426 {
3427 bss_start = vaddr;
3428 bss_end = vaddr + vsize;
3429
3430 if (pe_dll_extra_pe_debug)
3431 printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n",
3432 __FUNCTION__, sec_name, (unsigned long) vaddr,
3433 (unsigned long) (vaddr + vsize), (unsigned long) flags);
3434 }
3435 }
3436
3437 expdata = xmalloc (export_size);
3438 bfd_seek (dll, (file_ptr) expptr, SEEK_SET);
3439 bfd_bread (expdata, (bfd_size_type) export_size, dll);
3440 erva = (char *) expdata - export_rva;
3441
3442 if (pe_def_file == 0)
3443 pe_def_file = def_file_empty ();
3444
3445 nexp = pe_as32 (expdata + 24);
3446 name_rvas = pe_as32 (expdata + 32);
3447 exp_funcbase = pe_as32 (expdata + 28);
3448
3449 /* Use internal dll name instead of filename
3450 to enable symbolic dll linking. */
3451 dllname = erva + pe_as32 (expdata + 12);
3452
3453 /* Check to see if the dll has already been added to
3454 the definition list and if so return without error.
3455 This avoids multiple symbol definitions. */
3456 if (def_get_module (pe_def_file, dllname))
3457 {
3458 if (pe_dll_extra_pe_debug)
3459 printf ("%s is already loaded\n", dllname);
3460 return TRUE;
3461 }
3462
3463 /* This is an optimized version of the insertion loop, which avoids lots of
3464 calls to realloc and memmove from def_file_add_import. */
3465 if ((from = def_file_add_import_from (pe_def_file, nexp,
3466 erva + pe_as32 (erva + name_rvas),
3467 dllname, 0, NULL, NULL)) >= 0)
3468 {
3469 for (i = 0; i < nexp; i++)
3470 {
3471 /* Pointer to the names vector. */
3472 bfd_vma name_rva = pe_as32 (erva + name_rvas + i * 4);
3473 def_file_import *imp;
3474 /* Pointer to the function address vector. */
3475 bfd_vma func_rva = pe_as32 (erva + exp_funcbase + i * 4);
3476 /* is_data is true if the address is in the data, rdata or bss
3477 segment. */
3478 const int is_data =
3479 (func_rva >= data_start && func_rva < data_end)
3480 || (func_rva >= rdata_start && func_rva < rdata_end)
3481 || (func_rva >= bss_start && func_rva < bss_end);
3482
3483 imp = def_file_add_import_at (pe_def_file, from + i, erva + name_rva,
3484 dllname, i, NULL, NULL);
3485 /* Mark symbol type. */
3486 imp->data = is_data;
3487
3488 if (pe_dll_extra_pe_debug)
3489 printf ("%s dll-name: %s sym: %s addr: 0x%lx %s\n",
3490 __FUNCTION__, dllname, erva + name_rva,
3491 (unsigned long) func_rva, is_data ? "(data)" : "");
3492 }
3493
3494 return TRUE;
3495 }
3496
3497 /* Iterate through the list of symbols. */
3498 for (i = 0; i < nexp; i++)
3499 {
3500 /* Pointer to the names vector. */
3501 bfd_vma name_rva = pe_as32 (erva + name_rvas + i * 4);
3502 def_file_import *imp;
3503 /* Pointer to the function address vector. */
3504 bfd_vma func_rva = pe_as32 (erva + exp_funcbase + i * 4);
3505 int is_data = 0;
3506
3507 /* Skip unwanted symbols, which are
3508 exported in buggy auto-import releases. */
3509 if (! CONST_STRNEQ (erva + name_rva, "__nm_"))
3510 {
3511 int is_dup = 0;
3512 /* is_data is true if the address is in the data, rdata or bss
3513 segment. */
3514 is_data =
3515 (func_rva >= data_start && func_rva < data_end)
3516 || (func_rva >= rdata_start && func_rva < rdata_end)
3517 || (func_rva >= bss_start && func_rva < bss_end);
3518
3519 imp = def_file_add_import (pe_def_file, erva + name_rva,
3520 dllname, i, NULL, NULL, &is_dup);
3521 /* Mark symbol type. */
3522 if (!is_dup)
3523 imp->data = is_data;
3524
3525 if (pe_dll_extra_pe_debug)
3526 printf ("%s dll-name: %s sym: %s addr: 0x%lx %s\n",
3527 __FUNCTION__, dllname, erva + name_rva,
3528 (unsigned long) func_rva, is_data ? "(data)" : "");
3529 }
3530 }
3531
3532 return TRUE;
3533 }
3534
3535 void
3536 pe_output_file_set_long_section_names (bfd *abfd)
3537 {
3538 if (pe_use_coff_long_section_names < 0)
3539 return;
3540 if (!bfd_coff_set_long_section_names (abfd, pe_use_coff_long_section_names))
3541 einfo (_("%X%P: error: can't use long section names on this arch\n"));
3542 }
3543
3544 /* These are the main functions, called from the emulation. The first
3545 is called after the bfds are read, so we can guess at how much space
3546 we need. The second is called after everything is placed, so we
3547 can put the right values in place. */
3548
3549 void
3550 pe_dll_build_sections (bfd *abfd, struct bfd_link_info *info)
3551 {
3552 pe_dll_id_target (bfd_get_target (abfd));
3553 pe_output_file_set_long_section_names (abfd);
3554 process_def_file_and_drectve (abfd, info);
3555
3556 if (pe_def_file->num_exports == 0 && !bfd_link_pic (info))
3557 return;
3558
3559 generate_edata (abfd, info);
3560 build_filler_bfd (1);
3561 pe_output_file_set_long_section_names (filler_bfd);
3562 }
3563
3564 void
3565 pe_exe_build_sections (bfd *abfd, struct bfd_link_info *info ATTRIBUTE_UNUSED)
3566 {
3567 pe_dll_id_target (bfd_get_target (abfd));
3568 pe_output_file_set_long_section_names (abfd);
3569 build_filler_bfd (0);
3570 pe_output_file_set_long_section_names (filler_bfd);
3571 }
3572
3573 void
3574 pe_dll_fill_sections (bfd *abfd, struct bfd_link_info *info)
3575 {
3576 pe_dll_id_target (bfd_get_target (abfd));
3577 pe_output_file_set_long_section_names (abfd);
3578 image_base = pe_data (abfd)->pe_opthdr.ImageBase;
3579
3580 generate_reloc (abfd, info);
3581 if (reloc_sz > 0)
3582 {
3583 bfd_set_section_size (reloc_s, reloc_sz);
3584
3585 /* Resize the sections. */
3586 lang_reset_memory_regions ();
3587 lang_size_sections (NULL, TRUE);
3588
3589 /* Redo special stuff. */
3590 ldemul_after_allocation ();
3591
3592 /* Do the assignments again. */
3593 lang_do_assignments (lang_final_phase_enum);
3594 }
3595
3596 fill_edata (abfd, info);
3597
3598 if (bfd_link_dll (info))
3599 pe_data (abfd)->dll = 1;
3600
3601 edata_s->contents = edata_d;
3602 reloc_s->contents = reloc_d;
3603 }
3604
3605 void
3606 pe_exe_fill_sections (bfd *abfd, struct bfd_link_info *info)
3607 {
3608 pe_dll_id_target (bfd_get_target (abfd));
3609 pe_output_file_set_long_section_names (abfd);
3610 image_base = pe_data (abfd)->pe_opthdr.ImageBase;
3611
3612 generate_reloc (abfd, info);
3613 if (reloc_sz > 0)
3614 {
3615 bfd_set_section_size (reloc_s, reloc_sz);
3616
3617 /* Resize the sections. */
3618 lang_reset_memory_regions ();
3619 lang_size_sections (NULL, TRUE);
3620
3621 /* Redo special stuff. */
3622 ldemul_after_allocation ();
3623
3624 /* Do the assignments again. */
3625 lang_do_assignments (lang_final_phase_enum);
3626 }
3627 reloc_s->contents = reloc_d;
3628 }
3629
3630 bfd_boolean
3631 pe_bfd_is_dll (bfd *abfd)
3632 {
3633 return (bfd_get_format (abfd) == bfd_object
3634 && obj_pe (abfd)
3635 && pe_data (abfd)->dll);
3636 }
This page took 0.1549 seconds and 4 git commands to generate.