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