Convert ia64-gen to use getopt(). Add standard GNU options plus --srcdir.
[binutils.git] / ld / pe-dll.c
bloba85bf94038cca4e5e46518d51829d1357c87ae67
1 /* Routines to help build PEI-format DLLs (Win32 etc)
2 Copyright 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
3 Written by DJ Delorie <dj@cygnus.com>
5 This file is part of GLD, the Gnu Linker.
7 GLD 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 2, or (at your option)
10 any later version.
12 GLD 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 GLD; see the file COPYING. If not, write to the Free
19 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
20 02111-1307, USA. */
22 #include "bfd.h"
23 #include "sysdep.h"
24 #include "bfdlink.h"
25 #include "libiberty.h"
26 #include "safe-ctype.h"
28 #include <time.h>
30 #include "ld.h"
31 #include "ldexp.h"
32 #include "ldlang.h"
33 #include "ldwrite.h"
34 #include "ldmisc.h"
35 #include <ldgram.h>
36 #include "ldmain.h"
37 #include "ldfile.h"
38 #include "ldemul.h"
39 #include "coff/internal.h"
40 #include "../bfd/libcoff.h"
41 #include "deffile.h"
42 #include "pe-dll.h"
44 /* This file turns a regular Windows PE image into a DLL. Because of
45 the complexity of this operation, it has been broken down into a
46 number of separate modules which are all called by the main function
47 at the end of this file. This function is not re-entrant and is
48 normally only called once, so static variables are used to reduce
49 the number of parameters and return values required.
51 See also: ld/emultempl/pe.em. */
53 /* Auto-import feature by Paul Sokolovsky
55 Quick facts:
57 1. With this feature on, DLL clients can import variables from DLL
58 without any concern from their side (for example, without any source
59 code modifications).
61 2. This is done completely in bounds of the PE specification (to be fair,
62 there's a place where it pokes nose out of, but in practise it works).
63 So, resulting module can be used with any other PE compiler/linker.
65 3. Auto-import is fully compatible with standard import method and they
66 can be mixed together.
68 4. Overheads: space: 8 bytes per imported symbol, plus 20 for each
69 reference to it; load time: negligible; virtual/physical memory: should be
70 less than effect of DLL relocation, and I sincerely hope it doesn't affect
71 DLL sharability (too much).
73 Idea
75 The obvious and only way to get rid of dllimport insanity is to make client
76 access variable directly in the DLL, bypassing extra dereference. I.e.,
77 whenever client contains someting like
79 mov dll_var,%eax,
81 address of dll_var in the command should be relocated to point into loaded
82 DLL. The aim is to make OS loader do so, and than make ld help with that.
83 Import section of PE made following way: there's a vector of structures
84 each describing imports from particular DLL. Each such structure points
85 to two other parellel vectors: one holding imported names, and one which
86 will hold address of corresponding imported name. So, the solution is
87 de-vectorize these structures, making import locations be sparse and
88 pointing directly into code. Before continuing, it is worth a note that,
89 while authors strives to make PE act ELF-like, there're some other people
90 make ELF act PE-like: elfvector, ;-) .
92 Implementation
94 For each reference of data symbol to be imported from DLL (to set of which
95 belong symbols with name <sym>, if __imp_<sym> is found in implib), the
96 import fixup entry is generated. That entry is of type
97 IMAGE_IMPORT_DESCRIPTOR and stored in .idata$3 subsection. Each
98 fixup entry contains pointer to symbol's address within .text section
99 (marked with __fuN_<sym> symbol, where N is integer), pointer to DLL name
100 (so, DLL name is referenced by multiple entries), and pointer to symbol
101 name thunk. Symbol name thunk is singleton vector (__nm_th_<symbol>)
102 pointing to IMAGE_IMPORT_BY_NAME structure (__nm_<symbol>) directly
103 containing imported name. Here comes that "om the edge" problem mentioned
104 above: PE specification rambles that name vector (OriginalFirstThunk)
105 should run in parallel with addresses vector (FirstThunk), i.e. that they
106 should have same number of elements and terminated with zero. We violate
107 this, since FirstThunk points directly into machine code. But in practise,
108 OS loader implemented the sane way: it goes thru OriginalFirstThunk and
109 puts addresses to FirstThunk, not something else. It once again should be
110 noted that dll and symbol name structures are reused across fixup entries
111 and should be there anyway to support standard import stuff, so sustained
112 overhead is 20 bytes per reference. Other question is whether having several
113 IMAGE_IMPORT_DESCRIPTORS for the same DLL is possible. Answer is yes, it is
114 done even by native compiler/linker (libth32's functions are in fact reside
115 in windows9x kernel32.dll, so if you use it, you have two
116 IMAGE_IMPORT_DESCRIPTORS for kernel32.dll). Yet other question is whether
117 referencing the same PE structures several times is valid. The answer is why
118 not, prohibitting that (detecting violation) would require more work on
119 behalf of loader than not doing it.
121 See also: ld/emultempl/pe.em. */
123 static void
124 add_bfd_to_link PARAMS ((bfd *, const char *, struct bfd_link_info *));
126 /* For emultempl/pe.em. */
128 def_file * pe_def_file = 0;
129 int pe_dll_export_everything = 0;
130 int pe_dll_do_default_excludes = 1;
131 int pe_dll_kill_ats = 0;
132 int pe_dll_stdcall_aliases = 0;
133 int pe_dll_warn_dup_exports = 0;
134 int pe_dll_compat_implib = 0;
135 int pe_dll_extra_pe_debug = 0;
137 /* Static variables and types. */
139 static bfd_vma image_base;
140 static bfd *filler_bfd;
141 static struct sec *edata_s, *reloc_s;
142 static unsigned char *edata_d, *reloc_d;
143 static size_t edata_sz, reloc_sz;
145 typedef struct
147 char *target_name;
148 char *object_target;
149 unsigned int imagebase_reloc;
150 int pe_arch;
151 int bfd_arch;
152 int underscored;
154 pe_details_type;
156 typedef struct
158 char *name;
159 int len;
161 autofilter_entry_type;
163 #define PE_ARCH_i386 1
164 #define PE_ARCH_sh 2
165 #define PE_ARCH_mips 3
166 #define PE_ARCH_arm 4
167 #define PE_ARCH_arm_epoc 5
169 static pe_details_type pe_detail_list[] =
172 "pei-i386",
173 "pe-i386",
174 7 /* R_IMAGEBASE */,
175 PE_ARCH_i386,
176 bfd_arch_i386,
180 "pei-shl",
181 "pe-shl",
182 16 /* R_SH_IMAGEBASE */,
183 PE_ARCH_sh,
184 bfd_arch_sh,
188 "pei-mips",
189 "pe-mips",
190 34 /* MIPS_R_RVA */,
191 PE_ARCH_mips,
192 bfd_arch_mips,
196 "pei-arm-little",
197 "pe-arm-little",
198 11 /* ARM_RVA32 */,
199 PE_ARCH_arm,
200 bfd_arch_arm,
204 "epoc-pei-arm-little",
205 "epoc-pe-arm-little",
206 11 /* ARM_RVA32 */,
207 PE_ARCH_arm_epoc,
208 bfd_arch_arm,
211 { NULL, NULL, 0, 0, 0, 0 }
214 static pe_details_type *pe_details;
216 static autofilter_entry_type autofilter_symbollist[] =
218 { "DllMain@12", 10 },
219 { "DllEntryPoint@0", 15 },
220 { "DllMainCRTStartup@12", 20 },
221 { "_cygwin_dll_entry@12", 20 },
222 { "_cygwin_crt0_common@8", 21 },
223 { "_cygwin_noncygwin_dll_entry@12", 30 },
224 { "impure_ptr", 10 },
225 { NULL, 0 }
228 /* Do not specify library suffix explicitly, to allow for dllized versions. */
229 static autofilter_entry_type autofilter_liblist[] =
231 { "libgcc.", 7 },
232 { "libstdc++.", 10 },
233 { "libmingw32.", 11 },
234 { "libg2c.", 7 },
235 { "libsupc++.", 10 },
236 { "libobjc.", 8 },
237 { NULL, 0 }
240 static autofilter_entry_type autofilter_objlist[] =
242 { "crt0.o", 6 },
243 { "crt1.o", 6 },
244 { "crt2.o", 6 },
245 { "dllcrt1.o", 9 },
246 { "dllcrt2.o", 9 },
247 { "gcrt0.o", 7 },
248 { "gcrt1.o", 7 },
249 { "gcrt2.o", 7 },
250 { "crtbegin.o", 10 },
251 { "crtend.o", 8 },
252 { NULL, 0 }
255 static autofilter_entry_type autofilter_symbolprefixlist[] =
257 /* { "__imp_", 6 }, */
258 /* Do __imp_ explicitly to save time. */
259 { "__rtti_", 7 },
260 /* Don't re-export auto-imported symbols. */
261 { "_nm_", 4 },
262 { "__builtin_", 10 },
263 /* Don't export symbols specifying internal DLL layout. */
264 { "_head_", 6 },
265 { "_fmode", 6 },
266 { "_impure_ptr", 11 },
267 { "cygwin_attach_dll", 17 },
268 { "cygwin_premain0", 15 },
269 { "cygwin_premain1", 15 },
270 { "cygwin_premain2", 15 },
271 { "cygwin_premain3", 15 },
272 { "environ", 7 },
273 { NULL, 0 }
276 static autofilter_entry_type autofilter_symbolsuffixlist[] =
278 { "_iname", 6 },
279 { NULL, 0 }
282 #define U(str) (pe_details->underscored ? "_" str : str)
284 static int reloc_sort PARAMS ((const void *, const void *));
285 static int pe_export_sort PARAMS ((const void *, const void *));
286 static int auto_export PARAMS ((bfd *, def_file *, const char *));
287 static void process_def_file PARAMS ((bfd *, struct bfd_link_info *));
288 static void build_filler_bfd PARAMS ((int));
289 static void generate_edata PARAMS ((bfd *, struct bfd_link_info *));
290 static void fill_exported_offsets PARAMS ((bfd *, struct bfd_link_info *));
291 static void fill_edata PARAMS ((bfd *, struct bfd_link_info *));
292 static void generate_reloc PARAMS ((bfd *, struct bfd_link_info *));
293 static void quoteput PARAMS ((char *, FILE *, int));
294 static asection *quick_section PARAMS ((bfd *, const char *, int, int));
295 static void quick_symbol
296 PARAMS ((bfd *, const char *, const char *, const char *,
297 asection *, int, int));
298 static void quick_reloc PARAMS ((bfd *, int, int, int));
299 static bfd *make_head PARAMS ((bfd *));
300 static bfd *make_tail PARAMS ((bfd *));
301 static bfd *make_one PARAMS ((def_file_export *, bfd *));
302 static bfd *make_singleton_name_thunk PARAMS ((const char *, bfd *));
303 static char *make_import_fixup_mark PARAMS ((arelent *));
304 static bfd *make_import_fixup_entry
305 PARAMS ((const char *, const char *, const char *, bfd *));
306 static unsigned int pe_get16 PARAMS ((bfd *, int));
307 static unsigned int pe_get32 PARAMS ((bfd *, int));
308 static unsigned int pe_as32 PARAMS ((void *));
310 void
311 pe_dll_id_target (target)
312 const char *target;
314 int i;
316 for (i = 0; pe_detail_list[i].target_name; i++)
317 if (strcmp (pe_detail_list[i].target_name, target) == 0
318 || strcmp (pe_detail_list[i].object_target, target) == 0)
320 pe_details = pe_detail_list + i;
321 return;
323 einfo (_("%XUnsupported PEI architecture: %s\n"), target);
324 exit (1);
327 /* Helper functions for qsort. Relocs must be sorted so that we can write
328 them out by pages. */
330 typedef struct
332 bfd_vma vma;
333 char type;
334 short extra;
336 reloc_data_type;
338 static int
339 reloc_sort (va, vb)
340 const void *va, *vb;
342 bfd_vma a = ((reloc_data_type *) va)->vma;
343 bfd_vma b = ((reloc_data_type *) vb)->vma;
345 return (a > b) ? 1 : ((a < b) ? -1 : 0);
348 static int
349 pe_export_sort (va, vb)
350 const void *va, *vb;
352 def_file_export *a = (def_file_export *) va;
353 def_file_export *b = (def_file_export *) vb;
355 return strcmp (a->name, b->name);
358 /* Read and process the .DEF file. */
360 /* These correspond to the entries in pe_def_file->exports[]. I use
361 exported_symbol_sections[i] to tag whether or not the symbol was
362 defined, since we can't export symbols we don't have. */
364 static bfd_vma *exported_symbol_offsets;
365 static struct sec **exported_symbol_sections;
366 static int export_table_size;
367 static int count_exported;
368 static int count_exported_byname;
369 static int count_with_ordinals;
370 static const char *dll_name;
371 static int min_ordinal, max_ordinal;
372 static int *exported_symbols;
374 typedef struct exclude_list_struct
376 char *string;
377 struct exclude_list_struct *next;
378 int type;
380 exclude_list_struct;
382 static struct exclude_list_struct *excludes = 0;
384 void
385 pe_dll_add_excludes (new_excludes, type)
386 const char *new_excludes;
387 const int type;
389 char *local_copy;
390 char *exclude_string;
392 local_copy = xstrdup (new_excludes);
394 exclude_string = strtok (local_copy, ",:");
395 for (; exclude_string; exclude_string = strtok (NULL, ",:"))
397 struct exclude_list_struct *new_exclude;
399 new_exclude = ((struct exclude_list_struct *)
400 xmalloc (sizeof (struct exclude_list_struct)));
401 new_exclude->string = (char *) xmalloc (strlen (exclude_string) + 1);
402 strcpy (new_exclude->string, exclude_string);
403 new_exclude->type = type;
404 new_exclude->next = excludes;
405 excludes = new_exclude;
408 free (local_copy);
412 /* abfd is a bfd containing n (or NULL)
413 It can be used for contextual checks. */
415 static int
416 auto_export (abfd, d, n)
417 bfd *abfd;
418 def_file *d;
419 const char *n;
421 int i;
422 struct exclude_list_struct *ex;
423 autofilter_entry_type *afptr;
424 const char * libname = 0;
425 if (abfd && abfd->my_archive)
426 libname = lbasename (abfd->my_archive->filename);
428 /* We should not re-export imported stuff. */
429 if (strncmp (n, "_imp__", 6) == 0)
430 return 0;
432 for (i = 0; i < d->num_exports; i++)
433 if (strcmp (d->exports[i].name, n) == 0)
434 return 0;
436 if (pe_dll_do_default_excludes)
438 const char * p;
439 int len;
441 if (pe_dll_extra_pe_debug)
442 printf ("considering exporting: %s, abfd=%p, abfd->my_arc=%p\n",
443 n, abfd, abfd->my_archive);
445 /* First of all, make context checks:
446 Don't export anything from standard libs. */
447 if (libname)
449 afptr = autofilter_liblist;
451 while (afptr->name)
453 if (strncmp (libname, afptr->name, afptr->len) == 0 )
454 return 0;
455 afptr++;
459 /* Next, exclude symbols from certain startup objects. */
461 if (abfd && (p = lbasename (abfd->filename)))
463 afptr = autofilter_objlist;
464 while (afptr->name)
466 if (strcmp (p, afptr->name) == 0)
467 return 0;
468 afptr++;
472 /* Don't try to blindly exclude all symbols
473 that begin with '__'; this was tried and
474 it is too restrictive. */
476 /* Then, exclude specific symbols. */
477 afptr = autofilter_symbollist;
478 while (afptr->name)
480 if (strcmp (n, afptr->name) == 0)
481 return 0;
483 afptr++;
486 /* Next, exclude symbols starting with ... */
487 afptr = autofilter_symbolprefixlist;
488 while (afptr->name)
490 if (strncmp (n, afptr->name, afptr->len) == 0)
491 return 0;
493 afptr++;
496 /* Finally, exclude symbols ending with ... */
497 len = strlen (n);
498 afptr = autofilter_symbolsuffixlist;
499 while (afptr->name)
501 if ((len >= afptr->len)
502 /* Add 1 to insure match with trailing '\0'. */
503 && strncmp (n + len - afptr->len, afptr->name,
504 afptr->len + 1) == 0)
505 return 0;
507 afptr++;
511 for (ex = excludes; ex; ex = ex->next)
513 if (ex->type == 1) /* exclude-libs */
515 if (libname
516 && ((strcmp (libname, ex->string) == 0)
517 || (strcasecmp ("ALL", ex->string) == 0)))
518 return 0;
520 else if (strcmp (n, ex->string) == 0)
521 return 0;
524 return 1;
527 static void
528 process_def_file (abfd, info)
529 bfd *abfd ATTRIBUTE_UNUSED;
530 struct bfd_link_info *info;
532 int i, j;
533 struct bfd_link_hash_entry *blhe;
534 bfd *b;
535 struct sec *s;
536 def_file_export *e = 0;
538 if (!pe_def_file)
539 pe_def_file = def_file_empty ();
541 /* First, run around to all the objects looking for the .drectve
542 sections, and push those into the def file too. */
543 for (b = info->input_bfds; b; b = b->link_next)
545 s = bfd_get_section_by_name (b, ".drectve");
546 if (s)
548 int size = bfd_get_section_size_before_reloc (s);
549 char *buf = xmalloc (size);
551 bfd_get_section_contents (b, s, buf, 0, size);
552 def_file_add_directive (pe_def_file, buf, size);
553 free (buf);
557 /* Now, maybe export everything else the default way. */
558 if (pe_dll_export_everything || pe_def_file->num_exports == 0)
560 for (b = info->input_bfds; b; b = b->link_next)
562 asymbol **symbols;
563 int nsyms, symsize;
565 symsize = bfd_get_symtab_upper_bound (b);
566 symbols = (asymbol **) xmalloc (symsize);
567 nsyms = bfd_canonicalize_symtab (b, symbols);
569 for (j = 0; j < nsyms; j++)
571 /* We should export symbols which are either global or not
572 anything at all. (.bss data is the latter)
573 We should not export undefined symbols. */
574 if (symbols[j]->section != &bfd_und_section
575 && ((symbols[j]->flags & BSF_GLOBAL)
576 || (symbols[j]->flags == BFD_FORT_COMM_DEFAULT_VALUE)))
578 const char *sn = symbols[j]->name;
580 /* We should not re-export imported stuff. */
582 char *name = (char *) xmalloc (strlen (sn) + 2 + 6);
583 sprintf (name, "%s%s", U("_imp_"), sn);
585 blhe = bfd_link_hash_lookup (info->hash, name,
586 false, false, false);
587 free (name);
589 if (blhe && blhe->type == bfd_link_hash_defined)
590 continue;
593 if (*sn == '_')
594 sn++;
596 if (auto_export (b, pe_def_file, sn))
598 def_file_export *p;
599 p=def_file_add_export (pe_def_file, sn, 0, -1);
600 /* Fill data flag properly, from dlltool.c. */
601 p->flag_data = !(symbols[j]->flags & BSF_FUNCTION);
608 #undef NE
609 #define NE pe_def_file->num_exports
611 /* Canonicalize the export list. */
612 if (pe_dll_kill_ats)
614 for (i = 0; i < NE; i++)
616 if (strchr (pe_def_file->exports[i].name, '@'))
618 /* This will preserve internal_name, which may have been
619 pointing to the same memory as name, or might not
620 have. */
621 int lead_at = (*pe_def_file->exports[i].name =='@');
622 char *tmp = xstrdup (pe_def_file->exports[i].name + lead_at);
624 *(strchr (tmp, '@')) = 0;
625 pe_def_file->exports[i].name = tmp;
630 if (pe_dll_stdcall_aliases)
632 for (i = 0; i < NE; i++)
634 if (strchr (pe_def_file->exports[i].name, '@'))
636 int lead_at = (*pe_def_file->exports[i].name == '@' ) ;
637 char *tmp = xstrdup (pe_def_file->exports[i].name + lead_at);
639 *(strchr (tmp, '@')) = 0;
640 if (auto_export (NULL, pe_def_file, tmp))
641 def_file_add_export (pe_def_file, tmp,
642 pe_def_file->exports[i].internal_name,
643 -1);
644 else
645 free (tmp);
650 /* Convenience, but watch out for it changing. */
651 e = pe_def_file->exports;
653 exported_symbol_offsets = (bfd_vma *) xmalloc (NE * sizeof (bfd_vma));
654 exported_symbol_sections = (struct sec **) xmalloc (NE * sizeof (struct sec *));
656 memset (exported_symbol_sections, 0, NE * sizeof (struct sec *));
657 max_ordinal = 0;
658 min_ordinal = 65536;
659 count_exported = 0;
660 count_exported_byname = 0;
661 count_with_ordinals = 0;
663 qsort (pe_def_file->exports, NE, sizeof (pe_def_file->exports[0]), pe_export_sort);
664 for (i = 0, j = 0; i < NE; i++)
666 if (i > 0 && strcmp (e[i].name, e[i - 1].name) == 0)
668 /* This is a duplicate. */
669 if (e[j - 1].ordinal != -1
670 && e[i].ordinal != -1
671 && e[j - 1].ordinal != e[i].ordinal)
673 if (pe_dll_warn_dup_exports)
674 /* xgettext:c-format */
675 einfo (_("%XError, duplicate EXPORT with ordinals: %s (%d vs %d)\n"),
676 e[j - 1].name, e[j - 1].ordinal, e[i].ordinal);
678 else
680 if (pe_dll_warn_dup_exports)
681 /* xgettext:c-format */
682 einfo (_("Warning, duplicate EXPORT: %s\n"),
683 e[j - 1].name);
686 if (e[i].ordinal != -1)
687 e[j - 1].ordinal = e[i].ordinal;
688 e[j - 1].flag_private |= e[i].flag_private;
689 e[j - 1].flag_constant |= e[i].flag_constant;
690 e[j - 1].flag_noname |= e[i].flag_noname;
691 e[j - 1].flag_data |= e[i].flag_data;
693 else
695 if (i != j)
696 e[j] = e[i];
697 j++;
700 pe_def_file->num_exports = j; /* == NE */
702 for (i = 0; i < NE; i++)
704 char *name = (char *) xmalloc (strlen (pe_def_file->exports[i].internal_name) + 2);
706 if (pe_details->underscored
707 && (*pe_def_file->exports[i].internal_name != '@'))
709 *name = '_';
710 strcpy (name + 1, pe_def_file->exports[i].internal_name);
712 else
713 strcpy (name, pe_def_file->exports[i].internal_name);
715 blhe = bfd_link_hash_lookup (info->hash,
716 name,
717 false, false, true);
719 if (blhe
720 && (blhe->type == bfd_link_hash_defined
721 || (blhe->type == bfd_link_hash_common)))
723 count_exported++;
724 if (!pe_def_file->exports[i].flag_noname)
725 count_exported_byname++;
727 /* Only fill in the sections. The actual offsets are computed
728 in fill_exported_offsets() after common symbols are laid
729 out. */
730 if (blhe->type == bfd_link_hash_defined)
731 exported_symbol_sections[i] = blhe->u.def.section;
732 else
733 exported_symbol_sections[i] = blhe->u.c.p->section;
735 if (pe_def_file->exports[i].ordinal != -1)
737 if (max_ordinal < pe_def_file->exports[i].ordinal)
738 max_ordinal = pe_def_file->exports[i].ordinal;
739 if (min_ordinal > pe_def_file->exports[i].ordinal)
740 min_ordinal = pe_def_file->exports[i].ordinal;
741 count_with_ordinals++;
744 else if (blhe && blhe->type == bfd_link_hash_undefined)
746 /* xgettext:c-format */
747 einfo (_("%XCannot export %s: symbol not defined\n"),
748 pe_def_file->exports[i].internal_name);
750 else if (blhe)
752 /* xgettext:c-format */
753 einfo (_("%XCannot export %s: symbol wrong type (%d vs %d)\n"),
754 pe_def_file->exports[i].internal_name,
755 blhe->type, bfd_link_hash_defined);
757 else
759 /* xgettext:c-format */
760 einfo (_("%XCannot export %s: symbol not found\n"),
761 pe_def_file->exports[i].internal_name);
763 free (name);
767 /* Build the bfd that will contain .edata and .reloc sections. */
769 static void
770 build_filler_bfd (include_edata)
771 int include_edata;
773 lang_input_statement_type *filler_file;
774 filler_file = lang_add_input_file ("dll stuff",
775 lang_input_file_is_fake_enum,
776 NULL);
777 filler_file->the_bfd = filler_bfd = bfd_create ("dll stuff", output_bfd);
778 if (filler_bfd == NULL
779 || !bfd_set_arch_mach (filler_bfd,
780 bfd_get_arch (output_bfd),
781 bfd_get_mach (output_bfd)))
783 einfo ("%X%P: can not create BFD %E\n");
784 return;
787 if (include_edata)
789 edata_s = bfd_make_section_old_way (filler_bfd, ".edata");
790 if (edata_s == NULL
791 || !bfd_set_section_flags (filler_bfd, edata_s,
792 (SEC_HAS_CONTENTS
793 | SEC_ALLOC
794 | SEC_LOAD
795 | SEC_KEEP
796 | SEC_IN_MEMORY)))
798 einfo ("%X%P: can not create .edata section: %E\n");
799 return;
801 bfd_set_section_size (filler_bfd, edata_s, edata_sz);
804 reloc_s = bfd_make_section_old_way (filler_bfd, ".reloc");
805 if (reloc_s == NULL
806 || !bfd_set_section_flags (filler_bfd, reloc_s,
807 (SEC_HAS_CONTENTS
808 | SEC_ALLOC
809 | SEC_LOAD
810 | SEC_KEEP
811 | SEC_IN_MEMORY)))
813 einfo ("%X%P: can not create .reloc section: %E\n");
814 return;
817 bfd_set_section_size (filler_bfd, reloc_s, 0);
819 ldlang_add_file (filler_file);
822 /* Gather all the exported symbols and build the .edata section. */
824 static void
825 generate_edata (abfd, info)
826 bfd *abfd;
827 struct bfd_link_info *info ATTRIBUTE_UNUSED;
829 int i, next_ordinal;
830 int name_table_size = 0;
831 const char *dlnp;
833 /* First, we need to know how many exported symbols there are,
834 and what the range of ordinals is. */
835 if (pe_def_file->name)
836 dll_name = pe_def_file->name;
837 else
839 dll_name = abfd->filename;
841 for (dlnp = dll_name; *dlnp; dlnp++)
842 if (*dlnp == '\\' || *dlnp == '/' || *dlnp == ':')
843 dll_name = dlnp + 1;
846 if (count_with_ordinals && max_ordinal > count_exported)
848 if (min_ordinal > max_ordinal - count_exported + 1)
849 min_ordinal = max_ordinal - count_exported + 1;
851 else
853 min_ordinal = 1;
854 max_ordinal = count_exported;
857 export_table_size = max_ordinal - min_ordinal + 1;
858 exported_symbols = (int *) xmalloc (export_table_size * sizeof (int));
859 for (i = 0; i < export_table_size; i++)
860 exported_symbols[i] = -1;
862 /* Now we need to assign ordinals to those that don't have them. */
863 for (i = 0; i < NE; i++)
865 if (exported_symbol_sections[i])
867 if (pe_def_file->exports[i].ordinal != -1)
869 int ei = pe_def_file->exports[i].ordinal - min_ordinal;
870 int pi = exported_symbols[ei];
872 if (pi != -1)
874 /* xgettext:c-format */
875 einfo (_("%XError, ordinal used twice: %d (%s vs %s)\n"),
876 pe_def_file->exports[i].ordinal,
877 pe_def_file->exports[i].name,
878 pe_def_file->exports[pi].name);
880 exported_symbols[ei] = i;
882 name_table_size += strlen (pe_def_file->exports[i].name) + 1;
886 next_ordinal = min_ordinal;
887 for (i = 0; i < NE; i++)
888 if (exported_symbol_sections[i])
889 if (pe_def_file->exports[i].ordinal == -1)
891 while (exported_symbols[next_ordinal - min_ordinal] != -1)
892 next_ordinal++;
894 exported_symbols[next_ordinal - min_ordinal] = i;
895 pe_def_file->exports[i].ordinal = next_ordinal;
898 /* OK, now we can allocate some memory. */
899 edata_sz = (40 /* directory */
900 + 4 * export_table_size /* addresses */
901 + 4 * count_exported_byname /* name ptrs */
902 + 2 * count_exported_byname /* ordinals */
903 + name_table_size + strlen (dll_name) + 1);
906 /* Fill the exported symbol offsets. The preliminary work has already
907 been done in process_def_file(). */
909 static void
910 fill_exported_offsets (abfd, info)
911 bfd *abfd ATTRIBUTE_UNUSED;
912 struct bfd_link_info *info;
914 int i;
915 struct bfd_link_hash_entry *blhe;
917 for (i = 0; i < pe_def_file->num_exports; i++)
919 char *name = (char *) xmalloc (strlen (pe_def_file->exports[i].internal_name) + 2);
921 if (pe_details->underscored
922 && (*pe_def_file->exports[i].internal_name != '@'))
924 *name = '_';
925 strcpy (name + 1, pe_def_file->exports[i].internal_name);
927 else
928 strcpy (name, pe_def_file->exports[i].internal_name);
930 blhe = bfd_link_hash_lookup (info->hash,
931 name,
932 false, false, true);
934 if (blhe && (blhe->type == bfd_link_hash_defined))
935 exported_symbol_offsets[i] = blhe->u.def.value;
937 free (name);
941 static void
942 fill_edata (abfd, info)
943 bfd *abfd;
944 struct bfd_link_info *info ATTRIBUTE_UNUSED;
946 int i, hint;
947 unsigned char *edirectory;
948 unsigned long *eaddresses;
949 unsigned long *enameptrs;
950 unsigned short *eordinals;
951 unsigned char *enamestr;
952 time_t now;
954 time (&now);
956 edata_d = (unsigned char *) xmalloc (edata_sz);
958 /* Note use of array pointer math here. */
959 edirectory = edata_d;
960 eaddresses = (unsigned long *) (edata_d + 40);
961 enameptrs = eaddresses + export_table_size;
962 eordinals = (unsigned short *) (enameptrs + count_exported_byname);
963 enamestr = (char *) (eordinals + count_exported_byname);
965 #define ERVA(ptr) (((unsigned char *)(ptr) - edata_d) + edata_s->output_section->vma - image_base)
967 memset (edata_d, 0, edata_sz);
968 bfd_put_32 (abfd, now, edata_d + 4);
969 if (pe_def_file->version_major != -1)
971 bfd_put_16 (abfd, pe_def_file->version_major, edata_d + 8);
972 bfd_put_16 (abfd, pe_def_file->version_minor, edata_d + 10);
975 bfd_put_32 (abfd, ERVA (enamestr), edata_d + 12);
976 strcpy (enamestr, dll_name);
977 enamestr += strlen (enamestr) + 1;
978 bfd_put_32 (abfd, min_ordinal, edata_d + 16);
979 bfd_put_32 (abfd, export_table_size, edata_d + 20);
980 bfd_put_32 (abfd, count_exported_byname, edata_d + 24);
981 bfd_put_32 (abfd, ERVA (eaddresses), edata_d + 28);
982 bfd_put_32 (abfd, ERVA (enameptrs), edata_d + 32);
983 bfd_put_32 (abfd, ERVA (eordinals), edata_d + 36);
985 fill_exported_offsets (abfd, info);
987 /* Ok, now for the filling in part. */
988 hint = 0;
989 for (i = 0; i < export_table_size; i++)
991 int s = exported_symbols[i];
993 if (s != -1)
995 struct sec *ssec = exported_symbol_sections[s];
996 unsigned long srva = (exported_symbol_offsets[s]
997 + ssec->output_section->vma
998 + ssec->output_offset);
999 int ord = pe_def_file->exports[s].ordinal;
1001 bfd_put_32 (abfd, srva - image_base,
1002 (void *) (eaddresses + ord - min_ordinal));
1004 if (!pe_def_file->exports[s].flag_noname)
1006 char *ename = pe_def_file->exports[s].name;
1007 bfd_put_32 (abfd, ERVA (enamestr), (void *) enameptrs);
1008 enameptrs++;
1009 strcpy (enamestr, ename);
1010 enamestr += strlen (enamestr) + 1;
1011 bfd_put_16 (abfd, ord - min_ordinal, (void *) eordinals);
1012 eordinals++;
1013 pe_def_file->exports[s].hint = hint++;
1020 static struct sec *current_sec;
1022 void
1023 pe_walk_relocs_of_symbol (info, name, cb)
1024 struct bfd_link_info *info;
1025 const char *name;
1026 int (*cb) (arelent *, asection *);
1028 bfd *b;
1029 asection *s;
1031 for (b = info->input_bfds; b; b = b->link_next)
1033 asymbol **symbols;
1034 int nsyms, symsize;
1036 symsize = bfd_get_symtab_upper_bound (b);
1037 symbols = (asymbol **) xmalloc (symsize);
1038 nsyms = bfd_canonicalize_symtab (b, symbols);
1040 for (s = b->sections; s; s = s->next)
1042 arelent **relocs;
1043 int relsize, nrelocs, i;
1044 int flags = bfd_get_section_flags (b, s);
1046 /* Skip discarded linkonce sections. */
1047 if (flags & SEC_LINK_ONCE
1048 && s->output_section == bfd_abs_section_ptr)
1049 continue;
1051 current_sec = s;
1053 relsize = bfd_get_reloc_upper_bound (b, s);
1054 relocs = (arelent **) xmalloc ((size_t) relsize);
1055 nrelocs = bfd_canonicalize_reloc (b, s, relocs, symbols);
1057 for (i = 0; i < nrelocs; i++)
1059 struct symbol_cache_entry *sym = *relocs[i]->sym_ptr_ptr;
1061 if (!strcmp (name, sym->name))
1062 cb (relocs[i], s);
1065 free (relocs);
1067 /* Warning: the allocated symbols are remembered in BFD and reused
1068 later, so don't free them! */
1069 /* free (symbols); */
1074 /* Gather all the relocations and build the .reloc section. */
1076 static void
1077 generate_reloc (abfd, info)
1078 bfd *abfd;
1079 struct bfd_link_info *info;
1082 /* For .reloc stuff. */
1083 reloc_data_type *reloc_data;
1084 int total_relocs = 0;
1085 int i;
1086 unsigned long sec_page = (unsigned long) (-1);
1087 unsigned long page_ptr, page_count;
1088 int bi;
1089 bfd *b;
1090 struct sec *s;
1092 total_relocs = 0;
1093 for (b = info->input_bfds; b; b = b->link_next)
1094 for (s = b->sections; s; s = s->next)
1095 total_relocs += s->reloc_count;
1097 reloc_data =
1098 (reloc_data_type *) xmalloc (total_relocs * sizeof (reloc_data_type));
1100 total_relocs = 0;
1101 bi = 0;
1102 for (bi = 0, b = info->input_bfds; b; bi++, b = b->link_next)
1104 arelent **relocs;
1105 int relsize, nrelocs, i;
1107 for (s = b->sections; s; s = s->next)
1109 unsigned long sec_vma = s->output_section->vma + s->output_offset;
1110 asymbol **symbols;
1111 int nsyms, symsize;
1113 /* If it's not loaded, we don't need to relocate it this way. */
1114 if (!(s->output_section->flags & SEC_LOAD))
1115 continue;
1117 /* I don't know why there would be a reloc for these, but I've
1118 seen it happen - DJ */
1119 if (s->output_section == &bfd_abs_section)
1120 continue;
1122 if (s->output_section->vma == 0)
1124 /* Huh? Shouldn't happen, but punt if it does. */
1125 einfo ("DJ: zero vma section reloc detected: `%s' #%d f=%d\n",
1126 s->output_section->name, s->output_section->index,
1127 s->output_section->flags);
1128 continue;
1131 symsize = bfd_get_symtab_upper_bound (b);
1132 symbols = (asymbol **) xmalloc (symsize);
1133 nsyms = bfd_canonicalize_symtab (b, symbols);
1135 relsize = bfd_get_reloc_upper_bound (b, s);
1136 relocs = (arelent **) xmalloc ((size_t) relsize);
1137 nrelocs = bfd_canonicalize_reloc (b, s, relocs, symbols);
1139 for (i = 0; i < nrelocs; i++)
1141 if (pe_dll_extra_pe_debug)
1143 struct symbol_cache_entry *sym = *relocs[i]->sym_ptr_ptr;
1144 printf ("rel: %s\n", sym->name);
1146 if (!relocs[i]->howto->pc_relative
1147 && relocs[i]->howto->type != pe_details->imagebase_reloc)
1149 bfd_vma sym_vma;
1150 struct symbol_cache_entry *sym = *relocs[i]->sym_ptr_ptr;
1152 sym_vma = (relocs[i]->addend
1153 + sym->value
1154 + sym->section->vma
1155 + sym->section->output_offset
1156 + sym->section->output_section->vma);
1157 reloc_data[total_relocs].vma = sec_vma + relocs[i]->address;
1159 #define BITS_AND_SHIFT(bits, shift) (bits * 1000 | shift)
1161 switch BITS_AND_SHIFT (relocs[i]->howto->bitsize,
1162 relocs[i]->howto->rightshift)
1164 case BITS_AND_SHIFT (32, 0):
1165 reloc_data[total_relocs].type = 3;
1166 total_relocs++;
1167 break;
1168 case BITS_AND_SHIFT (16, 0):
1169 reloc_data[total_relocs].type = 2;
1170 total_relocs++;
1171 break;
1172 case BITS_AND_SHIFT (16, 16):
1173 reloc_data[total_relocs].type = 4;
1174 /* FIXME: we can't know the symbol's right value
1175 yet, but we probably can safely assume that
1176 CE will relocate us in 64k blocks, so leaving
1177 it zero is safe. */
1178 reloc_data[total_relocs].extra = 0;
1179 total_relocs++;
1180 break;
1181 case BITS_AND_SHIFT (26, 2):
1182 reloc_data[total_relocs].type = 5;
1183 total_relocs++;
1184 break;
1185 default:
1186 /* xgettext:c-format */
1187 einfo (_("%XError: %d-bit reloc in dll\n"),
1188 relocs[i]->howto->bitsize);
1189 break;
1193 free (relocs);
1194 /* Warning: the allocated symbols are remembered in BFD and
1195 reused later, so don't free them! */
1196 #if 0
1197 free (symbol);
1198 #endif
1202 /* At this point, we have total_relocs relocation addresses in
1203 reloc_addresses, which are all suitable for the .reloc section.
1204 We must now create the new sections. */
1205 qsort (reloc_data, total_relocs, sizeof (*reloc_data), reloc_sort);
1207 for (i = 0; i < total_relocs; i++)
1209 unsigned long this_page = (reloc_data[i].vma >> 12);
1211 if (this_page != sec_page)
1213 reloc_sz = (reloc_sz + 3) & ~3; /* 4-byte align. */
1214 reloc_sz += 8;
1215 sec_page = this_page;
1218 reloc_sz += 2;
1220 if (reloc_data[i].type == 4)
1221 reloc_sz += 2;
1224 reloc_sz = (reloc_sz + 3) & ~3; /* 4-byte align. */
1225 reloc_d = (unsigned char *) xmalloc (reloc_sz);
1226 sec_page = (unsigned long) (-1);
1227 reloc_sz = 0;
1228 page_ptr = (unsigned long) (-1);
1229 page_count = 0;
1231 for (i = 0; i < total_relocs; i++)
1233 unsigned long rva = reloc_data[i].vma - image_base;
1234 unsigned long this_page = (rva & ~0xfff);
1236 if (this_page != sec_page)
1238 while (reloc_sz & 3)
1239 reloc_d[reloc_sz++] = 0;
1241 if (page_ptr != (unsigned long) (-1))
1242 bfd_put_32 (abfd, reloc_sz - page_ptr, reloc_d + page_ptr + 4);
1244 bfd_put_32 (abfd, this_page, reloc_d + reloc_sz);
1245 page_ptr = reloc_sz;
1246 reloc_sz += 8;
1247 sec_page = this_page;
1248 page_count = 0;
1251 bfd_put_16 (abfd, (rva & 0xfff) + (reloc_data[i].type << 12),
1252 reloc_d + reloc_sz);
1253 reloc_sz += 2;
1255 if (reloc_data[i].type == 4)
1257 bfd_put_16 (abfd, reloc_data[i].extra, reloc_d + reloc_sz);
1258 reloc_sz += 2;
1261 page_count++;
1264 while (reloc_sz & 3)
1265 reloc_d[reloc_sz++] = 0;
1267 if (page_ptr != (unsigned long) (-1))
1268 bfd_put_32 (abfd, reloc_sz - page_ptr, reloc_d + page_ptr + 4);
1270 while (reloc_sz < reloc_s->_raw_size)
1271 reloc_d[reloc_sz++] = 0;
1274 /* Given the exiting def_file structure, print out a .DEF file that
1275 corresponds to it. */
1277 static void
1278 quoteput (s, f, needs_quotes)
1279 char *s;
1280 FILE *f;
1281 int needs_quotes;
1283 char *cp;
1285 for (cp = s; *cp; cp++)
1286 if (*cp == '\''
1287 || *cp == '"'
1288 || *cp == '\\'
1289 || ISSPACE (*cp)
1290 || *cp == ','
1291 || *cp == ';')
1292 needs_quotes = 1;
1294 if (needs_quotes)
1296 putc ('"', f);
1298 while (*s)
1300 if (*s == '"' || *s == '\\')
1301 putc ('\\', f);
1303 putc (*s, f);
1304 s++;
1307 putc ('"', f);
1309 else
1310 fputs (s, f);
1313 void
1314 pe_dll_generate_def_file (pe_out_def_filename)
1315 const char *pe_out_def_filename;
1317 int i;
1318 FILE *out = fopen (pe_out_def_filename, "w");
1320 if (out == NULL)
1321 /* xgettext:c-format */
1322 einfo (_("%s: Can't open output def file %s\n"),
1323 program_name, pe_out_def_filename);
1325 if (pe_def_file)
1327 if (pe_def_file->name)
1329 if (pe_def_file->is_dll)
1330 fprintf (out, "LIBRARY ");
1331 else
1332 fprintf (out, "NAME ");
1334 quoteput (pe_def_file->name, out, 1);
1336 if (pe_data (output_bfd)->pe_opthdr.ImageBase)
1337 fprintf (out, " BASE=0x%lx",
1338 (unsigned long) pe_data (output_bfd)->pe_opthdr.ImageBase);
1339 fprintf (out, "\n");
1342 if (pe_def_file->description)
1344 fprintf (out, "DESCRIPTION ");
1345 quoteput (pe_def_file->description, out, 1);
1346 fprintf (out, "\n");
1349 if (pe_def_file->version_minor != -1)
1350 fprintf (out, "VERSION %d.%d\n", pe_def_file->version_major,
1351 pe_def_file->version_minor);
1352 else if (pe_def_file->version_major != -1)
1353 fprintf (out, "VERSION %d\n", pe_def_file->version_major);
1355 if (pe_def_file->stack_reserve != -1 || pe_def_file->heap_reserve != -1)
1356 fprintf (out, "\n");
1358 if (pe_def_file->stack_commit != -1)
1359 fprintf (out, "STACKSIZE 0x%x,0x%x\n",
1360 pe_def_file->stack_reserve, pe_def_file->stack_commit);
1361 else if (pe_def_file->stack_reserve != -1)
1362 fprintf (out, "STACKSIZE 0x%x\n", pe_def_file->stack_reserve);
1364 if (pe_def_file->heap_commit != -1)
1365 fprintf (out, "HEAPSIZE 0x%x,0x%x\n",
1366 pe_def_file->heap_reserve, pe_def_file->heap_commit);
1367 else if (pe_def_file->heap_reserve != -1)
1368 fprintf (out, "HEAPSIZE 0x%x\n", pe_def_file->heap_reserve);
1370 if (pe_def_file->num_section_defs > 0)
1372 fprintf (out, "\nSECTIONS\n\n");
1374 for (i = 0; i < pe_def_file->num_section_defs; i++)
1376 fprintf (out, " ");
1377 quoteput (pe_def_file->section_defs[i].name, out, 0);
1379 if (pe_def_file->section_defs[i].class)
1381 fprintf (out, " CLASS ");
1382 quoteput (pe_def_file->section_defs[i].class, out, 0);
1385 if (pe_def_file->section_defs[i].flag_read)
1386 fprintf (out, " READ");
1388 if (pe_def_file->section_defs[i].flag_write)
1389 fprintf (out, " WRITE");
1391 if (pe_def_file->section_defs[i].flag_execute)
1392 fprintf (out, " EXECUTE");
1394 if (pe_def_file->section_defs[i].flag_shared)
1395 fprintf (out, " SHARED");
1397 fprintf (out, "\n");
1401 if (pe_def_file->num_exports > 0)
1403 fprintf (out, "EXPORTS\n");
1405 for (i = 0; i < pe_def_file->num_exports; i++)
1407 def_file_export *e = pe_def_file->exports + i;
1408 fprintf (out, " ");
1409 quoteput (e->name, out, 0);
1411 if (e->internal_name && strcmp (e->internal_name, e->name))
1413 fprintf (out, " = ");
1414 quoteput (e->internal_name, out, 0);
1417 if (e->ordinal != -1)
1418 fprintf (out, " @%d", e->ordinal);
1420 if (e->flag_private)
1421 fprintf (out, " PRIVATE");
1423 if (e->flag_constant)
1424 fprintf (out, " CONSTANT");
1426 if (e->flag_noname)
1427 fprintf (out, " NONAME");
1429 if (e->flag_data)
1430 fprintf (out, " DATA");
1432 fprintf (out, "\n");
1436 if (pe_def_file->num_imports > 0)
1438 fprintf (out, "\nIMPORTS\n\n");
1440 for (i = 0; i < pe_def_file->num_imports; i++)
1442 def_file_import *im = pe_def_file->imports + i;
1443 fprintf (out, " ");
1445 if (im->internal_name
1446 && (!im->name || strcmp (im->internal_name, im->name)))
1448 quoteput (im->internal_name, out, 0);
1449 fprintf (out, " = ");
1452 quoteput (im->module->name, out, 0);
1453 fprintf (out, ".");
1455 if (im->name)
1456 quoteput (im->name, out, 0);
1457 else
1458 fprintf (out, "%d", im->ordinal);
1460 fprintf (out, "\n");
1464 else
1465 fprintf (out, _("; no contents available\n"));
1467 if (fclose (out) == EOF)
1468 /* xgettext:c-format */
1469 einfo (_("%P: Error closing file `%s'\n"), pe_out_def_filename);
1472 /* Generate the import library. */
1474 static asymbol **symtab;
1475 static int symptr;
1476 static int tmp_seq;
1477 static const char *dll_filename;
1478 static char *dll_symname;
1480 #define UNDSEC (asection *) &bfd_und_section
1482 static asection *
1483 quick_section (abfd, name, flags, align)
1484 bfd *abfd;
1485 const char *name;
1486 int flags;
1487 int align;
1489 asection *sec;
1490 asymbol *sym;
1492 sec = bfd_make_section_old_way (abfd, name);
1493 bfd_set_section_flags (abfd, sec, flags | SEC_ALLOC | SEC_LOAD | SEC_KEEP);
1494 bfd_set_section_alignment (abfd, sec, align);
1495 /* Remember to undo this before trying to link internally! */
1496 sec->output_section = sec;
1498 sym = bfd_make_empty_symbol (abfd);
1499 symtab[symptr++] = sym;
1500 sym->name = sec->name;
1501 sym->section = sec;
1502 sym->flags = BSF_LOCAL;
1503 sym->value = 0;
1505 return sec;
1508 static void
1509 quick_symbol (abfd, n1, n2, n3, sec, flags, addr)
1510 bfd *abfd;
1511 const char *n1;
1512 const char *n2;
1513 const char *n3;
1514 asection *sec;
1515 int flags;
1516 int addr;
1518 asymbol *sym;
1519 char *name = (char *) xmalloc (strlen (n1) + strlen (n2) + strlen (n3) + 1);
1521 strcpy (name, n1);
1522 strcat (name, n2);
1523 strcat (name, n3);
1524 sym = bfd_make_empty_symbol (abfd);
1525 sym->name = name;
1526 sym->section = sec;
1527 sym->flags = flags;
1528 sym->value = addr;
1529 symtab[symptr++] = sym;
1532 static arelent *reltab = 0;
1533 static int relcount = 0, relsize = 0;
1535 static void
1536 quick_reloc (abfd, address, which_howto, symidx)
1537 bfd *abfd;
1538 int address;
1539 int which_howto;
1540 int symidx;
1542 if (relcount >= (relsize - 1))
1544 relsize += 10;
1545 if (reltab)
1546 reltab = (arelent *) xrealloc (reltab, relsize * sizeof (arelent));
1547 else
1548 reltab = (arelent *) xmalloc (relsize * sizeof (arelent));
1550 reltab[relcount].address = address;
1551 reltab[relcount].addend = 0;
1552 reltab[relcount].howto = bfd_reloc_type_lookup (abfd, which_howto);
1553 reltab[relcount].sym_ptr_ptr = symtab + symidx;
1554 relcount++;
1557 static void
1558 save_relocs (asection *sec)
1560 int i;
1562 sec->relocation = reltab;
1563 sec->reloc_count = relcount;
1564 sec->orelocation = (arelent **) xmalloc ((relcount + 1) * sizeof (arelent *));
1565 for (i = 0; i < relcount; i++)
1566 sec->orelocation[i] = sec->relocation + i;
1567 sec->orelocation[relcount] = 0;
1568 sec->flags |= SEC_RELOC;
1569 reltab = 0;
1570 relcount = relsize = 0;
1573 /* .section .idata$2
1574 .global __head_my_dll
1575 __head_my_dll:
1576 .rva hname
1577 .long 0
1578 .long 0
1579 .rva __my_dll_iname
1580 .rva fthunk
1582 .section .idata$5
1583 .long 0
1584 fthunk:
1586 .section .idata$4
1587 .long 0
1588 hname: */
1590 static bfd *
1591 make_head (parent)
1592 bfd *parent;
1594 asection *id2, *id5, *id4;
1595 unsigned char *d2, *d5, *d4;
1596 char *oname;
1597 bfd *abfd;
1599 oname = (char *) xmalloc (20);
1600 sprintf (oname, "d%06d.o", tmp_seq);
1601 tmp_seq++;
1603 abfd = bfd_create (oname, parent);
1604 bfd_find_target (pe_details->object_target, abfd);
1605 bfd_make_writable (abfd);
1607 bfd_set_format (abfd, bfd_object);
1608 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
1610 symptr = 0;
1611 symtab = (asymbol **) xmalloc (6 * sizeof (asymbol *));
1612 id2 = quick_section (abfd, ".idata$2", SEC_HAS_CONTENTS, 2);
1613 id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
1614 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
1615 quick_symbol (abfd, U ("_head_"), dll_symname, "", id2, BSF_GLOBAL, 0);
1616 quick_symbol (abfd, U (""), dll_symname, "_iname", UNDSEC, BSF_GLOBAL, 0);
1618 /* OK, pay attention here. I got confused myself looking back at
1619 it. We create a four-byte section to mark the beginning of the
1620 list, and we include an offset of 4 in the section, so that the
1621 pointer to the list points to the *end* of this section, which is
1622 the start of the list of sections from other objects. */
1624 bfd_set_section_size (abfd, id2, 20);
1625 d2 = (unsigned char *) xmalloc (20);
1626 id2->contents = d2;
1627 memset (d2, 0, 20);
1628 d2[0] = d2[16] = 4; /* Reloc addend. */
1629 quick_reloc (abfd, 0, BFD_RELOC_RVA, 2);
1630 quick_reloc (abfd, 12, BFD_RELOC_RVA, 4);
1631 quick_reloc (abfd, 16, BFD_RELOC_RVA, 1);
1632 save_relocs (id2);
1634 bfd_set_section_size (abfd, id5, 4);
1635 d5 = (unsigned char *) xmalloc (4);
1636 id5->contents = d5;
1637 memset (d5, 0, 4);
1639 bfd_set_section_size (abfd, id4, 4);
1640 d4 = (unsigned char *) xmalloc (4);
1641 id4->contents = d4;
1642 memset (d4, 0, 4);
1644 bfd_set_symtab (abfd, symtab, symptr);
1646 bfd_set_section_contents (abfd, id2, d2, 0, 20);
1647 bfd_set_section_contents (abfd, id5, d5, 0, 4);
1648 bfd_set_section_contents (abfd, id4, d4, 0, 4);
1650 bfd_make_readable (abfd);
1651 return abfd;
1654 /* .section .idata$4
1655 .long 0
1656 .section .idata$5
1657 .long 0
1658 .section idata$7
1659 .global __my_dll_iname
1660 __my_dll_iname:
1661 .asciz "my.dll" */
1663 static bfd *
1664 make_tail (parent)
1665 bfd *parent;
1667 asection *id4, *id5, *id7;
1668 unsigned char *d4, *d5, *d7;
1669 int len;
1670 char *oname;
1671 bfd *abfd;
1673 oname = (char *) xmalloc (20);
1674 sprintf (oname, "d%06d.o", tmp_seq);
1675 tmp_seq++;
1677 abfd = bfd_create (oname, parent);
1678 bfd_find_target (pe_details->object_target, abfd);
1679 bfd_make_writable (abfd);
1681 bfd_set_format (abfd, bfd_object);
1682 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
1684 symptr = 0;
1685 symtab = (asymbol **) xmalloc (5 * sizeof (asymbol *));
1686 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
1687 id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
1688 id7 = quick_section (abfd, ".idata$7", SEC_HAS_CONTENTS, 2);
1689 quick_symbol (abfd, U (""), dll_symname, "_iname", id7, BSF_GLOBAL, 0);
1691 bfd_set_section_size (abfd, id4, 4);
1692 d4 = (unsigned char *) xmalloc (4);
1693 id4->contents = d4;
1694 memset (d4, 0, 4);
1696 bfd_set_section_size (abfd, id5, 4);
1697 d5 = (unsigned char *) xmalloc (4);
1698 id5->contents = d5;
1699 memset (d5, 0, 4);
1701 len = strlen (dll_filename) + 1;
1702 if (len & 1)
1703 len++;
1704 bfd_set_section_size (abfd, id7, len);
1705 d7 = (unsigned char *) xmalloc (len);
1706 id7->contents = d7;
1707 strcpy (d7, dll_filename);
1709 bfd_set_symtab (abfd, symtab, symptr);
1711 bfd_set_section_contents (abfd, id4, d4, 0, 4);
1712 bfd_set_section_contents (abfd, id5, d5, 0, 4);
1713 bfd_set_section_contents (abfd, id7, d7, 0, len);
1715 bfd_make_readable (abfd);
1716 return abfd;
1719 /* .text
1720 .global _function
1721 .global ___imp_function
1722 .global __imp__function
1723 _function:
1724 jmp *__imp__function:
1726 .section idata$7
1727 .long __head_my_dll
1729 .section .idata$5
1730 ___imp_function:
1731 __imp__function:
1732 iat?
1733 .section .idata$4
1734 iat?
1735 .section .idata$6
1736 ID<ordinal>:
1737 .short <hint>
1738 .asciz "function" xlate? (add underscore, kill at) */
1740 static unsigned char jmp_ix86_bytes[] =
1742 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x90, 0x90
1745 /* _function:
1746 mov.l ip+8,r0
1747 mov.l @r0,r0
1748 jmp @r0
1750 .dw __imp_function */
1752 static unsigned char jmp_sh_bytes[] =
1754 0x01, 0xd0, 0x02, 0x60, 0x2b, 0x40, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00
1757 /* _function:
1758 lui $t0,<high:__imp_function>
1759 lw $t0,<low:__imp_function>
1760 jr $t0
1761 nop */
1763 static unsigned char jmp_mips_bytes[] =
1765 0x00, 0x00, 0x08, 0x3c, 0x00, 0x00, 0x08, 0x8d,
1766 0x08, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00
1769 static bfd *
1770 make_one (exp, parent)
1771 def_file_export *exp;
1772 bfd *parent;
1774 asection *tx, *id7, *id5, *id4, *id6;
1775 unsigned char *td = NULL, *d7, *d5, *d4, *d6 = NULL;
1776 int len;
1777 char *oname;
1778 bfd *abfd;
1779 unsigned char *jmp_bytes = NULL;
1780 int jmp_byte_count = 0;
1782 switch (pe_details->pe_arch)
1784 case PE_ARCH_i386:
1785 jmp_bytes = jmp_ix86_bytes;
1786 jmp_byte_count = sizeof (jmp_ix86_bytes);
1787 break;
1788 case PE_ARCH_sh:
1789 jmp_bytes = jmp_sh_bytes;
1790 jmp_byte_count = sizeof (jmp_sh_bytes);
1791 break;
1792 case PE_ARCH_mips:
1793 jmp_bytes = jmp_mips_bytes;
1794 jmp_byte_count = sizeof (jmp_mips_bytes);
1795 break;
1796 default:
1797 abort ();
1800 oname = (char *) xmalloc (20);
1801 sprintf (oname, "d%06d.o", tmp_seq);
1802 tmp_seq++;
1804 abfd = bfd_create (oname, parent);
1805 bfd_find_target (pe_details->object_target, abfd);
1806 bfd_make_writable (abfd);
1808 bfd_set_format (abfd, bfd_object);
1809 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
1811 symptr = 0;
1812 symtab = (asymbol **) xmalloc (11 * sizeof (asymbol *));
1813 tx = quick_section (abfd, ".text", SEC_CODE|SEC_HAS_CONTENTS, 2);
1814 id7 = quick_section (abfd, ".idata$7", SEC_HAS_CONTENTS, 2);
1815 id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
1816 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
1817 id6 = quick_section (abfd, ".idata$6", SEC_HAS_CONTENTS, 2);
1819 if (*exp->internal_name == '@')
1821 if (! exp->flag_data)
1822 quick_symbol (abfd, "", exp->internal_name, "", tx, BSF_GLOBAL, 0);
1823 quick_symbol (abfd, U ("_head_"), dll_symname, "", UNDSEC, BSF_GLOBAL, 0);
1824 quick_symbol (abfd, U ("_imp_"), exp->internal_name, "", id5, BSF_GLOBAL, 0);
1825 /* Fastcall applies only to functions,
1826 so no need for auto-import symbol. */
1828 else
1830 if (! exp->flag_data)
1831 quick_symbol (abfd, U (""), exp->internal_name, "", tx, BSF_GLOBAL, 0);
1832 quick_symbol (abfd, U ("_head_"), dll_symname, "", UNDSEC, BSF_GLOBAL, 0);
1833 quick_symbol (abfd, U ("_imp__"), exp->internal_name, "", id5, BSF_GLOBAL, 0);
1834 /* Symbol to reference ord/name of imported
1835 data symbol, used to implement auto-import. */
1836 if (exp->flag_data)
1837 quick_symbol (abfd, U("_nm__"), exp->internal_name, "", id6, BSF_GLOBAL,0);
1839 if (pe_dll_compat_implib)
1840 quick_symbol (abfd, U ("__imp_"), exp->internal_name, "",
1841 id5, BSF_GLOBAL, 0);
1843 if (! exp->flag_data)
1845 bfd_set_section_size (abfd, tx, jmp_byte_count);
1846 td = (unsigned char *) xmalloc (jmp_byte_count);
1847 tx->contents = td;
1848 memcpy (td, jmp_bytes, jmp_byte_count);
1850 switch (pe_details->pe_arch)
1852 case PE_ARCH_i386:
1853 quick_reloc (abfd, 2, BFD_RELOC_32, 2);
1854 break;
1855 case PE_ARCH_sh:
1856 quick_reloc (abfd, 8, BFD_RELOC_32, 2);
1857 break;
1858 case PE_ARCH_mips:
1859 quick_reloc (abfd, 0, BFD_RELOC_HI16_S, 2);
1860 quick_reloc (abfd, 0, BFD_RELOC_LO16, 0); /* MIPS_R_PAIR */
1861 quick_reloc (abfd, 4, BFD_RELOC_LO16, 2);
1862 break;
1863 default:
1864 abort ();
1866 save_relocs (tx);
1869 bfd_set_section_size (abfd, id7, 4);
1870 d7 = (unsigned char *) xmalloc (4);
1871 id7->contents = d7;
1872 memset (d7, 0, 4);
1873 quick_reloc (abfd, 0, BFD_RELOC_RVA, 6);
1874 save_relocs (id7);
1876 bfd_set_section_size (abfd, id5, 4);
1877 d5 = (unsigned char *) xmalloc (4);
1878 id5->contents = d5;
1879 memset (d5, 0, 4);
1881 if (exp->flag_noname)
1883 d5[0] = exp->ordinal;
1884 d5[1] = exp->ordinal >> 8;
1885 d5[3] = 0x80;
1887 else
1889 quick_reloc (abfd, 0, BFD_RELOC_RVA, 4);
1890 save_relocs (id5);
1893 bfd_set_section_size (abfd, id4, 4);
1894 d4 = (unsigned char *) xmalloc (4);
1895 id4->contents = d4;
1896 memset (d4, 0, 4);
1898 if (exp->flag_noname)
1900 d4[0] = exp->ordinal;
1901 d4[1] = exp->ordinal >> 8;
1902 d4[3] = 0x80;
1904 else
1906 quick_reloc (abfd, 0, BFD_RELOC_RVA, 4);
1907 save_relocs (id4);
1910 if (exp->flag_noname)
1912 len = 0;
1913 bfd_set_section_size (abfd, id6, 0);
1915 else
1917 len = strlen (exp->name) + 3;
1918 if (len & 1)
1919 len++;
1920 bfd_set_section_size (abfd, id6, len);
1921 d6 = (unsigned char *) xmalloc (len);
1922 id6->contents = d6;
1923 memset (d6, 0, len);
1924 d6[0] = exp->hint & 0xff;
1925 d6[1] = exp->hint >> 8;
1926 strcpy (d6 + 2, exp->name);
1929 bfd_set_symtab (abfd, symtab, symptr);
1931 bfd_set_section_contents (abfd, tx, td, 0, jmp_byte_count);
1932 bfd_set_section_contents (abfd, id7, d7, 0, 4);
1933 bfd_set_section_contents (abfd, id5, d5, 0, 4);
1934 bfd_set_section_contents (abfd, id4, d4, 0, 4);
1935 if (!exp->flag_noname)
1936 bfd_set_section_contents (abfd, id6, d6, 0, len);
1938 bfd_make_readable (abfd);
1939 return abfd;
1942 static bfd *
1943 make_singleton_name_thunk (import, parent)
1944 const char *import;
1945 bfd *parent;
1947 /* Name thunks go to idata$4. */
1948 asection *id4;
1949 unsigned char *d4;
1950 char *oname;
1951 bfd *abfd;
1953 oname = (char *) xmalloc (20);
1954 sprintf (oname, "nmth%06d.o", tmp_seq);
1955 tmp_seq++;
1957 abfd = bfd_create (oname, parent);
1958 bfd_find_target (pe_details->object_target, abfd);
1959 bfd_make_writable (abfd);
1961 bfd_set_format (abfd, bfd_object);
1962 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
1964 symptr = 0;
1965 symtab = (asymbol **) xmalloc (3 * sizeof (asymbol *));
1966 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
1967 quick_symbol (abfd, U ("_nm_thnk_"), import, "", id4, BSF_GLOBAL, 0);
1968 quick_symbol (abfd, U ("_nm_"), import, "", UNDSEC, BSF_GLOBAL, 0);
1970 bfd_set_section_size (abfd, id4, 8);
1971 d4 = (unsigned char *) xmalloc (4);
1972 id4->contents = d4;
1973 memset (d4, 0, 8);
1974 quick_reloc (abfd, 0, BFD_RELOC_RVA, 2);
1975 save_relocs (id4);
1977 bfd_set_symtab (abfd, symtab, symptr);
1979 bfd_set_section_contents (abfd, id4, d4, 0, 8);
1981 bfd_make_readable (abfd);
1982 return abfd;
1985 static char *
1986 make_import_fixup_mark (rel)
1987 arelent *rel;
1989 /* We convert reloc to symbol, for later reference. */
1990 static int counter;
1991 static char *fixup_name = NULL;
1992 static size_t buffer_len = 0;
1994 struct symbol_cache_entry *sym = *rel->sym_ptr_ptr;
1996 bfd *abfd = bfd_asymbol_bfd (sym);
1997 struct bfd_link_hash_entry *bh;
1999 if (!fixup_name)
2001 fixup_name = (char *) xmalloc (384);
2002 buffer_len = 384;
2005 if (strlen (sym->name) + 25 > buffer_len)
2006 /* Assume 25 chars for "__fu" + counter + "_". If counter is
2007 bigger than 20 digits long, we've got worse problems than
2008 overflowing this buffer... */
2010 free (fixup_name);
2011 /* New buffer size is length of symbol, plus 25, but then
2012 rounded up to the nearest multiple of 128. */
2013 buffer_len = ((strlen (sym->name) + 25) + 127) & ~127;
2014 fixup_name = (char *) xmalloc (buffer_len);
2017 sprintf (fixup_name, "__fu%d_%s", counter++, sym->name);
2019 bh = NULL;
2020 bfd_coff_link_add_one_symbol (&link_info, abfd, fixup_name, BSF_GLOBAL,
2021 current_sec, /* sym->section, */
2022 rel->address, NULL, true, false, &bh);
2024 if (0)
2026 struct coff_link_hash_entry *myh;
2028 myh = (struct coff_link_hash_entry *) bh;
2029 printf ("type:%d\n", myh->type);
2030 printf ("%s\n", myh->root.u.def.section->name);
2033 return fixup_name;
2036 /* .section .idata$3
2037 .rva __nm_thnk_SYM (singleton thunk with name of func)
2038 .long 0
2039 .long 0
2040 .rva __my_dll_iname (name of dll)
2041 .rva __fuNN_SYM (pointer to reference (address) in text) */
2043 static bfd *
2044 make_import_fixup_entry (name, fixup_name, dll_symname, parent)
2045 const char *name;
2046 const char *fixup_name;
2047 const char *dll_symname;
2048 bfd *parent;
2050 asection *id3;
2051 unsigned char *d3;
2052 char *oname;
2053 bfd *abfd;
2055 oname = (char *) xmalloc (20);
2056 sprintf (oname, "fu%06d.o", tmp_seq);
2057 tmp_seq++;
2059 abfd = bfd_create (oname, parent);
2060 bfd_find_target (pe_details->object_target, abfd);
2061 bfd_make_writable (abfd);
2063 bfd_set_format (abfd, bfd_object);
2064 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2066 symptr = 0;
2067 symtab = (asymbol **) xmalloc (6 * sizeof (asymbol *));
2068 id3 = quick_section (abfd, ".idata$3", SEC_HAS_CONTENTS, 2);
2070 #if 0
2071 quick_symbol (abfd, U ("_head_"), dll_symname, "", id2, BSF_GLOBAL, 0);
2072 #endif
2073 quick_symbol (abfd, U ("_nm_thnk_"), name, "", UNDSEC, BSF_GLOBAL, 0);
2074 quick_symbol (abfd, U (""), dll_symname, "_iname", UNDSEC, BSF_GLOBAL, 0);
2075 quick_symbol (abfd, "", fixup_name, "", UNDSEC, BSF_GLOBAL, 0);
2077 bfd_set_section_size (abfd, id3, 20);
2078 d3 = (unsigned char *) xmalloc (20);
2079 id3->contents = d3;
2080 memset (d3, 0, 20);
2082 quick_reloc (abfd, 0, BFD_RELOC_RVA, 1);
2083 quick_reloc (abfd, 12, BFD_RELOC_RVA, 2);
2084 quick_reloc (abfd, 16, BFD_RELOC_RVA, 3);
2085 save_relocs (id3);
2087 bfd_set_symtab (abfd, symtab, symptr);
2089 bfd_set_section_contents (abfd, id3, d3, 0, 20);
2091 bfd_make_readable (abfd);
2092 return abfd;
2095 void
2096 pe_create_import_fixup (rel)
2097 arelent *rel;
2099 char buf[300];
2100 struct symbol_cache_entry *sym = *rel->sym_ptr_ptr;
2101 struct bfd_link_hash_entry *name_thunk_sym;
2102 const char *name = sym->name;
2103 char *fixup_name = make_import_fixup_mark (rel);
2105 sprintf (buf, U ("_nm_thnk_%s"), name);
2107 name_thunk_sym = bfd_link_hash_lookup (link_info.hash, buf, 0, 0, 1);
2109 if (!name_thunk_sym || name_thunk_sym->type != bfd_link_hash_defined)
2111 bfd *b = make_singleton_name_thunk (name, output_bfd);
2112 add_bfd_to_link (b, b->filename, &link_info);
2114 /* If we ever use autoimport, we have to cast text section writable. */
2115 config.text_read_only = false;
2119 extern char * pe_data_import_dll;
2120 char * dll_symname = pe_data_import_dll ? pe_data_import_dll : "unknown";
2122 bfd *b = make_import_fixup_entry (name, fixup_name, dll_symname,
2123 output_bfd);
2124 add_bfd_to_link (b, b->filename, &link_info);
2129 void
2130 pe_dll_generate_implib (def, impfilename)
2131 def_file *def;
2132 const char *impfilename;
2134 int i;
2135 bfd *ar_head;
2136 bfd *ar_tail;
2137 bfd *outarch;
2138 bfd *head = 0;
2140 dll_filename = (def->name) ? def->name : dll_name;
2141 dll_symname = xstrdup (dll_filename);
2142 for (i = 0; dll_symname[i]; i++)
2143 if (!ISALNUM (dll_symname[i]))
2144 dll_symname[i] = '_';
2146 unlink (impfilename);
2148 outarch = bfd_openw (impfilename, 0);
2150 if (!outarch)
2152 /* xgettext:c-format */
2153 einfo (_("%XCan't open .lib file: %s\n"), impfilename);
2154 return;
2157 /* xgettext:c-format */
2158 einfo (_("Creating library file: %s\n"), impfilename);
2160 bfd_set_format (outarch, bfd_archive);
2161 outarch->has_armap = 1;
2163 /* Work out a reasonable size of things to put onto one line. */
2164 ar_head = make_head (outarch);
2166 for (i = 0; i < def->num_exports; i++)
2168 /* The import library doesn't know about the internal name. */
2169 char *internal = def->exports[i].internal_name;
2170 bfd *n;
2172 def->exports[i].internal_name = def->exports[i].name;
2173 n = make_one (def->exports + i, outarch);
2174 n->next = head;
2175 head = n;
2176 def->exports[i].internal_name = internal;
2179 ar_tail = make_tail (outarch);
2181 if (ar_head == NULL || ar_tail == NULL)
2182 return;
2184 /* Now stick them all into the archive. */
2185 ar_head->next = head;
2186 ar_tail->next = ar_head;
2187 head = ar_tail;
2189 if (! bfd_set_archive_head (outarch, head))
2190 einfo ("%Xbfd_set_archive_head: %s\n", bfd_errmsg (bfd_get_error ()));
2192 if (! bfd_close (outarch))
2193 einfo ("%Xbfd_close %s: %s\n", impfilename, bfd_errmsg (bfd_get_error ()));
2195 while (head != NULL)
2197 bfd *n = head->next;
2198 bfd_close (head);
2199 head = n;
2203 static void
2204 add_bfd_to_link (abfd, name, link_info)
2205 bfd *abfd;
2206 const char *name;
2207 struct bfd_link_info *link_info;
2209 lang_input_statement_type *fake_file;
2211 fake_file = lang_add_input_file (name,
2212 lang_input_file_is_fake_enum,
2213 NULL);
2214 fake_file->the_bfd = abfd;
2215 ldlang_add_file (fake_file);
2217 if (!bfd_link_add_symbols (abfd, link_info))
2218 einfo ("%Xaddsym %s: %s\n", name, bfd_errmsg (bfd_get_error ()));
2221 void
2222 pe_process_import_defs (output_bfd, link_info)
2223 bfd *output_bfd;
2224 struct bfd_link_info *link_info;
2226 def_file_module *module;
2228 pe_dll_id_target (bfd_get_target (output_bfd));
2230 if (!pe_def_file)
2231 return;
2233 for (module = pe_def_file->modules; module; module = module->next)
2235 int i, do_this_dll;
2237 dll_filename = module->name;
2238 dll_symname = xstrdup (module->name);
2239 for (i = 0; dll_symname[i]; i++)
2240 if (!ISALNUM (dll_symname[i]))
2241 dll_symname[i] = '_';
2243 do_this_dll = 0;
2245 for (i = 0; i < pe_def_file->num_imports; i++)
2246 if (pe_def_file->imports[i].module == module)
2248 def_file_export exp;
2249 struct bfd_link_hash_entry *blhe;
2250 int lead_at = (*pe_def_file->imports[i].internal_name == '@');
2251 /* See if we need this import. */
2252 char *name = (char *) xmalloc (strlen (pe_def_file->imports[i].internal_name) + 2 + 6);
2254 if (lead_at)
2255 sprintf (name, "%s%s", "", pe_def_file->imports[i].internal_name);
2256 else
2257 sprintf (name, "%s%s",U (""), pe_def_file->imports[i].internal_name);
2259 blhe = bfd_link_hash_lookup (link_info->hash, name,
2260 false, false, false);
2262 if (!blhe || (blhe && blhe->type != bfd_link_hash_undefined))
2264 if (lead_at)
2265 sprintf (name, "%s%s", U ("_imp_"),
2266 pe_def_file->imports[i].internal_name);
2267 else
2268 sprintf (name, "%s%s", U ("_imp__"),
2269 pe_def_file->imports[i].internal_name);
2271 blhe = bfd_link_hash_lookup (link_info->hash, name,
2272 false, false, false);
2274 free (name);
2276 if (blhe && blhe->type == bfd_link_hash_undefined)
2278 bfd *one;
2279 /* We do. */
2280 if (!do_this_dll)
2282 bfd *ar_head = make_head (output_bfd);
2283 add_bfd_to_link (ar_head, ar_head->filename, link_info);
2284 do_this_dll = 1;
2286 exp.internal_name = pe_def_file->imports[i].internal_name;
2287 exp.name = pe_def_file->imports[i].name;
2288 exp.ordinal = pe_def_file->imports[i].ordinal;
2289 exp.hint = exp.ordinal >= 0 ? exp.ordinal : 0;
2290 exp.flag_private = 0;
2291 exp.flag_constant = 0;
2292 exp.flag_data = 0;
2293 exp.flag_noname = exp.name ? 0 : 1;
2294 one = make_one (&exp, output_bfd);
2295 add_bfd_to_link (one, one->filename, link_info);
2298 if (do_this_dll)
2300 bfd *ar_tail = make_tail (output_bfd);
2301 add_bfd_to_link (ar_tail, ar_tail->filename, link_info);
2304 free (dll_symname);
2308 /* We were handed a *.DLL file. Parse it and turn it into a set of
2309 IMPORTS directives in the def file. Return true if the file was
2310 handled, false if not. */
2312 static unsigned int
2313 pe_get16 (abfd, where)
2314 bfd *abfd;
2315 int where;
2317 unsigned char b[2];
2319 bfd_seek (abfd, (file_ptr) where, SEEK_SET);
2320 bfd_bread (b, (bfd_size_type) 2, abfd);
2321 return b[0] + (b[1] << 8);
2324 static unsigned int
2325 pe_get32 (abfd, where)
2326 bfd *abfd;
2327 int where;
2329 unsigned char b[4];
2331 bfd_seek (abfd, (file_ptr) where, SEEK_SET);
2332 bfd_bread (b, (bfd_size_type) 4, abfd);
2333 return b[0] + (b[1] << 8) + (b[2] << 16) + (b[3] << 24);
2336 #if 0 /* This is not currently used. */
2338 static unsigned int
2339 pe_as16 (ptr)
2340 void *ptr;
2342 unsigned char *b = ptr;
2344 return b[0] + (b[1] << 8);
2347 #endif
2349 static unsigned int
2350 pe_as32 (ptr)
2351 void *ptr;
2353 unsigned char *b = ptr;
2355 return b[0] + (b[1] << 8) + (b[2] << 16) + (b[3] << 24);
2358 boolean
2359 pe_implied_import_dll (filename)
2360 const char *filename;
2362 bfd *dll;
2363 unsigned long pe_header_offset, opthdr_ofs, num_entries, i;
2364 unsigned long export_rva, export_size, nsections, secptr, expptr;
2365 unsigned char *expdata, *erva;
2366 unsigned long name_rvas, ordinals, nexp, ordbase;
2367 const char *dll_name;
2369 /* No, I can't use bfd here. kernel32.dll puts its export table in
2370 the middle of the .rdata section. */
2371 dll = bfd_openr (filename, pe_details->target_name);
2372 if (!dll)
2374 einfo ("%Xopen %s: %s\n", filename, bfd_errmsg (bfd_get_error ()));
2375 return false;
2378 /* PEI dlls seem to be bfd_objects. */
2379 if (!bfd_check_format (dll, bfd_object))
2381 einfo ("%X%s: this doesn't appear to be a DLL\n", filename);
2382 return false;
2385 dll_name = filename;
2386 for (i = 0; filename[i]; i++)
2387 if (filename[i] == '/' || filename[i] == '\\' || filename[i] == ':')
2388 dll_name = filename + i + 1;
2390 pe_header_offset = pe_get32 (dll, 0x3c);
2391 opthdr_ofs = pe_header_offset + 4 + 20;
2392 num_entries = pe_get32 (dll, opthdr_ofs + 92);
2394 if (num_entries < 1) /* No exports. */
2395 return false;
2397 export_rva = pe_get32 (dll, opthdr_ofs + 96);
2398 export_size = pe_get32 (dll, opthdr_ofs + 100);
2399 nsections = pe_get16 (dll, pe_header_offset + 4 + 2);
2400 secptr = (pe_header_offset + 4 + 20 +
2401 pe_get16 (dll, pe_header_offset + 4 + 16));
2402 expptr = 0;
2404 for (i = 0; i < nsections; i++)
2406 char sname[8];
2407 unsigned long secptr1 = secptr + 40 * i;
2408 unsigned long vaddr = pe_get32 (dll, secptr1 + 12);
2409 unsigned long vsize = pe_get32 (dll, secptr1 + 16);
2410 unsigned long fptr = pe_get32 (dll, secptr1 + 20);
2412 bfd_seek (dll, (file_ptr) secptr1, SEEK_SET);
2413 bfd_bread (sname, (bfd_size_type) 8, dll);
2415 if (vaddr <= export_rva && vaddr + vsize > export_rva)
2417 expptr = fptr + (export_rva - vaddr);
2418 if (export_rva + export_size > vaddr + vsize)
2419 export_size = vsize - (export_rva - vaddr);
2420 break;
2424 expdata = (unsigned char *) xmalloc (export_size);
2425 bfd_seek (dll, (file_ptr) expptr, SEEK_SET);
2426 bfd_bread (expdata, (bfd_size_type) export_size, dll);
2427 erva = expdata - export_rva;
2429 if (pe_def_file == 0)
2430 pe_def_file = def_file_empty ();
2432 nexp = pe_as32 (expdata + 24);
2433 name_rvas = pe_as32 (expdata + 32);
2434 ordinals = pe_as32 (expdata + 36);
2435 ordbase = pe_as32 (expdata + 16);
2437 for (i = 0; i < nexp; i++)
2439 unsigned long name_rva = pe_as32 (erva + name_rvas + i * 4);
2440 def_file_import *imp;
2442 imp = def_file_add_import (pe_def_file, erva + name_rva, dll_name,
2443 i, 0);
2446 return true;
2449 /* These are the main functions, called from the emulation. The first
2450 is called after the bfds are read, so we can guess at how much space
2451 we need. The second is called after everything is placed, so we
2452 can put the right values in place. */
2454 void
2455 pe_dll_build_sections (abfd, info)
2456 bfd *abfd;
2457 struct bfd_link_info *info;
2459 pe_dll_id_target (bfd_get_target (abfd));
2460 process_def_file (abfd, info);
2462 generate_edata (abfd, info);
2463 build_filler_bfd (1);
2466 void
2467 pe_exe_build_sections (abfd, info)
2468 bfd *abfd;
2469 struct bfd_link_info *info ATTRIBUTE_UNUSED;
2471 pe_dll_id_target (bfd_get_target (abfd));
2472 build_filler_bfd (0);
2475 void
2476 pe_dll_fill_sections (abfd, info)
2477 bfd *abfd;
2478 struct bfd_link_info *info;
2480 pe_dll_id_target (bfd_get_target (abfd));
2481 image_base = pe_data (abfd)->pe_opthdr.ImageBase;
2483 generate_reloc (abfd, info);
2484 if (reloc_sz > 0)
2486 bfd_set_section_size (filler_bfd, reloc_s, reloc_sz);
2488 /* Resize the sections. */
2489 lang_size_sections (stat_ptr->head, abs_output_section,
2490 &stat_ptr->head, 0, (bfd_vma) 0, NULL);
2492 /* Redo special stuff. */
2493 ldemul_after_allocation ();
2495 /* Do the assignments again. */
2496 lang_do_assignments (stat_ptr->head,
2497 abs_output_section,
2498 (fill_type *) 0, (bfd_vma) 0);
2501 fill_edata (abfd, info);
2503 pe_data (abfd)->dll = 1;
2505 edata_s->contents = edata_d;
2506 reloc_s->contents = reloc_d;
2509 void
2510 pe_exe_fill_sections (abfd, info)
2511 bfd *abfd;
2512 struct bfd_link_info *info;
2514 pe_dll_id_target (bfd_get_target (abfd));
2515 image_base = pe_data (abfd)->pe_opthdr.ImageBase;
2517 generate_reloc (abfd, info);
2518 if (reloc_sz > 0)
2520 bfd_set_section_size (filler_bfd, reloc_s, reloc_sz);
2522 /* Resize the sections. */
2523 lang_size_sections (stat_ptr->head, abs_output_section,
2524 &stat_ptr->head, 0, (bfd_vma) 0, NULL);
2526 /* Redo special stuff. */
2527 ldemul_after_allocation ();
2529 /* Do the assignments again. */
2530 lang_do_assignments (stat_ptr->head,
2531 abs_output_section,
2532 (fill_type *) 0, (bfd_vma) 0);
2534 reloc_s->contents = reloc_d;