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