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