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