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