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