Add translations for various sub-directories
[binutils-gdb.git] / ld / pe-dll.c
blobf24b8716ae2fcc35ca03aaec7ae3b94763a77309
1 /* Routines to help build PEI-format DLLs (Win32 etc)
2 Copyright (C) 1998-2025 Free Software Foundation, Inc.
3 Written by DJ Delorie <dj@cygnus.com>
5 This file is part of the GNU Binutils.
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.
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.
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. */
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"
30 #include <time.h>
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"
45 #ifdef pe_use_plus
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
54 #else
56 #include "pe-dll.h"
58 #endif
60 #ifndef PE_IDATA4_SIZE
61 #define PE_IDATA4_SIZE 4
62 #endif
64 #ifndef PE_IDATA5_SIZE
65 #define PE_IDATA5_SIZE 4
66 #endif
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.
75 See also: ld/emultempl/pe.em and ld/emultempl/pep.em. */
77 /* Auto-import feature by Paul Sokolovsky
79 Quick facts:
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).
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.
89 3. Auto-import is fully compatible with standard import method and they
90 can be mixed together.
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).
97 Idea
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
103 mov dll_var,%eax,
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, ;-) .
116 Implementation
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.
145 See also: ld/emultempl/pe.em and ld/emultempl/pep.em. */
147 static void add_bfd_to_link (bfd *, const char *, struct bfd_link_info *);
149 /* For emultempl/pe.em. */
151 def_file * pe_def_file = 0;
152 int pe_dll_export_everything = 0;
153 int pe_dll_exclude_all_symbols = 0;
154 int pe_dll_do_default_excludes = 1;
155 int pe_dll_kill_ats = 0;
156 int pe_dll_stdcall_aliases = 0;
157 int pe_dll_warn_dup_exports = 0;
158 int pe_dll_compat_implib = 0;
159 int pe_dll_extra_pe_debug = 0;
160 int pe_use_nul_prefixed_import_tables = 0;
161 int pe_use_coff_long_section_names = -1;
162 int pe_leading_underscore = -1;
163 int pe_dll_enable_reloc_section = 1;
165 /* Static variables and types. */
167 static bfd_vma image_base;
168 static bfd *filler_bfd;
169 static struct bfd_section *edata_s, *reloc_s;
170 static unsigned char *edata_d, *reloc_d;
171 static unsigned char *reloc_d = NULL;
172 static size_t edata_sz, reloc_sz = 0;
173 static int runtime_pseudo_relocs_created = 0;
174 static bool runtime_pseudp_reloc_v2_init = false;
176 typedef struct
178 const char *name;
179 int len;
181 autofilter_entry_type;
183 typedef struct
185 const char *target_name;
186 const char *object_target;
187 unsigned int imagebase_reloc;
188 unsigned int secrel_reloc_lo;
189 unsigned int secrel_reloc_hi;
190 unsigned int section_reloc;
191 int pe_arch;
192 int bfd_arch;
193 bool underscored;
194 const autofilter_entry_type* autofilter_symbollist;
196 pe_details_type;
198 static const autofilter_entry_type autofilter_symbollist_generic[] =
200 { STRING_COMMA_LEN ("_NULL_IMPORT_DESCRIPTOR") },
201 /* Entry point symbols. */
202 { STRING_COMMA_LEN ("DllMain") },
203 { STRING_COMMA_LEN ("DllMainCRTStartup") },
204 { STRING_COMMA_LEN ("_DllMainCRTStartup") },
205 /* Runtime pseudo-reloc. */
206 { STRING_COMMA_LEN ("_pei386_runtime_relocator") },
207 { STRING_COMMA_LEN ("do_pseudo_reloc") },
208 { NULL, 0 }
211 static const autofilter_entry_type autofilter_symbollist_i386[] =
213 { STRING_COMMA_LEN ("_NULL_IMPORT_DESCRIPTOR") },
214 /* Entry point symbols, and entry hooks. */
215 { STRING_COMMA_LEN ("cygwin_crt0") },
216 #ifdef pe_use_plus
217 { STRING_COMMA_LEN ("DllMain") },
218 { STRING_COMMA_LEN ("DllEntryPoint") },
219 { STRING_COMMA_LEN ("DllMainCRTStartup") },
220 { STRING_COMMA_LEN ("_cygwin_dll_entry") },
221 { STRING_COMMA_LEN ("_cygwin_crt0_common") },
222 { STRING_COMMA_LEN ("_cygwin_noncygwin_dll_entry") },
223 #else
224 { STRING_COMMA_LEN ("DllMain@12") },
225 { STRING_COMMA_LEN ("DllEntryPoint@0") },
226 { STRING_COMMA_LEN ("DllMainCRTStartup@12") },
227 { STRING_COMMA_LEN ("_cygwin_dll_entry@12") },
228 { STRING_COMMA_LEN ("_cygwin_crt0_common@8") },
229 { STRING_COMMA_LEN ("_cygwin_noncygwin_dll_entry@12") },
230 { STRING_COMMA_LEN ("cygwin_attach_dll") },
231 #endif
232 { STRING_COMMA_LEN ("cygwin_premain0") },
233 { STRING_COMMA_LEN ("cygwin_premain1") },
234 { STRING_COMMA_LEN ("cygwin_premain2") },
235 { STRING_COMMA_LEN ("cygwin_premain3") },
236 /* Runtime pseudo-reloc. */
237 { STRING_COMMA_LEN ("_pei386_runtime_relocator") },
238 { STRING_COMMA_LEN ("do_pseudo_reloc") },
239 /* Global vars that should not be exported. */
240 { STRING_COMMA_LEN ("impure_ptr") },
241 { STRING_COMMA_LEN ("_impure_ptr") },
242 { STRING_COMMA_LEN ("_fmode") },
243 { STRING_COMMA_LEN ("environ") },
244 { STRING_COMMA_LEN ("__dso_handle") },
245 { NULL, 0 }
248 #define PE_ARCH_i386 1
249 #define PE_ARCH_sh 2
250 #define PE_ARCH_mips 3
251 #define PE_ARCH_arm 4
252 #define PE_ARCH_arm_wince 5
253 #define PE_ARCH_aarch64 6
255 /* Don't make it constant as underscore mode gets possibly overriden
256 by target or -(no-)leading-underscore option. */
257 static pe_details_type pe_detail_list[] =
260 #ifdef pe_use_plus
261 "pei-x86-64",
262 "pe-x86-64",
263 3 /* R_AMD64_IMAGEBASE */,
264 11 /* R_AMD64_SECREL32 */,
265 12 /* R_AMD64_SECREL7 */,
266 10 /* R_AMD64_SECTION */,
267 #else
268 "pei-i386",
269 "pe-i386",
270 7 /* R_IMAGEBASE */,
271 11, 11 /* R_SECREL32 */,
272 10 /* R_SECTION */,
273 #endif
274 PE_ARCH_i386,
275 bfd_arch_i386,
276 #ifdef pe_use_plus
277 false,
278 #else
279 true,
280 #endif
281 autofilter_symbollist_i386
283 #ifdef pe_use_plus
285 "pei-x86-64",
286 "pe-bigobj-x86-64",
287 3 /* R_AMD64_IMAGEBASE */,
288 11 /* R_AMD64_SECREL32 */,
289 12 /* R_AMD64_SECREL7 */,
290 10 /* R_AMD64_SECTION */,
291 PE_ARCH_i386,
292 bfd_arch_i386,
293 false,
294 autofilter_symbollist_i386
296 #else
298 "pei-i386",
299 "pe-bigobj-i386",
300 7 /* R_IMAGEBASE */,
301 11, 11 /* R_SECREL32 */,
302 10 /* R_SECTION */,
303 PE_ARCH_i386,
304 bfd_arch_i386,
305 true,
306 autofilter_symbollist_i386
308 #endif
310 "pei-shl",
311 "pe-shl",
312 16 /* R_SH_IMAGEBASE */,
313 ~0, 0, ~0, /* none */
314 PE_ARCH_sh,
315 bfd_arch_sh,
316 true,
317 autofilter_symbollist_generic
320 "pei-mips",
321 "pe-mips",
322 34 /* MIPS_R_RVA */,
323 ~0, 0, ~0, /* none */
324 PE_ARCH_mips,
325 bfd_arch_mips,
326 false,
327 autofilter_symbollist_generic
330 "pei-arm-little",
331 "pe-arm-little",
332 11 /* ARM_RVA32 */,
333 ~0, 0, ~0, /* none */
334 PE_ARCH_arm,
335 bfd_arch_arm,
336 true,
337 autofilter_symbollist_generic
340 "pei-arm-wince-little",
341 "pe-arm-wince-little",
342 2, /* ARM_RVA32 on Windows CE, see bfd/coff-arm.c. */
343 15, 15, /* ARM_SECREL (dito) */
344 14, /* ARM_SECTION (dito) */
345 PE_ARCH_arm_wince,
346 bfd_arch_arm,
347 false,
348 autofilter_symbollist_generic
351 "pei-aarch64-little",
352 "pe-aarch64-little",
353 2, /* IMAGE_REL_ARM64_ADDR32NB */
354 8, /* IMAGE_REL_ARM64_SECREL */
355 11, /* IMAGE_REL_ARM64_SECREL_LOW12L */
356 13, /* IMAGE_REL_ARM64_SECTION */
357 PE_ARCH_aarch64,
358 bfd_arch_aarch64,
359 false,
360 autofilter_symbollist_generic
362 { NULL, NULL, 0, 0, 0, 0, 0, 0, false, NULL }
365 static const pe_details_type *pe_details;
367 /* Do not specify library suffix explicitly, to allow for dllized versions. */
368 static const autofilter_entry_type autofilter_liblist[] =
370 { STRING_COMMA_LEN ("libcegcc") },
371 { STRING_COMMA_LEN ("libcygwin") },
372 { STRING_COMMA_LEN ("libgcc") },
373 { STRING_COMMA_LEN ("libgcc_s") },
374 { STRING_COMMA_LEN ("libstdc++") },
375 { STRING_COMMA_LEN ("libmingw32") },
376 { STRING_COMMA_LEN ("libmingwex") },
377 { STRING_COMMA_LEN ("libg2c") },
378 { STRING_COMMA_LEN ("libsupc++") },
379 { STRING_COMMA_LEN ("libobjc") },
380 { STRING_COMMA_LEN ("libgcj") },
381 { STRING_COMMA_LEN ("libmsvcrt") },
382 { STRING_COMMA_LEN ("libmsvcrt-os") },
383 { STRING_COMMA_LEN ("libucrt") },
384 { STRING_COMMA_LEN ("libucrtbase") },
385 { STRING_COMMA_LEN ("libpthread") },
386 { STRING_COMMA_LEN ("libwinpthread") },
387 { NULL, 0 }
390 /* Regardless of the suffix issue mentioned above, we must ensure that
391 we do not falsely match on a leading substring, such as when libtool
392 builds libstdc++ as a DLL using libsupc++convenience.a as an intermediate.
393 This routine ensures that the leading part of the name matches and that
394 it is followed by only an optional version suffix and a file extension,
395 returning zero if so or -1 if not. */
396 static int libnamencmp (const char *libname, const autofilter_entry_type *afptr)
398 if (filename_ncmp (libname, afptr->name, afptr->len))
399 return -1;
401 libname += afptr->len;
403 /* Be liberal in interpreting what counts as a version suffix; we
404 accept anything that has a dash to separate it from the name and
405 begins with a digit. */
406 if (libname[0] == '-')
408 if (!ISDIGIT (*++libname))
409 return -1;
410 /* Ensure the filename has an extension. */
411 while (*++libname != '.')
412 if (!*libname)
413 return -1;
415 else if (libname[0] != '.')
416 return -1;
418 return 0;
421 static const autofilter_entry_type autofilter_objlist[] =
423 { STRING_COMMA_LEN ("crt0.o") },
424 { STRING_COMMA_LEN ("crt1.o") },
425 { STRING_COMMA_LEN ("crt2.o") },
426 { STRING_COMMA_LEN ("dllcrt1.o") },
427 { STRING_COMMA_LEN ("dllcrt2.o") },
428 { STRING_COMMA_LEN ("gcrt0.o") },
429 { STRING_COMMA_LEN ("gcrt1.o") },
430 { STRING_COMMA_LEN ("gcrt2.o") },
431 { STRING_COMMA_LEN ("crtbegin.o") },
432 { STRING_COMMA_LEN ("crtend.o") },
433 { NULL, 0 }
436 static const autofilter_entry_type autofilter_symbolprefixlist[] =
438 /* _imp_ is treated specially, as it is always underscored. */
439 /* { STRING_COMMA_LEN ("_imp_") }, */
440 /* Don't export some c++ symbols. */
441 { STRING_COMMA_LEN ("__rtti_") },
442 { STRING_COMMA_LEN ("__builtin_") },
443 /* Don't re-export auto-imported symbols. */
444 { STRING_COMMA_LEN ("__nm_") },
445 /* Don't export symbols specifying internal DLL layout. */
446 { STRING_COMMA_LEN ("_head_") },
447 { STRING_COMMA_LEN ("_IMPORT_DESCRIPTOR_") },
448 /* Don't export section labels or artificial symbols
449 (eg ".weak.foo". */
450 { STRING_COMMA_LEN (".") },
451 { NULL, 0 }
454 static const autofilter_entry_type autofilter_symbolsuffixlist[] =
456 { STRING_COMMA_LEN ("_iname") },
457 { STRING_COMMA_LEN ("_NULL_THUNK_DATA") },
458 { NULL, 0 }
461 #define U(str) (pe_details->underscored ? "_" str : str)
463 void
464 pe_dll_id_target (const char *target)
466 int i;
468 for (i = 0; pe_detail_list[i].target_name; i++)
469 if (strcmp (pe_detail_list[i].target_name, target) == 0
470 || strcmp (pe_detail_list[i].object_target, target) == 0)
472 int u = pe_leading_underscore; /* Underscoring mode. -1 for use default. */
473 if (u == -1)
474 bfd_get_target_info (target, NULL, NULL, &u, NULL);
475 if (u == -1)
476 abort ();
477 pe_detail_list[i].underscored = u != 0;
478 pe_details = pe_detail_list + i;
479 pe_leading_underscore = (u != 0 ? 1 : 0);
480 return;
482 einfo (_("%X%P: unsupported PEI architecture: %s\n"), target);
483 exit (1);
486 /* Helper functions for qsort. Relocs must be sorted so that we can write
487 them out by pages. */
489 typedef struct
491 bfd_vma vma;
492 char type;
493 short extra;
494 int idx;
496 reloc_data_type;
498 static int
499 reloc_sort (const void *va, const void *vb)
501 const reloc_data_type *a = (const reloc_data_type *) va;
502 const reloc_data_type *b = (const reloc_data_type *) vb;
504 if (a->vma > b->vma)
505 return 1;
506 if (a->vma < b->vma)
507 return -1;
508 if (a->idx > b->idx)
509 return 1;
510 if (a->idx < b->idx)
511 return -1;
512 return 0;
515 static int
516 pe_export_sort (const void *va, const void *vb)
518 const def_file_export *a = va;
519 const def_file_export *b = vb;
520 char *an = a->name;
521 char *bn = b->name;
522 if (a->its_name)
523 an = a->its_name;
524 if (b->its_name)
525 bn = b->its_name;
527 return strcmp (an, bn);
530 /* Read and process the .DEF file. */
532 /* These correspond to the entries in pe_def_file->exports[]. I use
533 exported_symbol_sections[i] to tag whether or not the symbol was
534 defined, since we can't export symbols we don't have. */
536 static bfd_vma *exported_symbol_offsets;
537 static struct bfd_section **exported_symbol_sections;
538 static int export_table_size;
539 static int count_exported;
540 static int count_exported_byname;
541 static int count_with_ordinals;
542 static const char *dll_filename;
543 static int min_ordinal, max_ordinal;
544 static int *exported_symbols;
546 typedef struct exclude_list_struct
548 char *string;
549 struct exclude_list_struct *next;
550 exclude_type type;
552 exclude_list_struct;
554 static struct exclude_list_struct *excludes = 0;
556 void
557 pe_dll_add_excludes (const char *new_excludes, const exclude_type type)
559 char *local_copy;
560 char *exclude_string;
562 local_copy = xstrdup (new_excludes);
564 exclude_string = strtok (local_copy, ",:");
565 for (; exclude_string; exclude_string = strtok (NULL, ",:"))
567 struct exclude_list_struct *new_exclude;
569 new_exclude = xmalloc (sizeof (struct exclude_list_struct));
570 new_exclude->string = xmalloc (strlen (exclude_string) + 1);
571 strcpy (new_exclude->string, exclude_string);
572 new_exclude->type = type;
573 new_exclude->next = excludes;
574 excludes = new_exclude;
577 free (local_copy);
580 static bool
581 is_import (const char* n)
583 return (startswith (n, "__imp_"));
586 /* abfd is a bfd containing n (or NULL)
587 It can be used for contextual checks. */
589 static int
590 auto_export (bfd *abfd, def_file *d, const char *n)
592 def_file_export key;
593 struct exclude_list_struct *ex;
594 const autofilter_entry_type *afptr;
595 const char * libname = NULL;
597 if (abfd && abfd->my_archive)
598 libname = lbasename (bfd_get_filename (abfd->my_archive));
600 key.name = key.its_name = (char *) n;
602 /* Return false if n is in the d->exports table. */
603 if (d->num_exports != 0
604 && bsearch (&key, d->exports, d->num_exports,
605 sizeof (pe_def_file->exports[0]), pe_export_sort))
606 return 0;
608 if (pe_dll_do_default_excludes)
610 const char * p;
611 int len;
613 if (pe_dll_extra_pe_debug)
614 printf ("considering exporting: %s, abfd=%p, abfd->my_arc=%p\n",
615 n, abfd, abfd->my_archive);
617 /* First of all, make context checks:
618 Don't export anything from standard libs. */
619 if (libname)
621 afptr = autofilter_liblist;
623 while (afptr->name)
625 if (libnamencmp (libname, afptr) == 0 )
626 return 0;
627 afptr++;
631 /* Next, exclude symbols from certain startup objects. */
633 if (abfd && (p = lbasename (bfd_get_filename (abfd))))
635 afptr = autofilter_objlist;
636 while (afptr->name)
638 if (strcmp (p, afptr->name) == 0)
639 return 0;
640 afptr++;
644 /* Don't try to blindly exclude all symbols
645 that begin with '__'; this was tried and
646 it is too restrictive. Instead we have
647 a target specific list to use: */
648 afptr = pe_details->autofilter_symbollist;
650 while (afptr->name)
652 if (strcmp (n, afptr->name) == 0)
653 return 0;
655 afptr++;
658 /* Next, exclude symbols starting with ... */
659 afptr = autofilter_symbolprefixlist;
660 while (afptr->name)
662 if (strncmp (n, afptr->name, afptr->len) == 0)
663 return 0;
665 afptr++;
668 /* Finally, exclude symbols ending with ... */
669 len = strlen (n);
670 afptr = autofilter_symbolsuffixlist;
671 while (afptr->name)
673 if ((len >= afptr->len)
674 /* Add 1 to insure match with trailing '\0'. */
675 && strncmp (n + len - afptr->len, afptr->name,
676 afptr->len + 1) == 0)
677 return 0;
679 afptr++;
683 for (ex = excludes; ex; ex = ex->next)
685 if (ex->type == EXCLUDELIBS)
687 if (libname
688 && ((filename_cmp (libname, ex->string) == 0)
689 || (strcasecmp ("ALL", ex->string) == 0)))
690 return 0;
692 else if (ex->type == EXCLUDEFORIMPLIB)
694 if (filename_cmp (bfd_get_filename (abfd), ex->string) == 0)
695 return 0;
697 else if (strcmp (n, ex->string) == 0)
698 return 0;
701 return 1;
704 static void
705 process_def_file_and_drectve (bfd *abfd ATTRIBUTE_UNUSED, struct bfd_link_info *info)
707 int i, j;
708 unsigned int ui;
709 struct bfd_link_hash_entry *blhe;
710 bfd *b;
711 struct bfd_section *s;
712 def_file_export *e = 0;
713 bool resort_needed;
715 if (!pe_def_file)
716 pe_def_file = def_file_empty ();
718 /* First, run around to all the objects looking for the .drectve
719 sections, and push those into the def file too. */
720 for (b = info->input_bfds; b; b = b->link.next)
722 s = bfd_get_section_by_name (b, ".drectve");
723 if (s)
725 long size = s->size;
726 char *buf = xmalloc (size);
728 bfd_get_section_contents (b, s, buf, 0, size);
729 def_file_add_directive (pe_def_file, buf, size);
730 free (buf);
734 /* Process aligned common symbol information from the
735 .drectve sections now; common symbol allocation is
736 done before final link, so it will be too late to
737 process them in process_embedded_commands() called
738 from _bfd_coff_link_input_bfd(). */
739 if (pe_def_file->aligncomms)
741 def_file_aligncomm *ac = pe_def_file->aligncomms;
742 while (ac)
744 struct coff_link_hash_entry *sym_hash;
745 sym_hash = coff_link_hash_lookup (coff_hash_table (info),
746 ac->symbol_name, false, false, false);
747 if (sym_hash && sym_hash->root.type == bfd_link_hash_common
748 && sym_hash->root.u.c.p->alignment_power < (unsigned) ac->alignment)
750 sym_hash->root.u.c.p->alignment_power = (unsigned) ac->alignment;
752 ac = ac->next;
756 if (pe_def_file->exclude_symbols)
758 for (ui = 0; ui < pe_def_file->num_exclude_symbols; ui++)
760 pe_dll_add_excludes (pe_def_file->exclude_symbols[ui].symbol_name,
761 EXCLUDESYMS);
765 /* If we are building an executable and there is nothing
766 to export, we do not build an export table at all. */
767 if (bfd_link_executable (info) && pe_def_file->num_exports == 0
768 && (!pe_dll_export_everything || pe_dll_exclude_all_symbols))
769 return;
771 /* Now, maybe export everything else the default way. */
772 if ((pe_dll_export_everything || pe_def_file->num_exports == 0)
773 && !pe_dll_exclude_all_symbols)
775 for (b = info->input_bfds; b; b = b->link.next)
777 asymbol **symbols;
778 int nsyms;
780 if (!bfd_generic_link_read_symbols (b))
782 einfo (_("%F%P: %pB: could not read symbols: %E\n"), b);
783 return;
786 symbols = bfd_get_outsymbols (b);
787 nsyms = bfd_get_symcount (b);
789 for (j = 0; j < nsyms; j++)
791 /* We should export symbols which are either global or not
792 anything at all. (.bss data is the latter)
793 We should not export undefined symbols. */
794 bool would_export
795 = (symbols[j]->section != bfd_und_section_ptr
796 && ((symbols[j]->flags & BSF_GLOBAL)
797 || (symbols[j]->flags == 0)));
798 if (link_info.version_info && would_export)
799 would_export
800 = !bfd_hide_sym_by_version (link_info.version_info,
801 symbols[j]->name);
802 if (would_export)
804 const char *sn = symbols[j]->name;
806 /* We should not re-export imported stuff. */
808 char *name;
809 if (is_import (sn))
810 continue;
812 name = xmalloc (strlen ("__imp_") + strlen (sn) + 1);
813 sprintf (name, "%s%s", "__imp_", sn);
815 blhe = bfd_link_hash_lookup (info->hash, name,
816 false, false, false);
817 free (name);
819 if (blhe && blhe->type == bfd_link_hash_defined)
820 continue;
823 if (pe_details->underscored && *sn == '_')
824 sn++;
826 if (auto_export (b, pe_def_file, sn))
828 bool is_dup = false;
829 def_file_export *p;
831 p = def_file_add_export (pe_def_file, sn, 0, -1,
832 NULL, &is_dup);
833 /* Fill data flag properly, from dlltool.c. */
834 if (!is_dup)
835 p->flag_data = !(symbols[j]->flags & BSF_FUNCTION);
842 #undef NE
843 #define NE pe_def_file->num_exports
845 /* Don't create an empty export table. */
846 if (NE == 0)
847 return;
849 resort_needed = false;
851 /* Canonicalize the export list. */
852 if (pe_dll_kill_ats)
854 for (i = 0; i < NE; i++)
856 /* Check for fastcall/stdcall-decoration, but ignore
857 C++ mangled names. */
858 if (pe_def_file->exports[i].name[0] != '?'
859 && strchr (pe_def_file->exports[i].name, '@'))
861 /* This will preserve internal_name, which may have been
862 pointing to the same memory as name, or might not
863 have. */
864 int lead_at = (*pe_def_file->exports[i].name == '@');
865 char *tmp = xstrdup (pe_def_file->exports[i].name + lead_at);
866 char *tmp_at = strrchr (tmp, '@');
868 if (tmp_at)
869 *tmp_at = 0;
870 else
871 einfo (_("%X%P: cannot export %s: invalid export name\n"),
872 pe_def_file->exports[i].name);
873 pe_def_file->exports[i].name = tmp;
874 resort_needed = true;
879 /* Re-sort the exports table as we have possibly changed the order
880 by removing leading @. */
881 if (resort_needed)
882 qsort (pe_def_file->exports, NE, sizeof (pe_def_file->exports[0]),
883 pe_export_sort);
885 if (pe_dll_stdcall_aliases)
887 for (i = 0; i < NE; i++)
889 if (is_import (pe_def_file->exports[i].name))
890 continue;
892 if (strchr (pe_def_file->exports[i].name, '@'))
894 bool is_dup = true;
895 int lead_at = (*pe_def_file->exports[i].name == '@');
896 char *tmp = xstrdup (pe_def_file->exports[i].name + lead_at);
898 *(strchr (tmp, '@')) = 0;
899 if (auto_export (NULL, pe_def_file, tmp))
900 def_file_add_export (pe_def_file, tmp,
901 pe_def_file->exports[i].internal_name,
902 -1, NULL, &is_dup);
903 if (is_dup)
904 free (tmp);
909 /* Convenience, but watch out for it changing. */
910 e = pe_def_file->exports;
912 for (i = 0, j = 0; i < NE; i++)
914 if (i > 0 && strcmp (e[i].name, e[i - 1].name) == 0)
916 /* This is a duplicate. */
917 if (e[j - 1].ordinal != -1
918 && e[i].ordinal != -1
919 && e[j - 1].ordinal != e[i].ordinal)
921 if (pe_dll_warn_dup_exports)
922 /* xgettext:c-format */
923 einfo (_("%X%P: error, duplicate EXPORT with ordinals: %s (%d vs %d)\n"),
924 e[j - 1].name, e[j - 1].ordinal, e[i].ordinal);
926 else
928 if (pe_dll_warn_dup_exports)
929 /* xgettext:c-format */
930 einfo (_("%P: warning, duplicate EXPORT: %s\n"),
931 e[j - 1].name);
934 if (e[i].ordinal != -1)
935 e[j - 1].ordinal = e[i].ordinal;
936 e[j - 1].flag_private |= e[i].flag_private;
937 e[j - 1].flag_constant |= e[i].flag_constant;
938 e[j - 1].flag_noname |= e[i].flag_noname;
939 e[j - 1].flag_data |= e[i].flag_data;
940 free (e[i].name);
941 free (e[i].internal_name);
942 free (e[i].its_name);
944 else
946 if (i != j)
947 e[j] = e[i];
948 j++;
951 pe_def_file->num_exports = j; /* == NE */
953 exported_symbol_offsets = xmalloc (NE * sizeof (bfd_vma));
954 exported_symbol_sections = xmalloc (NE * sizeof (struct bfd_section *));
956 memset (exported_symbol_sections, 0, NE * sizeof (struct bfd_section *));
957 max_ordinal = 0;
958 min_ordinal = 65536;
959 count_exported = 0;
960 count_exported_byname = 0;
961 count_with_ordinals = 0;
963 for (i = 0; i < NE; i++)
965 char *int_name = pe_def_file->exports[i].internal_name;
966 char *name;
968 /* PR 19803: Make sure that any exported symbol does not get garbage collected. */
969 lang_add_gc_name (int_name);
971 name = xmalloc (strlen (int_name) + 2);
972 if (pe_details->underscored && int_name[0] != '@')
974 *name = '_';
975 strcpy (name + 1, int_name);
977 /* PR 19803: The alias must be preserved as well. */
978 lang_add_gc_name (xstrdup (name));
980 else
981 strcpy (name, int_name);
983 blhe = bfd_link_hash_lookup (info->hash,
984 name,
985 false, false, true);
987 if (blhe
988 && (blhe->type == bfd_link_hash_defined
989 || (blhe->type == bfd_link_hash_common)))
991 count_exported++;
992 if (!pe_def_file->exports[i].flag_noname)
993 count_exported_byname++;
995 /* Only fill in the sections. The actual offsets are computed
996 in fill_exported_offsets() after common symbols are laid
997 out. */
998 if (blhe->type == bfd_link_hash_defined)
999 exported_symbol_sections[i] = blhe->u.def.section;
1000 else
1001 exported_symbol_sections[i] = blhe->u.c.p->section;
1003 if (pe_def_file->exports[i].ordinal != -1)
1005 if (max_ordinal < pe_def_file->exports[i].ordinal)
1006 max_ordinal = pe_def_file->exports[i].ordinal;
1007 if (min_ordinal > pe_def_file->exports[i].ordinal)
1008 min_ordinal = pe_def_file->exports[i].ordinal;
1009 count_with_ordinals++;
1012 /* Check for forward exports. These are indicated in DEF files by an
1013 export directive of the form NAME1 = MODULE-NAME.EXTERNAL-NAME
1014 but we must take care not to be fooled when the user wants to export
1015 a symbol that actually really has a dot in it, so we only check
1016 for them here, after real defined symbols have already been matched. */
1017 else if (strchr (int_name, '.'))
1019 count_exported++;
1020 if (!pe_def_file->exports[i].flag_noname)
1021 count_exported_byname++;
1023 pe_def_file->exports[i].flag_forward = 1;
1025 if (pe_def_file->exports[i].ordinal != -1)
1027 if (max_ordinal < pe_def_file->exports[i].ordinal)
1028 max_ordinal = pe_def_file->exports[i].ordinal;
1029 if (min_ordinal > pe_def_file->exports[i].ordinal)
1030 min_ordinal = pe_def_file->exports[i].ordinal;
1031 count_with_ordinals++;
1034 else if (blhe && blhe->type == bfd_link_hash_undefined)
1036 /* xgettext:c-format */
1037 einfo (_("%X%P: cannot export %s: symbol not defined\n"),
1038 int_name);
1040 else if (blhe)
1042 /* xgettext:c-format */
1043 einfo (_("%X%P: cannot export %s: symbol wrong type (%d vs %d)\n"),
1044 int_name,
1045 blhe->type, bfd_link_hash_defined);
1047 else
1049 /* xgettext:c-format */
1050 einfo (_("%X%P: cannot export %s: symbol not found\n"),
1051 int_name);
1053 free (name);
1057 /* Build the bfd that will contain .edata and .reloc sections. */
1059 static void
1060 build_filler_bfd (bool include_edata)
1062 lang_input_statement_type *filler_file;
1064 filler_file = lang_add_input_file ("dll stuff",
1065 lang_input_file_is_fake_enum,
1066 NULL);
1067 filler_file->the_bfd = filler_bfd = bfd_create ("dll stuff",
1068 link_info.output_bfd);
1069 if (filler_bfd == NULL
1070 || !bfd_set_arch_mach (filler_bfd,
1071 bfd_get_arch (link_info.output_bfd),
1072 bfd_get_mach (link_info.output_bfd)))
1074 einfo (_("%F%P: can not create BFD: %E\n"));
1075 return;
1078 if (include_edata)
1080 edata_s = bfd_make_section_old_way (filler_bfd, ".edata");
1081 if (edata_s == NULL
1082 || !bfd_set_section_flags (edata_s, (SEC_HAS_CONTENTS
1083 | SEC_ALLOC
1084 | SEC_LOAD
1085 | SEC_KEEP
1086 | SEC_IN_MEMORY)))
1088 einfo (_("%X%P: can not create .edata section: %E\n"));
1089 return;
1091 bfd_set_section_size (edata_s, edata_sz);
1094 reloc_s = bfd_make_section_old_way (filler_bfd, ".reloc");
1095 if (reloc_s == NULL
1096 || !bfd_set_section_flags (reloc_s, (SEC_HAS_CONTENTS
1097 | SEC_ALLOC
1098 | SEC_LOAD
1099 | SEC_KEEP
1100 | SEC_IN_MEMORY)))
1102 einfo (_("%X%P: can not create .reloc section: %E\n"));
1103 return;
1106 bfd_set_section_size (reloc_s, 0);
1108 ldlang_add_file (filler_file);
1111 /* Gather all the exported symbols and build the .edata section. */
1113 static void
1114 generate_edata (void)
1116 int i, next_ordinal;
1117 int name_table_size = 0;
1119 /* First, we need to know how many exported symbols there are,
1120 and what the range of ordinals is. */
1121 if (count_with_ordinals && max_ordinal > count_exported)
1123 if (min_ordinal > max_ordinal - count_exported + 1)
1124 min_ordinal = max_ordinal - count_exported + 1;
1126 else
1128 min_ordinal = 1;
1129 max_ordinal = count_exported;
1132 export_table_size = max_ordinal - min_ordinal + 1;
1133 exported_symbols = xmalloc (export_table_size * sizeof (int));
1134 for (i = 0; i < export_table_size; i++)
1135 exported_symbols[i] = -1;
1137 /* Now we need to assign ordinals to those that don't have them. */
1138 for (i = 0; i < NE; i++)
1140 if (exported_symbol_sections[i]
1141 || pe_def_file->exports[i].flag_forward)
1143 if (pe_def_file->exports[i].ordinal != -1)
1145 int ei = pe_def_file->exports[i].ordinal - min_ordinal;
1146 int pi = exported_symbols[ei];
1148 if (pi != -1)
1150 /* xgettext:c-format */
1151 einfo (_("%X%P: error: ordinal used twice: %d (%s vs %s)\n"),
1152 pe_def_file->exports[i].ordinal,
1153 pe_def_file->exports[i].name,
1154 pe_def_file->exports[pi].name);
1156 exported_symbols[ei] = i;
1158 if (pe_def_file->exports[i].its_name)
1159 name_table_size += strlen (pe_def_file->exports[i].its_name) + 1;
1160 else
1161 name_table_size += strlen (pe_def_file->exports[i].name) + 1;
1164 /* Reserve space for the forward name. */
1165 if (pe_def_file->exports[i].flag_forward)
1167 name_table_size += strlen (pe_def_file->exports[i].internal_name) + 1;
1171 next_ordinal = min_ordinal;
1172 for (i = 0; i < NE; i++)
1173 if ((exported_symbol_sections[i]
1174 || pe_def_file->exports[i].flag_forward)
1175 && pe_def_file->exports[i].ordinal == -1)
1177 while (exported_symbols[next_ordinal - min_ordinal] != -1)
1178 next_ordinal++;
1180 exported_symbols[next_ordinal - min_ordinal] = i;
1181 pe_def_file->exports[i].ordinal = next_ordinal;
1184 /* PR 12969: Check for more than 1^16 ordinals. */
1185 if (max_ordinal > 65535 || next_ordinal > 65535)
1186 /* xgettext:c-format */
1187 einfo(_("%X%P: error: export ordinal too large: %d\n"),
1188 max_ordinal > next_ordinal ? max_ordinal : next_ordinal);
1190 /* OK, now we can allocate some memory. */
1191 edata_sz = (40 /* directory */
1192 + 4 * export_table_size /* addresses */
1193 + 4 * count_exported_byname /* name ptrs */
1194 + 2 * count_exported_byname /* ordinals */
1195 + name_table_size + strlen (dll_filename) + 1);
1198 /* Fill the exported symbol offsets. The preliminary work has already
1199 been done in process_def_file_and_drectve(). */
1201 static void
1202 fill_exported_offsets (bfd *abfd ATTRIBUTE_UNUSED, struct bfd_link_info *info)
1204 int i;
1205 struct bfd_link_hash_entry *blhe;
1207 for (i = 0; i < pe_def_file->num_exports; i++)
1209 char *name;
1211 name = xmalloc (strlen (pe_def_file->exports[i].internal_name) + 2);
1212 if (pe_details->underscored
1213 && *pe_def_file->exports[i].internal_name != '@')
1215 *name = '_';
1216 strcpy (name + 1, pe_def_file->exports[i].internal_name);
1218 else
1219 strcpy (name, pe_def_file->exports[i].internal_name);
1221 blhe = bfd_link_hash_lookup (info->hash,
1222 name,
1223 false, false, true);
1225 if (blhe && blhe->type == bfd_link_hash_defined)
1226 exported_symbol_offsets[i] = blhe->u.def.value;
1228 free (name);
1232 static void
1233 fill_edata (bfd *abfd, struct bfd_link_info *info ATTRIBUTE_UNUSED)
1235 int s, hint;
1236 unsigned char *edirectory;
1237 unsigned char *eaddresses;
1238 unsigned char *enameptrs;
1239 unsigned char *eordinals;
1240 char *enamestr;
1242 edata_d = xmalloc (edata_sz);
1244 /* Note use of array pointer math here. */
1245 edirectory = edata_d;
1246 eaddresses = edirectory + 40;
1247 enameptrs = eaddresses + 4 * export_table_size;
1248 eordinals = enameptrs + 4 * count_exported_byname;
1249 enamestr = (char *) eordinals + 2 * count_exported_byname;
1251 #define ERVA(ptr) (((unsigned char *)(ptr) - edata_d) \
1252 + edata_s->output_section->vma - image_base)
1254 memset (edata_d, 0, edata_sz);
1256 if (pe_data (abfd)->timestamp == -1)
1258 time_t now = bfd_get_current_time (0);
1259 H_PUT_32 (abfd, now, edata_d + 4);
1261 else
1262 H_PUT_32 (abfd, pe_data (abfd)->timestamp, edata_d + 4);
1264 if (pe_def_file->version_major != -1)
1266 bfd_put_16 (abfd, pe_def_file->version_major, edata_d + 8);
1267 bfd_put_16 (abfd, pe_def_file->version_minor, edata_d + 10);
1270 bfd_put_32 (abfd, ERVA (enamestr), edata_d + 12);
1271 strcpy (enamestr, dll_filename);
1272 enamestr += strlen (enamestr) + 1;
1273 bfd_put_32 (abfd, min_ordinal, edata_d + 16);
1274 bfd_put_32 (abfd, export_table_size, edata_d + 20);
1275 bfd_put_32 (abfd, count_exported_byname, edata_d + 24);
1276 bfd_put_32 (abfd, ERVA (eaddresses), edata_d + 28);
1277 bfd_put_32 (abfd, ERVA (enameptrs), edata_d + 32);
1278 bfd_put_32 (abfd, ERVA (eordinals), edata_d + 36);
1280 fill_exported_offsets (abfd, info);
1282 /* Ok, now for the filling in part.
1283 Scan alphabetically - ie the ordering in the exports[] table,
1284 rather than by ordinal - the ordering in the exported_symbol[]
1285 table. See dlltool.c and:
1286 http://sources.redhat.com/ml/binutils/2003-04/msg00379.html
1287 for more information. */
1288 hint = 0;
1289 for (s = 0; s < NE; s++)
1291 struct bfd_section *ssec = exported_symbol_sections[s];
1292 if (pe_def_file->exports[s].ordinal != -1
1293 && (pe_def_file->exports[s].flag_forward || ssec != NULL))
1295 int ord = pe_def_file->exports[s].ordinal;
1297 if (pe_def_file->exports[s].flag_forward)
1299 bfd_put_32 (abfd, ERVA (enamestr),
1300 eaddresses + 4 * (ord - min_ordinal));
1302 strcpy (enamestr, pe_def_file->exports[s].internal_name);
1303 enamestr += strlen (pe_def_file->exports[s].internal_name) + 1;
1305 else
1307 bfd_vma srva = (exported_symbol_offsets[s]
1308 + ssec->output_section->vma
1309 + ssec->output_offset);
1311 bfd_put_32 (abfd, srva - image_base,
1312 eaddresses + 4 * (ord - min_ordinal));
1315 if (!pe_def_file->exports[s].flag_noname)
1317 char *ename = pe_def_file->exports[s].name;
1318 if (pe_def_file->exports[s].its_name)
1319 ename = pe_def_file->exports[s].its_name;
1321 bfd_put_32 (abfd, ERVA (enamestr), enameptrs);
1322 enameptrs += 4;
1323 strcpy (enamestr, ename);
1324 enamestr += strlen (enamestr) + 1;
1325 bfd_put_16 (abfd, ord - min_ordinal, eordinals);
1326 eordinals += 2;
1327 pe_def_file->exports[s].hint = hint++;
1334 static struct bfd_section *current_sec;
1336 static void
1337 pe_walk_relocs (struct bfd_link_info *info,
1338 char *name,
1339 const char *symname,
1340 struct bfd_hash_table *import_hash,
1341 void (*cb) (arelent *, asection *, char *, const char *))
1343 bfd *b;
1344 asection *s;
1346 for (b = info->input_bfds; b; b = b->link.next)
1348 asymbol **symbols;
1350 if (!bfd_generic_link_read_symbols (b))
1352 einfo (_("%F%P: %pB: could not read symbols: %E\n"), b);
1353 return;
1356 symbols = bfd_get_outsymbols (b);
1358 for (s = b->sections; s; s = s->next)
1360 arelent **relocs;
1361 int relsize, nrelocs, i;
1362 int flags = bfd_section_flags (s);
1364 /* Skip discarded linkonce sections. */
1365 if (flags & SEC_LINK_ONCE
1366 && s->output_section == bfd_abs_section_ptr)
1367 continue;
1369 current_sec = s;
1371 relsize = bfd_get_reloc_upper_bound (b, s);
1372 relocs = xmalloc (relsize);
1373 nrelocs = bfd_canonicalize_reloc (b, s, relocs, symbols);
1375 for (i = 0; i < nrelocs; i++)
1377 struct bfd_symbol *sym = *relocs[i]->sym_ptr_ptr;
1379 /* Warning: the callback needs to be passed NAME directly. */
1380 if (import_hash)
1382 if (bfd_hash_lookup (import_hash, sym->name, false, false))
1384 strcpy (name, sym->name);
1385 cb (relocs[i], s, name, symname);
1388 else
1390 if (strcmp (name, sym->name) == 0)
1391 cb (relocs[i], s, name, symname);
1395 free (relocs);
1397 /* Warning: the allocated symbols are remembered in BFD and reused
1398 later, so don't free them! */
1399 /* free (symbols); */
1404 void
1405 pe_find_data_imports (const char *symhead,
1406 void (*cb) (arelent *, asection *, char *, const char *))
1408 struct bfd_link_hash_entry *undef;
1409 const size_t headlen = strlen (symhead);
1410 size_t namelen = 0;
1411 char *buf, *name;
1412 struct bfd_hash_table *import_hash;
1414 for (undef = link_info.hash->undefs; undef; undef = undef->u.undef.next)
1415 if (undef->type == bfd_link_hash_undefined)
1417 size_t len = strlen (undef->root.string);
1418 if (namelen < len)
1419 namelen = len;
1421 if (namelen == 0)
1422 return;
1424 /* For the pseudo-relocation support version 2, we can collect the symbols
1425 that are subject to auto-import and adjust the relocations en masse. */
1426 if (link_info.pei386_runtime_pseudo_reloc == 2)
1428 import_hash
1429 = (struct bfd_hash_table *) xmalloc (sizeof (struct bfd_hash_table));
1430 if (!bfd_hash_table_init (import_hash,
1431 bfd_hash_newfunc,
1432 sizeof (struct bfd_hash_entry)))
1433 einfo (_("%F%P: bfd_hash_table_init failed: %E\n"));
1435 else
1436 import_hash = NULL;
1438 /* We are being a bit cunning here. The buffer will have space for
1439 prefixes at the beginning. The prefix is modified here and in a
1440 number of functions called from this function. */
1441 #define PREFIX_LEN 32
1442 buf = xmalloc (PREFIX_LEN + namelen + 1);
1443 name = buf + PREFIX_LEN;
1445 for (undef = link_info.hash->undefs; undef; undef = undef->u.undef.next)
1446 if (undef->type == bfd_link_hash_undefined)
1448 struct bfd_link_hash_entry *sym;
1449 char *impname;
1451 if (pe_dll_extra_pe_debug)
1452 printf ("%s:%s\n", __func__, undef->root.string);
1454 strcpy (name, undef->root.string);
1455 impname = name - (sizeof "__imp_" - 1);
1456 memcpy (impname, "__imp_", sizeof "__imp_" - 1);
1458 sym = bfd_link_hash_lookup (link_info.hash, impname, 0, 0, 1);
1460 if (sym && sym->type == bfd_link_hash_defined)
1462 if (import_hash)
1463 bfd_hash_lookup (import_hash, undef->root.string, true, false);
1464 else
1466 bfd *b = sym->u.def.section->owner;
1467 const char *symname = NULL;
1468 asymbol **symbols;
1469 int nsyms, i;
1471 if (!bfd_generic_link_read_symbols (b))
1473 einfo (_("%F%P: %pB: could not read symbols: %E\n"), b);
1474 return;
1477 symbols = bfd_get_outsymbols (b);
1478 nsyms = bfd_get_symcount (b);
1480 for (i = 0; i < nsyms; i++)
1481 if (strncmp (symbols[i]->name, symhead, headlen) == 0)
1483 if (pe_dll_extra_pe_debug)
1484 printf ("->%s\n", symbols[i]->name);
1486 symname = symbols[i]->name + headlen;
1487 break;
1490 /* If the symobl isn't part of an import table, there is no
1491 point in building a fixup, this would give rise to link
1492 errors for mangled symbols instead of the original one. */
1493 if (symname)
1494 pe_walk_relocs (&link_info, name, symname, NULL, cb);
1495 else
1496 continue;
1499 /* Let's differentiate it somehow from defined. */
1500 undef->type = bfd_link_hash_defweak;
1501 undef->u.def.value = sym->u.def.value;
1502 undef->u.def.section = sym->u.def.section;
1504 /* We replace the original name with the __imp_ prefixed one, this
1505 1) may trash memory 2) leads to duplicate symbols. But this is
1506 better than having a misleading name that can confuse GDB. */
1507 undef->root.string = sym->root.string;
1509 if (link_info.pei386_auto_import == -1)
1511 static bool warned = false;
1513 info_msg (_("Info: resolving %s by linking to %s "
1514 "(auto-import)\n"), name, impname);
1516 /* PR linker/4844. */
1517 if (!warned)
1519 einfo (_("%P: warning: auto-importing has been activated "
1520 "without --enable-auto-import specified on the "
1521 "command line; this should work unless it "
1522 "involves constant data structures referencing "
1523 "symbols from auto-imported DLLs\n"));
1524 warned = true;
1530 /* If we have the import hash table, walk the relocations only once. */
1531 if (import_hash)
1533 pe_walk_relocs (&link_info, name, NULL, import_hash, cb);
1534 bfd_hash_table_free (import_hash);
1535 free (import_hash);
1538 free (buf);
1541 /* Gather all the relocations and build the .reloc section. */
1543 static void
1544 generate_reloc (bfd *abfd, struct bfd_link_info *info)
1546 /* For .reloc stuff. */
1547 reloc_data_type *reloc_data;
1548 int total_relocs = 0;
1549 int i;
1550 bfd_vma sec_page = (bfd_vma) -1;
1551 bfd_vma page_ptr;
1552 bfd *b;
1553 struct bfd_section *s;
1555 if (reloc_s == NULL || reloc_s->output_section == bfd_abs_section_ptr)
1556 return;
1558 /* Set an upper bound for the total number of relocations we will have to generate. */
1559 total_relocs = 0;
1560 for (b = info->input_bfds; b; b = b->link.next)
1561 for (s = b->sections; s; s = s->next)
1562 total_relocs += s->reloc_count;
1564 reloc_data = xmalloc (total_relocs * sizeof (reloc_data_type));
1566 total_relocs = 0;
1567 for (b = info->input_bfds; b; b = b->link.next)
1569 arelent **relocs;
1570 int relsize, nrelocs;
1571 asymbol **symbols;
1573 if (!bfd_generic_link_read_symbols (b))
1575 einfo (_("%F%P: %pB: could not read symbols: %E\n"), b);
1576 return;
1579 symbols = bfd_get_outsymbols (b);
1581 for (s = b->sections; s; s = s->next)
1583 bfd_vma sec_vma;
1585 /* If the section is not going to be output, then ignore it. */
1586 if (s->output_section == NULL)
1588 /* FIXME: This should not happen. Convert to the correct
1589 form here, but really, this should be investigated. */
1590 s->output_section = bfd_abs_section_ptr;
1591 continue;
1594 /* I don't know why there would be a reloc for these, but I've
1595 seen it happen - DJ */
1596 if (s->output_section == bfd_abs_section_ptr)
1597 continue;
1599 /* If it's not loaded, we don't need to relocate it this way. */
1600 if (!(s->output_section->flags & SEC_LOAD))
1601 continue;
1603 /* This happens when linking with --just-symbols=<file>
1604 so do not generate an error. */
1605 if (s->output_section->vma == 0)
1606 continue;
1608 sec_vma = s->output_section->vma + s->output_offset;
1610 relsize = bfd_get_reloc_upper_bound (b, s);
1611 relocs = xmalloc (relsize);
1612 nrelocs = bfd_canonicalize_reloc (b, s, relocs, symbols);
1614 for (i = 0; i < nrelocs; i++)
1616 if (pe_dll_extra_pe_debug)
1618 struct bfd_symbol *sym = *relocs[i]->sym_ptr_ptr;
1619 printf ("rel: %s\n", sym->name);
1621 if (!relocs[i]->howto->pc_relative
1622 && relocs[i]->howto->type != pe_details->imagebase_reloc
1623 && (relocs[i]->howto->type < pe_details->secrel_reloc_lo
1624 || relocs[i]->howto->type > pe_details->secrel_reloc_hi)
1625 && relocs[i]->howto->type != pe_details->section_reloc)
1627 struct bfd_symbol *sym = *relocs[i]->sym_ptr_ptr;
1628 const struct bfd_link_hash_entry *blhe
1629 = bfd_wrapped_link_hash_lookup (abfd, info, sym->name,
1630 false, false, false);
1632 /* Don't create relocs for undefined weak symbols. */
1633 if (sym->flags == BSF_WEAK)
1635 if (blhe && blhe->type == bfd_link_hash_undefweak)
1637 /* Check aux sym and see if it is defined or not. */
1638 struct coff_link_hash_entry *h, *h2;
1639 h = (struct coff_link_hash_entry *)blhe;
1640 if (h->symbol_class != C_NT_WEAK || h->numaux != 1)
1641 continue;
1642 h2 = h->auxbfd->tdata.coff_obj_data->sym_hashes
1643 [h->aux->x_sym.x_tagndx.u32];
1644 /* We don't want a base reloc if the aux sym is not
1645 found, undefined, or if it is the constant ABS
1646 zero default value. (We broaden that slightly by
1647 not testing the value, just the section; there's
1648 no reason we'd want a reference to any absolute
1649 address to get relocated during rebasing). */
1650 if (!h2 || h2->root.type == bfd_link_hash_undefined
1651 || h2->root.u.def.section == bfd_abs_section_ptr)
1652 continue;
1654 else if (!blhe || blhe->type != bfd_link_hash_defined)
1655 continue;
1657 /* Nor for Dwarf FDE references to discarded sections. */
1658 else if (bfd_is_abs_section (sym->section->output_section))
1660 /* We only ignore relocs from .eh_frame sections, as
1661 they are discarded by the final link rather than
1662 resolved against the kept section. */
1663 if (!strcmp (s->name, ".eh_frame"))
1664 continue;
1666 /* Nor for absolute symbols. */
1667 else if (blhe && ldexp_is_final_sym_absolute (blhe)
1668 && (!blhe->linker_def
1669 || (strcmp (sym->name, "__image_base__")
1670 && strcmp (sym->name, U ("__ImageBase")))))
1671 continue;
1673 reloc_data[total_relocs].vma = sec_vma + relocs[i]->address;
1674 reloc_data[total_relocs].idx = total_relocs;
1676 /* Since we're only about to determine .reloc's size,
1677 subsequent output section VMA calculations will shift up
1678 sections at this or higher addresses. Relocations for
1679 such sections would hence end up not being correct. */
1680 if (reloc_data[total_relocs].vma
1681 >= reloc_s->output_section->vma)
1682 einfo (_("%P: base relocation for section `%s' above "
1683 ".reloc section\n"), s->output_section->name);
1685 #define BITS_AND_SHIFT(bits, shift) (bits * 1000 | shift)
1687 switch BITS_AND_SHIFT (relocs[i]->howto->bitsize,
1688 relocs[i]->howto->rightshift)
1690 #ifdef pe_use_plus
1691 case BITS_AND_SHIFT (64, 0):
1692 reloc_data[total_relocs].type = IMAGE_REL_BASED_DIR64;
1693 total_relocs++;
1694 break;
1695 #endif
1696 case BITS_AND_SHIFT (32, 0):
1697 reloc_data[total_relocs].type = IMAGE_REL_BASED_HIGHLOW;
1698 total_relocs++;
1699 break;
1700 case BITS_AND_SHIFT (16, 0):
1701 reloc_data[total_relocs].type = IMAGE_REL_BASED_LOW;
1702 total_relocs++;
1703 break;
1704 case BITS_AND_SHIFT (16, 16):
1705 reloc_data[total_relocs].type = IMAGE_REL_BASED_HIGHADJ;
1706 /* FIXME: we can't know the symbol's right value
1707 yet, but we probably can safely assume that
1708 CE will relocate us in 64k blocks, so leaving
1709 it zero is safe. */
1710 reloc_data[total_relocs].extra = 0;
1711 total_relocs++;
1712 break;
1713 case BITS_AND_SHIFT (26, 2):
1714 reloc_data[total_relocs].type =
1715 IMAGE_REL_BASED_ARM_MOV32;
1716 total_relocs++;
1717 break;
1718 case BITS_AND_SHIFT (24, 2):
1719 /* FIXME: 0 is ARM_26D, it is defined in bfd/coff-arm.c
1720 Those ARM_xxx definitions should go in proper
1721 header someday. */
1722 if (relocs[i]->howto->type == 0
1723 /* Older GNU linkers used 5 instead of 0 for this reloc. */
1724 || relocs[i]->howto->type == 5)
1725 /* This is an ARM_26D reloc, which is an ARM_26 reloc
1726 that has already been fully processed during a
1727 previous link stage, so ignore it here. */
1728 break;
1729 /* Fall through. */
1730 default:
1731 /* xgettext:c-format */
1732 einfo (_("%X%P: error: %d-bit reloc in dll\n"),
1733 relocs[i]->howto->bitsize);
1734 break;
1739 free (relocs);
1740 /* Warning: the allocated symbols are remembered in BFD and
1741 reused later, so don't free them! */
1745 /* This can happen for example when LTO has eliminated all code. */
1746 if (total_relocs == 0)
1747 return;
1749 /* At this point, we have total_relocs relocation addresses in
1750 reloc_addresses, which are all suitable for the .reloc section.
1751 We must now create the new sections. */
1752 qsort (reloc_data, total_relocs, sizeof (*reloc_data), reloc_sort);
1754 for (i = 0; i < total_relocs; i++)
1756 bfd_vma this_page = (reloc_data[i].vma >> 12);
1758 if (this_page != sec_page)
1760 reloc_sz = (reloc_sz + 3) & ~3; /* 4-byte align. */
1761 reloc_sz += 8;
1762 sec_page = this_page;
1765 reloc_sz += 2;
1767 if (reloc_data[i].type == IMAGE_REL_BASED_HIGHADJ)
1768 reloc_sz += 2;
1771 reloc_sz = (reloc_sz + 3) & ~3; /* 4-byte align. */
1772 reloc_d = xmalloc (reloc_sz);
1774 page_ptr = sec_page = (bfd_vma) -1;
1775 reloc_sz = 0;
1777 for (i = 0; i < total_relocs; i++)
1779 bfd_vma rva = reloc_data[i].vma - image_base;
1780 bfd_vma this_page = (rva & ~0xfff);
1782 if (this_page != sec_page)
1784 while (reloc_sz & 3)
1785 reloc_d[reloc_sz++] = 0;
1787 if (page_ptr != (bfd_vma) -1)
1788 bfd_put_32 (abfd, reloc_sz - page_ptr, reloc_d + page_ptr + 4);
1790 bfd_put_32 (abfd, this_page, reloc_d + reloc_sz);
1791 page_ptr = reloc_sz;
1792 reloc_sz += 8;
1793 sec_page = this_page;
1796 bfd_put_16 (abfd, (rva & 0xfff) + (reloc_data[i].type << 12),
1797 reloc_d + reloc_sz);
1798 reloc_sz += 2;
1800 if (reloc_data[i].type == IMAGE_REL_BASED_HIGHADJ)
1802 bfd_put_16 (abfd, reloc_data[i].extra, reloc_d + reloc_sz);
1803 reloc_sz += 2;
1807 while (reloc_sz & 3)
1808 reloc_d[reloc_sz++] = 0;
1810 if (page_ptr != (bfd_vma) -1)
1811 bfd_put_32 (abfd, reloc_sz - page_ptr, reloc_d + page_ptr + 4);
1814 /* Given the exiting def_file structure, print out a .DEF file that
1815 corresponds to it. */
1817 static void
1818 quoteput (char *s, FILE *f, int needs_quotes)
1820 char *cp;
1822 for (cp = s; *cp; cp++)
1823 if (*cp == '\''
1824 || *cp == '"'
1825 || *cp == '\\'
1826 || ISSPACE (*cp)
1827 || *cp == ','
1828 || *cp == ';')
1829 needs_quotes = 1;
1831 if (needs_quotes)
1833 putc ('"', f);
1835 while (*s)
1837 if (*s == '"' || *s == '\\')
1838 putc ('\\', f);
1840 putc (*s, f);
1841 s++;
1844 putc ('"', f);
1846 else
1847 fputs (s, f);
1850 void
1851 pe_dll_generate_def_file (const char *pe_out_def_filename)
1853 int i;
1854 FILE *out = fopen (pe_out_def_filename, "w");
1856 if (out == NULL)
1857 /* xgettext:c-format */
1858 einfo (_("%P: can't open output def file %s\n"),
1859 pe_out_def_filename);
1861 if (pe_def_file)
1863 if (pe_def_file->name)
1865 if (pe_def_file->is_dll)
1866 fprintf (out, "LIBRARY ");
1867 else
1868 fprintf (out, "NAME ");
1870 quoteput (pe_def_file->name, out, 1);
1872 if (pe_data (link_info.output_bfd)->pe_opthdr.ImageBase)
1873 fprintf (out, " BASE=0x%" PRIx64,
1874 (uint64_t) pe_data (link_info.output_bfd)->pe_opthdr.ImageBase);
1875 fprintf (out, "\n");
1878 if (pe_def_file->description)
1880 fprintf (out, "DESCRIPTION ");
1881 quoteput (pe_def_file->description, out, 1);
1882 fprintf (out, "\n");
1885 if (pe_def_file->version_minor != -1)
1886 fprintf (out, "VERSION %d.%d\n", pe_def_file->version_major,
1887 pe_def_file->version_minor);
1888 else if (pe_def_file->version_major != -1)
1889 fprintf (out, "VERSION %d\n", pe_def_file->version_major);
1891 if (pe_def_file->stack_reserve != -1 || pe_def_file->heap_reserve != -1)
1892 fprintf (out, "\n");
1894 if (pe_def_file->stack_commit != -1)
1895 fprintf (out, "STACKSIZE 0x%x,0x%x\n",
1896 pe_def_file->stack_reserve, pe_def_file->stack_commit);
1897 else if (pe_def_file->stack_reserve != -1)
1898 fprintf (out, "STACKSIZE 0x%x\n", pe_def_file->stack_reserve);
1900 if (pe_def_file->heap_commit != -1)
1901 fprintf (out, "HEAPSIZE 0x%x,0x%x\n",
1902 pe_def_file->heap_reserve, pe_def_file->heap_commit);
1903 else if (pe_def_file->heap_reserve != -1)
1904 fprintf (out, "HEAPSIZE 0x%x\n", pe_def_file->heap_reserve);
1906 if (pe_def_file->num_section_defs > 0)
1908 fprintf (out, "\nSECTIONS\n\n");
1910 for (i = 0; i < pe_def_file->num_section_defs; i++)
1912 fprintf (out, " ");
1913 quoteput (pe_def_file->section_defs[i].name, out, 0);
1915 if (pe_def_file->section_defs[i].class)
1917 fprintf (out, " CLASS ");
1918 quoteput (pe_def_file->section_defs[i].class, out, 0);
1921 if (pe_def_file->section_defs[i].flag_read)
1922 fprintf (out, " READ");
1924 if (pe_def_file->section_defs[i].flag_write)
1925 fprintf (out, " WRITE");
1927 if (pe_def_file->section_defs[i].flag_execute)
1928 fprintf (out, " EXECUTE");
1930 if (pe_def_file->section_defs[i].flag_shared)
1931 fprintf (out, " SHARED");
1933 fprintf (out, "\n");
1937 if (pe_def_file->num_exports > 0)
1939 fprintf (out, "EXPORTS\n");
1941 for (i = 0; i < pe_def_file->num_exports; i++)
1943 def_file_export *e = pe_def_file->exports + i;
1944 fprintf (out, " ");
1945 quoteput (e->name, out, 0);
1947 if (e->internal_name && strcmp (e->internal_name, e->name))
1949 fprintf (out, " = ");
1950 quoteput (e->internal_name, out, 0);
1953 if (e->ordinal != -1)
1954 fprintf (out, " @%d", e->ordinal);
1956 if (e->flag_private)
1957 fprintf (out, " PRIVATE");
1959 if (e->flag_constant)
1960 fprintf (out, " CONSTANT");
1962 if (e->flag_noname)
1963 fprintf (out, " NONAME");
1965 if (e->flag_data)
1966 fprintf (out, " DATA");
1968 fprintf (out, "\n");
1972 if (pe_def_file->num_imports > 0)
1974 fprintf (out, "\nIMPORTS\n\n");
1976 for (i = 0; i < pe_def_file->num_imports; i++)
1978 def_file_import *im = pe_def_file->imports + i;
1979 fprintf (out, " ");
1981 if (im->internal_name
1982 && (!im->name || strcmp (im->internal_name, im->name)))
1984 quoteput (im->internal_name, out, 0);
1985 fprintf (out, " = ");
1988 quoteput (im->module->name, out, 0);
1989 fprintf (out, ".");
1991 if (im->name)
1992 quoteput (im->name, out, 0);
1993 else
1994 fprintf (out, "%d", im->ordinal);
1996 if (im->its_name)
1998 fprintf (out, " == ");
1999 quoteput (im->its_name, out, 0);
2002 fprintf (out, "\n");
2006 else
2007 fprintf (out, _("; no contents available\n"));
2009 if (fclose (out) == EOF)
2010 /* xgettext:c-format */
2011 einfo (_("%P: error closing file `%s'\n"), pe_out_def_filename);
2014 /* Generate the import library. */
2016 static asymbol **symtab;
2017 static int symptr;
2018 static int tmp_seq;
2019 static char *dll_symname;
2021 #define UNDSEC bfd_und_section_ptr
2023 static asection *
2024 quick_section (bfd *abfd, const char *name, int flags, int align)
2026 asection *sec;
2027 asymbol *sym;
2029 sec = bfd_make_section_old_way (abfd, name);
2030 bfd_set_section_flags (sec, flags | SEC_ALLOC | SEC_LOAD | SEC_KEEP);
2031 bfd_set_section_alignment (sec, align);
2032 /* Remember to undo this before trying to link internally! */
2033 sec->output_section = sec;
2035 sym = bfd_make_empty_symbol (abfd);
2036 symtab[symptr++] = sym;
2037 sym->name = sec->name;
2038 sym->section = sec;
2039 sym->flags = BSF_LOCAL;
2040 sym->value = 0;
2042 return sec;
2045 static void
2046 quick_symbol (bfd *abfd,
2047 const char *n1,
2048 const char *n2,
2049 const char *n3,
2050 asection *sec,
2051 int flags,
2052 int addr)
2054 asymbol *sym;
2055 char *name = xmalloc (strlen (n1) + strlen (n2) + strlen (n3) + 1);
2057 strcpy (name, n1);
2058 strcat (name, n2);
2059 strcat (name, n3);
2060 sym = bfd_make_empty_symbol (abfd);
2061 sym->name = name;
2062 sym->section = sec;
2063 sym->flags = flags;
2064 sym->value = addr;
2065 symtab[symptr++] = sym;
2068 static arelent *reltab = 0;
2069 static int relcount = 0, relsize = 0;
2071 static void
2072 quick_reloc (bfd *abfd, bfd_size_type address, int which_howto, int symidx)
2074 if (relcount >= relsize - 1)
2076 relsize += 10;
2077 if (reltab)
2078 reltab = xrealloc (reltab, relsize * sizeof (arelent));
2079 else
2080 reltab = xmalloc (relsize * sizeof (arelent));
2082 reltab[relcount].address = address;
2083 reltab[relcount].addend = 0;
2084 reltab[relcount].howto = bfd_reloc_type_lookup (abfd, which_howto);
2085 reltab[relcount].sym_ptr_ptr = symtab + symidx;
2086 relcount++;
2089 static void
2090 save_relocs (asection *sec)
2092 int i;
2094 sec->relocation = reltab;
2095 sec->reloc_count = relcount;
2096 sec->orelocation = xmalloc ((relcount + 1) * sizeof (arelent *));
2097 for (i = 0; i < relcount; i++)
2098 sec->orelocation[i] = sec->relocation + i;
2099 sec->orelocation[relcount] = 0;
2100 sec->flags |= SEC_RELOC;
2101 reltab = 0;
2102 relcount = relsize = 0;
2105 /* .section .idata$2
2106 .global __head_my_dll
2107 __head_my_dll:
2108 .rva hname
2109 .long 0
2110 .long 0
2111 .rva __my_dll_iname
2112 .rva fthunk
2114 .section .idata$5
2115 .long 0
2116 fthunk:
2118 .section .idata$4
2119 .long 0
2120 hname: */
2122 static bfd *
2123 make_head (bfd *parent)
2125 asection *id2, *id5, *id4;
2126 unsigned char *d2, *d5, *d4;
2127 char *oname;
2128 bfd *abfd;
2130 oname = xasprintf ("%s_d%06d.o", dll_symname, tmp_seq);
2131 tmp_seq++;
2133 abfd = bfd_create (oname, parent);
2134 free (oname);
2135 bfd_find_target (pe_details->object_target, abfd);
2136 bfd_make_writable (abfd);
2138 bfd_set_format (abfd, bfd_object);
2139 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2141 symptr = 0;
2142 symtab = xmalloc (6 * sizeof (asymbol *));
2143 id2 = quick_section (abfd, ".idata$2", SEC_HAS_CONTENTS, 2);
2144 id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
2145 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
2146 quick_symbol (abfd, U ("_head_"), dll_symname, "", id2, BSF_GLOBAL, 0);
2147 quick_symbol (abfd, U (""), dll_symname, "_iname", UNDSEC, BSF_GLOBAL, 0);
2149 /* OK, pay attention here. I got confused myself looking back at
2150 it. We create a four-byte section to mark the beginning of the
2151 list, and we include an offset of 4 in the section, so that the
2152 pointer to the list points to the *end* of this section, which is
2153 the start of the list of sections from other objects. */
2155 bfd_set_section_size (id2, 20);
2156 d2 = xmalloc (20);
2157 id2->contents = d2;
2158 memset (d2, 0, 20);
2159 if (pe_use_nul_prefixed_import_tables)
2160 d2[0] = d2[16] = PE_IDATA5_SIZE; /* Reloc addend. */
2161 quick_reloc (abfd, 0, BFD_RELOC_RVA, 2);
2162 quick_reloc (abfd, 12, BFD_RELOC_RVA, 4);
2163 quick_reloc (abfd, 16, BFD_RELOC_RVA, 1);
2164 save_relocs (id2);
2166 if (pe_use_nul_prefixed_import_tables)
2167 bfd_set_section_size (id5, PE_IDATA5_SIZE);
2168 else
2169 bfd_set_section_size (id5, 0);
2170 d5 = xmalloc (PE_IDATA5_SIZE);
2171 id5->contents = d5;
2172 memset (d5, 0, PE_IDATA5_SIZE);
2173 if (pe_use_nul_prefixed_import_tables)
2174 bfd_set_section_size (id4, PE_IDATA4_SIZE);
2175 else
2176 bfd_set_section_size (id4, 0);
2177 d4 = xmalloc (PE_IDATA4_SIZE);
2178 id4->contents = d4;
2179 memset (d4, 0, PE_IDATA4_SIZE);
2181 bfd_set_symtab (abfd, symtab, symptr);
2183 bfd_set_section_contents (abfd, id2, d2, 0, 20);
2184 if (pe_use_nul_prefixed_import_tables)
2186 bfd_set_section_contents (abfd, id5, d5, 0, PE_IDATA5_SIZE);
2187 bfd_set_section_contents (abfd, id4, d4, 0, PE_IDATA4_SIZE);
2189 else
2191 bfd_set_section_contents (abfd, id5, d5, 0, 0);
2192 bfd_set_section_contents (abfd, id4, d4, 0, 0);
2195 bfd_make_readable (abfd);
2196 return abfd;
2199 /* .section .idata$4
2200 .long 0
2201 [.long 0] for PE+
2202 .section .idata$5
2203 .long 0
2204 [.long 0] for PE+
2205 .section idata$7
2206 .global __my_dll_iname
2207 __my_dll_iname:
2208 .asciz "my.dll" */
2210 static bfd *
2211 make_tail (bfd *parent)
2213 asection *id4, *id5, *id7;
2214 unsigned char *d4, *d5, *d7;
2215 int len;
2216 char *oname;
2217 bfd *abfd;
2219 oname = xasprintf ("%s_d%06d.o", dll_symname, tmp_seq);
2220 tmp_seq++;
2222 abfd = bfd_create (oname, parent);
2223 free (oname);
2224 bfd_find_target (pe_details->object_target, abfd);
2225 bfd_make_writable (abfd);
2227 bfd_set_format (abfd, bfd_object);
2228 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2230 symptr = 0;
2231 symtab = xmalloc (5 * sizeof (asymbol *));
2232 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
2233 id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
2234 id7 = quick_section (abfd, ".idata$7", SEC_HAS_CONTENTS, 2);
2235 quick_symbol (abfd, U (""), dll_symname, "_iname", id7, BSF_GLOBAL, 0);
2237 bfd_set_section_size (id4, PE_IDATA4_SIZE);
2238 d4 = xmalloc (PE_IDATA4_SIZE);
2239 id4->contents = d4;
2240 memset (d4, 0, PE_IDATA4_SIZE);
2242 bfd_set_section_size (id5, PE_IDATA5_SIZE);
2243 d5 = xmalloc (PE_IDATA5_SIZE);
2244 id5->contents = d5;
2245 memset (d5, 0, PE_IDATA5_SIZE);
2247 len = strlen (dll_filename) + 1;
2248 if (len & 1)
2249 len++;
2250 bfd_set_section_size (id7, len);
2251 d7 = xmalloc (len);
2252 id7->contents = d7;
2253 strcpy ((char *) d7, dll_filename);
2254 /* If len was odd, the above
2255 strcpy leaves behind an undefined byte. That is harmless,
2256 but we set it to 0 just so the binary dumps are pretty. */
2257 d7[len - 1] = 0;
2259 bfd_set_symtab (abfd, symtab, symptr);
2261 bfd_set_section_contents (abfd, id4, d4, 0, PE_IDATA4_SIZE);
2262 bfd_set_section_contents (abfd, id5, d5, 0, PE_IDATA5_SIZE);
2263 bfd_set_section_contents (abfd, id7, d7, 0, len);
2265 bfd_make_readable (abfd);
2266 return abfd;
2269 /* .text
2270 .global _function
2271 .global ___imp_function
2272 .global __imp__function
2273 _function:
2274 jmp *__imp__function:
2276 .section idata$7
2277 .long __head_my_dll
2279 .section .idata$5
2280 ___imp_function:
2281 __imp__function:
2282 iat?
2283 .section .idata$4
2284 iat?
2285 .section .idata$6
2286 ID<ordinal>:
2287 .short <hint>
2288 .asciz "function" xlate? (add underscore, kill at) */
2290 static const unsigned char jmp_ix86_bytes[] =
2292 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x90, 0x90
2295 static const unsigned char jmp_aarch64_bytes[] =
2297 0x10, 0x00, 0x00, 0x90, /* adrp x16, 0 */
2298 0x10, 0x02, 0x00, 0x91, /* add x16, x16, #0x0 */
2299 0x10, 0x02, 0x40, 0xf9, /* ldr x16, [x16] */
2300 0x00, 0x02, 0x1f, 0xd6 /* br x16 */
2303 /* _function:
2304 mov.l ip+8,r0
2305 mov.l @r0,r0
2306 jmp @r0
2308 .dw __imp_function */
2310 static const unsigned char jmp_sh_bytes[] =
2312 0x01, 0xd0, 0x02, 0x60, 0x2b, 0x40, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00
2315 /* _function:
2316 lui $t0,<high:__imp_function>
2317 lw $t0,<low:__imp_function>
2318 jr $t0
2319 nop */
2321 static const unsigned char jmp_mips_bytes[] =
2323 0x00, 0x00, 0x08, 0x3c, 0x00, 0x00, 0x08, 0x8d,
2324 0x08, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00
2327 static const unsigned char jmp_arm_bytes[] =
2329 0x00, 0xc0, 0x9f, 0xe5, /* ldr ip, [pc] */
2330 0x00, 0xf0, 0x9c, 0xe5, /* ldr pc, [ip] */
2331 0, 0, 0, 0
2335 static bfd *
2336 make_one (def_file_export *exp, bfd *parent, bool include_jmp_stub)
2338 asection *tx, *id7, *id5, *id4, *id6;
2339 unsigned char *td = NULL, *d7, *d5, *d4, *d6 = NULL;
2340 int len;
2341 char *oname;
2342 bfd *abfd;
2343 const unsigned char *jmp_bytes = NULL;
2344 int jmp_byte_count = 0;
2345 const char *internal_name = exp->internal_name;
2347 if (!exp->flag_noname)
2349 /* Check for a decorated symbol name */
2350 struct decoration_hash_entry *entry;
2352 entry = (struct decoration_hash_entry *)
2353 bfd_hash_lookup (&(coff_hash_table (&link_info)->decoration_hash),
2354 internal_name, false, false);
2355 if (entry)
2357 if (entry->decorated_link)
2359 internal_name = entry->decorated_link->root.string;
2361 if (pe_details->underscored && internal_name[0] == '_')
2362 internal_name++;
2364 else
2366 einfo (_("%P: error: NULL decorated name for %s\n"), internal_name);
2371 /* Include the jump stub section only if it is needed. A jump
2372 stub is needed if the symbol being imported <sym> is a function
2373 symbol and there is at least one undefined reference to that
2374 symbol. In other words, if all the import references to <sym> are
2375 explicitly through _declspec(dllimport) then the jump stub is not
2376 needed. */
2377 if (include_jmp_stub)
2379 switch (pe_details->pe_arch)
2381 case PE_ARCH_i386:
2382 jmp_bytes = jmp_ix86_bytes;
2383 jmp_byte_count = sizeof (jmp_ix86_bytes);
2384 break;
2385 case PE_ARCH_sh:
2386 jmp_bytes = jmp_sh_bytes;
2387 jmp_byte_count = sizeof (jmp_sh_bytes);
2388 break;
2389 case PE_ARCH_mips:
2390 jmp_bytes = jmp_mips_bytes;
2391 jmp_byte_count = sizeof (jmp_mips_bytes);
2392 break;
2393 case PE_ARCH_arm:
2394 case PE_ARCH_arm_wince:
2395 jmp_bytes = jmp_arm_bytes;
2396 jmp_byte_count = sizeof (jmp_arm_bytes);
2397 break;
2398 case PE_ARCH_aarch64:
2399 jmp_bytes = jmp_aarch64_bytes;
2400 jmp_byte_count = sizeof (jmp_aarch64_bytes);
2401 break;
2402 default:
2403 abort ();
2407 oname = xasprintf ("%s_d%06d.o", dll_symname, tmp_seq);
2408 tmp_seq++;
2410 abfd = bfd_create (oname, parent);
2411 free (oname);
2412 bfd_find_target (pe_details->object_target, abfd);
2413 bfd_make_writable (abfd);
2415 bfd_set_format (abfd, bfd_object);
2416 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2418 symptr = 0;
2419 symtab = xmalloc (12 * sizeof (asymbol *));
2421 tx = quick_section (abfd, ".text", SEC_CODE | SEC_HAS_CONTENTS | SEC_READONLY, 2);
2422 id7 = quick_section (abfd, ".idata$7", SEC_HAS_CONTENTS, 2);
2423 id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
2424 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
2425 id6 = quick_section (abfd, ".idata$6", SEC_HAS_CONTENTS, 2);
2427 if (*internal_name == '@')
2429 quick_symbol (abfd, U ("_head_"), dll_symname, "", UNDSEC,
2430 BSF_GLOBAL, 0);
2431 if (include_jmp_stub)
2432 quick_symbol (abfd, "", internal_name, "", tx, BSF_GLOBAL, 0);
2433 quick_symbol (abfd, "__imp_", internal_name, "", id5,
2434 BSF_GLOBAL, 0);
2435 /* Fastcall applies only to functions,
2436 so no need for auto-import symbol. */
2438 else
2440 quick_symbol (abfd, U ("_head_"), dll_symname, "", UNDSEC,
2441 BSF_GLOBAL, 0);
2442 if (include_jmp_stub)
2443 quick_symbol (abfd, U (""), internal_name, "", tx,
2444 BSF_GLOBAL, 0);
2445 quick_symbol (abfd, "__imp_", U (""), internal_name, id5,
2446 BSF_GLOBAL, 0);
2447 /* Symbol to reference ord/name of imported
2448 data symbol, used to implement auto-import. */
2449 if (exp->flag_data)
2450 quick_symbol (abfd, "__nm_", U (""), internal_name, id6,
2451 BSF_GLOBAL,0);
2453 if (pe_dll_compat_implib)
2454 quick_symbol (abfd, "___imp_", internal_name, "", id5,
2455 BSF_GLOBAL, 0);
2457 if (include_jmp_stub)
2459 bfd_set_section_size (tx, jmp_byte_count);
2460 td = xmalloc (jmp_byte_count);
2461 tx->contents = td;
2462 memcpy (td, jmp_bytes, jmp_byte_count);
2464 switch (pe_details->pe_arch)
2466 case PE_ARCH_i386:
2467 #ifdef pe_use_plus
2468 quick_reloc (abfd, 2, BFD_RELOC_32_PCREL, 2);
2469 #else
2470 /* Mark this object as SAFESEH compatible. */
2471 quick_symbol (abfd, "", "@feat.00", "", bfd_abs_section_ptr,
2472 BSF_LOCAL, 1);
2473 quick_reloc (abfd, 2, BFD_RELOC_32, 2);
2474 #endif
2475 break;
2476 case PE_ARCH_sh:
2477 quick_reloc (abfd, 8, BFD_RELOC_32, 2);
2478 break;
2479 case PE_ARCH_mips:
2480 quick_reloc (abfd, 0, BFD_RELOC_HI16_S, 2);
2481 quick_reloc (abfd, 0, BFD_RELOC_LO16, 0); /* MIPS_R_PAIR */
2482 quick_reloc (abfd, 4, BFD_RELOC_LO16, 2);
2483 break;
2484 case PE_ARCH_arm:
2485 case PE_ARCH_arm_wince:
2486 quick_reloc (abfd, 8, BFD_RELOC_32, 2);
2487 break;
2488 case PE_ARCH_aarch64:
2489 quick_reloc (abfd, 0, BFD_RELOC_AARCH64_ADR_HI21_NC_PCREL, 2);
2490 quick_reloc (abfd, 4, BFD_RELOC_AARCH64_ADD_LO12, 2);
2491 break;
2492 default:
2493 abort ();
2495 save_relocs (tx);
2497 else
2498 bfd_set_section_size (tx, 0);
2500 bfd_set_section_size (id7, 4);
2501 d7 = xmalloc (4);
2502 id7->contents = d7;
2503 memset (d7, 0, 4);
2504 quick_reloc (abfd, 0, BFD_RELOC_RVA, 5);
2505 save_relocs (id7);
2507 bfd_set_section_size (id5, PE_IDATA5_SIZE);
2508 d5 = xmalloc (PE_IDATA5_SIZE);
2509 id5->contents = d5;
2510 memset (d5, 0, PE_IDATA5_SIZE);
2512 if (exp->flag_noname)
2514 d5[0] = exp->ordinal;
2515 d5[1] = exp->ordinal >> 8;
2516 d5[PE_IDATA5_SIZE - 1] = 0x80;
2518 else
2520 quick_reloc (abfd, 0, BFD_RELOC_RVA, 4);
2521 save_relocs (id5);
2524 bfd_set_section_size (id4, PE_IDATA4_SIZE);
2525 d4 = xmalloc (PE_IDATA4_SIZE);
2526 id4->contents = d4;
2527 memset (d4, 0, PE_IDATA4_SIZE);
2529 if (exp->flag_noname)
2531 d4[0] = exp->ordinal;
2532 d4[1] = exp->ordinal >> 8;
2533 d4[PE_IDATA4_SIZE - 1] = 0x80;
2535 else
2537 quick_reloc (abfd, 0, BFD_RELOC_RVA, 4);
2538 save_relocs (id4);
2541 if (exp->flag_noname)
2543 len = 0;
2544 bfd_set_section_size (id6, 0);
2546 else
2548 /* { short, asciz } = { hint, name } */
2549 if (exp->its_name)
2550 len = 2 + strlen (exp->its_name) + 1;
2551 else
2552 len = 2 + strlen (exp->name) + 1;
2553 if (len & 1)
2554 len++;
2555 bfd_set_section_size (id6, len);
2556 d6 = xmalloc (len);
2557 id6->contents = d6;
2558 memset (d6, 0, len);
2559 d6[0] = exp->hint & 0xff;
2560 d6[1] = exp->hint >> 8;
2561 if (exp->its_name)
2562 strcpy ((char*) d6 + 2, exp->its_name);
2563 else
2564 strcpy ((char *) d6 + 2, exp->name);
2567 bfd_set_symtab (abfd, symtab, symptr);
2569 if (include_jmp_stub)
2570 bfd_set_section_contents (abfd, tx, td, 0, jmp_byte_count);
2571 bfd_set_section_contents (abfd, id7, d7, 0, 4);
2572 bfd_set_section_contents (abfd, id5, d5, 0, PE_IDATA5_SIZE);
2573 bfd_set_section_contents (abfd, id4, d4, 0, PE_IDATA4_SIZE);
2574 if (!exp->flag_noname)
2575 bfd_set_section_contents (abfd, id6, d6, 0, len);
2577 bfd_make_readable (abfd);
2578 return abfd;
2581 static bfd *
2582 make_singleton_name_thunk (const char *import, bfd *parent)
2584 /* Name thunks go to idata$4. */
2585 asection *id4;
2586 unsigned char *d4;
2587 char *oname;
2588 bfd *abfd;
2590 oname = xasprintf ("%s_nmth%06d.o", dll_symname, tmp_seq);
2591 tmp_seq++;
2593 abfd = bfd_create (oname, parent);
2594 free (oname);
2595 bfd_find_target (pe_details->object_target, abfd);
2596 bfd_make_writable (abfd);
2598 bfd_set_format (abfd, bfd_object);
2599 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2601 symptr = 0;
2602 symtab = xmalloc (3 * sizeof (asymbol *));
2603 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
2604 quick_symbol (abfd, "__nm_thnk_", import, "", id4, BSF_GLOBAL, 0);
2605 quick_symbol (abfd, "__nm_", import, "", UNDSEC, BSF_GLOBAL, 0);
2607 /* We need space for the real thunk and for the null terminator. */
2608 bfd_set_section_size (id4, PE_IDATA4_SIZE * 2);
2609 d4 = xmalloc (PE_IDATA4_SIZE * 2);
2610 id4->contents = d4;
2611 memset (d4, 0, PE_IDATA4_SIZE * 2);
2612 quick_reloc (abfd, 0, BFD_RELOC_RVA, 2);
2613 save_relocs (id4);
2615 bfd_set_symtab (abfd, symtab, symptr);
2617 bfd_set_section_contents (abfd, id4, d4, 0, PE_IDATA4_SIZE * 2);
2619 bfd_make_readable (abfd);
2620 return abfd;
2623 static const char *
2624 make_import_fixup_mark (arelent *rel, char *name)
2626 /* We convert reloc to symbol, for later reference. */
2627 static unsigned int counter;
2628 struct bfd_symbol *sym = *rel->sym_ptr_ptr;
2629 bfd *abfd = bfd_asymbol_bfd (sym);
2630 struct bfd_link_hash_entry *bh;
2631 char *fixup_name, buf[256];
2632 size_t prefix_len;
2634 /* "name" buffer has space before the symbol name for prefixes. */
2635 sprintf (buf, "__fu%d_", counter++);
2636 prefix_len = strlen (buf);
2637 fixup_name = name - prefix_len;
2638 memcpy (fixup_name, buf, prefix_len);
2640 bh = NULL;
2641 bfd_coff_link_add_one_symbol (&link_info, abfd, fixup_name, BSF_GLOBAL,
2642 current_sec, /* sym->section, */
2643 rel->address, NULL, true, false, &bh);
2645 return bh->root.string;
2648 /* .section .idata$2
2649 .rva __nm_thnk_SYM (singleton thunk with name of func)
2650 .long 0
2651 .long 0
2652 .rva __my_dll_iname (name of dll)
2653 .rva __fuNN_SYM (pointer to reference (address) in text) */
2655 static bfd *
2656 make_import_fixup_entry (const char *name,
2657 const char *fixup_name,
2658 const char *symname,
2659 bfd *parent)
2661 asection *id2;
2662 unsigned char *d2;
2663 char *oname;
2664 bfd *abfd;
2666 oname = xasprintf ("%s_fu%06d.o", dll_symname, tmp_seq);
2667 tmp_seq++;
2669 abfd = bfd_create (oname, parent);
2670 free (oname);
2671 bfd_find_target (pe_details->object_target, abfd);
2672 bfd_make_writable (abfd);
2674 bfd_set_format (abfd, bfd_object);
2675 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2677 symptr = 0;
2678 symtab = xmalloc (6 * sizeof (asymbol *));
2679 id2 = quick_section (abfd, ".idata$2", SEC_HAS_CONTENTS, 2);
2681 quick_symbol (abfd, "__nm_thnk_", name, "", UNDSEC, BSF_GLOBAL, 0);
2682 quick_symbol (abfd, U (""), symname, "_iname", UNDSEC, BSF_GLOBAL, 0);
2683 quick_symbol (abfd, "", fixup_name, "", UNDSEC, BSF_GLOBAL, 0);
2685 bfd_set_section_size (id2, 20);
2686 d2 = xmalloc (20);
2687 id2->contents = d2;
2688 memset (d2, 0, 20);
2690 quick_reloc (abfd, 0, BFD_RELOC_RVA, 1);
2691 quick_reloc (abfd, 12, BFD_RELOC_RVA, 2);
2692 quick_reloc (abfd, 16, BFD_RELOC_RVA, 3);
2693 save_relocs (id2);
2695 bfd_set_symtab (abfd, symtab, symptr);
2697 bfd_set_section_contents (abfd, id2, d2, 0, 20);
2699 bfd_make_readable (abfd);
2700 return abfd;
2703 /* .section .rdata_runtime_pseudo_reloc
2704 .long addend
2705 .rva __fuNN_SYM (pointer to reference (address) in text) */
2707 static bfd *
2708 make_runtime_pseudo_reloc (const char *name ATTRIBUTE_UNUSED,
2709 const char *fixup_name,
2710 bfd_vma addend ATTRIBUTE_UNUSED,
2711 bfd_vma bitsize,
2712 bfd *parent)
2714 asection *rt_rel;
2715 unsigned char *rt_rel_d;
2716 char *oname;
2717 bfd *abfd;
2718 bfd_size_type size;
2720 oname = xasprintf ("%s_rtr%06d.o", dll_symname, tmp_seq);
2721 tmp_seq++;
2723 abfd = bfd_create (oname, parent);
2724 free (oname);
2725 bfd_find_target (pe_details->object_target, abfd);
2726 bfd_make_writable (abfd);
2728 bfd_set_format (abfd, bfd_object);
2729 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2731 if (link_info.pei386_runtime_pseudo_reloc == 2)
2733 if (runtime_pseudp_reloc_v2_init)
2734 size = 3 * sizeof (asymbol *);
2735 else
2736 size = 6 * sizeof (asymbol *);
2738 else
2739 size = 2 * sizeof (asymbol *);
2741 symptr = 0;
2742 symtab = xmalloc (size);
2744 rt_rel
2745 = quick_section (abfd, ".rdata_runtime_pseudo_reloc", SEC_HAS_CONTENTS, 2);
2746 bfd_coff_set_long_section_names (abfd, true);
2748 quick_symbol (abfd, "", fixup_name, "", UNDSEC, BSF_GLOBAL, 0);
2750 if (link_info.pei386_runtime_pseudo_reloc == 2)
2752 size = 12;
2753 if (!runtime_pseudp_reloc_v2_init)
2755 size += 12;
2756 runtime_pseudp_reloc_v2_init = true;
2759 quick_symbol (abfd, "__imp_", name, "", UNDSEC, BSF_GLOBAL, 0);
2761 bfd_set_section_size (rt_rel, size);
2762 rt_rel_d = xmalloc (size);
2763 rt_rel->contents = rt_rel_d;
2764 memset (rt_rel_d, 0, size);
2765 quick_reloc (abfd, size - 8, BFD_RELOC_RVA, 1);
2766 quick_reloc (abfd, size - 12, BFD_RELOC_RVA, 2);
2767 bfd_put_32 (abfd, bitsize, rt_rel_d + (size - 4));
2768 if (size != 12)
2769 bfd_put_32 (abfd, 1, rt_rel_d + 8);
2770 save_relocs (rt_rel);
2772 bfd_set_symtab (abfd, symtab, symptr);
2774 bfd_set_section_contents (abfd, rt_rel, rt_rel_d, 0, size);
2776 else
2778 bfd_set_section_size (rt_rel, 8);
2779 rt_rel_d = xmalloc (8);
2780 rt_rel->contents = rt_rel_d;
2781 memset (rt_rel_d, 0, 8);
2783 bfd_put_32 (abfd, addend, rt_rel_d);
2784 quick_reloc (abfd, 4, BFD_RELOC_RVA, 1);
2786 save_relocs (rt_rel);
2788 bfd_set_symtab (abfd, symtab, symptr);
2790 bfd_set_section_contents (abfd, rt_rel, rt_rel_d, 0, 8);
2793 bfd_make_readable (abfd);
2794 return abfd;
2797 /* .section .rdata
2798 .rva __pei386_runtime_relocator */
2800 static bfd *
2801 pe_create_runtime_relocator_reference (bfd *parent)
2803 asection *extern_rt_rel;
2804 unsigned char *extern_rt_rel_d;
2805 char *oname;
2806 bfd *abfd;
2808 oname = xasprintf ("%s_ertr%06d.o", dll_symname, tmp_seq);
2809 tmp_seq++;
2811 abfd = bfd_create (oname, parent);
2812 free (oname);
2813 bfd_find_target (pe_details->object_target, abfd);
2814 bfd_make_writable (abfd);
2816 bfd_set_format (abfd, bfd_object);
2817 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2819 symptr = 0;
2820 symtab = xmalloc (2 * sizeof (asymbol *));
2821 extern_rt_rel = quick_section (abfd, ".rdata", SEC_HAS_CONTENTS, 2);
2823 quick_symbol (abfd, "", U ("_pei386_runtime_relocator"), "", UNDSEC,
2824 BSF_NO_FLAGS, 0);
2826 bfd_set_section_size (extern_rt_rel, PE_IDATA5_SIZE);
2827 extern_rt_rel_d = xcalloc (1, PE_IDATA5_SIZE);
2828 extern_rt_rel->contents = extern_rt_rel_d;
2830 quick_reloc (abfd, 0, BFD_RELOC_RVA, 1);
2831 save_relocs (extern_rt_rel);
2833 bfd_set_symtab (abfd, symtab, symptr);
2835 bfd_set_section_contents (abfd, extern_rt_rel, extern_rt_rel_d, 0, PE_IDATA5_SIZE);
2837 bfd_make_readable (abfd);
2838 return abfd;
2841 void
2842 pe_create_import_fixup (arelent *rel, asection *s, bfd_vma addend, char *name,
2843 const char *symname)
2845 const char *fixup_name = make_import_fixup_mark (rel, name);
2846 bfd *b;
2848 /* This is the original implementation of the auto-import feature, which
2849 primarily relied on the OS loader to patch things up with some help
2850 from the pseudo-relocator to overcome the main limitation. See the
2851 comment at the beginning of the file for an overview of the feature. */
2852 if (link_info.pei386_runtime_pseudo_reloc != 2)
2854 struct bfd_link_hash_entry *name_thunk_sym;
2855 /* name buffer is allocated with space at beginning for prefixes. */
2856 char *thname = name - (sizeof "__nm_thnk_" - 1);
2857 memcpy (thname, "__nm_thnk_", sizeof "__nm_thnk_" - 1);
2858 name_thunk_sym = bfd_link_hash_lookup (link_info.hash, thname, 0, 0, 1);
2860 if (!(name_thunk_sym && name_thunk_sym->type == bfd_link_hash_defined))
2862 b = make_singleton_name_thunk (name, link_info.output_bfd);
2863 add_bfd_to_link (b, bfd_get_filename (b), &link_info);
2865 /* If we ever use autoimport, we have to cast text section writable. */
2866 config.text_read_only = false;
2867 link_info.output_bfd->flags &= ~WP_TEXT;
2870 if (addend == 0 || link_info.pei386_runtime_pseudo_reloc == 1)
2872 b = make_import_fixup_entry (name, fixup_name, symname,
2873 link_info.output_bfd);
2874 add_bfd_to_link (b, bfd_get_filename (b), &link_info);
2878 /* In the original implementation, the pseudo-relocator was only used when
2879 the addend was not null. In the new implementation, the OS loader is
2880 completely bypassed and the pseudo-relocator does the entire work. */
2881 if ((addend != 0 && link_info.pei386_runtime_pseudo_reloc == 1)
2882 || link_info.pei386_runtime_pseudo_reloc == 2)
2884 if (pe_dll_extra_pe_debug)
2885 printf ("creating runtime pseudo-reloc entry for %s (addend=%d)\n",
2886 fixup_name, (int) addend);
2888 b = make_runtime_pseudo_reloc (name, fixup_name, addend,
2889 rel->howto->bitsize,
2890 link_info.output_bfd);
2891 add_bfd_to_link (b, bfd_get_filename (b), &link_info);
2893 if (runtime_pseudo_relocs_created++ == 0)
2895 b = pe_create_runtime_relocator_reference (link_info.output_bfd);
2896 add_bfd_to_link (b, bfd_get_filename (b), &link_info);
2900 else if (addend != 0)
2901 einfo (_("%X%P: %H: variable '%pT' can't be auto-imported; please read the documentation for ld's --enable-auto-import for details\n"),
2902 s->owner, s, rel->address, (*rel->sym_ptr_ptr)->name);
2905 void
2906 pe_dll_generate_implib (def_file *def, const char *impfilename, struct bfd_link_info *info)
2908 int i;
2909 bfd *ar_head;
2910 bfd *ar_tail;
2911 bfd *outarch;
2912 bfd *ibfd;
2913 bfd *head = 0;
2915 unlink_if_ordinary (impfilename);
2917 outarch = bfd_openw (impfilename, 0);
2919 if (!outarch)
2921 /* xgettext:c-format */
2922 einfo (_("%X%P: can't open .lib file: %s\n"), impfilename);
2923 return;
2926 if (verbose)
2927 /* xgettext:c-format */
2928 info_msg (_("Creating library file: %s\n"), impfilename);
2930 bfd_set_format (outarch, bfd_archive);
2931 outarch->has_armap = 1;
2933 /* Work out a reasonable size of things to put onto one line. */
2934 ar_head = make_head (outarch);
2936 /* Iterate the input BFDs, looking for exclude-modules-for-implib. */
2937 for (ibfd = info->input_bfds; ibfd; ibfd = ibfd->link.next)
2939 /* Iterate the exclude list. */
2940 struct exclude_list_struct *ex;
2941 char found;
2942 for (ex = excludes, found = 0; ex && !found; ex = ex->next)
2944 if (ex->type != EXCLUDEFORIMPLIB)
2945 continue;
2946 found = (filename_cmp (ex->string, bfd_get_filename (ibfd)) == 0);
2948 /* If it matched, we must open a fresh BFD for it (the original
2949 input BFD is still needed for the DLL's final link) and add
2950 it into the archive member chain. */
2951 if (found)
2953 bfd *newbfd = bfd_openr (ibfd->my_archive
2954 ? bfd_get_filename (ibfd->my_archive)
2955 : bfd_get_filename (ibfd), NULL);
2956 if (!newbfd)
2958 einfo (_("%X%P: bfd_openr %s: %E\n"), bfd_get_filename (ibfd));
2959 return;
2961 if (ibfd->my_archive)
2963 /* Must now iterate through archive until we find the
2964 required member. A minor shame that we'll open the
2965 archive once per member that we require from it, and
2966 leak those archive bfds rather than reuse them. */
2967 bfd *arbfd = newbfd;
2968 if (!bfd_check_format_matches (arbfd, bfd_archive, NULL))
2970 einfo (_("%X%P: %s(%s): can't find member in non-archive file"),
2971 bfd_get_filename (ibfd->my_archive),
2972 bfd_get_filename (ibfd));
2973 return;
2975 newbfd = NULL;
2976 while ((newbfd = bfd_openr_next_archived_file (arbfd, newbfd)) != 0)
2978 if (filename_cmp (bfd_get_filename (newbfd),
2979 bfd_get_filename (ibfd)) == 0)
2980 break;
2982 if (!newbfd)
2984 einfo (_("%X%P: %s(%s): can't find member in archive"),
2985 bfd_get_filename (ibfd->my_archive),
2986 bfd_get_filename (ibfd));
2987 return;
2990 newbfd->archive_next = head;
2991 head = newbfd;
2995 for (i = 0; i < def->num_exports; i++)
2997 /* The import library doesn't know about the internal name. */
2998 char *internal = def->exports[i].internal_name;
2999 bfd *n;
3001 /* Don't add PRIVATE entries to import lib. */
3002 if (pe_def_file->exports[i].flag_private)
3003 continue;
3005 def->exports[i].internal_name = def->exports[i].name;
3007 /* PR 19803: If a symbol has been discard due to garbage
3008 collection then do not create any exports for it. */
3010 struct coff_link_hash_entry *h;
3012 h = coff_link_hash_lookup (coff_hash_table (info), internal,
3013 false, false, false);
3014 if (h != NULL
3015 /* If the symbol is hidden and undefined then it
3016 has been swept up by garbage collection. */
3017 && h->symbol_class == C_HIDDEN
3018 && h->root.u.def.section == bfd_und_section_ptr)
3019 continue;
3021 /* If necessary, check with an underscore prefix as well. */
3022 if (pe_details->underscored && internal[0] != '@')
3024 char *name;
3026 name = xmalloc (strlen (internal) + 2);
3027 sprintf (name, "_%s", internal);
3029 h = coff_link_hash_lookup (coff_hash_table (info), name,
3030 false, false, false);
3031 free (name);
3033 if (h != NULL
3034 /* If the symbol is hidden and undefined then it
3035 has been swept up by garbage collection. */
3036 && h->symbol_class == C_HIDDEN
3037 && h->root.u.def.section == bfd_und_section_ptr)
3038 continue;
3042 n = make_one (def->exports + i, outarch, !(def->exports + i)->flag_data);
3043 n->archive_next = head;
3044 head = n;
3045 def->exports[i].internal_name = internal;
3048 ar_tail = make_tail (outarch);
3050 if (ar_head == NULL || ar_tail == NULL)
3051 return;
3053 /* Now stick them all into the archive. */
3054 ar_head->archive_next = head;
3055 ar_tail->archive_next = ar_head;
3056 head = ar_tail;
3058 if (! bfd_set_archive_head (outarch, head))
3059 einfo ("%X%P: bfd_set_archive_head: %E\n");
3061 if (! bfd_close (outarch))
3062 einfo ("%X%P: bfd_close %s: %E\n", impfilename);
3065 static int undef_count = 0;
3067 struct key_value
3069 char *key;
3070 const char *oname;
3073 static struct key_value *udef_table;
3075 static int undef_sort_cmp (const void *l1, const void *r1)
3077 const struct key_value *l = l1;
3078 const struct key_value *r = r1;
3080 return strcmp (l->key, r->key);
3083 static struct bfd_link_hash_entry *
3084 pe_find_cdecl_alias_match (struct bfd_link_info *linfo, char *name)
3086 struct bfd_link_hash_entry *h = NULL;
3087 struct key_value *kv;
3088 struct key_value key;
3089 char *at, *lname = xmalloc (strlen (name) + 3);
3091 strcpy (lname, name);
3093 at = strchr (lname + (lname[0] == '@'), '@');
3094 if (at)
3095 at[1] = 0;
3097 key.key = lname;
3098 kv = bsearch (&key, udef_table, undef_count, sizeof (struct key_value),
3099 undef_sort_cmp);
3101 if (kv)
3103 h = bfd_link_hash_lookup (linfo->hash, kv->oname, false, false, false);
3104 if (h->type == bfd_link_hash_undefined)
3105 goto return_h;
3108 if (lname[0] == '?')
3109 goto return_NULL;
3111 if (at || lname[0] == '@')
3113 if (lname[0] == '@')
3115 if (pe_details->underscored)
3116 lname[0] = '_';
3117 else
3118 /* Use memmove rather than strcpy as that
3119 can handle overlapping buffers. */
3120 memmove (lname, lname + 1, strlen (lname));
3121 key.key = lname;
3122 kv = bsearch (&key, udef_table, undef_count,
3123 sizeof (struct key_value), undef_sort_cmp);
3124 if (kv)
3126 h = bfd_link_hash_lookup (linfo->hash, kv->oname, false, false, false);
3127 if (h->type == bfd_link_hash_undefined)
3128 goto return_h;
3131 if (at)
3132 *strchr (lname, '@') = 0;
3133 key.key = lname;
3134 kv = bsearch (&key, udef_table, undef_count,
3135 sizeof (struct key_value), undef_sort_cmp);
3136 if (kv)
3138 h = bfd_link_hash_lookup (linfo->hash, kv->oname, false, false, false);
3139 if (h->type == bfd_link_hash_undefined)
3140 goto return_h;
3142 goto return_NULL;
3145 strcat (lname, "@");
3146 key.key = lname;
3147 kv = bsearch (&key, udef_table, undef_count,
3148 sizeof (struct key_value), undef_sort_cmp);
3150 if (kv)
3152 h = bfd_link_hash_lookup (linfo->hash, kv->oname, false, false, false);
3153 if (h->type == bfd_link_hash_undefined)
3154 goto return_h;
3157 if (lname[0] == '_' && pe_details->underscored)
3158 lname[0] = '@';
3159 else
3161 memmove (lname + 1, lname, strlen (lname) + 1);
3162 lname[0] = '@';
3164 key.key = lname;
3166 kv = bsearch (&key, udef_table, undef_count,
3167 sizeof (struct key_value), undef_sort_cmp);
3169 if (kv)
3171 h = bfd_link_hash_lookup (linfo->hash, kv->oname, false, false, false);
3172 if (h->type == bfd_link_hash_undefined)
3173 goto return_h;
3176 return_NULL:
3177 h = NULL;
3178 return_h:
3179 free (lname);
3180 return h;
3183 static bool
3184 pe_undef_count (struct bfd_link_hash_entry *h ATTRIBUTE_UNUSED,
3185 void *inf ATTRIBUTE_UNUSED)
3187 if (h->type == bfd_link_hash_undefined)
3188 undef_count++;
3189 return true;
3192 static bool
3193 pe_undef_fill (struct bfd_link_hash_entry *h, void *inf ATTRIBUTE_UNUSED)
3195 if (h->type == bfd_link_hash_undefined)
3197 char *at;
3199 udef_table[undef_count].key = xstrdup (h->root.string);
3200 at = strchr (udef_table[undef_count].key
3201 + (udef_table[undef_count].key[0] == '@'), '@');
3202 if (at)
3203 at[1] = 0;
3204 udef_table[undef_count].oname = h->root.string;
3205 undef_count++;
3207 return true;
3210 static void
3211 pe_create_undef_table (void)
3213 undef_count = 0;
3215 /* count undefined symbols */
3217 bfd_link_hash_traverse (link_info.hash, pe_undef_count, "");
3219 /* create and fill the corresponding table */
3220 udef_table = xmalloc (undef_count * sizeof (struct key_value));
3222 undef_count = 0;
3223 bfd_link_hash_traverse (link_info.hash, pe_undef_fill, "");
3225 /* sort items */
3226 qsort (udef_table, undef_count, sizeof (struct key_value), undef_sort_cmp);
3229 static void
3230 add_bfd_to_link (bfd *abfd, const char *name, struct bfd_link_info *linfo)
3232 lang_input_statement_type *fake_file;
3234 fake_file = lang_add_input_file (name,
3235 lang_input_file_is_fake_enum,
3236 NULL);
3237 fake_file->the_bfd = abfd;
3238 ldlang_add_file (fake_file);
3240 if (!bfd_link_add_symbols (abfd, linfo))
3241 einfo (_("%X%P: add symbols %s: %E\n"), name);
3244 void
3245 pe_process_import_defs (bfd *output_bfd, struct bfd_link_info *linfo)
3247 pe_dll_id_target (bfd_get_target (output_bfd));
3249 if (pe_def_file)
3251 int i, j;
3252 def_file_module *module;
3253 def_file_import *imp;
3255 imp = pe_def_file->imports;
3257 pe_create_undef_table ();
3259 for (module = pe_def_file->modules; module; module = module->next)
3261 int do_this_dll = 0;
3263 for (i = 0; i < pe_def_file->num_imports; i++)
3264 if (imp[i].module == module)
3265 break;
3266 if (i >= pe_def_file->num_imports)
3267 continue;
3269 dll_filename = module->name;
3270 dll_symname = xstrdup (module->name);
3271 for (j = 0; dll_symname[j]; j++)
3272 if (!ISALNUM (dll_symname[j]))
3273 dll_symname[j] = '_';
3275 for (; i < pe_def_file->num_imports && imp[i].module == module; i++)
3277 def_file_export exp;
3278 struct bfd_link_hash_entry *blhe;
3279 int lead_at = (*imp[i].internal_name == '@');
3280 /* See if we need this import. */
3281 size_t len = strlen (imp[i].internal_name);
3282 char *name = xmalloc (len + 2 + 6);
3283 bool include_jmp_stub = false;
3284 bool is_cdecl = false;
3285 bool is_undef = false;
3287 if (!lead_at && strchr (imp[i].internal_name, '@') == NULL)
3288 is_cdecl = true;
3290 if (lead_at)
3291 sprintf (name, "%s", imp[i].internal_name);
3292 else
3293 sprintf (name, "%s%s",U (""), imp[i].internal_name);
3295 blhe = bfd_link_hash_lookup (linfo->hash, name,
3296 false, false, false);
3298 /* Include the jump stub for <sym> only if the <sym>
3299 is undefined. */
3300 if (!blhe || (blhe && blhe->type != bfd_link_hash_undefined))
3302 if (lead_at)
3303 sprintf (name, "%s%s", "__imp_", imp[i].internal_name);
3304 else
3305 sprintf (name, "%s%s%s", "__imp_", U (""),
3306 imp[i].internal_name);
3308 blhe = bfd_link_hash_lookup (linfo->hash, name,
3309 false, false, false);
3310 if (blhe)
3311 is_undef = (blhe->type == bfd_link_hash_undefined);
3313 if (is_cdecl && (!blhe || !is_undef))
3315 blhe = pe_find_cdecl_alias_match (linfo, name + 6);
3316 include_jmp_stub = true;
3317 if (blhe)
3318 is_undef = (blhe->type == bfd_link_hash_undefined);
3321 else
3323 include_jmp_stub = true;
3324 is_undef = (blhe->type == bfd_link_hash_undefined);
3327 free (name);
3329 if (is_undef)
3331 bfd *one;
3332 /* We do. */
3333 if (!do_this_dll)
3335 bfd *ar_head = make_head (output_bfd);
3336 add_bfd_to_link (ar_head, bfd_get_filename (ar_head),
3337 linfo);
3338 do_this_dll = 1;
3340 exp.internal_name = imp[i].internal_name;
3341 exp.name = imp[i].name;
3342 exp.its_name = imp[i].its_name;
3343 exp.ordinal = imp[i].ordinal;
3344 exp.hint = exp.ordinal >= 0 ? exp.ordinal : 0;
3345 exp.flag_private = 0;
3346 exp.flag_constant = 0;
3347 exp.flag_data = imp[i].data;
3348 exp.flag_noname = exp.name ? 0 : 1;
3349 one = make_one (&exp, output_bfd,
3350 !exp.flag_data && include_jmp_stub);
3351 add_bfd_to_link (one, bfd_get_filename (one), linfo);
3354 if (do_this_dll)
3356 bfd *ar_tail = make_tail (output_bfd);
3357 add_bfd_to_link (ar_tail, bfd_get_filename (ar_tail), linfo);
3360 free (dll_symname);
3363 while (undef_count)
3365 --undef_count;
3366 free (udef_table[undef_count].key);
3368 free (udef_table);
3371 if (pe_def_file && pe_def_file->name)
3372 dll_filename = pe_def_file->name;
3373 else
3375 dll_filename = bfd_get_filename (output_bfd);
3376 for (const char *p = dll_filename; *p; p++)
3377 if (*p == '\\' || *p == '/' || *p == ':')
3378 dll_filename = p + 1;
3380 dll_symname = xstrdup (dll_filename);
3381 for (int i = 0; dll_symname[i]; i++)
3382 if (!ISALNUM (dll_symname[i]))
3383 dll_symname[i] = '_';
3386 /* We were handed a *.DLL file. Parse it and turn it into a set of
3387 IMPORTS directives in the def file. Return TRUE if the file was
3388 handled, FALSE if not. */
3390 static unsigned int
3391 pe_get16 (bfd *abfd, int where, bool *fail)
3393 unsigned char b[2];
3395 if (bfd_seek (abfd, where, SEEK_SET) != 0
3396 || bfd_read (b, 2, abfd) != 2)
3398 *fail = true;
3399 return 0;
3401 return b[0] + (b[1] << 8);
3404 static unsigned int
3405 pe_get32 (bfd *abfd, int where, bool *fail)
3407 unsigned char b[4];
3409 if (bfd_seek (abfd, where, SEEK_SET) != 0
3410 || bfd_read (b, 4, abfd) != 4)
3412 *fail = true;
3413 return 0;
3415 return b[0] + (b[1] << 8) + (b[2] << 16) + ((unsigned) b[3] << 24);
3418 static unsigned int
3419 pe_as32 (void *ptr)
3421 unsigned char *b = ptr;
3423 return b[0] + (b[1] << 8) + (b[2] << 16) + ((unsigned) b[3] << 24);
3426 bool
3427 pe_implied_import_dll (const char *filename)
3429 bfd *dll;
3430 bfd_vma pe_header_offset, opthdr_ofs, num_entries, i;
3431 bfd_vma export_rva, export_size, nsections, secptr, expptr;
3432 bfd_vma exp_funcbase;
3433 unsigned char *expdata;
3434 char *erva;
3435 bfd_vma name_rvas, nexp;
3436 const char *dllname;
3437 /* Initialization with start > end guarantees that is_data
3438 will not be set by mistake, and avoids compiler warning. */
3439 bfd_vma data_start = 1;
3440 bfd_vma data_end = 0;
3441 bfd_vma rdata_start = 1;
3442 bfd_vma rdata_end = 0;
3443 bfd_vma bss_start = 1;
3444 bfd_vma bss_end = 0;
3445 int from;
3447 /* No, I can't use bfd here. kernel32.dll puts its export table in
3448 the middle of the .rdata section. */
3449 dll = bfd_openr (filename, pe_details->target_name);
3450 if (!dll)
3452 einfo (_("%X%P: open %s: %E\n"), filename);
3453 return false;
3456 track_dependency_files (filename);
3458 /* PEI dlls seem to be bfd_objects. */
3459 if (!bfd_check_format (dll, bfd_object))
3461 notdll:
3462 einfo (_("%X%P: %s: this doesn't appear to be a DLL\n"), filename);
3463 return false;
3466 /* Get pe_header, optional header and numbers of directory entries. */
3467 bool fail = false;
3468 pe_header_offset = pe_get32 (dll, 0x3c, &fail);
3469 if (fail)
3470 goto notdll;
3471 opthdr_ofs = pe_header_offset + 4 + 20;
3472 #ifdef pe_use_plus
3473 /* NumberOfRvaAndSizes. */
3474 num_entries = pe_get32 (dll, opthdr_ofs + 92 + 4 * 4, &fail);
3475 #else
3476 num_entries = pe_get32 (dll, opthdr_ofs + 92, &fail);
3477 #endif
3478 if (fail)
3479 goto notdll;
3481 /* No import or export directory entry. */
3482 if (num_entries < 1)
3483 return false;
3485 #ifdef pe_use_plus
3486 export_rva = pe_get32 (dll, opthdr_ofs + 96 + 4 * 4, &fail);
3487 export_size = pe_get32 (dll, opthdr_ofs + 100 + 4 * 4, &fail);
3488 #else
3489 export_rva = pe_get32 (dll, opthdr_ofs + 96, &fail);
3490 export_size = pe_get32 (dll, opthdr_ofs + 100, &fail);
3491 #endif
3492 if (fail)
3493 goto notdll;
3495 /* No export table - nothing to export. */
3496 if (export_size == 0)
3497 return false;
3499 nsections = pe_get16 (dll, pe_header_offset + 4 + 2, &fail);
3500 secptr = (pe_header_offset + 4 + 20 +
3501 pe_get16 (dll, pe_header_offset + 4 + 16, &fail));
3502 if (fail)
3503 goto notdll;
3504 expptr = 0;
3506 /* Get the rva and size of the export section. */
3507 for (i = 0; i < nsections; i++)
3509 char sname[8];
3510 bfd_vma secptr1 = secptr + 40 * i;
3511 bfd_vma vaddr = pe_get32 (dll, secptr1 + 12, &fail);
3512 bfd_vma vsize = pe_get32 (dll, secptr1 + 16, &fail);
3513 bfd_vma fptr = pe_get32 (dll, secptr1 + 20, &fail);
3515 if (fail
3516 || bfd_seek (dll, secptr1, SEEK_SET) != 0
3517 || bfd_read (sname, 8, dll) != 8)
3518 goto notdll;
3520 if (vaddr <= export_rva && vaddr + vsize > export_rva)
3522 expptr = fptr + (export_rva - vaddr);
3523 if (export_rva + export_size > vaddr + vsize)
3524 export_size = vsize - (export_rva - vaddr);
3525 break;
3529 /* Scan sections and store the base and size of the
3530 data and bss segments in data/base_start/end. */
3531 for (i = 0; i < nsections; i++)
3533 bfd_vma secptr1 = secptr + 40 * i;
3534 bfd_vma vsize = pe_get32 (dll, secptr1 + 8, &fail);
3535 bfd_vma vaddr = pe_get32 (dll, secptr1 + 12, &fail);
3536 bfd_vma flags = pe_get32 (dll, secptr1 + 36, &fail);
3537 char sec_name[9];
3539 sec_name[8] = '\0';
3540 if (fail
3541 || bfd_seek (dll, secptr1 + 0, SEEK_SET) != 0
3542 || bfd_read (sec_name, 8, dll) != 8)
3543 goto notdll;
3545 if (strcmp(sec_name,".data") == 0)
3547 data_start = vaddr;
3548 data_end = vaddr + vsize;
3550 if (pe_dll_extra_pe_debug)
3551 printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n",
3552 __func__, sec_name, (unsigned long) vaddr,
3553 (unsigned long) (vaddr + vsize), (unsigned long) flags);
3555 else if (strcmp(sec_name,".rdata") == 0)
3557 rdata_start = vaddr;
3558 rdata_end = vaddr + vsize;
3560 if (pe_dll_extra_pe_debug)
3561 printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n",
3562 __func__, sec_name, (unsigned long) vaddr,
3563 (unsigned long) (vaddr + vsize), (unsigned long) flags);
3565 else if (strcmp (sec_name,".bss") == 0)
3567 bss_start = vaddr;
3568 bss_end = vaddr + vsize;
3570 if (pe_dll_extra_pe_debug)
3571 printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n",
3572 __func__, sec_name, (unsigned long) vaddr,
3573 (unsigned long) (vaddr + vsize), (unsigned long) flags);
3577 expdata = xmalloc (export_size);
3578 if (bfd_seek (dll, expptr, SEEK_SET) != 0
3579 || bfd_read (expdata, export_size, dll) != export_size)
3580 goto notdll;
3581 erva = (char *) expdata - export_rva;
3583 if (pe_def_file == 0)
3584 pe_def_file = def_file_empty ();
3586 nexp = pe_as32 (expdata + 24);
3587 name_rvas = pe_as32 (expdata + 32);
3588 exp_funcbase = pe_as32 (expdata + 28);
3590 /* Use internal dll name instead of filename
3591 to enable symbolic dll linking. */
3592 dllname = erva + pe_as32 (expdata + 12);
3594 /* Check to see if the dll has already been added to
3595 the definition list and if so return without error.
3596 This avoids multiple symbol definitions. */
3597 if (def_get_module (pe_def_file, dllname))
3599 if (pe_dll_extra_pe_debug)
3600 printf ("%s is already loaded\n", dllname);
3601 return true;
3604 /* This is an optimized version of the insertion loop, which avoids lots of
3605 calls to realloc and memmove from def_file_add_import. */
3606 if ((from = def_file_add_import_from (pe_def_file, nexp,
3607 erva + pe_as32 (erva + name_rvas),
3608 dllname, 0, NULL, NULL)) >= 0)
3610 for (i = 0; i < nexp; i++)
3612 /* Pointer to the names vector. */
3613 bfd_vma name_rva = pe_as32 (erva + name_rvas + i * 4);
3614 def_file_import *imp;
3615 /* Pointer to the function address vector. */
3616 bfd_vma func_rva = pe_as32 (erva + exp_funcbase + i * 4);
3617 /* is_data is true if the address is in the data, rdata or bss
3618 segment. */
3619 const int is_data =
3620 (func_rva >= data_start && func_rva < data_end)
3621 || (func_rva >= rdata_start && func_rva < rdata_end)
3622 || (func_rva >= bss_start && func_rva < bss_end);
3624 imp = def_file_add_import_at (pe_def_file, from + i, erva + name_rva,
3625 dllname, i, NULL, NULL);
3626 /* Mark symbol type. */
3627 imp->data = is_data;
3629 if (pe_dll_extra_pe_debug)
3630 printf ("%s dll-name: %s sym: %s addr: 0x%lx %s\n",
3631 __func__, dllname, erva + name_rva,
3632 (unsigned long) func_rva, is_data ? "(data)" : "");
3635 return true;
3638 /* Iterate through the list of symbols. */
3639 for (i = 0; i < nexp; i++)
3641 /* Pointer to the names vector. */
3642 bfd_vma name_rva = pe_as32 (erva + name_rvas + i * 4);
3643 def_file_import *imp;
3644 /* Pointer to the function address vector. */
3645 bfd_vma func_rva = pe_as32 (erva + exp_funcbase + i * 4);
3646 int is_data = 0;
3648 /* Skip unwanted symbols, which are
3649 exported in buggy auto-import releases. */
3650 if (! startswith (erva + name_rva, "__nm_"))
3652 bool is_dup = false;
3653 /* is_data is true if the address is in the data, rdata or bss
3654 segment. */
3655 is_data =
3656 (func_rva >= data_start && func_rva < data_end)
3657 || (func_rva >= rdata_start && func_rva < rdata_end)
3658 || (func_rva >= bss_start && func_rva < bss_end);
3660 imp = def_file_add_import (pe_def_file, erva + name_rva,
3661 dllname, i, NULL, NULL, &is_dup);
3662 /* Mark symbol type. */
3663 if (!is_dup)
3664 imp->data = is_data;
3666 if (pe_dll_extra_pe_debug)
3667 printf ("%s dll-name: %s sym: %s addr: 0x%lx %s\n",
3668 __func__, dllname, erva + name_rva,
3669 (unsigned long) func_rva, is_data ? "(data)" : "");
3673 return true;
3676 void
3677 pe_output_file_set_long_section_names (bfd *abfd)
3679 if (pe_use_coff_long_section_names < 0)
3680 return;
3681 if (!bfd_coff_set_long_section_names (abfd, pe_use_coff_long_section_names))
3682 einfo (_("%X%P: error: can't use long section names on this arch\n"));
3685 /* These are the main functions, called from the emulation. The first
3686 is called after the bfds are read, so we can guess at how much space
3687 we need. The second is called after everything is placed, so we
3688 can put the right values in place. */
3690 void
3691 pe_dll_build_sections (bfd *abfd, struct bfd_link_info *info)
3693 pe_dll_id_target (bfd_get_target (abfd));
3694 pe_output_file_set_long_section_names (abfd);
3695 process_def_file_and_drectve (abfd, info);
3697 if (pe_def_file->num_exports == 0
3698 && (!bfd_link_pic (info) || pe_dll_exclude_all_symbols))
3700 if (pe_dll_enable_reloc_section)
3702 build_filler_bfd (false /* edata not needed. */);
3703 pe_output_file_set_long_section_names (filler_bfd);
3705 return;
3708 generate_edata ();
3709 build_filler_bfd (true /* edata is needed. */);
3710 pe_output_file_set_long_section_names (filler_bfd);
3713 void
3714 pe_exe_build_sections (bfd *abfd, struct bfd_link_info *info ATTRIBUTE_UNUSED)
3716 pe_dll_id_target (bfd_get_target (abfd));
3717 pe_output_file_set_long_section_names (abfd);
3718 build_filler_bfd (0);
3719 pe_output_file_set_long_section_names (filler_bfd);
3722 void
3723 pe_dll_fill_sections (bfd *abfd, struct bfd_link_info *info)
3725 pe_exe_fill_sections (abfd, info);
3727 if (edata_s)
3729 fill_edata (abfd, info);
3730 edata_s->contents = edata_d;
3733 if (bfd_link_dll (info))
3734 pe_data (abfd)->dll = 1;
3737 void
3738 pe_exe_fill_sections (bfd *abfd, struct bfd_link_info *info)
3740 pe_dll_id_target (bfd_get_target (abfd));
3741 pe_output_file_set_long_section_names (abfd);
3742 image_base = pe_data (abfd)->pe_opthdr.ImageBase;
3744 generate_reloc (abfd, info);
3746 if (reloc_sz > 0)
3748 bfd_set_section_size (reloc_s, reloc_sz);
3750 /* Resize the sections. */
3751 lang_reset_memory_regions ();
3752 lang_size_sections (NULL, true);
3754 /* Redo special stuff. */
3755 ldemul_after_allocation ();
3757 /* Do the assignments again. */
3758 lang_do_assignments (lang_final_phase_enum);
3760 reloc_s->contents = reloc_d;
3762 else if (reloc_s)
3764 /* Do not emit an empty reloc section. */
3765 bfd_set_section_flags (reloc_s, SEC_IN_MEMORY | SEC_EXCLUDE);
3766 reloc_s->output_section = bfd_abs_section_ptr;
3770 bool
3771 pe_bfd_is_dll (bfd *abfd)
3773 return (bfd_get_format (abfd) == bfd_object
3774 && obj_pe (abfd)
3775 && pe_data (abfd)->dll);