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