Patrick Welche <prlw1@cam.ac.uk>
[netbsd-mini2440.git] / external / gpl3 / binutils / dist / ld / pe-dll.c
blob1435e9f44d5ef2fddcc226ea306a8b0806668ca9
1 /* Routines to help build PEI-format DLLs (Win32 etc)
2 Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
3 2008, 2009 Free Software Foundation, Inc.
4 Written by DJ Delorie <dj@cygnus.com>
6 This file is part of the GNU Binutils.
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
21 MA 02110-1301, USA. */
23 #include "sysdep.h"
24 #include "bfd.h"
25 #include "bfdlink.h"
26 #include "libiberty.h"
27 #include "safe-ctype.h"
29 #include <time.h>
31 #include "ld.h"
32 #include "ldexp.h"
33 #include "ldlang.h"
34 #include "ldwrite.h"
35 #include "ldmisc.h"
36 #include <ldgram.h>
37 #include "ldmain.h"
38 #include "ldfile.h"
39 #include "ldemul.h"
40 #include "coff/internal.h"
41 #include "../bfd/libcoff.h"
42 #include "deffile.h"
43 #include "pe-dll.h"
45 #ifdef pe_use_x86_64
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 thru 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_do_default_excludes = 1;
154 int pe_dll_kill_ats = 0;
155 int pe_dll_stdcall_aliases = 0;
156 int pe_dll_warn_dup_exports = 0;
157 int pe_dll_compat_implib = 0;
158 int pe_dll_extra_pe_debug = 0;
160 /* Static variables and types. */
162 static bfd_vma image_base;
163 static bfd *filler_bfd;
164 static struct bfd_section *edata_s, *reloc_s;
165 static unsigned char *edata_d, *reloc_d;
166 static size_t edata_sz, reloc_sz;
167 static int runtime_pseudo_relocs_created = 0;
169 typedef struct
171 const char *name;
172 int len;
174 autofilter_entry_type;
176 typedef struct
178 const char *target_name;
179 const char *object_target;
180 unsigned int imagebase_reloc;
181 int pe_arch;
182 int bfd_arch;
183 bfd_boolean underscored;
184 const autofilter_entry_type* autofilter_symbollist;
186 pe_details_type;
188 static const autofilter_entry_type autofilter_symbollist_generic[] =
190 { STRING_COMMA_LEN ("_NULL_IMPORT_DESCRIPTOR") },
191 /* Entry point symbols. */
192 { STRING_COMMA_LEN ("DllMain") },
193 { STRING_COMMA_LEN ("DllMainCRTStartup") },
194 { STRING_COMMA_LEN ("_DllMainCRTStartup") },
195 /* Runtime pseudo-reloc. */
196 { STRING_COMMA_LEN ("_pei386_runtime_relocator") },
197 { STRING_COMMA_LEN ("do_pseudo_reloc") },
198 { NULL, 0 }
201 static const autofilter_entry_type autofilter_symbollist_i386[] =
203 { STRING_COMMA_LEN ("_NULL_IMPORT_DESCRIPTOR") },
204 /* Entry point symbols, and entry hooks. */
205 { STRING_COMMA_LEN ("cygwin_crt0") },
206 #ifdef pe_use_x86_64
207 { STRING_COMMA_LEN ("DllMain") },
208 { STRING_COMMA_LEN ("DllEntryPoint") },
209 { STRING_COMMA_LEN ("DllMainCRTStartup") },
210 { STRING_COMMA_LEN ("_cygwin_dll_entry") },
211 { STRING_COMMA_LEN ("_cygwin_crt0_common") },
212 { STRING_COMMA_LEN ("_cygwin_noncygwin_dll_entry") },
213 #else
214 { STRING_COMMA_LEN ("DllMain@12") },
215 { STRING_COMMA_LEN ("DllEntryPoint@0") },
216 { STRING_COMMA_LEN ("DllMainCRTStartup@12") },
217 { STRING_COMMA_LEN ("_cygwin_dll_entry@12") },
218 { STRING_COMMA_LEN ("_cygwin_crt0_common@8") },
219 { STRING_COMMA_LEN ("_cygwin_noncygwin_dll_entry@12") },
220 { STRING_COMMA_LEN ("cygwin_attach_dll") },
221 #endif
222 { STRING_COMMA_LEN ("cygwin_premain0") },
223 { STRING_COMMA_LEN ("cygwin_premain1") },
224 { STRING_COMMA_LEN ("cygwin_premain2") },
225 { STRING_COMMA_LEN ("cygwin_premain3") },
226 /* Runtime pseudo-reloc. */
227 { STRING_COMMA_LEN ("_pei386_runtime_relocator") },
228 { STRING_COMMA_LEN ("do_pseudo_reloc") },
229 /* Global vars that should not be exported. */
230 { STRING_COMMA_LEN ("impure_ptr") },
231 { STRING_COMMA_LEN ("_impure_ptr") },
232 { STRING_COMMA_LEN ("_fmode") },
233 { STRING_COMMA_LEN ("environ") },
234 { NULL, 0 }
237 #define PE_ARCH_i386 1
238 #define PE_ARCH_sh 2
239 #define PE_ARCH_mips 3
240 #define PE_ARCH_arm 4
241 #define PE_ARCH_arm_epoc 5
242 #define PE_ARCH_arm_wince 6
244 static const pe_details_type pe_detail_list[] =
247 #ifdef pe_use_x86_64
248 "pei-x86-64",
249 "pe-x86-64",
250 3 /* R_IMAGEBASE */,
251 #else
252 "pei-i386",
253 "pe-i386",
254 7 /* R_IMAGEBASE */,
255 #endif
256 PE_ARCH_i386,
257 bfd_arch_i386,
258 TRUE,
259 autofilter_symbollist_i386
262 "pei-shl",
263 "pe-shl",
264 16 /* R_SH_IMAGEBASE */,
265 PE_ARCH_sh,
266 bfd_arch_sh,
267 TRUE,
268 autofilter_symbollist_generic
271 "pei-mips",
272 "pe-mips",
273 34 /* MIPS_R_RVA */,
274 PE_ARCH_mips,
275 bfd_arch_mips,
276 FALSE,
277 autofilter_symbollist_generic
280 "pei-arm-little",
281 "pe-arm-little",
282 11 /* ARM_RVA32 */,
283 PE_ARCH_arm,
284 bfd_arch_arm,
285 TRUE,
286 autofilter_symbollist_generic
289 "epoc-pei-arm-little",
290 "epoc-pe-arm-little",
291 11 /* ARM_RVA32 */,
292 PE_ARCH_arm_epoc,
293 bfd_arch_arm,
294 FALSE,
295 autofilter_symbollist_generic
298 "pei-arm-wince-little",
299 "pe-arm-wince-little",
300 2, /* ARM_RVA32 on Windows CE, see bfd/coff-arm.c. */
301 PE_ARCH_arm_wince,
302 bfd_arch_arm,
303 FALSE,
304 autofilter_symbollist_generic
306 { NULL, NULL, 0, 0, 0, FALSE, NULL }
309 static const pe_details_type *pe_details;
311 /* Do not specify library suffix explicitly, to allow for dllized versions. */
312 static const autofilter_entry_type autofilter_liblist[] =
314 { STRING_COMMA_LEN ("libcegcc") },
315 { STRING_COMMA_LEN ("libcygwin") },
316 { STRING_COMMA_LEN ("libgcc") },
317 { STRING_COMMA_LEN ("libgcc_s") },
318 { STRING_COMMA_LEN ("libstdc++") },
319 { STRING_COMMA_LEN ("libmingw32") },
320 { STRING_COMMA_LEN ("libmingwex") },
321 { STRING_COMMA_LEN ("libg2c") },
322 { STRING_COMMA_LEN ("libsupc++") },
323 { STRING_COMMA_LEN ("libobjc") },
324 { STRING_COMMA_LEN ("libgcj") },
325 { NULL, 0 }
328 /* Regardless of the suffix issue mentioned above, we must ensure that
329 we do not falsely match on a leading substring, such as when libtool
330 builds libstdc++ as a DLL using libsupc++convenience.a as an intermediate.
331 This routine ensures that the leading part of the name matches and that
332 it is followed by only an optional version suffix and a file extension,
333 returning zero if so or -1 if not. */
334 static int libnamencmp (const char *libname, const autofilter_entry_type *afptr)
336 if (strncmp (libname, afptr->name, afptr->len))
337 return -1;
339 libname += afptr->len;
341 /* Be liberal in interpreting what counts as a version suffix; we
342 accept anything that has a dash to separate it from the name and
343 begins with a digit. */
344 if (libname[0] == '-')
346 if (!ISDIGIT (*++libname))
347 return -1;
348 /* Ensure the filename has an extension. */
349 while (*++libname != '.')
350 if (!*libname)
351 return -1;
353 else if (libname[0] != '.')
354 return -1;
356 return 0;
359 static const autofilter_entry_type autofilter_objlist[] =
361 { STRING_COMMA_LEN ("crt0.o") },
362 { STRING_COMMA_LEN ("crt1.o") },
363 { STRING_COMMA_LEN ("crt2.o") },
364 { STRING_COMMA_LEN ("dllcrt1.o") },
365 { STRING_COMMA_LEN ("dllcrt2.o") },
366 { STRING_COMMA_LEN ("gcrt0.o") },
367 { STRING_COMMA_LEN ("gcrt1.o") },
368 { STRING_COMMA_LEN ("gcrt2.o") },
369 { STRING_COMMA_LEN ("crtbegin.o") },
370 { STRING_COMMA_LEN ("crtend.o") },
371 { NULL, 0 }
374 static const autofilter_entry_type autofilter_symbolprefixlist[] =
376 /* _imp_ is treated specially, as it is always underscored. */
377 /* { STRING_COMMA_LEN ("_imp_") }, */
378 /* Don't export some c++ symbols. */
379 { STRING_COMMA_LEN ("__rtti_") },
380 { STRING_COMMA_LEN ("__builtin_") },
381 /* Don't re-export auto-imported symbols. */
382 { STRING_COMMA_LEN ("_nm_") },
383 /* Don't export symbols specifying internal DLL layout. */
384 { STRING_COMMA_LEN ("_head_") },
385 { STRING_COMMA_LEN ("_IMPORT_DESCRIPTOR_") },
386 /* Don't export section labels or artificial symbols
387 (eg ".weak.foo". */
388 { STRING_COMMA_LEN (".") },
389 { NULL, 0 }
392 static const autofilter_entry_type autofilter_symbolsuffixlist[] =
394 { STRING_COMMA_LEN ("_iname") },
395 { STRING_COMMA_LEN ("_NULL_THUNK_DATA") },
396 { NULL, 0 }
399 #define U(str) (pe_details->underscored ? "_" str : str)
401 void
402 pe_dll_id_target (const char *target)
404 int i;
406 for (i = 0; pe_detail_list[i].target_name; i++)
407 if (strcmp (pe_detail_list[i].target_name, target) == 0
408 || strcmp (pe_detail_list[i].object_target, target) == 0)
410 pe_details = pe_detail_list + i;
411 return;
413 einfo (_("%XUnsupported PEI architecture: %s\n"), target);
414 exit (1);
417 /* Helper functions for qsort. Relocs must be sorted so that we can write
418 them out by pages. */
420 typedef struct
422 bfd_vma vma;
423 char type;
424 short extra;
426 reloc_data_type;
428 static int
429 reloc_sort (const void *va, const void *vb)
431 bfd_vma a = ((const reloc_data_type *) va)->vma;
432 bfd_vma b = ((const reloc_data_type *) vb)->vma;
434 return (a > b) ? 1 : ((a < b) ? -1 : 0);
437 static int
438 pe_export_sort (const void *va, const void *vb)
440 const def_file_export *a = va;
441 const def_file_export *b = vb;
443 return strcmp (a->name, b->name);
446 /* Read and process the .DEF file. */
448 /* These correspond to the entries in pe_def_file->exports[]. I use
449 exported_symbol_sections[i] to tag whether or not the symbol was
450 defined, since we can't export symbols we don't have. */
452 static bfd_vma *exported_symbol_offsets;
453 static struct bfd_section **exported_symbol_sections;
454 static int export_table_size;
455 static int count_exported;
456 static int count_exported_byname;
457 static int count_with_ordinals;
458 static const char *dll_name;
459 static int min_ordinal, max_ordinal;
460 static int *exported_symbols;
462 typedef struct exclude_list_struct
464 char *string;
465 struct exclude_list_struct *next;
466 int type;
468 exclude_list_struct;
470 static struct exclude_list_struct *excludes = 0;
472 void
473 pe_dll_add_excludes (const char *new_excludes, const int type)
475 char *local_copy;
476 char *exclude_string;
478 local_copy = xstrdup (new_excludes);
480 exclude_string = strtok (local_copy, ",:");
481 for (; exclude_string; exclude_string = strtok (NULL, ",:"))
483 struct exclude_list_struct *new_exclude;
485 new_exclude = xmalloc (sizeof (struct exclude_list_struct));
486 new_exclude->string = xmalloc (strlen (exclude_string) + 1);
487 strcpy (new_exclude->string, exclude_string);
488 new_exclude->type = type;
489 new_exclude->next = excludes;
490 excludes = new_exclude;
493 free (local_copy);
496 static bfd_boolean
497 is_import (const char* n)
499 return (CONST_STRNEQ (n, "__imp_"));
502 /* abfd is a bfd containing n (or NULL)
503 It can be used for contextual checks. */
505 static int
506 auto_export (bfd *abfd, def_file *d, const char *n)
508 int i;
509 struct exclude_list_struct *ex;
510 const autofilter_entry_type *afptr;
511 const char * libname = 0;
512 if (abfd && abfd->my_archive)
513 libname = lbasename (abfd->my_archive->filename);
515 for (i = 0; i < d->num_exports; i++)
516 if (strcmp (d->exports[i].name, n) == 0)
517 return 0;
519 if (pe_dll_do_default_excludes)
521 const char * p;
522 int len;
524 if (pe_dll_extra_pe_debug)
525 printf ("considering exporting: %s, abfd=%p, abfd->my_arc=%p\n",
526 n, abfd, abfd->my_archive);
528 /* First of all, make context checks:
529 Don't export anything from standard libs. */
530 if (libname)
532 afptr = autofilter_liblist;
534 while (afptr->name)
536 if (libnamencmp (libname, afptr) == 0 )
537 return 0;
538 afptr++;
542 /* Next, exclude symbols from certain startup objects. */
544 if (abfd && (p = lbasename (abfd->filename)))
546 afptr = autofilter_objlist;
547 while (afptr->name)
549 if (strcmp (p, afptr->name) == 0)
550 return 0;
551 afptr++;
555 /* Don't try to blindly exclude all symbols
556 that begin with '__'; this was tried and
557 it is too restrictive. Instead we have
558 a target specific list to use: */
559 afptr = pe_details->autofilter_symbollist;
561 while (afptr->name)
563 if (strcmp (n, afptr->name) == 0)
564 return 0;
566 afptr++;
569 /* Next, exclude symbols starting with ... */
570 afptr = autofilter_symbolprefixlist;
571 while (afptr->name)
573 if (strncmp (n, afptr->name, afptr->len) == 0)
574 return 0;
576 afptr++;
579 /* Finally, exclude symbols ending with ... */
580 len = strlen (n);
581 afptr = autofilter_symbolsuffixlist;
582 while (afptr->name)
584 if ((len >= afptr->len)
585 /* Add 1 to insure match with trailing '\0'. */
586 && strncmp (n + len - afptr->len, afptr->name,
587 afptr->len + 1) == 0)
588 return 0;
590 afptr++;
594 for (ex = excludes; ex; ex = ex->next)
596 if (ex->type == 1) /* exclude-libs */
598 if (libname
599 && ((strcmp (libname, ex->string) == 0)
600 || (strcasecmp ("ALL", ex->string) == 0)))
601 return 0;
603 else if (strcmp (n, ex->string) == 0)
604 return 0;
607 return 1;
610 static void
611 process_def_file (bfd *abfd ATTRIBUTE_UNUSED, struct bfd_link_info *info)
613 int i, j;
614 struct bfd_link_hash_entry *blhe;
615 bfd *b;
616 struct bfd_section *s;
617 def_file_export *e = 0;
619 if (!pe_def_file)
620 pe_def_file = def_file_empty ();
622 /* First, run around to all the objects looking for the .drectve
623 sections, and push those into the def file too. */
624 for (b = info->input_bfds; b; b = b->link_next)
626 s = bfd_get_section_by_name (b, ".drectve");
627 if (s)
629 long size = s->size;
630 char *buf = xmalloc (size);
632 bfd_get_section_contents (b, s, buf, 0, size);
633 def_file_add_directive (pe_def_file, buf, size);
634 free (buf);
638 /* If we are not building a DLL, when there are no exports
639 we do not build an export table at all. */
640 if (!pe_dll_export_everything && pe_def_file->num_exports == 0
641 && info->executable)
642 return;
644 /* Now, maybe export everything else the default way. */
645 if (pe_dll_export_everything || pe_def_file->num_exports == 0)
647 for (b = info->input_bfds; b; b = b->link_next)
649 asymbol **symbols;
650 int nsyms;
652 if (!bfd_generic_link_read_symbols (b))
654 einfo (_("%B%F: could not read symbols: %E\n"), b);
655 return;
658 symbols = bfd_get_outsymbols (b);
659 nsyms = bfd_get_symcount (b);
661 for (j = 0; j < nsyms; j++)
663 /* We should export symbols which are either global or not
664 anything at all. (.bss data is the latter)
665 We should not export undefined symbols. */
666 if (symbols[j]->section != &bfd_und_section
667 && ((symbols[j]->flags & BSF_GLOBAL)
668 || (symbols[j]->flags == BFD_FORT_COMM_DEFAULT_VALUE)))
670 const char *sn = symbols[j]->name;
672 /* We should not re-export imported stuff. */
674 char *name;
675 if (is_import (sn))
676 continue;
678 name = xmalloc (strlen ("__imp_") + strlen (sn) + 1);
679 sprintf (name, "%s%s", "__imp_", sn);
681 blhe = bfd_link_hash_lookup (info->hash, name,
682 FALSE, FALSE, FALSE);
683 free (name);
685 if (blhe && blhe->type == bfd_link_hash_defined)
686 continue;
689 if (pe_details->underscored && *sn == '_')
690 sn++;
692 if (auto_export (b, pe_def_file, sn))
694 def_file_export *p;
695 p=def_file_add_export (pe_def_file, sn, 0, -1);
696 /* Fill data flag properly, from dlltool.c. */
697 p->flag_data = !(symbols[j]->flags & BSF_FUNCTION);
704 #undef NE
705 #define NE pe_def_file->num_exports
707 /* Canonicalize the export list. */
708 if (pe_dll_kill_ats)
710 for (i = 0; i < NE; i++)
712 if (strchr (pe_def_file->exports[i].name, '@'))
714 /* This will preserve internal_name, which may have been
715 pointing to the same memory as name, or might not
716 have. */
717 int lead_at = (*pe_def_file->exports[i].name == '@');
718 char *tmp = xstrdup (pe_def_file->exports[i].name + lead_at);
719 char *tmp_at = strchr (tmp, '@');
721 if (tmp_at)
722 *tmp_at = 0;
723 else
724 einfo (_("%XCannot export %s: invalid export name\n"),
725 pe_def_file->exports[i].name);
726 pe_def_file->exports[i].name = tmp;
731 if (pe_dll_stdcall_aliases)
733 for (i = 0; i < NE; i++)
735 if (is_import (pe_def_file->exports[i].name))
736 continue;
738 if (strchr (pe_def_file->exports[i].name, '@'))
740 int lead_at = (*pe_def_file->exports[i].name == '@');
741 char *tmp = xstrdup (pe_def_file->exports[i].name + lead_at);
743 *(strchr (tmp, '@')) = 0;
744 if (auto_export (NULL, pe_def_file, tmp))
745 def_file_add_export (pe_def_file, tmp,
746 pe_def_file->exports[i].internal_name,
747 -1);
748 else
749 free (tmp);
754 /* Convenience, but watch out for it changing. */
755 e = pe_def_file->exports;
757 exported_symbol_offsets = xmalloc (NE * sizeof (bfd_vma));
758 exported_symbol_sections = xmalloc (NE * sizeof (struct bfd_section *));
760 memset (exported_symbol_sections, 0, NE * sizeof (struct bfd_section *));
761 max_ordinal = 0;
762 min_ordinal = 65536;
763 count_exported = 0;
764 count_exported_byname = 0;
765 count_with_ordinals = 0;
767 qsort (pe_def_file->exports, NE, sizeof (pe_def_file->exports[0]),
768 pe_export_sort);
769 for (i = 0, j = 0; i < NE; i++)
771 if (i > 0 && strcmp (e[i].name, e[i - 1].name) == 0)
773 /* This is a duplicate. */
774 if (e[j - 1].ordinal != -1
775 && e[i].ordinal != -1
776 && e[j - 1].ordinal != e[i].ordinal)
778 if (pe_dll_warn_dup_exports)
779 /* xgettext:c-format */
780 einfo (_("%XError, duplicate EXPORT with ordinals: %s (%d vs %d)\n"),
781 e[j - 1].name, e[j - 1].ordinal, e[i].ordinal);
783 else
785 if (pe_dll_warn_dup_exports)
786 /* xgettext:c-format */
787 einfo (_("Warning, duplicate EXPORT: %s\n"),
788 e[j - 1].name);
791 if (e[i].ordinal != -1)
792 e[j - 1].ordinal = e[i].ordinal;
793 e[j - 1].flag_private |= e[i].flag_private;
794 e[j - 1].flag_constant |= e[i].flag_constant;
795 e[j - 1].flag_noname |= e[i].flag_noname;
796 e[j - 1].flag_data |= e[i].flag_data;
798 else
800 if (i != j)
801 e[j] = e[i];
802 j++;
805 pe_def_file->num_exports = j; /* == NE */
807 for (i = 0; i < NE; i++)
809 char *name;
811 /* Check for forward exports */
812 if (strchr (pe_def_file->exports[i].internal_name, '.'))
814 count_exported++;
815 if (!pe_def_file->exports[i].flag_noname)
816 count_exported_byname++;
818 pe_def_file->exports[i].flag_forward = 1;
820 if (pe_def_file->exports[i].ordinal != -1)
822 if (max_ordinal < pe_def_file->exports[i].ordinal)
823 max_ordinal = pe_def_file->exports[i].ordinal;
824 if (min_ordinal > pe_def_file->exports[i].ordinal)
825 min_ordinal = pe_def_file->exports[i].ordinal;
826 count_with_ordinals++;
829 continue;
832 name = xmalloc (strlen (pe_def_file->exports[i].internal_name) + 2);
833 if (pe_details->underscored
834 && (*pe_def_file->exports[i].internal_name != '@'))
836 *name = '_';
837 strcpy (name + 1, pe_def_file->exports[i].internal_name);
839 else
840 strcpy (name, pe_def_file->exports[i].internal_name);
842 blhe = bfd_link_hash_lookup (info->hash,
843 name,
844 FALSE, FALSE, TRUE);
846 if (blhe
847 && (blhe->type == bfd_link_hash_defined
848 || (blhe->type == bfd_link_hash_common)))
850 count_exported++;
851 if (!pe_def_file->exports[i].flag_noname)
852 count_exported_byname++;
854 /* Only fill in the sections. The actual offsets are computed
855 in fill_exported_offsets() after common symbols are laid
856 out. */
857 if (blhe->type == bfd_link_hash_defined)
858 exported_symbol_sections[i] = blhe->u.def.section;
859 else
860 exported_symbol_sections[i] = blhe->u.c.p->section;
862 if (pe_def_file->exports[i].ordinal != -1)
864 if (max_ordinal < pe_def_file->exports[i].ordinal)
865 max_ordinal = pe_def_file->exports[i].ordinal;
866 if (min_ordinal > pe_def_file->exports[i].ordinal)
867 min_ordinal = pe_def_file->exports[i].ordinal;
868 count_with_ordinals++;
871 else if (blhe && blhe->type == bfd_link_hash_undefined)
873 /* xgettext:c-format */
874 einfo (_("%XCannot export %s: symbol not defined\n"),
875 pe_def_file->exports[i].internal_name);
877 else if (blhe)
879 /* xgettext:c-format */
880 einfo (_("%XCannot export %s: symbol wrong type (%d vs %d)\n"),
881 pe_def_file->exports[i].internal_name,
882 blhe->type, bfd_link_hash_defined);
884 else
886 /* xgettext:c-format */
887 einfo (_("%XCannot export %s: symbol not found\n"),
888 pe_def_file->exports[i].internal_name);
890 free (name);
894 /* Build the bfd that will contain .edata and .reloc sections. */
896 static void
897 build_filler_bfd (int include_edata)
899 lang_input_statement_type *filler_file;
900 filler_file = lang_add_input_file ("dll stuff",
901 lang_input_file_is_fake_enum,
902 NULL);
903 filler_file->the_bfd = filler_bfd = bfd_create ("dll stuff",
904 link_info.output_bfd);
905 if (filler_bfd == NULL
906 || !bfd_set_arch_mach (filler_bfd,
907 bfd_get_arch (link_info.output_bfd),
908 bfd_get_mach (link_info.output_bfd)))
910 einfo ("%X%P: can not create BFD: %E\n");
911 return;
914 if (include_edata)
916 edata_s = bfd_make_section_old_way (filler_bfd, ".edata");
917 if (edata_s == NULL
918 || !bfd_set_section_flags (filler_bfd, edata_s,
919 (SEC_HAS_CONTENTS
920 | SEC_ALLOC
921 | SEC_LOAD
922 | SEC_KEEP
923 | SEC_IN_MEMORY)))
925 einfo ("%X%P: can not create .edata section: %E\n");
926 return;
928 bfd_set_section_size (filler_bfd, edata_s, edata_sz);
931 reloc_s = bfd_make_section_old_way (filler_bfd, ".reloc");
932 if (reloc_s == NULL
933 || !bfd_set_section_flags (filler_bfd, reloc_s,
934 (SEC_HAS_CONTENTS
935 | SEC_ALLOC
936 | SEC_LOAD
937 | SEC_KEEP
938 | SEC_IN_MEMORY)))
940 einfo ("%X%P: can not create .reloc section: %E\n");
941 return;
944 bfd_set_section_size (filler_bfd, reloc_s, 0);
946 ldlang_add_file (filler_file);
949 /* Gather all the exported symbols and build the .edata section. */
951 static void
952 generate_edata (bfd *abfd, struct bfd_link_info *info ATTRIBUTE_UNUSED)
954 int i, next_ordinal;
955 int name_table_size = 0;
956 const char *dlnp;
958 /* First, we need to know how many exported symbols there are,
959 and what the range of ordinals is. */
960 if (pe_def_file->name)
961 dll_name = pe_def_file->name;
962 else
964 dll_name = abfd->filename;
966 for (dlnp = dll_name; *dlnp; dlnp++)
967 if (*dlnp == '\\' || *dlnp == '/' || *dlnp == ':')
968 dll_name = dlnp + 1;
971 if (count_with_ordinals && max_ordinal > count_exported)
973 if (min_ordinal > max_ordinal - count_exported + 1)
974 min_ordinal = max_ordinal - count_exported + 1;
976 else
978 min_ordinal = 1;
979 max_ordinal = count_exported;
982 export_table_size = max_ordinal - min_ordinal + 1;
983 exported_symbols = xmalloc (export_table_size * sizeof (int));
984 for (i = 0; i < export_table_size; i++)
985 exported_symbols[i] = -1;
987 /* Now we need to assign ordinals to those that don't have them. */
988 for (i = 0; i < NE; i++)
990 if (exported_symbol_sections[i] ||
991 pe_def_file->exports[i].flag_forward)
993 if (pe_def_file->exports[i].ordinal != -1)
995 int ei = pe_def_file->exports[i].ordinal - min_ordinal;
996 int pi = exported_symbols[ei];
998 if (pi != -1)
1000 /* xgettext:c-format */
1001 einfo (_("%XError, ordinal used twice: %d (%s vs %s)\n"),
1002 pe_def_file->exports[i].ordinal,
1003 pe_def_file->exports[i].name,
1004 pe_def_file->exports[pi].name);
1006 exported_symbols[ei] = i;
1008 name_table_size += strlen (pe_def_file->exports[i].name) + 1;
1011 /* Reserve space for the forward name. */
1012 if (pe_def_file->exports[i].flag_forward)
1014 name_table_size += strlen (pe_def_file->exports[i].internal_name) + 1;
1018 next_ordinal = min_ordinal;
1019 for (i = 0; i < NE; i++)
1020 if ((exported_symbol_sections[i] ||
1021 pe_def_file->exports[i].flag_forward) &&
1022 pe_def_file->exports[i].ordinal == -1)
1024 while (exported_symbols[next_ordinal - min_ordinal] != -1)
1025 next_ordinal++;
1027 exported_symbols[next_ordinal - min_ordinal] = i;
1028 pe_def_file->exports[i].ordinal = next_ordinal;
1031 /* OK, now we can allocate some memory. */
1032 edata_sz = (40 /* directory */
1033 + 4 * export_table_size /* addresses */
1034 + 4 * count_exported_byname /* name ptrs */
1035 + 2 * count_exported_byname /* ordinals */
1036 + name_table_size + strlen (dll_name) + 1);
1039 /* Fill the exported symbol offsets. The preliminary work has already
1040 been done in process_def_file(). */
1042 static void
1043 fill_exported_offsets (bfd *abfd ATTRIBUTE_UNUSED, struct bfd_link_info *info)
1045 int i;
1046 struct bfd_link_hash_entry *blhe;
1048 for (i = 0; i < pe_def_file->num_exports; i++)
1050 char *name;
1052 name = xmalloc (strlen (pe_def_file->exports[i].internal_name) + 2);
1053 if (pe_details->underscored
1054 && *pe_def_file->exports[i].internal_name != '@')
1056 *name = '_';
1057 strcpy (name + 1, pe_def_file->exports[i].internal_name);
1059 else
1060 strcpy (name, pe_def_file->exports[i].internal_name);
1062 blhe = bfd_link_hash_lookup (info->hash,
1063 name,
1064 FALSE, FALSE, TRUE);
1066 if (blhe && blhe->type == bfd_link_hash_defined)
1067 exported_symbol_offsets[i] = blhe->u.def.value;
1069 free (name);
1073 static void
1074 fill_edata (bfd *abfd, struct bfd_link_info *info ATTRIBUTE_UNUSED)
1076 int s, hint;
1077 unsigned char *edirectory;
1078 unsigned char *eaddresses;
1079 unsigned char *enameptrs;
1080 unsigned char *eordinals;
1081 char *enamestr;
1082 time_t now;
1084 time (&now);
1086 edata_d = xmalloc (edata_sz);
1088 /* Note use of array pointer math here. */
1089 edirectory = edata_d;
1090 eaddresses = edata_d + 40;
1091 enameptrs = eaddresses + 4 * export_table_size;
1092 eordinals = enameptrs + 4 * count_exported_byname;
1093 enamestr = (char *) eordinals + 2 * count_exported_byname;
1095 #define ERVA(ptr) (((unsigned char *)(ptr) - edata_d) \
1096 + edata_s->output_section->vma - image_base)
1098 memset (edata_d, 0, edata_sz);
1099 bfd_put_32 (abfd, now, edata_d + 4);
1100 if (pe_def_file->version_major != -1)
1102 bfd_put_16 (abfd, pe_def_file->version_major, edata_d + 8);
1103 bfd_put_16 (abfd, pe_def_file->version_minor, edata_d + 10);
1106 bfd_put_32 (abfd, ERVA (enamestr), edata_d + 12);
1107 strcpy (enamestr, dll_name);
1108 enamestr += strlen (enamestr) + 1;
1109 bfd_put_32 (abfd, min_ordinal, edata_d + 16);
1110 bfd_put_32 (abfd, export_table_size, edata_d + 20);
1111 bfd_put_32 (abfd, count_exported_byname, edata_d + 24);
1112 bfd_put_32 (abfd, ERVA (eaddresses), edata_d + 28);
1113 bfd_put_32 (abfd, ERVA (enameptrs), edata_d + 32);
1114 bfd_put_32 (abfd, ERVA (eordinals), edata_d + 36);
1116 fill_exported_offsets (abfd, info);
1118 /* Ok, now for the filling in part.
1119 Scan alphabetically - ie the ordering in the exports[] table,
1120 rather than by ordinal - the ordering in the exported_symbol[]
1121 table. See dlltool.c and:
1122 http://sources.redhat.com/ml/binutils/2003-04/msg00379.html
1123 for more information. */
1124 hint = 0;
1125 for (s = 0; s < NE; s++)
1127 struct bfd_section *ssec = exported_symbol_sections[s];
1128 if (pe_def_file->exports[s].ordinal != -1 &&
1129 (pe_def_file->exports[s].flag_forward || ssec != NULL))
1131 int ord = pe_def_file->exports[s].ordinal;
1133 if (pe_def_file->exports[s].flag_forward)
1135 bfd_put_32 (abfd, ERVA (enamestr),
1136 eaddresses + 4 * (ord - min_ordinal));
1138 strcpy (enamestr, pe_def_file->exports[s].internal_name);
1139 enamestr += strlen (pe_def_file->exports[s].internal_name) + 1;
1141 else
1143 bfd_vma srva = (exported_symbol_offsets[s]
1144 + ssec->output_section->vma
1145 + ssec->output_offset);
1147 bfd_put_32 (abfd, srva - image_base,
1148 eaddresses + 4 * (ord - min_ordinal));
1151 if (!pe_def_file->exports[s].flag_noname)
1153 char *ename = pe_def_file->exports[s].name;
1155 bfd_put_32 (abfd, ERVA (enamestr), enameptrs);
1156 enameptrs += 4;
1157 strcpy (enamestr, ename);
1158 enamestr += strlen (enamestr) + 1;
1159 bfd_put_16 (abfd, ord - min_ordinal, eordinals);
1160 eordinals += 2;
1161 pe_def_file->exports[s].hint = hint++;
1168 static struct bfd_section *current_sec;
1170 void
1171 pe_walk_relocs_of_symbol (struct bfd_link_info *info,
1172 const char *name,
1173 int (*cb) (arelent *, asection *))
1175 bfd *b;
1176 asection *s;
1178 for (b = info->input_bfds; b; b = b->link_next)
1180 asymbol **symbols;
1181 int nsyms;
1183 if (!bfd_generic_link_read_symbols (b))
1185 einfo (_("%B%F: could not read symbols: %E\n"), b);
1186 return;
1189 symbols = bfd_get_outsymbols (b);
1190 nsyms = bfd_get_symcount (b);
1192 for (s = b->sections; s; s = s->next)
1194 arelent **relocs;
1195 int relsize, nrelocs, i;
1196 int flags = bfd_get_section_flags (b, s);
1198 /* Skip discarded linkonce sections. */
1199 if (flags & SEC_LINK_ONCE
1200 && s->output_section == bfd_abs_section_ptr)
1201 continue;
1203 current_sec = s;
1205 relsize = bfd_get_reloc_upper_bound (b, s);
1206 relocs = xmalloc (relsize);
1207 nrelocs = bfd_canonicalize_reloc (b, s, relocs, symbols);
1209 for (i = 0; i < nrelocs; i++)
1211 struct bfd_symbol *sym = *relocs[i]->sym_ptr_ptr;
1213 if (!strcmp (name, sym->name))
1214 cb (relocs[i], s);
1217 free (relocs);
1219 /* Warning: the allocated symbols are remembered in BFD and reused
1220 later, so don't free them! */
1221 /* free (symbols); */
1226 /* Gather all the relocations and build the .reloc section. */
1228 static void
1229 generate_reloc (bfd *abfd, struct bfd_link_info *info)
1232 /* For .reloc stuff. */
1233 reloc_data_type *reloc_data;
1234 int total_relocs = 0;
1235 int i;
1236 bfd_vma sec_page = (bfd_vma) -1;
1237 bfd_vma page_ptr, page_count;
1238 int bi;
1239 bfd *b;
1240 struct bfd_section *s;
1242 total_relocs = 0;
1243 for (b = info->input_bfds; b; b = b->link_next)
1244 for (s = b->sections; s; s = s->next)
1245 total_relocs += s->reloc_count;
1247 reloc_data = xmalloc (total_relocs * sizeof (reloc_data_type));
1249 total_relocs = 0;
1250 bi = 0;
1251 for (bi = 0, b = info->input_bfds; b; bi++, b = b->link_next)
1253 arelent **relocs;
1254 int relsize, nrelocs, i;
1256 for (s = b->sections; s; s = s->next)
1258 bfd_vma sec_vma = s->output_section->vma + s->output_offset;
1259 asymbol **symbols;
1260 int nsyms;
1262 /* If it's not loaded, we don't need to relocate it this way. */
1263 if (!(s->output_section->flags & SEC_LOAD))
1264 continue;
1266 /* I don't know why there would be a reloc for these, but I've
1267 seen it happen - DJ */
1268 if (s->output_section == &bfd_abs_section)
1269 continue;
1271 if (s->output_section->vma == 0)
1273 /* Huh? Shouldn't happen, but punt if it does. */
1274 einfo ("DJ: zero vma section reloc detected: `%s' #%d f=%d\n",
1275 s->output_section->name, s->output_section->index,
1276 s->output_section->flags);
1277 continue;
1280 if (!bfd_generic_link_read_symbols (b))
1282 einfo (_("%B%F: could not read symbols: %E\n"), b);
1283 return;
1286 symbols = bfd_get_outsymbols (b);
1287 nsyms = bfd_get_symcount (b);
1288 relsize = bfd_get_reloc_upper_bound (b, s);
1289 relocs = xmalloc (relsize);
1290 nrelocs = bfd_canonicalize_reloc (b, s, relocs, symbols);
1292 for (i = 0; i < nrelocs; i++)
1294 if (pe_dll_extra_pe_debug)
1296 struct bfd_symbol *sym = *relocs[i]->sym_ptr_ptr;
1297 printf ("rel: %s\n", sym->name);
1299 if (!relocs[i]->howto->pc_relative
1300 && relocs[i]->howto->type != pe_details->imagebase_reloc)
1302 bfd_vma sym_vma;
1303 struct bfd_symbol *sym = *relocs[i]->sym_ptr_ptr;
1305 /* Don't create relocs for undefined weak symbols. */
1306 if (sym->flags == BSF_WEAK)
1308 struct bfd_link_hash_entry *blhe
1309 = bfd_link_hash_lookup (info->hash, sym->name,
1310 FALSE, FALSE, FALSE);
1311 if (!blhe || blhe->type != bfd_link_hash_defined)
1312 continue;
1315 sym_vma = (relocs[i]->addend
1316 + sym->value
1317 + sym->section->vma
1318 + sym->section->output_offset
1319 + sym->section->output_section->vma);
1320 reloc_data[total_relocs].vma = sec_vma + relocs[i]->address;
1322 #define BITS_AND_SHIFT(bits, shift) (bits * 1000 | shift)
1324 switch BITS_AND_SHIFT (relocs[i]->howto->bitsize,
1325 relocs[i]->howto->rightshift)
1327 #ifdef pe_use_x86_64
1328 case BITS_AND_SHIFT (64, 0):
1329 reloc_data[total_relocs].type = 10;
1330 total_relocs++;
1331 break;
1332 #endif
1333 case BITS_AND_SHIFT (32, 0):
1334 reloc_data[total_relocs].type = 3;
1335 total_relocs++;
1336 break;
1337 case BITS_AND_SHIFT (16, 0):
1338 reloc_data[total_relocs].type = 2;
1339 total_relocs++;
1340 break;
1341 case BITS_AND_SHIFT (16, 16):
1342 reloc_data[total_relocs].type = 4;
1343 /* FIXME: we can't know the symbol's right value
1344 yet, but we probably can safely assume that
1345 CE will relocate us in 64k blocks, so leaving
1346 it zero is safe. */
1347 reloc_data[total_relocs].extra = 0;
1348 total_relocs++;
1349 break;
1350 case BITS_AND_SHIFT (26, 2):
1351 reloc_data[total_relocs].type = 5;
1352 total_relocs++;
1353 break;
1354 case BITS_AND_SHIFT (24, 2):
1355 /* FIXME: 0 is ARM_26D, it is defined in bfd/coff-arm.c
1356 Those ARM_xxx definitions should go in proper
1357 header someday. */
1358 if (relocs[i]->howto->type == 0
1359 /* Older GNU linkers used 5 instead of 0 for this reloc. */
1360 || relocs[i]->howto->type == 5)
1361 /* This is an ARM_26D reloc, which is an ARM_26 reloc
1362 that has already been fully processed during a
1363 previous link stage, so ignore it here. */
1364 break;
1365 /* Fall through. */
1366 default:
1367 /* xgettext:c-format */
1368 einfo (_("%XError: %d-bit reloc in dll\n"),
1369 relocs[i]->howto->bitsize);
1370 break;
1374 free (relocs);
1375 /* Warning: the allocated symbols are remembered in BFD and
1376 reused later, so don't free them! */
1380 /* At this point, we have total_relocs relocation addresses in
1381 reloc_addresses, which are all suitable for the .reloc section.
1382 We must now create the new sections. */
1383 qsort (reloc_data, total_relocs, sizeof (*reloc_data), reloc_sort);
1385 for (i = 0; i < total_relocs; i++)
1387 bfd_vma this_page = (reloc_data[i].vma >> 12);
1389 if (this_page != sec_page)
1391 reloc_sz = (reloc_sz + 3) & ~3; /* 4-byte align. */
1392 reloc_sz += 8;
1393 sec_page = this_page;
1396 reloc_sz += 2;
1398 if (reloc_data[i].type == 4)
1399 reloc_sz += 2;
1402 reloc_sz = (reloc_sz + 3) & ~3; /* 4-byte align. */
1403 reloc_d = xmalloc (reloc_sz);
1404 sec_page = (bfd_vma) -1;
1405 reloc_sz = 0;
1406 page_ptr = (bfd_vma) -1;
1407 page_count = 0;
1409 for (i = 0; i < total_relocs; i++)
1411 bfd_vma rva = reloc_data[i].vma - image_base;
1412 bfd_vma this_page = (rva & ~0xfff);
1414 if (this_page != sec_page)
1416 while (reloc_sz & 3)
1417 reloc_d[reloc_sz++] = 0;
1419 if (page_ptr != (bfd_vma) -1)
1420 bfd_put_32 (abfd, reloc_sz - page_ptr, reloc_d + page_ptr + 4);
1422 bfd_put_32 (abfd, this_page, reloc_d + reloc_sz);
1423 page_ptr = reloc_sz;
1424 reloc_sz += 8;
1425 sec_page = this_page;
1426 page_count = 0;
1429 bfd_put_16 (abfd, (rva & 0xfff) + (reloc_data[i].type << 12),
1430 reloc_d + reloc_sz);
1431 reloc_sz += 2;
1433 if (reloc_data[i].type == 4)
1435 bfd_put_16 (abfd, reloc_data[i].extra, reloc_d + reloc_sz);
1436 reloc_sz += 2;
1439 page_count++;
1442 while (reloc_sz & 3)
1443 reloc_d[reloc_sz++] = 0;
1445 if (page_ptr != (bfd_vma) -1)
1446 bfd_put_32 (abfd, reloc_sz - page_ptr, reloc_d + page_ptr + 4);
1448 while (reloc_sz < reloc_s->size)
1449 reloc_d[reloc_sz++] = 0;
1452 /* Given the exiting def_file structure, print out a .DEF file that
1453 corresponds to it. */
1455 static void
1456 quoteput (char *s, FILE *f, int needs_quotes)
1458 char *cp;
1460 for (cp = s; *cp; cp++)
1461 if (*cp == '\''
1462 || *cp == '"'
1463 || *cp == '\\'
1464 || ISSPACE (*cp)
1465 || *cp == ','
1466 || *cp == ';')
1467 needs_quotes = 1;
1469 if (needs_quotes)
1471 putc ('"', f);
1473 while (*s)
1475 if (*s == '"' || *s == '\\')
1476 putc ('\\', f);
1478 putc (*s, f);
1479 s++;
1482 putc ('"', f);
1484 else
1485 fputs (s, f);
1488 void
1489 pe_dll_generate_def_file (const char *pe_out_def_filename)
1491 int i;
1492 FILE *out = fopen (pe_out_def_filename, "w");
1494 if (out == NULL)
1495 /* xgettext:c-format */
1496 einfo (_("%s: Can't open output def file %s\n"),
1497 program_name, pe_out_def_filename);
1499 if (pe_def_file)
1501 if (pe_def_file->name)
1503 if (pe_def_file->is_dll)
1504 fprintf (out, "LIBRARY ");
1505 else
1506 fprintf (out, "NAME ");
1508 quoteput (pe_def_file->name, out, 1);
1510 if (pe_data (link_info.output_bfd)->pe_opthdr.ImageBase)
1512 fprintf (out, " BASE=0x");
1513 fprintf_vma (out, ((bfd_vma) pe_data (link_info.output_bfd)->pe_opthdr.ImageBase));
1515 fprintf (out, "\n");
1518 if (pe_def_file->description)
1520 fprintf (out, "DESCRIPTION ");
1521 quoteput (pe_def_file->description, out, 1);
1522 fprintf (out, "\n");
1525 if (pe_def_file->version_minor != -1)
1526 fprintf (out, "VERSION %d.%d\n", pe_def_file->version_major,
1527 pe_def_file->version_minor);
1528 else if (pe_def_file->version_major != -1)
1529 fprintf (out, "VERSION %d\n", pe_def_file->version_major);
1531 if (pe_def_file->stack_reserve != -1 || pe_def_file->heap_reserve != -1)
1532 fprintf (out, "\n");
1534 if (pe_def_file->stack_commit != -1)
1535 fprintf (out, "STACKSIZE 0x%x,0x%x\n",
1536 pe_def_file->stack_reserve, pe_def_file->stack_commit);
1537 else if (pe_def_file->stack_reserve != -1)
1538 fprintf (out, "STACKSIZE 0x%x\n", pe_def_file->stack_reserve);
1540 if (pe_def_file->heap_commit != -1)
1541 fprintf (out, "HEAPSIZE 0x%x,0x%x\n",
1542 pe_def_file->heap_reserve, pe_def_file->heap_commit);
1543 else if (pe_def_file->heap_reserve != -1)
1544 fprintf (out, "HEAPSIZE 0x%x\n", pe_def_file->heap_reserve);
1546 if (pe_def_file->num_section_defs > 0)
1548 fprintf (out, "\nSECTIONS\n\n");
1550 for (i = 0; i < pe_def_file->num_section_defs; i++)
1552 fprintf (out, " ");
1553 quoteput (pe_def_file->section_defs[i].name, out, 0);
1555 if (pe_def_file->section_defs[i].class)
1557 fprintf (out, " CLASS ");
1558 quoteput (pe_def_file->section_defs[i].class, out, 0);
1561 if (pe_def_file->section_defs[i].flag_read)
1562 fprintf (out, " READ");
1564 if (pe_def_file->section_defs[i].flag_write)
1565 fprintf (out, " WRITE");
1567 if (pe_def_file->section_defs[i].flag_execute)
1568 fprintf (out, " EXECUTE");
1570 if (pe_def_file->section_defs[i].flag_shared)
1571 fprintf (out, " SHARED");
1573 fprintf (out, "\n");
1577 if (pe_def_file->num_exports > 0)
1579 fprintf (out, "EXPORTS\n");
1581 for (i = 0; i < pe_def_file->num_exports; i++)
1583 def_file_export *e = pe_def_file->exports + i;
1584 fprintf (out, " ");
1585 quoteput (e->name, out, 0);
1587 if (e->internal_name && strcmp (e->internal_name, e->name))
1589 fprintf (out, " = ");
1590 quoteput (e->internal_name, out, 0);
1593 if (e->ordinal != -1)
1594 fprintf (out, " @%d", e->ordinal);
1596 if (e->flag_private)
1597 fprintf (out, " PRIVATE");
1599 if (e->flag_constant)
1600 fprintf (out, " CONSTANT");
1602 if (e->flag_noname)
1603 fprintf (out, " NONAME");
1605 if (e->flag_data)
1606 fprintf (out, " DATA");
1608 fprintf (out, "\n");
1612 if (pe_def_file->num_imports > 0)
1614 fprintf (out, "\nIMPORTS\n\n");
1616 for (i = 0; i < pe_def_file->num_imports; i++)
1618 def_file_import *im = pe_def_file->imports + i;
1619 fprintf (out, " ");
1621 if (im->internal_name
1622 && (!im->name || strcmp (im->internal_name, im->name)))
1624 quoteput (im->internal_name, out, 0);
1625 fprintf (out, " = ");
1628 quoteput (im->module->name, out, 0);
1629 fprintf (out, ".");
1631 if (im->name)
1632 quoteput (im->name, out, 0);
1633 else
1634 fprintf (out, "%d", im->ordinal);
1636 fprintf (out, "\n");
1640 else
1641 fprintf (out, _("; no contents available\n"));
1643 if (fclose (out) == EOF)
1644 /* xgettext:c-format */
1645 einfo (_("%P: Error closing file `%s'\n"), pe_out_def_filename);
1648 /* Generate the import library. */
1650 static asymbol **symtab;
1651 static int symptr;
1652 static int tmp_seq;
1653 static const char *dll_filename;
1654 static char *dll_symname;
1656 #define UNDSEC (asection *) &bfd_und_section
1658 static asection *
1659 quick_section (bfd *abfd, const char *name, int flags, int align)
1661 asection *sec;
1662 asymbol *sym;
1664 sec = bfd_make_section_old_way (abfd, name);
1665 bfd_set_section_flags (abfd, sec, flags | SEC_ALLOC | SEC_LOAD | SEC_KEEP);
1666 bfd_set_section_alignment (abfd, sec, align);
1667 /* Remember to undo this before trying to link internally! */
1668 sec->output_section = sec;
1670 sym = bfd_make_empty_symbol (abfd);
1671 symtab[symptr++] = sym;
1672 sym->name = sec->name;
1673 sym->section = sec;
1674 sym->flags = BSF_LOCAL;
1675 sym->value = 0;
1677 return sec;
1680 static void
1681 quick_symbol (bfd *abfd,
1682 const char *n1,
1683 const char *n2,
1684 const char *n3,
1685 asection *sec,
1686 int flags,
1687 int addr)
1689 asymbol *sym;
1690 char *name = xmalloc (strlen (n1) + strlen (n2) + strlen (n3) + 1);
1692 strcpy (name, n1);
1693 strcat (name, n2);
1694 strcat (name, n3);
1695 sym = bfd_make_empty_symbol (abfd);
1696 sym->name = name;
1697 sym->section = sec;
1698 sym->flags = flags;
1699 sym->value = addr;
1700 symtab[symptr++] = sym;
1703 static arelent *reltab = 0;
1704 static int relcount = 0, relsize = 0;
1706 static void
1707 quick_reloc (bfd *abfd, bfd_size_type address, int which_howto, int symidx)
1709 if (relcount >= relsize - 1)
1711 relsize += 10;
1712 if (reltab)
1713 reltab = xrealloc (reltab, relsize * sizeof (arelent));
1714 else
1715 reltab = xmalloc (relsize * sizeof (arelent));
1717 reltab[relcount].address = address;
1718 reltab[relcount].addend = 0;
1719 reltab[relcount].howto = bfd_reloc_type_lookup (abfd, which_howto);
1720 reltab[relcount].sym_ptr_ptr = symtab + symidx;
1721 relcount++;
1724 static void
1725 save_relocs (asection *sec)
1727 int i;
1729 sec->relocation = reltab;
1730 sec->reloc_count = relcount;
1731 sec->orelocation = xmalloc ((relcount + 1) * sizeof (arelent *));
1732 for (i = 0; i < relcount; i++)
1733 sec->orelocation[i] = sec->relocation + i;
1734 sec->orelocation[relcount] = 0;
1735 sec->flags |= SEC_RELOC;
1736 reltab = 0;
1737 relcount = relsize = 0;
1740 /* .section .idata$2
1741 .global __head_my_dll
1742 __head_my_dll:
1743 .rva hname
1744 .long 0
1745 .long 0
1746 .rva __my_dll_iname
1747 .rva fthunk
1749 .section .idata$5
1750 .long 0
1751 fthunk:
1753 .section .idata$4
1754 .long 0
1755 hname: */
1757 static bfd *
1758 make_head (bfd *parent)
1760 asection *id2, *id5, *id4;
1761 unsigned char *d2, *d5, *d4;
1762 char *oname;
1763 bfd *abfd;
1765 oname = xmalloc (20);
1766 sprintf (oname, "d%06d.o", tmp_seq);
1767 tmp_seq++;
1769 abfd = bfd_create (oname, parent);
1770 bfd_find_target (pe_details->object_target, abfd);
1771 bfd_make_writable (abfd);
1773 bfd_set_format (abfd, bfd_object);
1774 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
1776 symptr = 0;
1777 symtab = xmalloc (6 * sizeof (asymbol *));
1778 id2 = quick_section (abfd, ".idata$2", SEC_HAS_CONTENTS, 2);
1779 id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
1780 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
1781 quick_symbol (abfd, U ("_head_"), dll_symname, "", id2, BSF_GLOBAL, 0);
1782 quick_symbol (abfd, U (""), dll_symname, "_iname", UNDSEC, BSF_GLOBAL, 0);
1784 /* OK, pay attention here. I got confused myself looking back at
1785 it. We create a four-byte section to mark the beginning of the
1786 list, and we include an offset of 4 in the section, so that the
1787 pointer to the list points to the *end* of this section, which is
1788 the start of the list of sections from other objects. */
1790 bfd_set_section_size (abfd, id2, 20);
1791 d2 = xmalloc (20);
1792 id2->contents = d2;
1793 memset (d2, 0, 20);
1794 d2[0] = d2[16] = PE_IDATA5_SIZE; /* Reloc addend. */
1795 quick_reloc (abfd, 0, BFD_RELOC_RVA, 2);
1796 quick_reloc (abfd, 12, BFD_RELOC_RVA, 4);
1797 quick_reloc (abfd, 16, BFD_RELOC_RVA, 1);
1798 save_relocs (id2);
1800 bfd_set_section_size (abfd, id5, PE_IDATA5_SIZE);
1801 d5 = xmalloc (PE_IDATA5_SIZE);
1802 id5->contents = d5;
1803 memset (d5, 0, PE_IDATA5_SIZE);
1805 bfd_set_section_size (abfd, id4, PE_IDATA4_SIZE);
1806 d4 = xmalloc (PE_IDATA4_SIZE);
1807 id4->contents = d4;
1808 memset (d4, 0, PE_IDATA4_SIZE);
1810 bfd_set_symtab (abfd, symtab, symptr);
1812 bfd_set_section_contents (abfd, id2, d2, 0, 20);
1813 bfd_set_section_contents (abfd, id5, d5, 0, PE_IDATA5_SIZE);
1814 bfd_set_section_contents (abfd, id4, d4, 0, PE_IDATA4_SIZE);
1816 bfd_make_readable (abfd);
1817 return abfd;
1820 /* .section .idata$4
1821 .long 0
1822 [.long 0] for PE+
1823 .section .idata$5
1824 .long 0
1825 [.long 0] for PE+
1826 .section idata$7
1827 .global __my_dll_iname
1828 __my_dll_iname:
1829 .asciz "my.dll" */
1831 static bfd *
1832 make_tail (bfd *parent)
1834 asection *id4, *id5, *id7;
1835 unsigned char *d4, *d5, *d7;
1836 int len;
1837 char *oname;
1838 bfd *abfd;
1840 oname = xmalloc (20);
1841 sprintf (oname, "d%06d.o", tmp_seq);
1842 tmp_seq++;
1844 abfd = bfd_create (oname, parent);
1845 bfd_find_target (pe_details->object_target, abfd);
1846 bfd_make_writable (abfd);
1848 bfd_set_format (abfd, bfd_object);
1849 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
1851 symptr = 0;
1852 symtab = xmalloc (5 * sizeof (asymbol *));
1853 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
1854 id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
1855 id7 = quick_section (abfd, ".idata$7", SEC_HAS_CONTENTS, 2);
1856 quick_symbol (abfd, U (""), dll_symname, "_iname", id7, BSF_GLOBAL, 0);
1858 bfd_set_section_size (abfd, id4, PE_IDATA4_SIZE);
1859 d4 = xmalloc (PE_IDATA4_SIZE);
1860 id4->contents = d4;
1861 memset (d4, 0, PE_IDATA4_SIZE);
1863 bfd_set_section_size (abfd, id5, PE_IDATA5_SIZE);
1864 d5 = xmalloc (PE_IDATA5_SIZE);
1865 id5->contents = d5;
1866 memset (d5, 0, PE_IDATA5_SIZE);
1868 len = strlen (dll_filename) + 1;
1869 if (len & 1)
1870 len++;
1871 bfd_set_section_size (abfd, id7, len);
1872 d7 = xmalloc (len);
1873 id7->contents = d7;
1874 strcpy ((char *) d7, dll_filename);
1875 /* If len was odd, the above
1876 strcpy leaves behind an undefined byte. That is harmless,
1877 but we set it to 0 just so the binary dumps are pretty. */
1878 d7[len - 1] = 0;
1880 bfd_set_symtab (abfd, symtab, symptr);
1882 bfd_set_section_contents (abfd, id4, d4, 0, PE_IDATA4_SIZE);
1883 bfd_set_section_contents (abfd, id5, d5, 0, PE_IDATA5_SIZE);
1884 bfd_set_section_contents (abfd, id7, d7, 0, len);
1886 bfd_make_readable (abfd);
1887 return abfd;
1890 /* .text
1891 .global _function
1892 .global ___imp_function
1893 .global __imp__function
1894 _function:
1895 jmp *__imp__function:
1897 .section idata$7
1898 .long __head_my_dll
1900 .section .idata$5
1901 ___imp_function:
1902 __imp__function:
1903 iat?
1904 .section .idata$4
1905 iat?
1906 .section .idata$6
1907 ID<ordinal>:
1908 .short <hint>
1909 .asciz "function" xlate? (add underscore, kill at) */
1911 static const unsigned char jmp_ix86_bytes[] =
1913 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x90, 0x90
1916 /* _function:
1917 mov.l ip+8,r0
1918 mov.l @r0,r0
1919 jmp @r0
1921 .dw __imp_function */
1923 static const unsigned char jmp_sh_bytes[] =
1925 0x01, 0xd0, 0x02, 0x60, 0x2b, 0x40, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00
1928 /* _function:
1929 lui $t0,<high:__imp_function>
1930 lw $t0,<low:__imp_function>
1931 jr $t0
1932 nop */
1934 static const unsigned char jmp_mips_bytes[] =
1936 0x00, 0x00, 0x08, 0x3c, 0x00, 0x00, 0x08, 0x8d,
1937 0x08, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00
1940 static const unsigned char jmp_arm_bytes[] =
1942 0x00, 0xc0, 0x9f, 0xe5, /* ldr ip, [pc] */
1943 0x00, 0xf0, 0x9c, 0xe5, /* ldr pc, [ip] */
1944 0, 0, 0, 0
1948 static bfd *
1949 make_one (def_file_export *exp, bfd *parent, bfd_boolean include_jmp_stub)
1951 asection *tx, *id7, *id5, *id4, *id6;
1952 unsigned char *td = NULL, *d7, *d5, *d4, *d6 = NULL;
1953 int len;
1954 char *oname;
1955 bfd *abfd;
1956 const unsigned char *jmp_bytes = NULL;
1957 int jmp_byte_count = 0;
1959 /* Include the jump stub section only if it is needed. A jump
1960 stub is needed if the symbol being imported <sym> is a function
1961 symbol and there is at least one undefined reference to that
1962 symbol. In other words, if all the import references to <sym> are
1963 explicitly through _declspec(dllimport) then the jump stub is not
1964 needed. */
1965 if (include_jmp_stub)
1967 switch (pe_details->pe_arch)
1969 case PE_ARCH_i386:
1970 jmp_bytes = jmp_ix86_bytes;
1971 jmp_byte_count = sizeof (jmp_ix86_bytes);
1972 break;
1973 case PE_ARCH_sh:
1974 jmp_bytes = jmp_sh_bytes;
1975 jmp_byte_count = sizeof (jmp_sh_bytes);
1976 break;
1977 case PE_ARCH_mips:
1978 jmp_bytes = jmp_mips_bytes;
1979 jmp_byte_count = sizeof (jmp_mips_bytes);
1980 break;
1981 case PE_ARCH_arm:
1982 case PE_ARCH_arm_epoc:
1983 case PE_ARCH_arm_wince:
1984 jmp_bytes = jmp_arm_bytes;
1985 jmp_byte_count = sizeof (jmp_arm_bytes);
1986 break;
1987 default:
1988 abort ();
1992 oname = xmalloc (20);
1993 sprintf (oname, "d%06d.o", tmp_seq);
1994 tmp_seq++;
1996 abfd = bfd_create (oname, parent);
1997 bfd_find_target (pe_details->object_target, abfd);
1998 bfd_make_writable (abfd);
2000 bfd_set_format (abfd, bfd_object);
2001 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2003 symptr = 0;
2004 symtab = xmalloc (11 * sizeof (asymbol *));
2005 tx = quick_section (abfd, ".text", SEC_CODE|SEC_HAS_CONTENTS, 2);
2006 id7 = quick_section (abfd, ".idata$7", SEC_HAS_CONTENTS, 2);
2007 id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
2008 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
2009 id6 = quick_section (abfd, ".idata$6", SEC_HAS_CONTENTS, 2);
2011 if (*exp->internal_name == '@')
2013 quick_symbol (abfd, U ("_head_"), dll_symname, "", UNDSEC,
2014 BSF_GLOBAL, 0);
2015 if (include_jmp_stub)
2016 quick_symbol (abfd, "", exp->internal_name, "", tx, BSF_GLOBAL, 0);
2017 quick_symbol (abfd, "__imp_", exp->internal_name, "", id5,
2018 BSF_GLOBAL, 0);
2019 /* Fastcall applies only to functions,
2020 so no need for auto-import symbol. */
2022 else
2024 quick_symbol (abfd, U ("_head_"), dll_symname, "", UNDSEC,
2025 BSF_GLOBAL, 0);
2026 if (include_jmp_stub)
2027 quick_symbol (abfd, U (""), exp->internal_name, "", tx,
2028 BSF_GLOBAL, 0);
2029 quick_symbol (abfd, "__imp_", U (""), exp->internal_name, id5,
2030 BSF_GLOBAL, 0);
2031 /* Symbol to reference ord/name of imported
2032 data symbol, used to implement auto-import. */
2033 if (exp->flag_data)
2034 quick_symbol (abfd, U ("_nm_"), U (""), exp->internal_name, id6,
2035 BSF_GLOBAL,0);
2037 if (pe_dll_compat_implib)
2038 quick_symbol (abfd, U ("__imp_"), exp->internal_name, "", id5,
2039 BSF_GLOBAL, 0);
2041 if (include_jmp_stub)
2043 bfd_set_section_size (abfd, tx, jmp_byte_count);
2044 td = xmalloc (jmp_byte_count);
2045 tx->contents = td;
2046 memcpy (td, jmp_bytes, jmp_byte_count);
2048 switch (pe_details->pe_arch)
2050 case PE_ARCH_i386:
2051 #ifdef pe_use_x86_64
2052 quick_reloc (abfd, 2, BFD_RELOC_32_PCREL, 2);
2053 #else
2054 quick_reloc (abfd, 2, BFD_RELOC_32, 2);
2055 #endif
2056 break;
2057 case PE_ARCH_sh:
2058 quick_reloc (abfd, 8, BFD_RELOC_32, 2);
2059 break;
2060 case PE_ARCH_mips:
2061 quick_reloc (abfd, 0, BFD_RELOC_HI16_S, 2);
2062 quick_reloc (abfd, 0, BFD_RELOC_LO16, 0); /* MIPS_R_PAIR */
2063 quick_reloc (abfd, 4, BFD_RELOC_LO16, 2);
2064 break;
2065 case PE_ARCH_arm:
2066 case PE_ARCH_arm_epoc:
2067 case PE_ARCH_arm_wince:
2068 quick_reloc (abfd, 8, BFD_RELOC_32, 2);
2069 break;
2070 default:
2071 abort ();
2073 save_relocs (tx);
2075 else
2076 bfd_set_section_size (abfd, tx, 0);
2078 bfd_set_section_size (abfd, id7, 4);
2079 d7 = xmalloc (4);
2080 id7->contents = d7;
2081 memset (d7, 0, 4);
2082 quick_reloc (abfd, 0, BFD_RELOC_RVA, 5);
2083 save_relocs (id7);
2085 bfd_set_section_size (abfd, id5, PE_IDATA5_SIZE);
2086 d5 = xmalloc (PE_IDATA5_SIZE);
2087 id5->contents = d5;
2088 memset (d5, 0, PE_IDATA5_SIZE);
2090 if (exp->flag_noname)
2092 d5[0] = exp->ordinal;
2093 d5[1] = exp->ordinal >> 8;
2094 d5[PE_IDATA5_SIZE - 1] = 0x80;
2096 else
2098 quick_reloc (abfd, 0, BFD_RELOC_RVA, 4);
2099 save_relocs (id5);
2102 bfd_set_section_size (abfd, id4, PE_IDATA4_SIZE);
2103 d4 = xmalloc (PE_IDATA4_SIZE);
2104 id4->contents = d4;
2105 memset (d4, 0, PE_IDATA4_SIZE);
2107 if (exp->flag_noname)
2109 d4[0] = exp->ordinal;
2110 d4[1] = exp->ordinal >> 8;
2111 d4[PE_IDATA4_SIZE - 1] = 0x80;
2113 else
2115 quick_reloc (abfd, 0, BFD_RELOC_RVA, 4);
2116 save_relocs (id4);
2119 if (exp->flag_noname)
2121 len = 0;
2122 bfd_set_section_size (abfd, id6, 0);
2124 else
2126 /* { short, asciz } */
2127 len = 2 + strlen (exp->name) + 1;
2128 if (len & 1)
2129 len++;
2130 bfd_set_section_size (abfd, id6, len);
2131 d6 = xmalloc (len);
2132 id6->contents = d6;
2133 memset (d6, 0, len);
2134 d6[0] = exp->hint & 0xff;
2135 d6[1] = exp->hint >> 8;
2136 strcpy ((char *) d6 + 2, exp->name);
2139 bfd_set_symtab (abfd, symtab, symptr);
2141 if (include_jmp_stub)
2142 bfd_set_section_contents (abfd, tx, td, 0, jmp_byte_count);
2143 bfd_set_section_contents (abfd, id7, d7, 0, 4);
2144 bfd_set_section_contents (abfd, id5, d5, 0, PE_IDATA5_SIZE);
2145 bfd_set_section_contents (abfd, id4, d4, 0, PE_IDATA4_SIZE);
2146 if (!exp->flag_noname)
2147 bfd_set_section_contents (abfd, id6, d6, 0, len);
2149 bfd_make_readable (abfd);
2150 return abfd;
2153 static bfd *
2154 make_singleton_name_thunk (const char *import, bfd *parent)
2156 /* Name thunks go to idata$4. */
2157 asection *id4;
2158 unsigned char *d4;
2159 char *oname;
2160 bfd *abfd;
2162 oname = xmalloc (20);
2163 sprintf (oname, "nmth%06d.o", tmp_seq);
2164 tmp_seq++;
2166 abfd = bfd_create (oname, parent);
2167 bfd_find_target (pe_details->object_target, abfd);
2168 bfd_make_writable (abfd);
2170 bfd_set_format (abfd, bfd_object);
2171 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2173 symptr = 0;
2174 symtab = xmalloc (3 * sizeof (asymbol *));
2175 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
2176 quick_symbol (abfd, U ("_nm_thnk_"), import, "", id4, BSF_GLOBAL, 0);
2177 quick_symbol (abfd, U ("_nm_"), import, "", UNDSEC, BSF_GLOBAL, 0);
2179 /* We need space for the real thunk and for the null terminator. */
2180 bfd_set_section_size (abfd, id4, PE_IDATA4_SIZE * 2);
2181 d4 = xmalloc (PE_IDATA4_SIZE * 2);
2182 id4->contents = d4;
2183 memset (d4, 0, PE_IDATA4_SIZE * 2);
2184 quick_reloc (abfd, 0, BFD_RELOC_RVA, 2);
2185 save_relocs (id4);
2187 bfd_set_symtab (abfd, symtab, symptr);
2189 bfd_set_section_contents (abfd, id4, d4, 0, PE_IDATA4_SIZE * 2);
2191 bfd_make_readable (abfd);
2192 return abfd;
2195 static char *
2196 make_import_fixup_mark (arelent *rel)
2198 /* We convert reloc to symbol, for later reference. */
2199 static int counter;
2200 static char *fixup_name = NULL;
2201 static size_t buffer_len = 0;
2203 struct bfd_symbol *sym = *rel->sym_ptr_ptr;
2205 bfd *abfd = bfd_asymbol_bfd (sym);
2206 struct bfd_link_hash_entry *bh;
2208 if (!fixup_name)
2210 fixup_name = xmalloc (384);
2211 buffer_len = 384;
2214 if (strlen (sym->name) + 25 > buffer_len)
2215 /* Assume 25 chars for "__fu" + counter + "_". If counter is
2216 bigger than 20 digits long, we've got worse problems than
2217 overflowing this buffer... */
2219 free (fixup_name);
2220 /* New buffer size is length of symbol, plus 25, but
2221 then rounded up to the nearest multiple of 128. */
2222 buffer_len = ((strlen (sym->name) + 25) + 127) & ~127;
2223 fixup_name = xmalloc (buffer_len);
2226 sprintf (fixup_name, "__fu%d_%s", counter++, sym->name);
2228 bh = NULL;
2229 bfd_coff_link_add_one_symbol (&link_info, abfd, fixup_name, BSF_GLOBAL,
2230 current_sec, /* sym->section, */
2231 rel->address, NULL, TRUE, FALSE, &bh);
2233 return fixup_name;
2236 /* .section .idata$2
2237 .rva __nm_thnk_SYM (singleton thunk with name of func)
2238 .long 0
2239 .long 0
2240 .rva __my_dll_iname (name of dll)
2241 .rva __fuNN_SYM (pointer to reference (address) in text) */
2243 static bfd *
2244 make_import_fixup_entry (const char *name,
2245 const char *fixup_name,
2246 const char *dll_symname,
2247 bfd *parent)
2249 asection *id2;
2250 unsigned char *d2;
2251 char *oname;
2252 bfd *abfd;
2254 oname = xmalloc (20);
2255 sprintf (oname, "fu%06d.o", tmp_seq);
2256 tmp_seq++;
2258 abfd = bfd_create (oname, parent);
2259 bfd_find_target (pe_details->object_target, abfd);
2260 bfd_make_writable (abfd);
2262 bfd_set_format (abfd, bfd_object);
2263 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2265 symptr = 0;
2266 symtab = xmalloc (6 * sizeof (asymbol *));
2267 id2 = quick_section (abfd, ".idata$2", SEC_HAS_CONTENTS, 2);
2269 quick_symbol (abfd, U ("_nm_thnk_"), name, "", UNDSEC, BSF_GLOBAL, 0);
2270 quick_symbol (abfd, U (""), dll_symname, "_iname", UNDSEC, BSF_GLOBAL, 0);
2271 quick_symbol (abfd, "", fixup_name, "", UNDSEC, BSF_GLOBAL, 0);
2273 bfd_set_section_size (abfd, id2, 20);
2274 d2 = xmalloc (20);
2275 id2->contents = d2;
2276 memset (d2, 0, 20);
2278 quick_reloc (abfd, 0, BFD_RELOC_RVA, 1);
2279 quick_reloc (abfd, 12, BFD_RELOC_RVA, 2);
2280 quick_reloc (abfd, 16, BFD_RELOC_RVA, 3);
2281 save_relocs (id2);
2283 bfd_set_symtab (abfd, symtab, symptr);
2285 bfd_set_section_contents (abfd, id2, d2, 0, 20);
2287 bfd_make_readable (abfd);
2288 return abfd;
2291 /* .section .rdata_runtime_pseudo_reloc
2292 .long addend
2293 .rva __fuNN_SYM (pointer to reference (address) in text) */
2295 static bfd *
2296 make_runtime_pseudo_reloc (const char *name ATTRIBUTE_UNUSED,
2297 const char *fixup_name,
2298 int addend,
2299 bfd *parent)
2301 asection *rt_rel;
2302 unsigned char *rt_rel_d;
2303 char *oname;
2304 bfd *abfd;
2306 oname = xmalloc (20);
2307 sprintf (oname, "rtr%06d.o", tmp_seq);
2308 tmp_seq++;
2310 abfd = bfd_create (oname, parent);
2311 bfd_find_target (pe_details->object_target, abfd);
2312 bfd_make_writable (abfd);
2314 bfd_set_format (abfd, bfd_object);
2315 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2317 symptr = 0;
2318 symtab = xmalloc (2 * sizeof (asymbol *));
2319 rt_rel = quick_section (abfd, ".rdata_runtime_pseudo_reloc",
2320 SEC_HAS_CONTENTS, 2);
2322 quick_symbol (abfd, "", fixup_name, "", UNDSEC, BSF_GLOBAL, 0);
2324 bfd_set_section_size (abfd, rt_rel, 8);
2325 rt_rel_d = xmalloc (8);
2326 rt_rel->contents = rt_rel_d;
2327 memset (rt_rel_d, 0, 8);
2328 bfd_put_32 (abfd, addend, rt_rel_d);
2330 quick_reloc (abfd, 4, BFD_RELOC_RVA, 1);
2331 save_relocs (rt_rel);
2333 bfd_set_symtab (abfd, symtab, symptr);
2335 bfd_set_section_contents (abfd, rt_rel, rt_rel_d, 0, 8);
2337 bfd_make_readable (abfd);
2338 return abfd;
2341 /* .section .rdata
2342 .rva __pei386_runtime_relocator */
2344 static bfd *
2345 pe_create_runtime_relocator_reference (bfd *parent)
2347 asection *extern_rt_rel;
2348 unsigned char *extern_rt_rel_d;
2349 char *oname;
2350 bfd *abfd;
2352 oname = xmalloc (20);
2353 sprintf (oname, "ertr%06d.o", tmp_seq);
2354 tmp_seq++;
2356 abfd = bfd_create (oname, parent);
2357 bfd_find_target (pe_details->object_target, abfd);
2358 bfd_make_writable (abfd);
2360 bfd_set_format (abfd, bfd_object);
2361 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2363 symptr = 0;
2364 symtab = xmalloc (2 * sizeof (asymbol *));
2365 extern_rt_rel = quick_section (abfd, ".rdata", SEC_HAS_CONTENTS, 2);
2367 quick_symbol (abfd, "", U ("_pei386_runtime_relocator"), "", UNDSEC,
2368 BSF_NO_FLAGS, 0);
2370 bfd_set_section_size (abfd, extern_rt_rel, 4);
2371 extern_rt_rel_d = xmalloc (4);
2372 extern_rt_rel->contents = extern_rt_rel_d;
2374 quick_reloc (abfd, 0, BFD_RELOC_RVA, 1);
2375 save_relocs (extern_rt_rel);
2377 bfd_set_symtab (abfd, symtab, symptr);
2379 bfd_set_section_contents (abfd, extern_rt_rel, extern_rt_rel_d, 0, 4);
2381 bfd_make_readable (abfd);
2382 return abfd;
2385 void
2386 pe_create_import_fixup (arelent *rel, asection *s, int addend)
2388 char buf[300];
2389 struct bfd_symbol *sym = *rel->sym_ptr_ptr;
2390 struct bfd_link_hash_entry *name_thunk_sym;
2391 const char *name = sym->name;
2392 char *fixup_name = make_import_fixup_mark (rel);
2393 bfd *b;
2395 sprintf (buf, U ("_nm_thnk_%s"), name);
2397 name_thunk_sym = bfd_link_hash_lookup (link_info.hash, buf, 0, 0, 1);
2399 if (!name_thunk_sym || name_thunk_sym->type != bfd_link_hash_defined)
2401 bfd *b = make_singleton_name_thunk (name, link_info.output_bfd);
2402 add_bfd_to_link (b, b->filename, &link_info);
2404 /* If we ever use autoimport, we have to cast text section writable. */
2405 config.text_read_only = FALSE;
2406 link_info.output_bfd->flags &= ~WP_TEXT;
2409 if (addend == 0 || link_info.pei386_runtime_pseudo_reloc)
2411 extern char * pe_data_import_dll;
2412 char * dll_symname = pe_data_import_dll ? pe_data_import_dll : "unknown";
2414 b = make_import_fixup_entry (name, fixup_name, dll_symname,
2415 link_info.output_bfd);
2416 add_bfd_to_link (b, b->filename, &link_info);
2419 if (addend != 0)
2421 if (link_info.pei386_runtime_pseudo_reloc)
2423 if (pe_dll_extra_pe_debug)
2424 printf ("creating runtime pseudo-reloc entry for %s (addend=%d)\n",
2425 fixup_name, addend);
2426 b = make_runtime_pseudo_reloc (name, fixup_name, addend,
2427 link_info.output_bfd);
2428 add_bfd_to_link (b, b->filename, &link_info);
2430 if (runtime_pseudo_relocs_created == 0)
2432 b = pe_create_runtime_relocator_reference (link_info.output_bfd);
2433 add_bfd_to_link (b, b->filename, &link_info);
2435 runtime_pseudo_relocs_created++;
2437 else
2439 einfo (_("%C: variable '%T' can't be auto-imported. Please read the documentation for ld's --enable-auto-import for details.\n"),
2440 s->owner, s, rel->address, sym->name);
2441 einfo ("%X");
2447 void
2448 pe_dll_generate_implib (def_file *def, const char *impfilename)
2450 int i;
2451 bfd *ar_head;
2452 bfd *ar_tail;
2453 bfd *outarch;
2454 bfd *head = 0;
2456 dll_filename = (def->name) ? def->name : dll_name;
2457 dll_symname = xstrdup (dll_filename);
2458 for (i = 0; dll_symname[i]; i++)
2459 if (!ISALNUM (dll_symname[i]))
2460 dll_symname[i] = '_';
2462 unlink_if_ordinary (impfilename);
2464 outarch = bfd_openw (impfilename, 0);
2466 if (!outarch)
2468 /* xgettext:c-format */
2469 einfo (_("%XCan't open .lib file: %s\n"), impfilename);
2470 return;
2473 /* xgettext:c-format */
2474 info_msg (_("Creating library file: %s\n"), impfilename);
2476 bfd_set_format (outarch, bfd_archive);
2477 outarch->has_armap = 1;
2479 /* Work out a reasonable size of things to put onto one line. */
2480 ar_head = make_head (outarch);
2482 for (i = 0; i < def->num_exports; i++)
2484 /* The import library doesn't know about the internal name. */
2485 char *internal = def->exports[i].internal_name;
2486 bfd *n;
2488 /* Don't add PRIVATE entries to import lib. */
2489 if (pe_def_file->exports[i].flag_private)
2490 continue;
2491 def->exports[i].internal_name = def->exports[i].name;
2492 n = make_one (def->exports + i, outarch,
2493 ! (def->exports + i)->flag_data);
2494 n->archive_next = head;
2495 head = n;
2496 def->exports[i].internal_name = internal;
2499 ar_tail = make_tail (outarch);
2501 if (ar_head == NULL || ar_tail == NULL)
2502 return;
2504 /* Now stick them all into the archive. */
2505 ar_head->archive_next = head;
2506 ar_tail->archive_next = ar_head;
2507 head = ar_tail;
2509 if (! bfd_set_archive_head (outarch, head))
2510 einfo ("%Xbfd_set_archive_head: %E\n");
2512 if (! bfd_close (outarch))
2513 einfo ("%Xbfd_close %s: %E\n", impfilename);
2515 while (head != NULL)
2517 bfd *n = head->archive_next;
2518 bfd_close (head);
2519 head = n;
2523 static void
2524 add_bfd_to_link (bfd *abfd, const char *name, struct bfd_link_info *link_info)
2526 lang_input_statement_type *fake_file;
2528 fake_file = lang_add_input_file (name,
2529 lang_input_file_is_fake_enum,
2530 NULL);
2531 fake_file->the_bfd = abfd;
2532 ldlang_add_file (fake_file);
2534 if (!bfd_link_add_symbols (abfd, link_info))
2535 einfo ("%Xaddsym %s: %E\n", name);
2538 void
2539 pe_process_import_defs (bfd *output_bfd, struct bfd_link_info *link_info)
2541 def_file_module *module;
2543 pe_dll_id_target (bfd_get_target (output_bfd));
2545 if (!pe_def_file)
2546 return;
2548 for (module = pe_def_file->modules; module; module = module->next)
2550 int i, do_this_dll;
2552 dll_filename = module->name;
2553 dll_symname = xstrdup (module->name);
2554 for (i = 0; dll_symname[i]; i++)
2555 if (!ISALNUM (dll_symname[i]))
2556 dll_symname[i] = '_';
2558 do_this_dll = 0;
2560 for (i = 0; i < pe_def_file->num_imports; i++)
2561 if (pe_def_file->imports[i].module == module)
2563 def_file_export exp;
2564 struct bfd_link_hash_entry *blhe;
2565 int lead_at = (*pe_def_file->imports[i].internal_name == '@');
2566 /* See if we need this import. */
2567 size_t len = strlen (pe_def_file->imports[i].internal_name);
2568 char *name = xmalloc (len + 2 + 6);
2569 bfd_boolean include_jmp_stub = FALSE;
2571 if (lead_at)
2572 sprintf (name, "%s",
2573 pe_def_file->imports[i].internal_name);
2574 else
2575 sprintf (name, "%s%s",U (""),
2576 pe_def_file->imports[i].internal_name);
2578 blhe = bfd_link_hash_lookup (link_info->hash, name,
2579 FALSE, FALSE, FALSE);
2581 /* Include the jump stub for <sym> only if the <sym>
2582 is undefined. */
2583 if (!blhe || (blhe && blhe->type != bfd_link_hash_undefined))
2585 if (lead_at)
2586 sprintf (name, "%s%s", "__imp_",
2587 pe_def_file->imports[i].internal_name);
2588 else
2589 sprintf (name, "%s%s%s", "__imp_", U (""),
2590 pe_def_file->imports[i].internal_name);
2592 blhe = bfd_link_hash_lookup (link_info->hash, name,
2593 FALSE, FALSE, FALSE);
2595 else
2596 include_jmp_stub = TRUE;
2598 free (name);
2600 if (blhe && blhe->type == bfd_link_hash_undefined)
2602 bfd *one;
2603 /* We do. */
2604 if (!do_this_dll)
2606 bfd *ar_head = make_head (output_bfd);
2607 add_bfd_to_link (ar_head, ar_head->filename, link_info);
2608 do_this_dll = 1;
2610 exp.internal_name = pe_def_file->imports[i].internal_name;
2611 exp.name = pe_def_file->imports[i].name;
2612 exp.ordinal = pe_def_file->imports[i].ordinal;
2613 exp.hint = exp.ordinal >= 0 ? exp.ordinal : 0;
2614 exp.flag_private = 0;
2615 exp.flag_constant = 0;
2616 exp.flag_data = pe_def_file->imports[i].data;
2617 exp.flag_noname = exp.name ? 0 : 1;
2618 one = make_one (&exp, output_bfd, (! exp.flag_data) && include_jmp_stub);
2619 add_bfd_to_link (one, one->filename, link_info);
2622 if (do_this_dll)
2624 bfd *ar_tail = make_tail (output_bfd);
2625 add_bfd_to_link (ar_tail, ar_tail->filename, link_info);
2628 free (dll_symname);
2632 /* We were handed a *.DLL file. Parse it and turn it into a set of
2633 IMPORTS directives in the def file. Return TRUE if the file was
2634 handled, FALSE if not. */
2636 static unsigned int
2637 pe_get16 (bfd *abfd, int where)
2639 unsigned char b[2];
2641 bfd_seek (abfd, (file_ptr) where, SEEK_SET);
2642 bfd_bread (b, (bfd_size_type) 2, abfd);
2643 return b[0] + (b[1] << 8);
2646 static unsigned int
2647 pe_get32 (bfd *abfd, int where)
2649 unsigned char b[4];
2651 bfd_seek (abfd, (file_ptr) where, SEEK_SET);
2652 bfd_bread (b, (bfd_size_type) 4, abfd);
2653 return b[0] + (b[1] << 8) + (b[2] << 16) + (b[3] << 24);
2656 static unsigned int
2657 pe_as32 (void *ptr)
2659 unsigned char *b = ptr;
2661 return b[0] + (b[1] << 8) + (b[2] << 16) + (b[3] << 24);
2664 bfd_boolean
2665 pe_implied_import_dll (const char *filename)
2667 bfd *dll;
2668 bfd_vma pe_header_offset, opthdr_ofs, num_entries, i;
2669 bfd_vma export_rva, export_size, nsections, secptr, expptr;
2670 bfd_vma exp_funcbase;
2671 unsigned char *expdata;
2672 char *erva;
2673 bfd_vma name_rvas, ordinals, nexp, ordbase;
2674 const char *dll_name;
2675 /* Initialization with start > end guarantees that is_data
2676 will not be set by mistake, and avoids compiler warning. */
2677 bfd_vma data_start = 1;
2678 bfd_vma data_end = 0;
2679 bfd_vma rdata_start = 1;
2680 bfd_vma rdata_end = 0;
2681 bfd_vma bss_start = 1;
2682 bfd_vma bss_end = 0;
2684 /* No, I can't use bfd here. kernel32.dll puts its export table in
2685 the middle of the .rdata section. */
2686 dll = bfd_openr (filename, pe_details->target_name);
2687 if (!dll)
2689 einfo ("%Xopen %s: %E\n", filename);
2690 return FALSE;
2693 /* PEI dlls seem to be bfd_objects. */
2694 if (!bfd_check_format (dll, bfd_object))
2696 einfo ("%X%s: this doesn't appear to be a DLL\n", filename);
2697 return FALSE;
2700 /* Get pe_header, optional header and numbers of export entries. */
2701 pe_header_offset = pe_get32 (dll, 0x3c);
2702 opthdr_ofs = pe_header_offset + 4 + 20;
2703 #ifdef pe_use_x86_64
2704 num_entries = pe_get32 (dll, opthdr_ofs + 92 + 4 * 4); /* & NumberOfRvaAndSizes. */
2705 #else
2706 num_entries = pe_get32 (dll, opthdr_ofs + 92);
2707 #endif
2709 if (num_entries < 1) /* No exports. */
2710 return FALSE;
2712 #ifdef pe_use_x86_64
2713 export_rva = pe_get32 (dll, opthdr_ofs + 96 + 4 * 4);
2714 export_size = pe_get32 (dll, opthdr_ofs + 100 + 4 * 4);
2715 #else
2716 export_rva = pe_get32 (dll, opthdr_ofs + 96);
2717 export_size = pe_get32 (dll, opthdr_ofs + 100);
2718 #endif
2720 nsections = pe_get16 (dll, pe_header_offset + 4 + 2);
2721 secptr = (pe_header_offset + 4 + 20 +
2722 pe_get16 (dll, pe_header_offset + 4 + 16));
2723 expptr = 0;
2725 /* Get the rva and size of the export section. */
2726 for (i = 0; i < nsections; i++)
2728 char sname[8];
2729 bfd_vma secptr1 = secptr + 40 * i;
2730 bfd_vma vaddr = pe_get32 (dll, secptr1 + 12);
2731 bfd_vma vsize = pe_get32 (dll, secptr1 + 16);
2732 bfd_vma fptr = pe_get32 (dll, secptr1 + 20);
2734 bfd_seek (dll, (file_ptr) secptr1, SEEK_SET);
2735 bfd_bread (sname, (bfd_size_type) 8, dll);
2737 if (vaddr <= export_rva && vaddr + vsize > export_rva)
2739 expptr = fptr + (export_rva - vaddr);
2740 if (export_rva + export_size > vaddr + vsize)
2741 export_size = vsize - (export_rva - vaddr);
2742 break;
2746 /* Scan sections and store the base and size of the
2747 data and bss segments in data/base_start/end. */
2748 for (i = 0; i < nsections; i++)
2750 bfd_vma secptr1 = secptr + 40 * i;
2751 bfd_vma vsize = pe_get32 (dll, secptr1 + 8);
2752 bfd_vma vaddr = pe_get32 (dll, secptr1 + 12);
2753 bfd_vma flags = pe_get32 (dll, secptr1 + 36);
2754 char sec_name[9];
2756 sec_name[8] = '\0';
2757 bfd_seek (dll, (file_ptr) secptr1 + 0, SEEK_SET);
2758 bfd_bread (sec_name, (bfd_size_type) 8, dll);
2760 if (strcmp(sec_name,".data") == 0)
2762 data_start = vaddr;
2763 data_end = vaddr + vsize;
2765 if (pe_dll_extra_pe_debug)
2766 printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n",
2767 __FUNCTION__, sec_name, (unsigned long) vaddr,
2768 (unsigned long) (vaddr + vsize), (unsigned long) flags);
2770 else if (strcmp(sec_name,".rdata") == 0)
2772 rdata_start = vaddr;
2773 rdata_end = vaddr + vsize;
2775 if (pe_dll_extra_pe_debug)
2776 printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n",
2777 __FUNCTION__, sec_name, (unsigned long) vaddr,
2778 (unsigned long) (vaddr + vsize), (unsigned long) flags);
2780 else if (strcmp (sec_name,".bss") == 0)
2782 bss_start = vaddr;
2783 bss_end = vaddr + vsize;
2785 if (pe_dll_extra_pe_debug)
2786 printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n",
2787 __FUNCTION__, sec_name, (unsigned long) vaddr,
2788 (unsigned long) (vaddr + vsize), (unsigned long) flags);
2792 expdata = xmalloc (export_size);
2793 bfd_seek (dll, (file_ptr) expptr, SEEK_SET);
2794 bfd_bread (expdata, (bfd_size_type) export_size, dll);
2795 erva = (char *) expdata - export_rva;
2797 if (pe_def_file == 0)
2798 pe_def_file = def_file_empty ();
2800 nexp = pe_as32 (expdata + 24);
2801 name_rvas = pe_as32 (expdata + 32);
2802 ordinals = pe_as32 (expdata + 36);
2803 ordbase = pe_as32 (expdata + 16);
2804 exp_funcbase = pe_as32 (expdata + 28);
2806 /* Use internal dll name instead of filename
2807 to enable symbolic dll linking. */
2808 dll_name = erva + pe_as32 (expdata + 12);
2810 /* Check to see if the dll has already been added to
2811 the definition list and if so return without error.
2812 This avoids multiple symbol definitions. */
2813 if (def_get_module (pe_def_file, dll_name))
2815 if (pe_dll_extra_pe_debug)
2816 printf ("%s is already loaded\n", dll_name);
2817 return TRUE;
2820 /* Iterate through the list of symbols. */
2821 for (i = 0; i < nexp; i++)
2823 /* Pointer to the names vector. */
2824 bfd_vma name_rva = pe_as32 (erva + name_rvas + i * 4);
2825 def_file_import *imp;
2826 /* Pointer to the function address vector. */
2827 bfd_vma func_rva = pe_as32 (erva + exp_funcbase + i * 4);
2828 int is_data = 0;
2830 /* Skip unwanted symbols, which are
2831 exported in buggy auto-import releases. */
2832 if (! CONST_STRNEQ (erva + name_rva, "_nm_"))
2834 /* is_data is true if the address is in the data, rdata or bss
2835 segment. */
2836 is_data =
2837 (func_rva >= data_start && func_rva < data_end)
2838 || (func_rva >= rdata_start && func_rva < rdata_end)
2839 || (func_rva >= bss_start && func_rva < bss_end);
2841 imp = def_file_add_import (pe_def_file, erva + name_rva,
2842 dll_name, i, 0);
2843 /* Mark symbol type. */
2844 imp->data = is_data;
2846 if (pe_dll_extra_pe_debug)
2847 printf ("%s dll-name: %s sym: %s addr: 0x%lx %s\n",
2848 __FUNCTION__, dll_name, erva + name_rva,
2849 (unsigned long) func_rva, is_data ? "(data)" : "");
2853 return TRUE;
2856 /* These are the main functions, called from the emulation. The first
2857 is called after the bfds are read, so we can guess at how much space
2858 we need. The second is called after everything is placed, so we
2859 can put the right values in place. */
2861 void
2862 pe_dll_build_sections (bfd *abfd, struct bfd_link_info *info)
2864 pe_dll_id_target (bfd_get_target (abfd));
2865 process_def_file (abfd, info);
2867 if (pe_def_file->num_exports == 0 && !info->shared)
2868 return;
2870 generate_edata (abfd, info);
2871 build_filler_bfd (1);
2874 void
2875 pe_exe_build_sections (bfd *abfd, struct bfd_link_info *info ATTRIBUTE_UNUSED)
2877 pe_dll_id_target (bfd_get_target (abfd));
2878 build_filler_bfd (0);
2881 void
2882 pe_dll_fill_sections (bfd *abfd, struct bfd_link_info *info)
2884 pe_dll_id_target (bfd_get_target (abfd));
2885 image_base = pe_data (abfd)->pe_opthdr.ImageBase;
2887 generate_reloc (abfd, info);
2888 if (reloc_sz > 0)
2890 bfd_set_section_size (filler_bfd, reloc_s, reloc_sz);
2892 /* Resize the sections. */
2893 lang_reset_memory_regions ();
2894 lang_size_sections (NULL, TRUE);
2896 /* Redo special stuff. */
2897 ldemul_after_allocation ();
2899 /* Do the assignments again. */
2900 lang_do_assignments ();
2903 fill_edata (abfd, info);
2905 if (info->shared && !info->pie)
2906 pe_data (abfd)->dll = 1;
2908 edata_s->contents = edata_d;
2909 reloc_s->contents = reloc_d;
2912 void
2913 pe_exe_fill_sections (bfd *abfd, struct bfd_link_info *info)
2915 pe_dll_id_target (bfd_get_target (abfd));
2916 image_base = pe_data (abfd)->pe_opthdr.ImageBase;
2918 generate_reloc (abfd, info);
2919 if (reloc_sz > 0)
2921 bfd_set_section_size (filler_bfd, reloc_s, reloc_sz);
2923 /* Resize the sections. */
2924 lang_reset_memory_regions ();
2925 lang_size_sections (NULL, TRUE);
2927 /* Redo special stuff. */
2928 ldemul_after_allocation ();
2930 /* Do the assignments again. */
2931 lang_do_assignments ();
2933 reloc_s->contents = reloc_d;
2936 bfd_boolean
2937 pe_bfd_is_dll (bfd *abfd)
2939 return (bfd_get_format (abfd) == bfd_object
2940 && obj_pe (abfd)
2941 && pe_data (abfd)->dll);