* ldfile.c: Fix comment typos.
[external/binutils.git] / ld / pe-dll.c
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>
4
5    This file is part of GLD, the Gnu Linker.
6
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.
11
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.
16
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.  */
21
22 #include "bfd.h"
23 #include "sysdep.h"
24 #include "bfdlink.h"
25 #include "libiberty.h"
26 #include "safe-ctype.h"
27
28 #include <time.h>
29
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"
43
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.
50
51     See also: ld/emultempl/pe.em.  */
52
53 /*  Auto-import feature by Paul Sokolovsky
54
55     Quick facts:
56
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).
60
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 practice it works).
63     So, resulting module can be used with any other PE compiler/linker.
64
65     3. Auto-import is fully compatible with standard import method and they
66     can be mixed together.
67
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).
72
73     Idea
74
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 something like
78
79     mov dll_var,%eax,
80
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 parallel 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, ;-) .
91
92     Implementation
93
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 practice,
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, prohibiting that (detecting violation) would require more work on
119     behalf of loader than not doing it.
120
121     See also: ld/emultempl/pe.em.  */
122
123 static void
124 add_bfd_to_link PARAMS ((bfd *, const char *, struct bfd_link_info *));
125
126 /* For emultempl/pe.em.  */
127
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;
136
137 /* Static variables and types.  */
138
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;
144 static int runtime_pseudo_relocs_created = 0;
145
146 typedef struct
147   {
148     char *target_name;
149     char *object_target;
150     unsigned int imagebase_reloc;
151     int pe_arch;
152     int bfd_arch;
153     int underscored;
154   }
155 pe_details_type;
156
157 typedef struct
158   {
159     char *name;
160     int len;
161   }
162 autofilter_entry_type;
163
164 #define PE_ARCH_i386    1
165 #define PE_ARCH_sh      2
166 #define PE_ARCH_mips    3
167 #define PE_ARCH_arm     4
168 #define PE_ARCH_arm_epoc 5
169
170 static pe_details_type pe_detail_list[] =
171 {
172   {
173     "pei-i386",
174     "pe-i386",
175     7 /* R_IMAGEBASE */,
176     PE_ARCH_i386,
177     bfd_arch_i386,
178     1
179   },
180   {
181     "pei-shl",
182     "pe-shl",
183     16 /* R_SH_IMAGEBASE */,
184     PE_ARCH_sh,
185     bfd_arch_sh,
186     1
187   },
188   {
189     "pei-mips",
190     "pe-mips",
191     34 /* MIPS_R_RVA */,
192     PE_ARCH_mips,
193     bfd_arch_mips,
194     0
195   },
196   {
197     "pei-arm-little",
198     "pe-arm-little",
199     11 /* ARM_RVA32 */,
200     PE_ARCH_arm,
201     bfd_arch_arm,
202     0
203   },
204   {
205     "epoc-pei-arm-little",
206     "epoc-pe-arm-little",
207     11 /* ARM_RVA32 */,
208     PE_ARCH_arm_epoc,
209     bfd_arch_arm,
210     0
211   },
212   { NULL, NULL, 0, 0, 0, 0 }
213 };
214
215 static pe_details_type *pe_details;
216
217 static autofilter_entry_type autofilter_symbollist[] =
218 {
219   { "DllMain@12", 10 },
220   { "DllEntryPoint@0", 15 },
221   { "DllMainCRTStartup@12", 20 },
222   { "_cygwin_dll_entry@12", 20 },
223   { "_cygwin_crt0_common@8", 21 },
224   { "_cygwin_noncygwin_dll_entry@12", 30 },
225   { "impure_ptr", 10 },
226   { NULL, 0 }
227 };
228
229 /* Do not specify library suffix explicitly, to allow for dllized versions.  */
230 static autofilter_entry_type autofilter_liblist[] =
231 {
232   { "libgcc", 6 },
233   { "libstdc++", 9 },
234   { "libmingw32", 10 },
235   { "libmingwex", 10 },
236   { "libg2c", 6 },
237   { "libsupc++", 9 },
238   { "libobjc", 7 },
239   { "libgcj", 6 },
240   { NULL, 0 }
241 };
242
243 static autofilter_entry_type autofilter_objlist[] =
244 {
245   { "crt0.o", 6 },
246   { "crt1.o", 6 },
247   { "crt2.o", 6 },
248   { "dllcrt1.o", 9 },
249   { "dllcrt2.o", 9 },
250   { "gcrt0.o", 7 },
251   { "gcrt1.o", 7 },
252   { "gcrt2.o", 7 },
253   { "crtbegin.o", 10 },
254   { "crtend.o", 8 },
255   { NULL, 0 }
256 };
257
258 static autofilter_entry_type autofilter_symbolprefixlist[] =
259 {
260   /*  { "__imp_", 6 }, */
261   /* Do __imp_ explicitly to save time.  */
262   { "__rtti_", 7 },
263   /* Don't re-export auto-imported symbols.  */
264   { "_nm_", 4 },
265   { "__builtin_", 10 },
266   /* Don't export symbols specifying internal DLL layout.  */
267   { "_head_", 6 },
268   { "_fmode", 6 },
269   { "_impure_ptr", 11 },
270   { "cygwin_attach_dll", 17 },
271   { "cygwin_premain0", 15 },
272   { "cygwin_premain1", 15 },
273   { "cygwin_premain2", 15 },
274   { "cygwin_premain3", 15 },
275   { "environ", 7 },
276   { NULL, 0 }
277 };
278
279 static autofilter_entry_type autofilter_symbolsuffixlist[] =
280 {
281   { "_iname", 6 },
282   { NULL, 0 }
283 };
284
285 #define U(str) (pe_details->underscored ? "_" str : str)
286
287 static int reloc_sort PARAMS ((const void *, const void *));
288 static int pe_export_sort PARAMS ((const void *, const void *));
289 static int auto_export PARAMS ((bfd *, def_file *, const char *));
290 static void process_def_file PARAMS ((bfd *, struct bfd_link_info *));
291 static void build_filler_bfd PARAMS ((int));
292 static void generate_edata PARAMS ((bfd *, struct bfd_link_info *));
293 static void fill_exported_offsets PARAMS ((bfd *, struct bfd_link_info *));
294 static void fill_edata PARAMS ((bfd *, struct bfd_link_info *));
295 static void generate_reloc PARAMS ((bfd *, struct bfd_link_info *));
296 static void quoteput PARAMS ((char *, FILE *, int));
297 static asection *quick_section PARAMS ((bfd *, const char *, int, int));
298 static void quick_symbol
299   PARAMS ((bfd *, const char *, const char *, const char *,
300            asection *, int, int));
301 static void quick_reloc PARAMS ((bfd *, int, int, int));
302 static bfd *make_head PARAMS ((bfd *));
303 static bfd *make_tail PARAMS ((bfd *));
304 static bfd *make_one PARAMS ((def_file_export *, bfd *));
305 static bfd *make_singleton_name_thunk PARAMS ((const char *, bfd *));
306 static char *make_import_fixup_mark PARAMS ((arelent *));
307 static bfd *make_import_fixup_entry
308   PARAMS ((const char *, const char *, const char *, bfd *));
309 static bfd *make_runtime_pseudo_reloc
310   PARAMS ((const char *, const char *, int, bfd *));
311 static bfd *pe_create_runtime_relocator_reference
312   PARAMS ((bfd *));
313 static unsigned int pe_get16 PARAMS ((bfd *, int));
314 static unsigned int pe_get32 PARAMS ((bfd *, int));
315 static unsigned int pe_as32 PARAMS ((void *));
316
317 void
318 pe_dll_id_target (target)
319      const char *target;
320 {
321   int i;
322
323   for (i = 0; pe_detail_list[i].target_name; i++)
324     if (strcmp (pe_detail_list[i].target_name, target) == 0
325         || strcmp (pe_detail_list[i].object_target, target) == 0)
326       {
327         pe_details = pe_detail_list + i;
328         return;
329       }
330   einfo (_("%XUnsupported PEI architecture: %s\n"), target);
331   exit (1);
332 }
333
334 /* Helper functions for qsort.  Relocs must be sorted so that we can write
335    them out by pages.  */
336
337 typedef struct
338   {
339     bfd_vma vma;
340     char type;
341     short extra;
342   }
343 reloc_data_type;
344
345 static int
346 reloc_sort (va, vb)
347      const void *va, *vb;
348 {
349   bfd_vma a = ((reloc_data_type *) va)->vma;
350   bfd_vma b = ((reloc_data_type *) vb)->vma;
351
352   return (a > b) ? 1 : ((a < b) ? -1 : 0);
353 }
354
355 static int
356 pe_export_sort (va, vb)
357      const void *va, *vb;
358 {
359   def_file_export *a = (def_file_export *) va;
360   def_file_export *b = (def_file_export *) vb;
361
362   return strcmp (a->name, b->name);
363 }
364
365 /* Read and process the .DEF file.  */
366
367 /* These correspond to the entries in pe_def_file->exports[].  I use
368    exported_symbol_sections[i] to tag whether or not the symbol was
369    defined, since we can't export symbols we don't have.  */
370
371 static bfd_vma *exported_symbol_offsets;
372 static struct sec **exported_symbol_sections;
373 static int export_table_size;
374 static int count_exported;
375 static int count_exported_byname;
376 static int count_with_ordinals;
377 static const char *dll_name;
378 static int min_ordinal, max_ordinal;
379 static int *exported_symbols;
380
381 typedef struct exclude_list_struct
382   {
383     char *string;
384     struct exclude_list_struct *next;
385     int type;
386   }
387 exclude_list_struct;
388
389 static struct exclude_list_struct *excludes = 0;
390
391 void
392 pe_dll_add_excludes (new_excludes, type)
393      const char *new_excludes;
394      const int type;
395 {
396   char *local_copy;
397   char *exclude_string;
398
399   local_copy = xstrdup (new_excludes);
400
401   exclude_string = strtok (local_copy, ",:");
402   for (; exclude_string; exclude_string = strtok (NULL, ",:"))
403     {
404       struct exclude_list_struct *new_exclude;
405
406       new_exclude = ((struct exclude_list_struct *)
407                      xmalloc (sizeof (struct exclude_list_struct)));
408       new_exclude->string = (char *) xmalloc (strlen (exclude_string) + 1);
409       strcpy (new_exclude->string, exclude_string);
410       new_exclude->type = type;
411       new_exclude->next = excludes;
412       excludes = new_exclude;
413     }
414
415   free (local_copy);
416 }
417
418
419 /* abfd is a bfd containing n (or NULL)
420    It can be used for contextual checks.  */
421
422 static int
423 auto_export (abfd, d, n)
424      bfd *abfd;
425      def_file *d;
426      const char *n;
427 {
428   int i;
429   struct exclude_list_struct *ex;
430   autofilter_entry_type *afptr;
431   const char * libname = 0;
432   if (abfd && abfd->my_archive)
433     libname = lbasename (abfd->my_archive->filename);
434
435   /* We should not re-export imported stuff.  */
436   if (strncmp (n, "_imp__", 6) == 0)
437     return 0;
438
439   for (i = 0; i < d->num_exports; i++)
440     if (strcmp (d->exports[i].name, n) == 0)
441       return 0;
442
443   if (pe_dll_do_default_excludes)
444     {
445       const char * p;
446       int    len;
447
448       if (pe_dll_extra_pe_debug)
449         printf ("considering exporting: %s, abfd=%p, abfd->my_arc=%p\n",
450                 n, abfd, abfd->my_archive);
451
452       /* First of all, make context checks:
453          Don't export anything from standard libs.  */
454       if (libname)
455         {
456           afptr = autofilter_liblist;
457
458           while (afptr->name)
459             {
460               if (strncmp (libname, afptr->name, afptr->len) == 0 )
461                 return 0;
462               afptr++;
463             }
464         }
465
466       /* Next, exclude symbols from certain startup objects.  */
467
468       if (abfd && (p = lbasename (abfd->filename)))
469         {
470           afptr = autofilter_objlist;
471           while (afptr->name)
472             {
473               if (strcmp (p, afptr->name) == 0)
474                 return 0;
475               afptr++;
476             }
477         }
478
479       /* Don't try to blindly exclude all symbols
480          that begin with '__'; this was tried and
481          it is too restrictive.  */
482
483       /* Then, exclude specific symbols.  */
484       afptr = autofilter_symbollist;
485       while (afptr->name)
486         {
487           if (strcmp (n, afptr->name) == 0)
488             return 0;
489
490           afptr++;
491         }
492
493       /* Next, exclude symbols starting with ...  */
494       afptr = autofilter_symbolprefixlist;
495       while (afptr->name)
496         {
497           if (strncmp (n, afptr->name, afptr->len) == 0)
498             return 0;
499
500           afptr++;
501         }
502
503       /* Finally, exclude symbols ending with ...  */
504       len = strlen (n);
505       afptr = autofilter_symbolsuffixlist;
506       while (afptr->name)
507         {
508           if ((len >= afptr->len)
509               /* Add 1 to insure match with trailing '\0'.  */
510               && strncmp (n + len - afptr->len, afptr->name,
511                           afptr->len + 1) == 0)
512             return 0;
513
514           afptr++;
515         }
516     }
517
518   for (ex = excludes; ex; ex = ex->next)
519     {
520       if (ex->type == 1) /* exclude-libs */
521         {
522           if (libname
523               && ((strcmp (libname, ex->string) == 0)
524                    || (strcasecmp ("ALL", ex->string) == 0)))
525             return 0;
526         }
527       else if (strcmp (n, ex->string) == 0)
528         return 0;
529     }
530
531   return 1;
532 }
533
534 static void
535 process_def_file (abfd, info)
536      bfd *abfd ATTRIBUTE_UNUSED;
537      struct bfd_link_info *info;
538 {
539   int i, j;
540   struct bfd_link_hash_entry *blhe;
541   bfd *b;
542   struct sec *s;
543   def_file_export *e = 0;
544
545   if (!pe_def_file)
546     pe_def_file = def_file_empty ();
547
548   /* First, run around to all the objects looking for the .drectve
549      sections, and push those into the def file too.  */
550   for (b = info->input_bfds; b; b = b->link_next)
551     {
552       s = bfd_get_section_by_name (b, ".drectve");
553       if (s)
554         {
555           int size = bfd_get_section_size_before_reloc (s);
556           char *buf = xmalloc (size);
557
558           bfd_get_section_contents (b, s, buf, 0, size);
559           def_file_add_directive (pe_def_file, buf, size);
560           free (buf);
561         }
562     }
563
564   /* Now, maybe export everything else the default way.  */
565   if (pe_dll_export_everything || pe_def_file->num_exports == 0)
566     {
567       for (b = info->input_bfds; b; b = b->link_next)
568         {
569           asymbol **symbols;
570           int nsyms, symsize;
571
572           symsize = bfd_get_symtab_upper_bound (b);
573           symbols = (asymbol **) xmalloc (symsize);
574           nsyms = bfd_canonicalize_symtab (b, symbols);
575
576           for (j = 0; j < nsyms; j++)
577             {
578               /* We should export symbols which are either global or not
579                  anything at all.  (.bss data is the latter)
580                  We should not export undefined symbols.  */
581               if (symbols[j]->section != &bfd_und_section
582                   && ((symbols[j]->flags & BSF_GLOBAL)
583                       || (symbols[j]->flags == BFD_FORT_COMM_DEFAULT_VALUE)))
584                 {
585                   const char *sn = symbols[j]->name;
586
587                   /* We should not re-export imported stuff.  */
588                   {
589                     char *name = (char *) xmalloc (strlen (sn) + 2 + 6);
590                     sprintf (name, "%s%s", U("_imp_"), sn);
591
592                     blhe = bfd_link_hash_lookup (info->hash, name,
593                                                  FALSE, FALSE, FALSE);
594                     free (name);
595
596                     if (blhe && blhe->type == bfd_link_hash_defined)
597                       continue;
598                   }
599
600                   if (*sn == '_')
601                     sn++;
602
603                   if (auto_export (b, pe_def_file, sn))
604                     {
605                       def_file_export *p;
606                       p=def_file_add_export (pe_def_file, sn, 0, -1);
607                       /* Fill data flag properly, from dlltool.c.  */
608                       p->flag_data = !(symbols[j]->flags & BSF_FUNCTION);
609                     }
610                 }
611             }
612         }
613     }
614
615 #undef NE
616 #define NE pe_def_file->num_exports
617
618   /* Canonicalize the export list.  */
619   if (pe_dll_kill_ats)
620     {
621       for (i = 0; i < NE; i++)
622         {
623           if (strchr (pe_def_file->exports[i].name, '@'))
624             {
625               /* This will preserve internal_name, which may have been
626                  pointing to the same memory as name, or might not
627                  have.  */
628               int lead_at = (*pe_def_file->exports[i].name =='@');
629               char *tmp = xstrdup (pe_def_file->exports[i].name + lead_at);
630
631               *(strchr (tmp, '@')) = 0;
632               pe_def_file->exports[i].name = tmp;
633             }
634         }
635     }
636
637   if (pe_dll_stdcall_aliases)
638     {
639       for (i = 0; i < NE; i++)
640         {
641           if (strchr (pe_def_file->exports[i].name, '@'))
642             {
643               int lead_at = (*pe_def_file->exports[i].name == '@' ) ;
644               char *tmp = xstrdup (pe_def_file->exports[i].name + lead_at);
645
646               *(strchr (tmp, '@')) = 0;
647               if (auto_export (NULL, pe_def_file, tmp))
648                 def_file_add_export (pe_def_file, tmp,
649                                      pe_def_file->exports[i].internal_name,
650                                      -1);
651               else
652                 free (tmp);
653             }
654         }
655     }
656
657   /* Convenience, but watch out for it changing.  */
658   e = pe_def_file->exports;
659
660   exported_symbol_offsets = (bfd_vma *) xmalloc (NE * sizeof (bfd_vma));
661   exported_symbol_sections = (struct sec **) xmalloc (NE * sizeof (struct sec *));
662
663   memset (exported_symbol_sections, 0, NE * sizeof (struct sec *));
664   max_ordinal = 0;
665   min_ordinal = 65536;
666   count_exported = 0;
667   count_exported_byname = 0;
668   count_with_ordinals = 0;
669
670   qsort (pe_def_file->exports, NE, sizeof (pe_def_file->exports[0]), pe_export_sort);
671   for (i = 0, j = 0; i < NE; i++)
672     {
673       if (i > 0 && strcmp (e[i].name, e[i - 1].name) == 0)
674         {
675           /* This is a duplicate.  */
676           if (e[j - 1].ordinal != -1
677               && e[i].ordinal != -1
678               && e[j - 1].ordinal != e[i].ordinal)
679             {
680               if (pe_dll_warn_dup_exports)
681                 /* xgettext:c-format */
682                 einfo (_("%XError, duplicate EXPORT with ordinals: %s (%d vs %d)\n"),
683                        e[j - 1].name, e[j - 1].ordinal, e[i].ordinal);
684             }
685           else
686             {
687               if (pe_dll_warn_dup_exports)
688                 /* xgettext:c-format */
689                 einfo (_("Warning, duplicate EXPORT: %s\n"),
690                        e[j - 1].name);
691             }
692
693           if (e[i].ordinal != -1)
694             e[j - 1].ordinal = e[i].ordinal;
695           e[j - 1].flag_private |= e[i].flag_private;
696           e[j - 1].flag_constant |= e[i].flag_constant;
697           e[j - 1].flag_noname |= e[i].flag_noname;
698           e[j - 1].flag_data |= e[i].flag_data;
699         }
700       else
701         {
702           if (i != j)
703             e[j] = e[i];
704           j++;
705         }
706     }
707   pe_def_file->num_exports = j; /* == NE */
708
709   for (i = 0; i < NE; i++)
710     {
711       char *name = (char *) xmalloc (strlen (pe_def_file->exports[i].internal_name) + 2);
712
713       if (pe_details->underscored
714           && (*pe_def_file->exports[i].internal_name != '@'))
715         {
716           *name = '_';
717           strcpy (name + 1, pe_def_file->exports[i].internal_name);
718         }
719       else
720         strcpy (name, pe_def_file->exports[i].internal_name);
721
722       blhe = bfd_link_hash_lookup (info->hash,
723                                    name,
724                                    FALSE, FALSE, TRUE);
725
726       if (blhe
727           && (blhe->type == bfd_link_hash_defined
728               || (blhe->type == bfd_link_hash_common)))
729         {
730           count_exported++;
731           if (!pe_def_file->exports[i].flag_noname)
732             count_exported_byname++;
733
734           /* Only fill in the sections. The actual offsets are computed
735              in fill_exported_offsets() after common symbols are laid
736              out.  */
737           if (blhe->type == bfd_link_hash_defined)
738             exported_symbol_sections[i] = blhe->u.def.section;
739           else
740             exported_symbol_sections[i] = blhe->u.c.p->section;
741
742           if (pe_def_file->exports[i].ordinal != -1)
743             {
744               if (max_ordinal < pe_def_file->exports[i].ordinal)
745                 max_ordinal = pe_def_file->exports[i].ordinal;
746               if (min_ordinal > pe_def_file->exports[i].ordinal)
747                 min_ordinal = pe_def_file->exports[i].ordinal;
748               count_with_ordinals++;
749             }
750         }
751       else if (blhe && blhe->type == bfd_link_hash_undefined)
752         {
753           /* xgettext:c-format */
754           einfo (_("%XCannot export %s: symbol not defined\n"),
755                  pe_def_file->exports[i].internal_name);
756         }
757       else if (blhe)
758         {
759           /* xgettext:c-format */
760           einfo (_("%XCannot export %s: symbol wrong type (%d vs %d)\n"),
761                  pe_def_file->exports[i].internal_name,
762                  blhe->type, bfd_link_hash_defined);
763         }
764       else
765         {
766           /* xgettext:c-format */
767           einfo (_("%XCannot export %s: symbol not found\n"),
768                  pe_def_file->exports[i].internal_name);
769         }
770       free (name);
771     }
772 }
773
774 /* Build the bfd that will contain .edata and .reloc sections.  */
775
776 static void
777 build_filler_bfd (include_edata)
778      int include_edata;
779 {
780   lang_input_statement_type *filler_file;
781   filler_file = lang_add_input_file ("dll stuff",
782                                      lang_input_file_is_fake_enum,
783                                      NULL);
784   filler_file->the_bfd = filler_bfd = bfd_create ("dll stuff", output_bfd);
785   if (filler_bfd == NULL
786       || !bfd_set_arch_mach (filler_bfd,
787                              bfd_get_arch (output_bfd),
788                              bfd_get_mach (output_bfd)))
789     {
790       einfo ("%X%P: can not create BFD %E\n");
791       return;
792     }
793
794   if (include_edata)
795     {
796       edata_s = bfd_make_section_old_way (filler_bfd, ".edata");
797       if (edata_s == NULL
798           || !bfd_set_section_flags (filler_bfd, edata_s,
799                                      (SEC_HAS_CONTENTS
800                                       | SEC_ALLOC
801                                       | SEC_LOAD
802                                       | SEC_KEEP
803                                       | SEC_IN_MEMORY)))
804         {
805           einfo ("%X%P: can not create .edata section: %E\n");
806           return;
807         }
808       bfd_set_section_size (filler_bfd, edata_s, edata_sz);
809     }
810
811   reloc_s = bfd_make_section_old_way (filler_bfd, ".reloc");
812   if (reloc_s == NULL
813       || !bfd_set_section_flags (filler_bfd, reloc_s,
814                                  (SEC_HAS_CONTENTS
815                                   | SEC_ALLOC
816                                   | SEC_LOAD
817                                   | SEC_KEEP
818                                   | SEC_IN_MEMORY)))
819     {
820       einfo ("%X%P: can not create .reloc section: %E\n");
821       return;
822     }
823
824   bfd_set_section_size (filler_bfd, reloc_s, 0);
825
826   ldlang_add_file (filler_file);
827 }
828
829 /* Gather all the exported symbols and build the .edata section.  */
830
831 static void
832 generate_edata (abfd, info)
833      bfd *abfd;
834      struct bfd_link_info *info ATTRIBUTE_UNUSED;
835 {
836   int i, next_ordinal;
837   int name_table_size = 0;
838   const char *dlnp;
839
840   /* First, we need to know how many exported symbols there are,
841      and what the range of ordinals is.  */
842   if (pe_def_file->name)
843     dll_name = pe_def_file->name;
844   else
845     {
846       dll_name = abfd->filename;
847
848       for (dlnp = dll_name; *dlnp; dlnp++)
849         if (*dlnp == '\\' || *dlnp == '/' || *dlnp == ':')
850           dll_name = dlnp + 1;
851     }
852
853   if (count_with_ordinals && max_ordinal > count_exported)
854     {
855       if (min_ordinal > max_ordinal - count_exported + 1)
856         min_ordinal = max_ordinal - count_exported + 1;
857     }
858   else
859     {
860       min_ordinal = 1;
861       max_ordinal = count_exported;
862     }
863
864   export_table_size = max_ordinal - min_ordinal + 1;
865   exported_symbols = (int *) xmalloc (export_table_size * sizeof (int));
866   for (i = 0; i < export_table_size; i++)
867     exported_symbols[i] = -1;
868
869   /* Now we need to assign ordinals to those that don't have them.  */
870   for (i = 0; i < NE; i++)
871     {
872       if (exported_symbol_sections[i])
873         {
874           if (pe_def_file->exports[i].ordinal != -1)
875             {
876               int ei = pe_def_file->exports[i].ordinal - min_ordinal;
877               int pi = exported_symbols[ei];
878
879               if (pi != -1)
880                 {
881                   /* xgettext:c-format */
882                   einfo (_("%XError, ordinal used twice: %d (%s vs %s)\n"),
883                          pe_def_file->exports[i].ordinal,
884                          pe_def_file->exports[i].name,
885                          pe_def_file->exports[pi].name);
886                 }
887               exported_symbols[ei] = i;
888             }
889           name_table_size += strlen (pe_def_file->exports[i].name) + 1;
890         }
891     }
892
893   next_ordinal = min_ordinal;
894   for (i = 0; i < NE; i++)
895     if (exported_symbol_sections[i])
896       if (pe_def_file->exports[i].ordinal == -1)
897         {
898           while (exported_symbols[next_ordinal - min_ordinal] != -1)
899             next_ordinal++;
900
901           exported_symbols[next_ordinal - min_ordinal] = i;
902           pe_def_file->exports[i].ordinal = next_ordinal;
903         }
904
905   /* OK, now we can allocate some memory.  */
906   edata_sz = (40                                /* directory */
907               + 4 * export_table_size           /* addresses */
908               + 4 * count_exported_byname       /* name ptrs */
909               + 2 * count_exported_byname       /* ordinals */
910               + name_table_size + strlen (dll_name) + 1);
911 }
912
913 /* Fill the exported symbol offsets. The preliminary work has already
914    been done in process_def_file().  */
915
916 static void
917 fill_exported_offsets (abfd, info)
918      bfd *abfd ATTRIBUTE_UNUSED;
919      struct bfd_link_info *info;
920 {
921   int i;
922   struct bfd_link_hash_entry *blhe;
923
924   for (i = 0; i < pe_def_file->num_exports; i++)
925     {
926       char *name = (char *) xmalloc (strlen (pe_def_file->exports[i].internal_name) + 2);
927
928       if (pe_details->underscored
929           && (*pe_def_file->exports[i].internal_name != '@'))
930         {
931           *name = '_';
932           strcpy (name + 1, pe_def_file->exports[i].internal_name);
933         }
934       else
935         strcpy (name, pe_def_file->exports[i].internal_name);
936
937       blhe = bfd_link_hash_lookup (info->hash,
938                                    name,
939                                    FALSE, FALSE, TRUE);
940
941       if (blhe && (blhe->type == bfd_link_hash_defined))
942         exported_symbol_offsets[i] = blhe->u.def.value;
943
944       free (name);
945     }
946 }
947
948 static void
949 fill_edata (abfd, info)
950      bfd *abfd;
951      struct bfd_link_info *info ATTRIBUTE_UNUSED;
952 {
953   int i, hint;
954   unsigned char *edirectory;
955   unsigned long *eaddresses;
956   unsigned long *enameptrs;
957   unsigned short *eordinals;
958   unsigned char *enamestr;
959   time_t now;
960
961   time (&now);
962
963   edata_d = (unsigned char *) xmalloc (edata_sz);
964
965   /* Note use of array pointer math here.  */
966   edirectory = edata_d;
967   eaddresses = (unsigned long *) (edata_d + 40);
968   enameptrs = eaddresses + export_table_size;
969   eordinals = (unsigned short *) (enameptrs + count_exported_byname);
970   enamestr = (char *) (eordinals + count_exported_byname);
971
972 #define ERVA(ptr) (((unsigned char *)(ptr) - edata_d) + edata_s->output_section->vma - image_base)
973
974   memset (edata_d, 0, edata_sz);
975   bfd_put_32 (abfd, now, edata_d + 4);
976   if (pe_def_file->version_major != -1)
977     {
978       bfd_put_16 (abfd, pe_def_file->version_major, edata_d + 8);
979       bfd_put_16 (abfd, pe_def_file->version_minor, edata_d + 10);
980     }
981
982   bfd_put_32 (abfd, ERVA (enamestr), edata_d + 12);
983   strcpy (enamestr, dll_name);
984   enamestr += strlen (enamestr) + 1;
985   bfd_put_32 (abfd, min_ordinal, edata_d + 16);
986   bfd_put_32 (abfd, export_table_size, edata_d + 20);
987   bfd_put_32 (abfd, count_exported_byname, edata_d + 24);
988   bfd_put_32 (abfd, ERVA (eaddresses), edata_d + 28);
989   bfd_put_32 (abfd, ERVA (enameptrs), edata_d + 32);
990   bfd_put_32 (abfd, ERVA (eordinals), edata_d + 36);
991
992   fill_exported_offsets (abfd, info);
993
994   /* Ok, now for the filling in part.  */
995   hint = 0;
996   for (i = 0; i < export_table_size; i++)
997     {
998       int s = exported_symbols[i];
999
1000       if (s != -1)
1001         {
1002           struct sec *ssec = exported_symbol_sections[s];
1003           unsigned long srva = (exported_symbol_offsets[s]
1004                                 + ssec->output_section->vma
1005                                 + ssec->output_offset);
1006           int ord = pe_def_file->exports[s].ordinal;
1007
1008           bfd_put_32 (abfd, srva - image_base,
1009                       (void *) (eaddresses + ord - min_ordinal));
1010
1011           if (!pe_def_file->exports[s].flag_noname)
1012             {
1013               char *ename = pe_def_file->exports[s].name;
1014               bfd_put_32 (abfd, ERVA (enamestr), (void *) enameptrs);
1015               enameptrs++;
1016               strcpy (enamestr, ename);
1017               enamestr += strlen (enamestr) + 1;
1018               bfd_put_16 (abfd, ord - min_ordinal, (void *) eordinals);
1019               eordinals++;
1020               pe_def_file->exports[s].hint = hint++;
1021             }
1022         }
1023     }
1024 }
1025
1026
1027 static struct sec *current_sec;
1028
1029 void
1030 pe_walk_relocs_of_symbol (info, name, cb)
1031      struct bfd_link_info *info;
1032      const char *name;
1033      int (*cb) (arelent *, asection *);
1034 {
1035   bfd *b;
1036   asection *s;
1037
1038   for (b = info->input_bfds; b; b = b->link_next)
1039     {
1040       asymbol **symbols;
1041       int nsyms, symsize;
1042
1043       symsize = bfd_get_symtab_upper_bound (b);
1044       symbols = (asymbol **) xmalloc (symsize);
1045       nsyms   = bfd_canonicalize_symtab (b, symbols);
1046
1047       for (s = b->sections; s; s = s->next)
1048         {
1049           arelent **relocs;
1050           int relsize, nrelocs, i;
1051           int flags = bfd_get_section_flags (b, s);
1052
1053           /* Skip discarded linkonce sections.  */
1054           if (flags & SEC_LINK_ONCE
1055               && s->output_section == bfd_abs_section_ptr)
1056             continue;
1057
1058           current_sec = s;
1059
1060           relsize = bfd_get_reloc_upper_bound (b, s);
1061           relocs = (arelent **) xmalloc ((size_t) relsize);
1062           nrelocs = bfd_canonicalize_reloc (b, s, relocs, symbols);
1063
1064           for (i = 0; i < nrelocs; i++)
1065             {
1066               struct symbol_cache_entry *sym = *relocs[i]->sym_ptr_ptr;
1067
1068               if (!strcmp (name, sym->name))
1069                 cb (relocs[i], s);
1070             }
1071
1072           free (relocs);
1073
1074           /* Warning: the allocated symbols are remembered in BFD and reused
1075              later, so don't free them! */
1076           /* free (symbols); */
1077         }
1078     }
1079 }
1080
1081 /* Gather all the relocations and build the .reloc section.  */
1082
1083 static void
1084 generate_reloc (abfd, info)
1085      bfd *abfd;
1086      struct bfd_link_info *info;
1087 {
1088
1089   /* For .reloc stuff.  */
1090   reloc_data_type *reloc_data;
1091   int total_relocs = 0;
1092   int i;
1093   unsigned long sec_page = (unsigned long) (-1);
1094   unsigned long page_ptr, page_count;
1095   int bi;
1096   bfd *b;
1097   struct sec *s;
1098
1099   total_relocs = 0;
1100   for (b = info->input_bfds; b; b = b->link_next)
1101     for (s = b->sections; s; s = s->next)
1102       total_relocs += s->reloc_count;
1103
1104   reloc_data =
1105     (reloc_data_type *) xmalloc (total_relocs * sizeof (reloc_data_type));
1106
1107   total_relocs = 0;
1108   bi = 0;
1109   for (bi = 0, b = info->input_bfds; b; bi++, b = b->link_next)
1110     {
1111       arelent **relocs;
1112       int relsize, nrelocs, i;
1113
1114       for (s = b->sections; s; s = s->next)
1115         {
1116           unsigned long sec_vma = s->output_section->vma + s->output_offset;
1117           asymbol **symbols;
1118           int nsyms, symsize;
1119
1120           /* If it's not loaded, we don't need to relocate it this way.  */
1121           if (!(s->output_section->flags & SEC_LOAD))
1122             continue;
1123
1124           /* I don't know why there would be a reloc for these, but I've
1125              seen it happen - DJ  */
1126           if (s->output_section == &bfd_abs_section)
1127             continue;
1128
1129           if (s->output_section->vma == 0)
1130             {
1131               /* Huh?  Shouldn't happen, but punt if it does.  */
1132               einfo ("DJ: zero vma section reloc detected: `%s' #%d f=%d\n",
1133                      s->output_section->name, s->output_section->index,
1134                      s->output_section->flags);
1135               continue;
1136             }
1137
1138           symsize = bfd_get_symtab_upper_bound (b);
1139           symbols = (asymbol **) xmalloc (symsize);
1140           nsyms = bfd_canonicalize_symtab (b, symbols);
1141
1142           relsize = bfd_get_reloc_upper_bound (b, s);
1143           relocs = (arelent **) xmalloc ((size_t) relsize);
1144           nrelocs = bfd_canonicalize_reloc (b, s, relocs, symbols);
1145
1146           for (i = 0; i < nrelocs; i++)
1147             {
1148               if (pe_dll_extra_pe_debug)
1149                 {
1150                   struct symbol_cache_entry *sym = *relocs[i]->sym_ptr_ptr;
1151                   printf ("rel: %s\n", sym->name);
1152                 }
1153               if (!relocs[i]->howto->pc_relative
1154                   && relocs[i]->howto->type != pe_details->imagebase_reloc)
1155                 {
1156                   bfd_vma sym_vma;
1157                   struct symbol_cache_entry *sym = *relocs[i]->sym_ptr_ptr;
1158
1159                   sym_vma = (relocs[i]->addend
1160                              + sym->value
1161                              + sym->section->vma
1162                              + sym->section->output_offset
1163                              + sym->section->output_section->vma);
1164                   reloc_data[total_relocs].vma = sec_vma + relocs[i]->address;
1165
1166 #define BITS_AND_SHIFT(bits, shift) (bits * 1000 | shift)
1167
1168                   switch BITS_AND_SHIFT (relocs[i]->howto->bitsize,
1169                                          relocs[i]->howto->rightshift)
1170                     {
1171                     case BITS_AND_SHIFT (32, 0):
1172                       reloc_data[total_relocs].type = 3;
1173                       total_relocs++;
1174                       break;
1175                     case BITS_AND_SHIFT (16, 0):
1176                       reloc_data[total_relocs].type = 2;
1177                       total_relocs++;
1178                       break;
1179                     case BITS_AND_SHIFT (16, 16):
1180                       reloc_data[total_relocs].type = 4;
1181                       /* FIXME: we can't know the symbol's right value
1182                          yet, but we probably can safely assume that
1183                          CE will relocate us in 64k blocks, so leaving
1184                          it zero is safe.  */
1185                       reloc_data[total_relocs].extra = 0;
1186                       total_relocs++;
1187                       break;
1188                     case BITS_AND_SHIFT (26, 2):
1189                       reloc_data[total_relocs].type = 5;
1190                       total_relocs++;
1191                       break;
1192                     default:
1193                       /* xgettext:c-format */
1194                       einfo (_("%XError: %d-bit reloc in dll\n"),
1195                              relocs[i]->howto->bitsize);
1196                       break;
1197                     }
1198                 }
1199             }
1200           free (relocs);
1201           /* Warning: the allocated symbols are remembered in BFD and
1202              reused later, so don't free them!  */
1203 #if 0
1204           free (symbol);
1205 #endif
1206         }
1207     }
1208
1209   /* At this point, we have total_relocs relocation addresses in
1210      reloc_addresses, which are all suitable for the .reloc section.
1211      We must now create the new sections.  */
1212   qsort (reloc_data, total_relocs, sizeof (*reloc_data), reloc_sort);
1213
1214   for (i = 0; i < total_relocs; i++)
1215     {
1216       unsigned long this_page = (reloc_data[i].vma >> 12);
1217
1218       if (this_page != sec_page)
1219         {
1220           reloc_sz = (reloc_sz + 3) & ~3;       /* 4-byte align.  */
1221           reloc_sz += 8;
1222           sec_page = this_page;
1223         }
1224
1225       reloc_sz += 2;
1226
1227       if (reloc_data[i].type == 4)
1228         reloc_sz += 2;
1229     }
1230
1231   reloc_sz = (reloc_sz + 3) & ~3;       /* 4-byte align.  */
1232   reloc_d = (unsigned char *) xmalloc (reloc_sz);
1233   sec_page = (unsigned long) (-1);
1234   reloc_sz = 0;
1235   page_ptr = (unsigned long) (-1);
1236   page_count = 0;
1237
1238   for (i = 0; i < total_relocs; i++)
1239     {
1240       unsigned long rva = reloc_data[i].vma - image_base;
1241       unsigned long this_page = (rva & ~0xfff);
1242
1243       if (this_page != sec_page)
1244         {
1245           while (reloc_sz & 3)
1246             reloc_d[reloc_sz++] = 0;
1247
1248           if (page_ptr != (unsigned long) (-1))
1249             bfd_put_32 (abfd, reloc_sz - page_ptr, reloc_d + page_ptr + 4);
1250
1251           bfd_put_32 (abfd, this_page, reloc_d + reloc_sz);
1252           page_ptr = reloc_sz;
1253           reloc_sz += 8;
1254           sec_page = this_page;
1255           page_count = 0;
1256         }
1257
1258       bfd_put_16 (abfd, (rva & 0xfff) + (reloc_data[i].type << 12),
1259                   reloc_d + reloc_sz);
1260       reloc_sz += 2;
1261
1262       if (reloc_data[i].type == 4)
1263         {
1264           bfd_put_16 (abfd, reloc_data[i].extra, reloc_d + reloc_sz);
1265           reloc_sz += 2;
1266         }
1267
1268       page_count++;
1269     }
1270
1271   while (reloc_sz & 3)
1272     reloc_d[reloc_sz++] = 0;
1273
1274   if (page_ptr != (unsigned long) (-1))
1275     bfd_put_32 (abfd, reloc_sz - page_ptr, reloc_d + page_ptr + 4);
1276
1277   while (reloc_sz < reloc_s->_raw_size)
1278     reloc_d[reloc_sz++] = 0;
1279 }
1280
1281 /* Given the exiting def_file structure, print out a .DEF file that
1282    corresponds to it.  */
1283
1284 static void
1285 quoteput (s, f, needs_quotes)
1286      char *s;
1287      FILE *f;
1288      int needs_quotes;
1289 {
1290   char *cp;
1291
1292   for (cp = s; *cp; cp++)
1293     if (*cp == '\''
1294         || *cp == '"'
1295         || *cp == '\\'
1296         || ISSPACE (*cp)
1297         || *cp == ','
1298         || *cp == ';')
1299       needs_quotes = 1;
1300
1301   if (needs_quotes)
1302     {
1303       putc ('"', f);
1304
1305       while (*s)
1306         {
1307           if (*s == '"' || *s == '\\')
1308             putc ('\\', f);
1309
1310           putc (*s, f);
1311           s++;
1312         }
1313
1314       putc ('"', f);
1315     }
1316   else
1317     fputs (s, f);
1318 }
1319
1320 void
1321 pe_dll_generate_def_file (pe_out_def_filename)
1322      const char *pe_out_def_filename;
1323 {
1324   int i;
1325   FILE *out = fopen (pe_out_def_filename, "w");
1326
1327   if (out == NULL)
1328     /* xgettext:c-format */
1329     einfo (_("%s: Can't open output def file %s\n"),
1330            program_name, pe_out_def_filename);
1331
1332   if (pe_def_file)
1333     {
1334       if (pe_def_file->name)
1335         {
1336           if (pe_def_file->is_dll)
1337             fprintf (out, "LIBRARY ");
1338           else
1339             fprintf (out, "NAME ");
1340
1341           quoteput (pe_def_file->name, out, 1);
1342
1343           if (pe_data (output_bfd)->pe_opthdr.ImageBase)
1344             fprintf (out, " BASE=0x%lx",
1345                      (unsigned long) pe_data (output_bfd)->pe_opthdr.ImageBase);
1346           fprintf (out, "\n");
1347         }
1348
1349       if (pe_def_file->description)
1350         {
1351           fprintf (out, "DESCRIPTION ");
1352           quoteput (pe_def_file->description, out, 1);
1353           fprintf (out, "\n");
1354         }
1355
1356       if (pe_def_file->version_minor != -1)
1357         fprintf (out, "VERSION %d.%d\n", pe_def_file->version_major,
1358                  pe_def_file->version_minor);
1359       else if (pe_def_file->version_major != -1)
1360         fprintf (out, "VERSION %d\n", pe_def_file->version_major);
1361
1362       if (pe_def_file->stack_reserve != -1 || pe_def_file->heap_reserve != -1)
1363         fprintf (out, "\n");
1364
1365       if (pe_def_file->stack_commit != -1)
1366         fprintf (out, "STACKSIZE 0x%x,0x%x\n",
1367                  pe_def_file->stack_reserve, pe_def_file->stack_commit);
1368       else if (pe_def_file->stack_reserve != -1)
1369         fprintf (out, "STACKSIZE 0x%x\n", pe_def_file->stack_reserve);
1370
1371       if (pe_def_file->heap_commit != -1)
1372         fprintf (out, "HEAPSIZE 0x%x,0x%x\n",
1373                  pe_def_file->heap_reserve, pe_def_file->heap_commit);
1374       else if (pe_def_file->heap_reserve != -1)
1375         fprintf (out, "HEAPSIZE 0x%x\n", pe_def_file->heap_reserve);
1376
1377       if (pe_def_file->num_section_defs > 0)
1378         {
1379           fprintf (out, "\nSECTIONS\n\n");
1380
1381           for (i = 0; i < pe_def_file->num_section_defs; i++)
1382             {
1383               fprintf (out, "    ");
1384               quoteput (pe_def_file->section_defs[i].name, out, 0);
1385
1386               if (pe_def_file->section_defs[i].class)
1387                 {
1388                   fprintf (out, " CLASS ");
1389                   quoteput (pe_def_file->section_defs[i].class, out, 0);
1390                 }
1391
1392               if (pe_def_file->section_defs[i].flag_read)
1393                 fprintf (out, " READ");
1394
1395               if (pe_def_file->section_defs[i].flag_write)
1396                 fprintf (out, " WRITE");
1397
1398               if (pe_def_file->section_defs[i].flag_execute)
1399                 fprintf (out, " EXECUTE");
1400
1401               if (pe_def_file->section_defs[i].flag_shared)
1402                 fprintf (out, " SHARED");
1403
1404               fprintf (out, "\n");
1405             }
1406         }
1407
1408       if (pe_def_file->num_exports > 0)
1409         {
1410           fprintf (out, "EXPORTS\n");
1411
1412           for (i = 0; i < pe_def_file->num_exports; i++)
1413             {
1414               def_file_export *e = pe_def_file->exports + i;
1415               fprintf (out, "    ");
1416               quoteput (e->name, out, 0);
1417
1418               if (e->internal_name && strcmp (e->internal_name, e->name))
1419                 {
1420                   fprintf (out, " = ");
1421                   quoteput (e->internal_name, out, 0);
1422                 }
1423
1424               if (e->ordinal != -1)
1425                 fprintf (out, " @%d", e->ordinal);
1426
1427               if (e->flag_private)
1428                 fprintf (out, " PRIVATE");
1429
1430               if (e->flag_constant)
1431                 fprintf (out, " CONSTANT");
1432
1433               if (e->flag_noname)
1434                 fprintf (out, " NONAME");
1435
1436               if (e->flag_data)
1437                 fprintf (out, " DATA");
1438
1439               fprintf (out, "\n");
1440             }
1441         }
1442
1443       if (pe_def_file->num_imports > 0)
1444         {
1445           fprintf (out, "\nIMPORTS\n\n");
1446
1447           for (i = 0; i < pe_def_file->num_imports; i++)
1448             {
1449               def_file_import *im = pe_def_file->imports + i;
1450               fprintf (out, "    ");
1451
1452               if (im->internal_name
1453                   && (!im->name || strcmp (im->internal_name, im->name)))
1454                 {
1455                   quoteput (im->internal_name, out, 0);
1456                   fprintf (out, " = ");
1457                 }
1458
1459               quoteput (im->module->name, out, 0);
1460               fprintf (out, ".");
1461
1462               if (im->name)
1463                 quoteput (im->name, out, 0);
1464               else
1465                 fprintf (out, "%d", im->ordinal);
1466
1467               fprintf (out, "\n");
1468             }
1469         }
1470     }
1471   else
1472     fprintf (out, _("; no contents available\n"));
1473
1474   if (fclose (out) == EOF)
1475     /* xgettext:c-format */
1476     einfo (_("%P: Error closing file `%s'\n"), pe_out_def_filename);
1477 }
1478
1479 /* Generate the import library.  */
1480
1481 static asymbol **symtab;
1482 static int symptr;
1483 static int tmp_seq;
1484 static const char *dll_filename;
1485 static char *dll_symname;
1486
1487 #define UNDSEC (asection *) &bfd_und_section
1488
1489 static asection *
1490 quick_section (abfd, name, flags, align)
1491      bfd *abfd;
1492      const char *name;
1493      int flags;
1494      int align;
1495 {
1496   asection *sec;
1497   asymbol *sym;
1498
1499   sec = bfd_make_section_old_way (abfd, name);
1500   bfd_set_section_flags (abfd, sec, flags | SEC_ALLOC | SEC_LOAD | SEC_KEEP);
1501   bfd_set_section_alignment (abfd, sec, align);
1502   /* Remember to undo this before trying to link internally!  */
1503   sec->output_section = sec;
1504
1505   sym = bfd_make_empty_symbol (abfd);
1506   symtab[symptr++] = sym;
1507   sym->name = sec->name;
1508   sym->section = sec;
1509   sym->flags = BSF_LOCAL;
1510   sym->value = 0;
1511
1512   return sec;
1513 }
1514
1515 static void
1516 quick_symbol (abfd, n1, n2, n3, sec, flags, addr)
1517      bfd *abfd;
1518      const char *n1;
1519      const char *n2;
1520      const char *n3;
1521      asection *sec;
1522      int flags;
1523      int addr;
1524 {
1525   asymbol *sym;
1526   char *name = (char *) xmalloc (strlen (n1) + strlen (n2) + strlen (n3) + 1);
1527
1528   strcpy (name, n1);
1529   strcat (name, n2);
1530   strcat (name, n3);
1531   sym = bfd_make_empty_symbol (abfd);
1532   sym->name = name;
1533   sym->section = sec;
1534   sym->flags = flags;
1535   sym->value = addr;
1536   symtab[symptr++] = sym;
1537 }
1538
1539 static arelent *reltab = 0;
1540 static int relcount = 0, relsize = 0;
1541
1542 static void
1543 quick_reloc (abfd, address, which_howto, symidx)
1544      bfd *abfd;
1545      int address;
1546      int which_howto;
1547      int symidx;
1548 {
1549   if (relcount >= (relsize - 1))
1550     {
1551       relsize += 10;
1552       if (reltab)
1553         reltab = (arelent *) xrealloc (reltab, relsize * sizeof (arelent));
1554       else
1555         reltab = (arelent *) xmalloc (relsize * sizeof (arelent));
1556     }
1557   reltab[relcount].address = address;
1558   reltab[relcount].addend = 0;
1559   reltab[relcount].howto = bfd_reloc_type_lookup (abfd, which_howto);
1560   reltab[relcount].sym_ptr_ptr = symtab + symidx;
1561   relcount++;
1562 }
1563
1564 static void
1565 save_relocs (asection *sec)
1566 {
1567   int i;
1568
1569   sec->relocation = reltab;
1570   sec->reloc_count = relcount;
1571   sec->orelocation = (arelent **) xmalloc ((relcount + 1) * sizeof (arelent *));
1572   for (i = 0; i < relcount; i++)
1573     sec->orelocation[i] = sec->relocation + i;
1574   sec->orelocation[relcount] = 0;
1575   sec->flags |= SEC_RELOC;
1576   reltab = 0;
1577   relcount = relsize = 0;
1578 }
1579
1580 /*      .section        .idata$2
1581         .global         __head_my_dll
1582    __head_my_dll:
1583         .rva            hname
1584         .long           0
1585         .long           0
1586         .rva            __my_dll_iname
1587         .rva            fthunk
1588
1589         .section        .idata$5
1590         .long           0
1591    fthunk:
1592
1593         .section        .idata$4
1594         .long           0
1595    hname:                              */
1596
1597 static bfd *
1598 make_head (parent)
1599      bfd *parent;
1600 {
1601   asection *id2, *id5, *id4;
1602   unsigned char *d2, *d5, *d4;
1603   char *oname;
1604   bfd *abfd;
1605
1606   oname = (char *) xmalloc (20);
1607   sprintf (oname, "d%06d.o", tmp_seq);
1608   tmp_seq++;
1609
1610   abfd = bfd_create (oname, parent);
1611   bfd_find_target (pe_details->object_target, abfd);
1612   bfd_make_writable (abfd);
1613
1614   bfd_set_format (abfd, bfd_object);
1615   bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
1616
1617   symptr = 0;
1618   symtab = (asymbol **) xmalloc (6 * sizeof (asymbol *));
1619   id2 = quick_section (abfd, ".idata$2", SEC_HAS_CONTENTS, 2);
1620   id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
1621   id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
1622   quick_symbol (abfd, U ("_head_"), dll_symname, "", id2, BSF_GLOBAL, 0);
1623   quick_symbol (abfd, U (""), dll_symname, "_iname", UNDSEC, BSF_GLOBAL, 0);
1624
1625   /* OK, pay attention here.  I got confused myself looking back at
1626      it.  We create a four-byte section to mark the beginning of the
1627      list, and we include an offset of 4 in the section, so that the
1628      pointer to the list points to the *end* of this section, which is
1629      the start of the list of sections from other objects.  */
1630
1631   bfd_set_section_size (abfd, id2, 20);
1632   d2 = (unsigned char *) xmalloc (20);
1633   id2->contents = d2;
1634   memset (d2, 0, 20);
1635   d2[0] = d2[16] = 4; /* Reloc addend.  */
1636   quick_reloc (abfd,  0, BFD_RELOC_RVA, 2);
1637   quick_reloc (abfd, 12, BFD_RELOC_RVA, 4);
1638   quick_reloc (abfd, 16, BFD_RELOC_RVA, 1);
1639   save_relocs (id2);
1640
1641   bfd_set_section_size (abfd, id5, 4);
1642   d5 = (unsigned char *) xmalloc (4);
1643   id5->contents = d5;
1644   memset (d5, 0, 4);
1645
1646   bfd_set_section_size (abfd, id4, 4);
1647   d4 = (unsigned char *) xmalloc (4);
1648   id4->contents = d4;
1649   memset (d4, 0, 4);
1650
1651   bfd_set_symtab (abfd, symtab, symptr);
1652
1653   bfd_set_section_contents (abfd, id2, d2, 0, 20);
1654   bfd_set_section_contents (abfd, id5, d5, 0, 4);
1655   bfd_set_section_contents (abfd, id4, d4, 0, 4);
1656
1657   bfd_make_readable (abfd);
1658   return abfd;
1659 }
1660
1661 /*      .section        .idata$4
1662         .long           0
1663         .section        .idata$5
1664         .long           0
1665         .section        idata$7
1666         .global         __my_dll_iname
1667   __my_dll_iname:
1668         .asciz          "my.dll"       */
1669
1670 static bfd *
1671 make_tail (parent)
1672      bfd *parent;
1673 {
1674   asection *id4, *id5, *id7;
1675   unsigned char *d4, *d5, *d7;
1676   int len;
1677   char *oname;
1678   bfd *abfd;
1679
1680   oname = (char *) xmalloc (20);
1681   sprintf (oname, "d%06d.o", tmp_seq);
1682   tmp_seq++;
1683
1684   abfd = bfd_create (oname, parent);
1685   bfd_find_target (pe_details->object_target, abfd);
1686   bfd_make_writable (abfd);
1687
1688   bfd_set_format (abfd, bfd_object);
1689   bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
1690
1691   symptr = 0;
1692   symtab = (asymbol **) xmalloc (5 * sizeof (asymbol *));
1693   id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
1694   id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
1695   id7 = quick_section (abfd, ".idata$7", SEC_HAS_CONTENTS, 2);
1696   quick_symbol (abfd, U (""), dll_symname, "_iname", id7, BSF_GLOBAL, 0);
1697
1698   bfd_set_section_size (abfd, id4, 4);
1699   d4 = (unsigned char *) xmalloc (4);
1700   id4->contents = d4;
1701   memset (d4, 0, 4);
1702
1703   bfd_set_section_size (abfd, id5, 4);
1704   d5 = (unsigned char *) xmalloc (4);
1705   id5->contents = d5;
1706   memset (d5, 0, 4);
1707
1708   len = strlen (dll_filename) + 1;
1709   if (len & 1)
1710     len++;
1711   bfd_set_section_size (abfd, id7, len);
1712   d7 = (unsigned char *) xmalloc (len);
1713   id7->contents = d7;
1714   strcpy (d7, dll_filename);
1715
1716   bfd_set_symtab (abfd, symtab, symptr);
1717
1718   bfd_set_section_contents (abfd, id4, d4, 0, 4);
1719   bfd_set_section_contents (abfd, id5, d5, 0, 4);
1720   bfd_set_section_contents (abfd, id7, d7, 0, len);
1721
1722   bfd_make_readable (abfd);
1723   return abfd;
1724 }
1725
1726 /*      .text
1727         .global         _function
1728         .global         ___imp_function
1729         .global         __imp__function
1730   _function:
1731         jmp             *__imp__function:
1732
1733         .section        idata$7
1734         .long           __head_my_dll
1735
1736         .section        .idata$5
1737   ___imp_function:
1738   __imp__function:
1739   iat?
1740         .section        .idata$4
1741   iat?
1742         .section        .idata$6
1743   ID<ordinal>:
1744         .short          <hint>
1745         .asciz          "function" xlate? (add underscore, kill at)  */
1746
1747 static unsigned char jmp_ix86_bytes[] =
1748 {
1749   0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x90, 0x90
1750 };
1751
1752 /* _function:
1753         mov.l   ip+8,r0
1754         mov.l   @r0,r0
1755         jmp     @r0
1756         nop
1757         .dw     __imp_function   */
1758
1759 static unsigned char jmp_sh_bytes[] =
1760 {
1761   0x01, 0xd0, 0x02, 0x60, 0x2b, 0x40, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00
1762 };
1763
1764 /* _function:
1765         lui     $t0,<high:__imp_function>
1766         lw      $t0,<low:__imp_function>
1767         jr      $t0
1768         nop                              */
1769
1770 static unsigned char jmp_mips_bytes[] =
1771 {
1772   0x00, 0x00, 0x08, 0x3c,  0x00, 0x00, 0x08, 0x8d,
1773   0x08, 0x00, 0x00, 0x01,  0x00, 0x00, 0x00, 0x00
1774 };
1775
1776 static bfd *
1777 make_one (exp, parent)
1778      def_file_export *exp;
1779      bfd *parent;
1780 {
1781   asection *tx, *id7, *id5, *id4, *id6;
1782   unsigned char *td = NULL, *d7, *d5, *d4, *d6 = NULL;
1783   int len;
1784   char *oname;
1785   bfd *abfd;
1786   unsigned char *jmp_bytes = NULL;
1787   int jmp_byte_count = 0;
1788
1789   switch (pe_details->pe_arch)
1790     {
1791     case PE_ARCH_i386:
1792       jmp_bytes = jmp_ix86_bytes;
1793       jmp_byte_count = sizeof (jmp_ix86_bytes);
1794       break;
1795     case PE_ARCH_sh:
1796       jmp_bytes = jmp_sh_bytes;
1797       jmp_byte_count = sizeof (jmp_sh_bytes);
1798       break;
1799     case PE_ARCH_mips:
1800       jmp_bytes = jmp_mips_bytes;
1801       jmp_byte_count = sizeof (jmp_mips_bytes);
1802       break;
1803     default:
1804       abort ();
1805     }
1806
1807   oname = (char *) xmalloc (20);
1808   sprintf (oname, "d%06d.o", tmp_seq);
1809   tmp_seq++;
1810
1811   abfd = bfd_create (oname, parent);
1812   bfd_find_target (pe_details->object_target, abfd);
1813   bfd_make_writable (abfd);
1814
1815   bfd_set_format (abfd, bfd_object);
1816   bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
1817
1818   symptr = 0;
1819   symtab = (asymbol **) xmalloc (11 * sizeof (asymbol *));
1820   tx  = quick_section (abfd, ".text",    SEC_CODE|SEC_HAS_CONTENTS, 2);
1821   id7 = quick_section (abfd, ".idata$7", SEC_HAS_CONTENTS, 2);
1822   id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
1823   id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
1824   id6 = quick_section (abfd, ".idata$6", SEC_HAS_CONTENTS, 2);
1825
1826   if  (*exp->internal_name == '@')
1827     {
1828       if (! exp->flag_data)
1829         quick_symbol (abfd, "", exp->internal_name, "", tx, BSF_GLOBAL, 0);
1830       quick_symbol (abfd, U ("_head_"), dll_symname, "", UNDSEC, BSF_GLOBAL, 0);
1831       quick_symbol (abfd, U ("_imp_"), exp->internal_name, "", id5, BSF_GLOBAL, 0);
1832       /* Fastcall applies only to functions,
1833          so no need for auto-import symbol.  */
1834     }
1835   else
1836     {
1837       if (! exp->flag_data)
1838         quick_symbol (abfd, U (""), exp->internal_name, "", tx, BSF_GLOBAL, 0);
1839       quick_symbol (abfd, U ("_head_"), dll_symname, "", UNDSEC, BSF_GLOBAL, 0);
1840       quick_symbol (abfd, U ("_imp__"), exp->internal_name, "", id5, BSF_GLOBAL, 0);
1841       /* Symbol to reference ord/name of imported
1842          data symbol, used to implement auto-import.  */
1843       if (exp->flag_data)
1844         quick_symbol (abfd, U("_nm__"), exp->internal_name, "", id6, BSF_GLOBAL,0);
1845     }
1846   if (pe_dll_compat_implib)
1847     quick_symbol (abfd, U ("__imp_"), exp->internal_name, "",
1848                   id5, BSF_GLOBAL, 0);
1849
1850   if (! exp->flag_data)
1851     {
1852       bfd_set_section_size (abfd, tx, jmp_byte_count);
1853       td = (unsigned char *) xmalloc (jmp_byte_count);
1854       tx->contents = td;
1855       memcpy (td, jmp_bytes, jmp_byte_count);
1856
1857       switch (pe_details->pe_arch)
1858         {
1859         case PE_ARCH_i386:
1860           quick_reloc (abfd, 2, BFD_RELOC_32, 2);
1861           break;
1862         case PE_ARCH_sh:
1863           quick_reloc (abfd, 8, BFD_RELOC_32, 2);
1864           break;
1865         case PE_ARCH_mips:
1866           quick_reloc (abfd, 0, BFD_RELOC_HI16_S, 2);
1867           quick_reloc (abfd, 0, BFD_RELOC_LO16, 0); /* MIPS_R_PAIR */
1868           quick_reloc (abfd, 4, BFD_RELOC_LO16, 2);
1869           break;
1870         default:
1871           abort ();
1872         }
1873       save_relocs (tx);
1874     }
1875
1876   bfd_set_section_size (abfd, id7, 4);
1877   d7 = (unsigned char *) xmalloc (4);
1878   id7->contents = d7;
1879   memset (d7, 0, 4);
1880   quick_reloc (abfd, 0, BFD_RELOC_RVA, 6);
1881   save_relocs (id7);
1882
1883   bfd_set_section_size (abfd, id5, 4);
1884   d5 = (unsigned char *) xmalloc (4);
1885   id5->contents = d5;
1886   memset (d5, 0, 4);
1887
1888   if (exp->flag_noname)
1889     {
1890       d5[0] = exp->ordinal;
1891       d5[1] = exp->ordinal >> 8;
1892       d5[3] = 0x80;
1893     }
1894   else
1895     {
1896       quick_reloc (abfd, 0, BFD_RELOC_RVA, 4);
1897       save_relocs (id5);
1898     }
1899
1900   bfd_set_section_size (abfd, id4, 4);
1901   d4 = (unsigned char *) xmalloc (4);
1902   id4->contents = d4;
1903   memset (d4, 0, 4);
1904
1905   if (exp->flag_noname)
1906     {
1907       d4[0] = exp->ordinal;
1908       d4[1] = exp->ordinal >> 8;
1909       d4[3] = 0x80;
1910     }
1911   else
1912     {
1913       quick_reloc (abfd, 0, BFD_RELOC_RVA, 4);
1914       save_relocs (id4);
1915     }
1916
1917   if (exp->flag_noname)
1918     {
1919       len = 0;
1920       bfd_set_section_size (abfd, id6, 0);
1921     }
1922   else
1923     {
1924       len = strlen (exp->name) + 3;
1925       if (len & 1)
1926         len++;
1927       bfd_set_section_size (abfd, id6, len);
1928       d6 = (unsigned char *) xmalloc (len);
1929       id6->contents = d6;
1930       memset (d6, 0, len);
1931       d6[0] = exp->hint & 0xff;
1932       d6[1] = exp->hint >> 8;
1933       strcpy (d6 + 2, exp->name);
1934     }
1935
1936   bfd_set_symtab (abfd, symtab, symptr);
1937
1938   bfd_set_section_contents (abfd, tx, td, 0, jmp_byte_count);
1939   bfd_set_section_contents (abfd, id7, d7, 0, 4);
1940   bfd_set_section_contents (abfd, id5, d5, 0, 4);
1941   bfd_set_section_contents (abfd, id4, d4, 0, 4);
1942   if (!exp->flag_noname)
1943     bfd_set_section_contents (abfd, id6, d6, 0, len);
1944
1945   bfd_make_readable (abfd);
1946   return abfd;
1947 }
1948
1949 static bfd *
1950 make_singleton_name_thunk (import, parent)
1951      const char *import;
1952      bfd *parent;
1953 {
1954   /* Name thunks go to idata$4.  */
1955   asection *id4;
1956   unsigned char *d4;
1957   char *oname;
1958   bfd *abfd;
1959
1960   oname = (char *) xmalloc (20);
1961   sprintf (oname, "nmth%06d.o", tmp_seq);
1962   tmp_seq++;
1963
1964   abfd = bfd_create (oname, parent);
1965   bfd_find_target (pe_details->object_target, abfd);
1966   bfd_make_writable (abfd);
1967
1968   bfd_set_format (abfd, bfd_object);
1969   bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
1970
1971   symptr = 0;
1972   symtab = (asymbol **) xmalloc (3 * sizeof (asymbol *));
1973   id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
1974   quick_symbol (abfd, U ("_nm_thnk_"), import, "", id4, BSF_GLOBAL, 0);
1975   quick_symbol (abfd, U ("_nm_"), import, "", UNDSEC, BSF_GLOBAL, 0);
1976
1977   bfd_set_section_size (abfd, id4, 8);
1978   d4 = (unsigned char *) xmalloc (4);
1979   id4->contents = d4;
1980   memset (d4, 0, 8);
1981   quick_reloc (abfd, 0, BFD_RELOC_RVA, 2);
1982   save_relocs (id4);
1983
1984   bfd_set_symtab (abfd, symtab, symptr);
1985
1986   bfd_set_section_contents (abfd, id4, d4, 0, 8);
1987
1988   bfd_make_readable (abfd);
1989   return abfd;
1990 }
1991
1992 static char *
1993 make_import_fixup_mark (rel)
1994      arelent *rel;
1995 {
1996   /* We convert reloc to symbol, for later reference.  */
1997   static int counter;
1998   static char *fixup_name = NULL;
1999   static size_t buffer_len = 0;
2000
2001   struct symbol_cache_entry *sym = *rel->sym_ptr_ptr;
2002
2003   bfd *abfd = bfd_asymbol_bfd (sym);
2004   struct bfd_link_hash_entry *bh;
2005
2006   if (!fixup_name)
2007     {
2008       fixup_name = (char *) xmalloc (384);
2009       buffer_len = 384;
2010     }
2011
2012   if (strlen (sym->name) + 25 > buffer_len)
2013   /* Assume 25 chars for "__fu" + counter + "_".  If counter is
2014      bigger than 20 digits long, we've got worse problems than
2015      overflowing this buffer...  */
2016     {
2017       free (fixup_name);
2018       /* New buffer size is length of symbol, plus 25, but then
2019          rounded up to the nearest multiple of 128.  */
2020       buffer_len = ((strlen (sym->name) + 25) + 127) & ~127;
2021       fixup_name = (char *) xmalloc (buffer_len);
2022     }
2023
2024   sprintf (fixup_name, "__fu%d_%s", counter++, sym->name);
2025
2026   bh = NULL;
2027   bfd_coff_link_add_one_symbol (&link_info, abfd, fixup_name, BSF_GLOBAL,
2028                                 current_sec, /* sym->section, */
2029                                 rel->address, NULL, TRUE, FALSE, &bh);
2030
2031   if (0)
2032     {
2033       struct coff_link_hash_entry *myh;
2034
2035       myh = (struct coff_link_hash_entry *) bh;
2036       printf ("type:%d\n", myh->type);
2037       printf ("%s\n", myh->root.u.def.section->name);
2038     }
2039
2040   return fixup_name;
2041 }
2042
2043 /*      .section        .idata$3
2044         .rva            __nm_thnk_SYM (singleton thunk with name of func)
2045         .long           0
2046         .long           0
2047         .rva            __my_dll_iname (name of dll)
2048         .rva            __fuNN_SYM (pointer to reference (address) in text)  */
2049
2050 static bfd *
2051 make_import_fixup_entry (name, fixup_name, dll_symname, parent)
2052      const char *name;
2053      const char *fixup_name;
2054      const char *dll_symname;
2055      bfd *parent;
2056 {
2057   asection *id3;
2058   unsigned char *d3;
2059   char *oname;
2060   bfd *abfd;
2061
2062   oname = (char *) xmalloc (20);
2063   sprintf (oname, "fu%06d.o", tmp_seq);
2064   tmp_seq++;
2065
2066   abfd = bfd_create (oname, parent);
2067   bfd_find_target (pe_details->object_target, abfd);
2068   bfd_make_writable (abfd);
2069
2070   bfd_set_format (abfd, bfd_object);
2071   bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2072
2073   symptr = 0;
2074   symtab = (asymbol **) xmalloc (6 * sizeof (asymbol *));
2075   id3 = quick_section (abfd, ".idata$3", SEC_HAS_CONTENTS, 2);
2076
2077 #if 0
2078   quick_symbol (abfd, U ("_head_"), dll_symname, "", id2, BSF_GLOBAL, 0);
2079 #endif
2080   quick_symbol (abfd, U ("_nm_thnk_"), name, "", UNDSEC, BSF_GLOBAL, 0);
2081   quick_symbol (abfd, U (""), dll_symname, "_iname", UNDSEC, BSF_GLOBAL, 0);
2082   quick_symbol (abfd, "", fixup_name, "", UNDSEC, BSF_GLOBAL, 0);
2083
2084   bfd_set_section_size (abfd, id3, 20);
2085   d3 = (unsigned char *) xmalloc (20);
2086   id3->contents = d3;
2087   memset (d3, 0, 20);
2088
2089   quick_reloc (abfd, 0, BFD_RELOC_RVA, 1);
2090   quick_reloc (abfd, 12, BFD_RELOC_RVA, 2);
2091   quick_reloc (abfd, 16, BFD_RELOC_RVA, 3);
2092   save_relocs (id3);
2093
2094   bfd_set_symtab (abfd, symtab, symptr);
2095
2096   bfd_set_section_contents (abfd, id3, d3, 0, 20);
2097
2098   bfd_make_readable (abfd);
2099   return abfd;
2100 }
2101
2102 /*      .section        .rdata_runtime_pseudo_reloc
2103         .long           addend
2104         .rva            __fuNN_SYM (pointer to reference (address) in text)  */
2105
2106 static bfd *
2107 make_runtime_pseudo_reloc (name, fixup_name, addend, parent)
2108      const char *name ATTRIBUTE_UNUSED;
2109      const char *fixup_name;
2110      int addend;
2111      bfd *parent;
2112 {
2113   asection *rt_rel;
2114   unsigned char *rt_rel_d;
2115   char *oname;
2116   bfd *abfd;
2117
2118   oname = (char *) xmalloc (20);
2119   sprintf (oname, "rtr%06d.o", tmp_seq);
2120   tmp_seq++;
2121
2122   abfd = bfd_create (oname, parent);
2123   bfd_find_target (pe_details->object_target, abfd);
2124   bfd_make_writable (abfd);
2125
2126   bfd_set_format (abfd, bfd_object);
2127   bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2128
2129   symptr = 0;
2130   symtab = (asymbol **) xmalloc (2 * sizeof (asymbol *));
2131   rt_rel = quick_section (abfd, ".rdata_runtime_pseudo_reloc", SEC_HAS_CONTENTS, 2);
2132
2133   quick_symbol (abfd, "", fixup_name, "", UNDSEC, BSF_GLOBAL, 0);
2134
2135   bfd_set_section_size (abfd, rt_rel, 8);
2136   rt_rel_d = (unsigned char *) xmalloc (8);
2137   rt_rel->contents = rt_rel_d;
2138   memset (rt_rel_d, 0, 8);
2139   bfd_put_32 (abfd, addend, rt_rel_d);
2140
2141   quick_reloc (abfd, 4, BFD_RELOC_RVA, 1);
2142   save_relocs (rt_rel);
2143
2144   bfd_set_symtab (abfd, symtab, symptr);
2145
2146   bfd_set_section_contents (abfd, rt_rel, rt_rel_d, 0, 8);
2147
2148   bfd_make_readable (abfd);
2149   return abfd;
2150 }
2151
2152 /*      .section        .rdata
2153         .rva            __pei386_runtime_relocator */
2154
2155 static bfd *
2156 pe_create_runtime_relocator_reference (parent)
2157      bfd *parent;
2158 {
2159   asection *extern_rt_rel;
2160   unsigned char *extern_rt_rel_d;
2161   char *oname;
2162   bfd *abfd;
2163
2164   oname = (char *) xmalloc (20);
2165   sprintf (oname, "ertr%06d.o", tmp_seq);
2166   tmp_seq++;
2167
2168   abfd = bfd_create (oname, parent);
2169   bfd_find_target (pe_details->object_target, abfd);
2170   bfd_make_writable (abfd);
2171
2172   bfd_set_format (abfd, bfd_object);
2173   bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2174
2175   symptr = 0;
2176   symtab = (asymbol **) xmalloc (2 * sizeof (asymbol *));
2177   extern_rt_rel = quick_section (abfd, ".rdata", SEC_HAS_CONTENTS, 2);
2178
2179   quick_symbol (abfd, "", "__pei386_runtime_relocator", "", UNDSEC, BSF_NO_FLAGS, 0);
2180
2181   bfd_set_section_size (abfd, extern_rt_rel, 4);
2182   extern_rt_rel_d = (unsigned char *) xmalloc (4);
2183   extern_rt_rel->contents = extern_rt_rel_d;
2184
2185   quick_reloc (abfd, 0, BFD_RELOC_RVA, 1);
2186   save_relocs (extern_rt_rel);
2187
2188   bfd_set_symtab (abfd, symtab, symptr);
2189
2190   bfd_set_section_contents (abfd, extern_rt_rel, extern_rt_rel_d, 0, 4);
2191
2192   bfd_make_readable (abfd);
2193   return abfd;
2194 }
2195
2196 void
2197 pe_create_import_fixup (rel, s, addend)
2198      arelent *rel;
2199      asection *s;
2200      int addend;
2201 {
2202   char buf[300];
2203   struct symbol_cache_entry *sym = *rel->sym_ptr_ptr;
2204   struct bfd_link_hash_entry *name_thunk_sym;
2205   const char *name = sym->name;
2206   char *fixup_name = make_import_fixup_mark (rel);
2207   bfd *b;
2208
2209   sprintf (buf, U ("_nm_thnk_%s"), name);
2210
2211   name_thunk_sym = bfd_link_hash_lookup (link_info.hash, buf, 0, 0, 1);
2212
2213   if (!name_thunk_sym || name_thunk_sym->type != bfd_link_hash_defined)
2214     {
2215       bfd *b = make_singleton_name_thunk (name, output_bfd);
2216       add_bfd_to_link (b, b->filename, &link_info);
2217
2218       /* If we ever use autoimport, we have to cast text section writable.  */
2219       config.text_read_only = FALSE;
2220     }
2221
2222   if (addend == 0 || link_info.pei386_runtime_pseudo_reloc)
2223     {
2224       extern char * pe_data_import_dll;
2225       char * dll_symname = pe_data_import_dll ? pe_data_import_dll : "unknown";
2226
2227       b = make_import_fixup_entry (name, fixup_name, dll_symname, output_bfd);
2228       add_bfd_to_link (b, b->filename, &link_info);
2229     }
2230
2231   if (addend != 0)
2232     {
2233       if (link_info.pei386_runtime_pseudo_reloc)
2234         {
2235           if (pe_dll_extra_pe_debug)
2236             printf ("creating runtime pseudo-reloc entry for %s (addend=%d)\n",
2237                    fixup_name, addend);
2238           b = make_runtime_pseudo_reloc (name, fixup_name, addend, output_bfd);
2239           add_bfd_to_link (b, b->filename, &link_info);
2240
2241           if (runtime_pseudo_relocs_created == 0)
2242             {
2243               b = pe_create_runtime_relocator_reference (output_bfd);
2244               add_bfd_to_link (b, b->filename, &link_info);
2245             }
2246           runtime_pseudo_relocs_created++;
2247         }
2248       else
2249         {
2250           einfo (_("%C: variable '%T' can't be auto-imported. Please read the documentation for ld's --enable-auto-import for details.\n"),
2251                  s->owner, s, rel->address, sym->name);
2252           einfo ("%X");
2253         }
2254     }
2255 }
2256
2257
2258 void
2259 pe_dll_generate_implib (def, impfilename)
2260      def_file *def;
2261      const char *impfilename;
2262 {
2263   int i;
2264   bfd *ar_head;
2265   bfd *ar_tail;
2266   bfd *outarch;
2267   bfd *head = 0;
2268
2269   dll_filename = (def->name) ? def->name : dll_name;
2270   dll_symname = xstrdup (dll_filename);
2271   for (i = 0; dll_symname[i]; i++)
2272     if (!ISALNUM (dll_symname[i]))
2273       dll_symname[i] = '_';
2274
2275   unlink (impfilename);
2276
2277   outarch = bfd_openw (impfilename, 0);
2278
2279   if (!outarch)
2280     {
2281       /* xgettext:c-format */
2282       einfo (_("%XCan't open .lib file: %s\n"), impfilename);
2283       return;
2284     }
2285
2286   /* xgettext:c-format */
2287   einfo (_("Creating library file: %s\n"), impfilename);
2288
2289   bfd_set_format (outarch, bfd_archive);
2290   outarch->has_armap = 1;
2291
2292   /* Work out a reasonable size of things to put onto one line.  */
2293   ar_head = make_head (outarch);
2294
2295   for (i = 0; i < def->num_exports; i++)
2296     {
2297       /* The import library doesn't know about the internal name.  */
2298       char *internal = def->exports[i].internal_name;
2299       bfd *n;
2300
2301       def->exports[i].internal_name = def->exports[i].name;
2302       n = make_one (def->exports + i, outarch);
2303       n->next = head;
2304       head = n;
2305       def->exports[i].internal_name = internal;
2306     }
2307
2308   ar_tail = make_tail (outarch);
2309
2310   if (ar_head == NULL || ar_tail == NULL)
2311     return;
2312
2313   /* Now stick them all into the archive.  */
2314   ar_head->next = head;
2315   ar_tail->next = ar_head;
2316   head = ar_tail;
2317
2318   if (! bfd_set_archive_head (outarch, head))
2319     einfo ("%Xbfd_set_archive_head: %s\n", bfd_errmsg (bfd_get_error ()));
2320
2321   if (! bfd_close (outarch))
2322     einfo ("%Xbfd_close %s: %s\n", impfilename, bfd_errmsg (bfd_get_error ()));
2323
2324   while (head != NULL)
2325     {
2326       bfd *n = head->next;
2327       bfd_close (head);
2328       head = n;
2329     }
2330 }
2331
2332 static void
2333 add_bfd_to_link (abfd, name, link_info)
2334      bfd *abfd;
2335      const char *name;
2336      struct bfd_link_info *link_info;
2337 {
2338   lang_input_statement_type *fake_file;
2339
2340   fake_file = lang_add_input_file (name,
2341                                    lang_input_file_is_fake_enum,
2342                                    NULL);
2343   fake_file->the_bfd = abfd;
2344   ldlang_add_file (fake_file);
2345
2346   if (!bfd_link_add_symbols (abfd, link_info))
2347     einfo ("%Xaddsym %s: %s\n", name, bfd_errmsg (bfd_get_error ()));
2348 }
2349
2350 void
2351 pe_process_import_defs (output_bfd, link_info)
2352      bfd *output_bfd;
2353      struct bfd_link_info *link_info;
2354 {
2355   def_file_module *module;
2356
2357   pe_dll_id_target (bfd_get_target (output_bfd));
2358
2359   if (!pe_def_file)
2360     return;
2361
2362   for (module = pe_def_file->modules; module; module = module->next)
2363     {
2364       int i, do_this_dll;
2365
2366       dll_filename = module->name;
2367       dll_symname = xstrdup (module->name);
2368       for (i = 0; dll_symname[i]; i++)
2369         if (!ISALNUM (dll_symname[i]))
2370           dll_symname[i] = '_';
2371
2372       do_this_dll = 0;
2373
2374       for (i = 0; i < pe_def_file->num_imports; i++)
2375         if (pe_def_file->imports[i].module == module)
2376           {
2377             def_file_export exp;
2378             struct bfd_link_hash_entry *blhe;
2379             int lead_at = (*pe_def_file->imports[i].internal_name == '@');
2380             /* See if we need this import.  */
2381             char *name = (char *) xmalloc (strlen (pe_def_file->imports[i].internal_name) + 2 + 6);
2382
2383             if (lead_at)
2384               sprintf (name, "%s%s", "", pe_def_file->imports[i].internal_name);
2385             else
2386               sprintf (name, "%s%s",U (""), pe_def_file->imports[i].internal_name);
2387
2388             blhe = bfd_link_hash_lookup (link_info->hash, name,
2389                                          FALSE, FALSE, FALSE);
2390
2391             if (!blhe || (blhe && blhe->type != bfd_link_hash_undefined))
2392               {
2393                 if (lead_at)
2394                   sprintf (name, "%s%s", U ("_imp_"),
2395                            pe_def_file->imports[i].internal_name);
2396                 else
2397                   sprintf (name, "%s%s", U ("_imp__"),
2398                            pe_def_file->imports[i].internal_name);
2399
2400                 blhe = bfd_link_hash_lookup (link_info->hash, name,
2401                                              FALSE, FALSE, FALSE);
2402               }
2403             free (name);
2404
2405             if (blhe && blhe->type == bfd_link_hash_undefined)
2406               {
2407                 bfd *one;
2408                 /* We do.  */
2409                 if (!do_this_dll)
2410                   {
2411                     bfd *ar_head = make_head (output_bfd);
2412                     add_bfd_to_link (ar_head, ar_head->filename, link_info);
2413                     do_this_dll = 1;
2414                   }
2415                 exp.internal_name = pe_def_file->imports[i].internal_name;
2416                 exp.name = pe_def_file->imports[i].name;
2417                 exp.ordinal = pe_def_file->imports[i].ordinal;
2418                 exp.hint = exp.ordinal >= 0 ? exp.ordinal : 0;
2419                 exp.flag_private = 0;
2420                 exp.flag_constant = 0;
2421                 exp.flag_data = pe_def_file->imports[i].data;
2422                 exp.flag_noname = exp.name ? 0 : 1;
2423                 one = make_one (&exp, output_bfd);
2424                 add_bfd_to_link (one, one->filename, link_info);
2425               }
2426           }
2427       if (do_this_dll)
2428         {
2429           bfd *ar_tail = make_tail (output_bfd);
2430           add_bfd_to_link (ar_tail, ar_tail->filename, link_info);
2431         }
2432
2433       free (dll_symname);
2434     }
2435 }
2436
2437 /* We were handed a *.DLL file.  Parse it and turn it into a set of
2438    IMPORTS directives in the def file.  Return TRUE if the file was
2439    handled, FALSE if not.  */
2440
2441 static unsigned int
2442 pe_get16 (abfd, where)
2443      bfd *abfd;
2444      int where;
2445 {
2446   unsigned char b[2];
2447
2448   bfd_seek (abfd, (file_ptr) where, SEEK_SET);
2449   bfd_bread (b, (bfd_size_type) 2, abfd);
2450   return b[0] + (b[1] << 8);
2451 }
2452
2453 static unsigned int
2454 pe_get32 (abfd, where)
2455      bfd *abfd;
2456      int where;
2457 {
2458   unsigned char b[4];
2459
2460   bfd_seek (abfd, (file_ptr) where, SEEK_SET);
2461   bfd_bread (b, (bfd_size_type) 4, abfd);
2462   return b[0] + (b[1] << 8) + (b[2] << 16) + (b[3] << 24);
2463 }
2464
2465 #if 0 /* This is not currently used.  */
2466
2467 static unsigned int
2468 pe_as16 (ptr)
2469      void *ptr;
2470 {
2471   unsigned char *b = ptr;
2472
2473   return b[0] + (b[1] << 8);
2474 }
2475
2476 #endif
2477
2478 static unsigned int
2479 pe_as32 (ptr)
2480      void *ptr;
2481 {
2482   unsigned char *b = ptr;
2483
2484   return b[0] + (b[1] << 8) + (b[2] << 16) + (b[3] << 24);
2485 }
2486
2487 bfd_boolean
2488 pe_implied_import_dll (filename)
2489      const char *filename;
2490 {
2491   bfd *dll;
2492   unsigned long pe_header_offset, opthdr_ofs, num_entries, i;
2493   unsigned long export_rva, export_size, nsections, secptr, expptr;
2494   unsigned long exp_funcbase;
2495   unsigned char *expdata, *erva;
2496   unsigned long name_rvas, ordinals, nexp, ordbase;
2497   const char *dll_name;
2498   /* Initialization with start > end guarantees that is_data
2499      will not be set by mistake, and avoids compiler warning.  */
2500   unsigned long data_start = 1;
2501   unsigned long data_end   = 0;
2502   unsigned long bss_start  = 1;
2503   unsigned long bss_end    = 0;
2504
2505   /* No, I can't use bfd here.  kernel32.dll puts its export table in
2506      the middle of the .rdata section.  */
2507   dll = bfd_openr (filename, pe_details->target_name);
2508   if (!dll)
2509     {
2510       einfo ("%Xopen %s: %s\n", filename, bfd_errmsg (bfd_get_error ()));
2511       return FALSE;
2512     }
2513
2514   /* PEI dlls seem to be bfd_objects.  */
2515   if (!bfd_check_format (dll, bfd_object))
2516     {
2517       einfo ("%X%s: this doesn't appear to be a DLL\n", filename);
2518       return FALSE;
2519     }
2520
2521   /* Get pe_header, optional header and numbers of export entries.  */
2522   pe_header_offset = pe_get32 (dll, 0x3c);
2523   opthdr_ofs = pe_header_offset + 4 + 20;
2524   num_entries = pe_get32 (dll, opthdr_ofs + 92);
2525
2526   if (num_entries < 1) /* No exports.  */
2527     return FALSE;
2528
2529   export_rva = pe_get32 (dll, opthdr_ofs + 96);
2530   export_size = pe_get32 (dll, opthdr_ofs + 100);
2531   nsections = pe_get16 (dll, pe_header_offset + 4 + 2);
2532   secptr = (pe_header_offset + 4 + 20 +
2533             pe_get16 (dll, pe_header_offset + 4 + 16));
2534   expptr = 0;
2535
2536   /* Get the rva and size of the export section.  */ 
2537   for (i = 0; i < nsections; i++)
2538     {
2539       char sname[8];
2540       unsigned long secptr1 = secptr + 40 * i;
2541       unsigned long vaddr = pe_get32 (dll, secptr1 + 12);
2542       unsigned long vsize = pe_get32 (dll, secptr1 + 16);
2543       unsigned long fptr = pe_get32 (dll, secptr1 + 20);
2544
2545       bfd_seek (dll, (file_ptr) secptr1, SEEK_SET);
2546       bfd_bread (sname, (bfd_size_type) 8, dll);
2547
2548       if (vaddr <= export_rva && vaddr + vsize > export_rva)
2549         {
2550           expptr = fptr + (export_rva - vaddr);
2551           if (export_rva + export_size > vaddr + vsize)
2552             export_size = vsize - (export_rva - vaddr);
2553           break;
2554         }
2555     }
2556
2557   /* Scan sections and store the base and size of the
2558      data and bss segments in data/base_start/end.  */ 
2559   for (i = 0; i < nsections; i++)
2560     {
2561       unsigned long secptr1 = secptr + 40 * i;
2562       unsigned long vsize = pe_get32 (dll, secptr1 + 8);
2563       unsigned long vaddr = pe_get32 (dll, secptr1 + 12);
2564       unsigned long flags = pe_get32 (dll, secptr1 + 36);
2565       char sec_name[9];
2566
2567       sec_name[8] = '\0';
2568       bfd_seek (dll, (file_ptr) secptr1 + 0, SEEK_SET);
2569       bfd_bread (sec_name, (bfd_size_type) 8, dll);
2570
2571       if (strcmp(sec_name,".data") == 0)
2572         {
2573           data_start = vaddr;
2574           data_end = vaddr + vsize;
2575
2576           if (pe_dll_extra_pe_debug)
2577             printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n",
2578                     __FUNCTION__, sec_name, vaddr, vaddr + vsize, flags);
2579         }
2580       else if (strcmp (sec_name,".bss") == 0)
2581         {
2582           bss_start = vaddr;
2583           bss_end = vaddr + vsize;
2584
2585           if (pe_dll_extra_pe_debug)
2586             printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n",
2587                     __FUNCTION__, sec_name, vaddr, vaddr + vsize, flags);
2588         }
2589     }
2590
2591   expdata = (unsigned char *) xmalloc (export_size);
2592   bfd_seek (dll, (file_ptr) expptr, SEEK_SET);
2593   bfd_bread (expdata, (bfd_size_type) export_size, dll);
2594   erva = expdata - export_rva;
2595
2596   if (pe_def_file == 0)
2597     pe_def_file = def_file_empty ();
2598
2599   nexp = pe_as32 (expdata + 24);
2600   name_rvas = pe_as32 (expdata + 32);
2601   ordinals = pe_as32 (expdata + 36);
2602   ordbase = pe_as32 (expdata + 16);
2603   exp_funcbase = pe_as32 (expdata + 28);
2604
2605   /* Use internal dll name instead of filename
2606      to enable symbolic dll linking.  */
2607   dll_name = pe_as32 (expdata + 12) + erva;
2608
2609   /* Iterate through the list of symbols.  */
2610   for (i = 0; i < nexp; i++)
2611     {
2612       /* Pointer to the names vector.  */
2613       unsigned long name_rva = pe_as32 (erva + name_rvas + i * 4);
2614       def_file_import *imp;
2615       /* Pointer to the function address vector.  */ 
2616       unsigned long func_rva = pe_as32 (erva + exp_funcbase + i * 4);
2617       int is_data = 0;
2618
2619       /* Skip unwanted symbols, which are
2620          exported in buggy auto-import releases.  */
2621       if (strncmp (erva + name_rva, "_nm_", 4) != 0)
2622         {
2623           /* is_data is true if the address is in the data or bss segment.  */
2624           is_data =
2625             (func_rva >= data_start && func_rva < data_end)
2626             || (func_rva >= bss_start && func_rva < bss_end);
2627
2628           imp = def_file_add_import (pe_def_file, erva + name_rva,
2629                                      dll_name, i, 0);
2630           /* Mark symbol type.  */
2631           imp->data = is_data;
2632  
2633           if (pe_dll_extra_pe_debug)
2634             printf ("%s dll-name: %s sym: %s addr: 0x%lx %s\n",
2635                     __FUNCTION__, dll_name, erva + name_rva,
2636                     func_rva, is_data ? "(data)" : "");
2637         }
2638     }
2639
2640   return TRUE;
2641 }
2642
2643 /* These are the main functions, called from the emulation.  The first
2644    is called after the bfds are read, so we can guess at how much space
2645    we need.  The second is called after everything is placed, so we
2646    can put the right values in place.  */
2647
2648 void
2649 pe_dll_build_sections (abfd, info)
2650      bfd *abfd;
2651      struct bfd_link_info *info;
2652 {
2653   pe_dll_id_target (bfd_get_target (abfd));
2654   process_def_file (abfd, info);
2655
2656   generate_edata (abfd, info);
2657   build_filler_bfd (1);
2658 }
2659
2660 void
2661 pe_exe_build_sections (abfd, info)
2662      bfd *abfd;
2663      struct bfd_link_info *info ATTRIBUTE_UNUSED;
2664 {
2665   pe_dll_id_target (bfd_get_target (abfd));
2666   build_filler_bfd (0);
2667 }
2668
2669 void
2670 pe_dll_fill_sections (abfd, info)
2671      bfd *abfd;
2672      struct bfd_link_info *info;
2673 {
2674   pe_dll_id_target (bfd_get_target (abfd));
2675   image_base = pe_data (abfd)->pe_opthdr.ImageBase;
2676
2677   generate_reloc (abfd, info);
2678   if (reloc_sz > 0)
2679     {
2680       bfd_set_section_size (filler_bfd, reloc_s, reloc_sz);
2681
2682       /* Resize the sections.  */
2683       lang_size_sections (stat_ptr->head, abs_output_section,
2684                           &stat_ptr->head, 0, (bfd_vma) 0, NULL);
2685
2686       /* Redo special stuff.  */
2687       ldemul_after_allocation ();
2688
2689       /* Do the assignments again.  */
2690       lang_do_assignments (stat_ptr->head,
2691                            abs_output_section,
2692                            (fill_type *) 0, (bfd_vma) 0);
2693     }
2694
2695   fill_edata (abfd, info);
2696
2697   pe_data (abfd)->dll = 1;
2698
2699   edata_s->contents = edata_d;
2700   reloc_s->contents = reloc_d;
2701 }
2702
2703 void
2704 pe_exe_fill_sections (abfd, info)
2705      bfd *abfd;
2706      struct bfd_link_info *info;
2707 {
2708   pe_dll_id_target (bfd_get_target (abfd));
2709   image_base = pe_data (abfd)->pe_opthdr.ImageBase;
2710
2711   generate_reloc (abfd, info);
2712   if (reloc_sz > 0)
2713     {
2714       bfd_set_section_size (filler_bfd, reloc_s, reloc_sz);
2715
2716       /* Resize the sections.  */
2717       lang_size_sections (stat_ptr->head, abs_output_section,
2718                           &stat_ptr->head, 0, (bfd_vma) 0, NULL);
2719
2720       /* Redo special stuff.  */
2721       ldemul_after_allocation ();
2722
2723       /* Do the assignments again.  */
2724       lang_do_assignments (stat_ptr->head,
2725                            abs_output_section,
2726                            (fill_type *) 0, (bfd_vma) 0);
2727     }
2728   reloc_s->contents = reloc_d;
2729 }