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