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