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