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