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