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