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