Fix possible failure in the AVR linker tests.
[deliverable/binutils-gdb.git] / ld / pe-dll.c
1 /* Routines to help build PEI-format DLLs (Win32 etc)
2 Copyright (C) 1998-2016 Free Software Foundation, Inc.
3 Written by DJ Delorie <dj@cygnus.com>
4
5 This file is part of the GNU Binutils.
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
20 MA 02110-1301, USA. */
21
22 #include "sysdep.h"
23 #include "bfd.h"
24 #include "bfdlink.h"
25 #include "libiberty.h"
26 #include "filenames.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 "on 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_exclude_all_symbols = 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 int pe_use_nul_prefixed_import_tables = 0;
160 int pe_use_coff_long_section_names = -1;
161 int pe_leading_underscore = -1;
162
163 /* Static variables and types. */
164
165 static bfd_vma image_base;
166 static bfd *filler_bfd;
167 static struct bfd_section *edata_s, *reloc_s;
168 static unsigned char *edata_d, *reloc_d;
169 static size_t edata_sz, reloc_sz;
170 static int runtime_pseudo_relocs_created = 0;
171 static int runtime_pseudp_reloc_v2_init = 0;
172
173 typedef struct
174 {
175 const char *name;
176 int len;
177 }
178 autofilter_entry_type;
179
180 typedef struct
181 {
182 const char *target_name;
183 const char *object_target;
184 unsigned int imagebase_reloc;
185 int pe_arch;
186 int bfd_arch;
187 bfd_boolean underscored;
188 const autofilter_entry_type* autofilter_symbollist;
189 }
190 pe_details_type;
191
192 static const autofilter_entry_type autofilter_symbollist_generic[] =
193 {
194 { STRING_COMMA_LEN ("_NULL_IMPORT_DESCRIPTOR") },
195 /* Entry point symbols. */
196 { STRING_COMMA_LEN ("DllMain") },
197 { STRING_COMMA_LEN ("DllMainCRTStartup") },
198 { STRING_COMMA_LEN ("_DllMainCRTStartup") },
199 /* Runtime pseudo-reloc. */
200 { STRING_COMMA_LEN ("_pei386_runtime_relocator") },
201 { STRING_COMMA_LEN ("do_pseudo_reloc") },
202 { NULL, 0 }
203 };
204
205 static const autofilter_entry_type autofilter_symbollist_i386[] =
206 {
207 { STRING_COMMA_LEN ("_NULL_IMPORT_DESCRIPTOR") },
208 /* Entry point symbols, and entry hooks. */
209 { STRING_COMMA_LEN ("cygwin_crt0") },
210 #ifdef pe_use_x86_64
211 { STRING_COMMA_LEN ("DllMain") },
212 { STRING_COMMA_LEN ("DllEntryPoint") },
213 { STRING_COMMA_LEN ("DllMainCRTStartup") },
214 { STRING_COMMA_LEN ("_cygwin_dll_entry") },
215 { STRING_COMMA_LEN ("_cygwin_crt0_common") },
216 { STRING_COMMA_LEN ("_cygwin_noncygwin_dll_entry") },
217 #else
218 { STRING_COMMA_LEN ("DllMain@12") },
219 { STRING_COMMA_LEN ("DllEntryPoint@0") },
220 { STRING_COMMA_LEN ("DllMainCRTStartup@12") },
221 { STRING_COMMA_LEN ("_cygwin_dll_entry@12") },
222 { STRING_COMMA_LEN ("_cygwin_crt0_common@8") },
223 { STRING_COMMA_LEN ("_cygwin_noncygwin_dll_entry@12") },
224 { STRING_COMMA_LEN ("cygwin_attach_dll") },
225 #endif
226 { STRING_COMMA_LEN ("cygwin_premain0") },
227 { STRING_COMMA_LEN ("cygwin_premain1") },
228 { STRING_COMMA_LEN ("cygwin_premain2") },
229 { STRING_COMMA_LEN ("cygwin_premain3") },
230 /* Runtime pseudo-reloc. */
231 { STRING_COMMA_LEN ("_pei386_runtime_relocator") },
232 { STRING_COMMA_LEN ("do_pseudo_reloc") },
233 /* Global vars that should not be exported. */
234 { STRING_COMMA_LEN ("impure_ptr") },
235 { STRING_COMMA_LEN ("_impure_ptr") },
236 { STRING_COMMA_LEN ("_fmode") },
237 { STRING_COMMA_LEN ("environ") },
238 { STRING_COMMA_LEN ("__dso_handle") },
239 { NULL, 0 }
240 };
241
242 #define PE_ARCH_i386 1
243 #define PE_ARCH_sh 2
244 #define PE_ARCH_mips 3
245 #define PE_ARCH_arm 4
246 #define PE_ARCH_arm_epoc 5
247 #define PE_ARCH_arm_wince 6
248
249 /* Don't make it constant as underscore mode gets possibly overriden
250 by target or -(no-)leading-underscore option. */
251 static pe_details_type pe_detail_list[] =
252 {
253 {
254 #ifdef pe_use_x86_64
255 "pei-x86-64",
256 "pe-x86-64",
257 3 /* R_IMAGEBASE */,
258 #else
259 "pei-i386",
260 "pe-i386",
261 7 /* R_IMAGEBASE */,
262 #endif
263 PE_ARCH_i386,
264 bfd_arch_i386,
265 #ifdef pe_use_x86_64
266 FALSE,
267 #else
268 TRUE,
269 #endif
270 autofilter_symbollist_i386
271 },
272 {
273 "pei-shl",
274 "pe-shl",
275 16 /* R_SH_IMAGEBASE */,
276 PE_ARCH_sh,
277 bfd_arch_sh,
278 TRUE,
279 autofilter_symbollist_generic
280 },
281 {
282 "pei-mips",
283 "pe-mips",
284 34 /* MIPS_R_RVA */,
285 PE_ARCH_mips,
286 bfd_arch_mips,
287 FALSE,
288 autofilter_symbollist_generic
289 },
290 {
291 "pei-arm-little",
292 "pe-arm-little",
293 11 /* ARM_RVA32 */,
294 PE_ARCH_arm,
295 bfd_arch_arm,
296 TRUE,
297 autofilter_symbollist_generic
298 },
299 {
300 "epoc-pei-arm-little",
301 "epoc-pe-arm-little",
302 11 /* ARM_RVA32 */,
303 PE_ARCH_arm_epoc,
304 bfd_arch_arm,
305 FALSE,
306 autofilter_symbollist_generic
307 },
308 {
309 "pei-arm-wince-little",
310 "pe-arm-wince-little",
311 2, /* ARM_RVA32 on Windows CE, see bfd/coff-arm.c. */
312 PE_ARCH_arm_wince,
313 bfd_arch_arm,
314 FALSE,
315 autofilter_symbollist_generic
316 },
317 { NULL, NULL, 0, 0, 0, FALSE, NULL }
318 };
319
320 static const pe_details_type *pe_details;
321
322 /* Do not specify library suffix explicitly, to allow for dllized versions. */
323 static const autofilter_entry_type autofilter_liblist[] =
324 {
325 { STRING_COMMA_LEN ("libcegcc") },
326 { STRING_COMMA_LEN ("libcygwin") },
327 { STRING_COMMA_LEN ("libgcc") },
328 { STRING_COMMA_LEN ("libgcc_s") },
329 { STRING_COMMA_LEN ("libstdc++") },
330 { STRING_COMMA_LEN ("libmingw32") },
331 { STRING_COMMA_LEN ("libmingwex") },
332 { STRING_COMMA_LEN ("libg2c") },
333 { STRING_COMMA_LEN ("libsupc++") },
334 { STRING_COMMA_LEN ("libobjc") },
335 { STRING_COMMA_LEN ("libgcj") },
336 { NULL, 0 }
337 };
338
339 /* Regardless of the suffix issue mentioned above, we must ensure that
340 we do not falsely match on a leading substring, such as when libtool
341 builds libstdc++ as a DLL using libsupc++convenience.a as an intermediate.
342 This routine ensures that the leading part of the name matches and that
343 it is followed by only an optional version suffix and a file extension,
344 returning zero if so or -1 if not. */
345 static int libnamencmp (const char *libname, const autofilter_entry_type *afptr)
346 {
347 if (filename_ncmp (libname, afptr->name, afptr->len))
348 return -1;
349
350 libname += afptr->len;
351
352 /* Be liberal in interpreting what counts as a version suffix; we
353 accept anything that has a dash to separate it from the name and
354 begins with a digit. */
355 if (libname[0] == '-')
356 {
357 if (!ISDIGIT (*++libname))
358 return -1;
359 /* Ensure the filename has an extension. */
360 while (*++libname != '.')
361 if (!*libname)
362 return -1;
363 }
364 else if (libname[0] != '.')
365 return -1;
366
367 return 0;
368 }
369
370 static const autofilter_entry_type autofilter_objlist[] =
371 {
372 { STRING_COMMA_LEN ("crt0.o") },
373 { STRING_COMMA_LEN ("crt1.o") },
374 { STRING_COMMA_LEN ("crt2.o") },
375 { STRING_COMMA_LEN ("dllcrt1.o") },
376 { STRING_COMMA_LEN ("dllcrt2.o") },
377 { STRING_COMMA_LEN ("gcrt0.o") },
378 { STRING_COMMA_LEN ("gcrt1.o") },
379 { STRING_COMMA_LEN ("gcrt2.o") },
380 { STRING_COMMA_LEN ("crtbegin.o") },
381 { STRING_COMMA_LEN ("crtend.o") },
382 { NULL, 0 }
383 };
384
385 static const autofilter_entry_type autofilter_symbolprefixlist[] =
386 {
387 /* _imp_ is treated specially, as it is always underscored. */
388 /* { STRING_COMMA_LEN ("_imp_") }, */
389 /* Don't export some c++ symbols. */
390 { STRING_COMMA_LEN ("__rtti_") },
391 { STRING_COMMA_LEN ("__builtin_") },
392 /* Don't re-export auto-imported symbols. */
393 { STRING_COMMA_LEN ("__nm_") },
394 /* Don't export symbols specifying internal DLL layout. */
395 { STRING_COMMA_LEN ("_head_") },
396 { STRING_COMMA_LEN ("_IMPORT_DESCRIPTOR_") },
397 /* Don't export section labels or artificial symbols
398 (eg ".weak.foo". */
399 { STRING_COMMA_LEN (".") },
400 { NULL, 0 }
401 };
402
403 static const autofilter_entry_type autofilter_symbolsuffixlist[] =
404 {
405 { STRING_COMMA_LEN ("_iname") },
406 { STRING_COMMA_LEN ("_NULL_THUNK_DATA") },
407 { NULL, 0 }
408 };
409
410 #define U(str) (pe_details->underscored ? "_" str : str)
411
412 void
413 pe_dll_id_target (const char *target)
414 {
415 int i;
416
417 for (i = 0; pe_detail_list[i].target_name; i++)
418 if (strcmp (pe_detail_list[i].target_name, target) == 0
419 || strcmp (pe_detail_list[i].object_target, target) == 0)
420 {
421 int u = pe_leading_underscore; /* Underscoring mode. -1 for use default. */
422 if (u == -1)
423 bfd_get_target_info (target, NULL, NULL, &u, NULL);
424 if (u == -1)
425 abort ();
426 pe_detail_list[i].underscored = (u != 0 ? TRUE : FALSE);
427 pe_details = pe_detail_list + i;
428 pe_leading_underscore = (u != 0 ? 1 : 0);
429 return;
430 }
431 einfo (_("%XUnsupported PEI architecture: %s\n"), target);
432 exit (1);
433 }
434
435 /* Helper functions for qsort. Relocs must be sorted so that we can write
436 them out by pages. */
437
438 typedef struct
439 {
440 bfd_vma vma;
441 char type;
442 short extra;
443 }
444 reloc_data_type;
445
446 static int
447 reloc_sort (const void *va, const void *vb)
448 {
449 bfd_vma a = ((const reloc_data_type *) va)->vma;
450 bfd_vma b = ((const reloc_data_type *) vb)->vma;
451
452 return (a > b) ? 1 : ((a < b) ? -1 : 0);
453 }
454
455 static int
456 pe_export_sort (const void *va, const void *vb)
457 {
458 const def_file_export *a = va;
459 const def_file_export *b = vb;
460 char *an = a->name;
461 char *bn = b->name;
462 if (a->its_name)
463 an = a->its_name;
464 if (b->its_name)
465 bn = b->its_name;
466
467 return strcmp (an, bn);
468 }
469
470 /* Read and process the .DEF file. */
471
472 /* These correspond to the entries in pe_def_file->exports[]. I use
473 exported_symbol_sections[i] to tag whether or not the symbol was
474 defined, since we can't export symbols we don't have. */
475
476 static bfd_vma *exported_symbol_offsets;
477 static struct bfd_section **exported_symbol_sections;
478 static int export_table_size;
479 static int count_exported;
480 static int count_exported_byname;
481 static int count_with_ordinals;
482 static const char *dll_name;
483 static int min_ordinal, max_ordinal;
484 static int *exported_symbols;
485
486 typedef struct exclude_list_struct
487 {
488 char *string;
489 struct exclude_list_struct *next;
490 exclude_type type;
491 }
492 exclude_list_struct;
493
494 static struct exclude_list_struct *excludes = 0;
495
496 void
497 pe_dll_add_excludes (const char *new_excludes, const exclude_type type)
498 {
499 char *local_copy;
500 char *exclude_string;
501
502 local_copy = xstrdup (new_excludes);
503
504 exclude_string = strtok (local_copy, ",:");
505 for (; exclude_string; exclude_string = strtok (NULL, ",:"))
506 {
507 struct exclude_list_struct *new_exclude;
508
509 new_exclude = xmalloc (sizeof (struct exclude_list_struct));
510 new_exclude->string = xmalloc (strlen (exclude_string) + 1);
511 strcpy (new_exclude->string, exclude_string);
512 new_exclude->type = type;
513 new_exclude->next = excludes;
514 excludes = new_exclude;
515 }
516
517 free (local_copy);
518 }
519
520 static bfd_boolean
521 is_import (const char* n)
522 {
523 return (CONST_STRNEQ (n, "__imp_"));
524 }
525
526 /* abfd is a bfd containing n (or NULL)
527 It can be used for contextual checks. */
528
529 static int
530 auto_export (bfd *abfd, def_file *d, const char *n)
531 {
532 def_file_export key;
533 struct exclude_list_struct *ex;
534 const autofilter_entry_type *afptr;
535 const char * libname = NULL;
536
537 if (abfd && abfd->my_archive)
538 libname = lbasename (abfd->my_archive->filename);
539
540 key.name = key.its_name = (char *) n;
541
542 /* Return false if n is in the d->exports table. */
543 if (bsearch (&key, d->exports, d->num_exports,
544 sizeof (pe_def_file->exports[0]), pe_export_sort))
545 return 0;
546
547 if (pe_dll_do_default_excludes)
548 {
549 const char * p;
550 int len;
551
552 if (pe_dll_extra_pe_debug)
553 printf ("considering exporting: %s, abfd=%p, abfd->my_arc=%p\n",
554 n, abfd, abfd->my_archive);
555
556 /* First of all, make context checks:
557 Don't export anything from standard libs. */
558 if (libname)
559 {
560 afptr = autofilter_liblist;
561
562 while (afptr->name)
563 {
564 if (libnamencmp (libname, afptr) == 0 )
565 return 0;
566 afptr++;
567 }
568 }
569
570 /* Next, exclude symbols from certain startup objects. */
571
572 if (abfd && (p = lbasename (abfd->filename)))
573 {
574 afptr = autofilter_objlist;
575 while (afptr->name)
576 {
577 if (strcmp (p, afptr->name) == 0)
578 return 0;
579 afptr++;
580 }
581 }
582
583 /* Don't try to blindly exclude all symbols
584 that begin with '__'; this was tried and
585 it is too restrictive. Instead we have
586 a target specific list to use: */
587 afptr = pe_details->autofilter_symbollist;
588
589 while (afptr->name)
590 {
591 if (strcmp (n, afptr->name) == 0)
592 return 0;
593
594 afptr++;
595 }
596
597 /* Next, exclude symbols starting with ... */
598 afptr = autofilter_symbolprefixlist;
599 while (afptr->name)
600 {
601 if (strncmp (n, afptr->name, afptr->len) == 0)
602 return 0;
603
604 afptr++;
605 }
606
607 /* Finally, exclude symbols ending with ... */
608 len = strlen (n);
609 afptr = autofilter_symbolsuffixlist;
610 while (afptr->name)
611 {
612 if ((len >= afptr->len)
613 /* Add 1 to insure match with trailing '\0'. */
614 && strncmp (n + len - afptr->len, afptr->name,
615 afptr->len + 1) == 0)
616 return 0;
617
618 afptr++;
619 }
620 }
621
622 for (ex = excludes; ex; ex = ex->next)
623 {
624 if (ex->type == EXCLUDELIBS)
625 {
626 if (libname
627 && ((filename_cmp (libname, ex->string) == 0)
628 || (strcasecmp ("ALL", ex->string) == 0)))
629 return 0;
630 }
631 else if (ex->type == EXCLUDEFORIMPLIB)
632 {
633 if (filename_cmp (abfd->filename, ex->string) == 0)
634 return 0;
635 }
636 else if (strcmp (n, ex->string) == 0)
637 return 0;
638 }
639
640 return 1;
641 }
642
643 static void
644 process_def_file_and_drectve (bfd *abfd ATTRIBUTE_UNUSED, struct bfd_link_info *info)
645 {
646 int i, j;
647 struct bfd_link_hash_entry *blhe;
648 bfd *b;
649 struct bfd_section *s;
650 def_file_export *e = 0;
651 bfd_boolean resort_needed;
652
653 if (!pe_def_file)
654 pe_def_file = def_file_empty ();
655
656 /* First, run around to all the objects looking for the .drectve
657 sections, and push those into the def file too. */
658 for (b = info->input_bfds; b; b = b->link.next)
659 {
660 s = bfd_get_section_by_name (b, ".drectve");
661 if (s)
662 {
663 long size = s->size;
664 char *buf = xmalloc (size);
665
666 bfd_get_section_contents (b, s, buf, 0, size);
667 def_file_add_directive (pe_def_file, buf, size);
668 free (buf);
669 }
670 }
671
672 /* Process aligned common symbol information from the
673 .drectve sections now; common symbol allocation is
674 done before final link, so it will be too late to
675 process them in process_embedded_commands() called
676 from _bfd_coff_link_input_bfd(). */
677 if (pe_def_file->aligncomms)
678 {
679 def_file_aligncomm *ac = pe_def_file->aligncomms;
680 while (ac)
681 {
682 struct coff_link_hash_entry *sym_hash;
683 sym_hash = coff_link_hash_lookup (coff_hash_table (info),
684 ac->symbol_name, FALSE, FALSE, FALSE);
685 if (sym_hash && sym_hash->root.type == bfd_link_hash_common
686 && sym_hash->root.u.c.p->alignment_power < (unsigned) ac->alignment)
687 {
688 sym_hash->root.u.c.p->alignment_power = (unsigned) ac->alignment;
689 }
690 ac = ac->next;
691 }
692 }
693
694 /* If we are building an executable and there is nothing
695 to export, we do not build an export table at all. */
696 if (bfd_link_executable (info) && pe_def_file->num_exports == 0
697 && (!pe_dll_export_everything || pe_dll_exclude_all_symbols))
698 return;
699
700 /* Now, maybe export everything else the default way. */
701 if ((pe_dll_export_everything || pe_def_file->num_exports == 0)
702 && !pe_dll_exclude_all_symbols)
703 {
704 for (b = info->input_bfds; b; b = b->link.next)
705 {
706 asymbol **symbols;
707 int nsyms;
708
709 if (!bfd_generic_link_read_symbols (b))
710 {
711 einfo (_("%B%F: could not read symbols: %E\n"), b);
712 return;
713 }
714
715 symbols = bfd_get_outsymbols (b);
716 nsyms = bfd_get_symcount (b);
717
718 for (j = 0; j < nsyms; j++)
719 {
720 /* We should export symbols which are either global or not
721 anything at all. (.bss data is the latter)
722 We should not export undefined symbols. */
723 bfd_boolean would_export
724 = (symbols[j]->section != bfd_und_section_ptr
725 && ((symbols[j]->flags & BSF_GLOBAL)
726 || (symbols[j]->flags == 0)));
727 if (link_info.version_info && would_export)
728 would_export
729 = !bfd_hide_sym_by_version (link_info.version_info,
730 symbols[j]->name);
731 if (would_export)
732 {
733 const char *sn = symbols[j]->name;
734
735 /* We should not re-export imported stuff. */
736 {
737 char *name;
738 if (is_import (sn))
739 continue;
740
741 name = xmalloc (strlen ("__imp_") + strlen (sn) + 1);
742 sprintf (name, "%s%s", "__imp_", sn);
743
744 blhe = bfd_link_hash_lookup (info->hash, name,
745 FALSE, FALSE, FALSE);
746 free (name);
747
748 if (blhe && blhe->type == bfd_link_hash_defined)
749 continue;
750 }
751
752 if (pe_details->underscored && *sn == '_')
753 sn++;
754
755 if (auto_export (b, pe_def_file, sn))
756 {
757 int is_dup = 0;
758 def_file_export *p;
759
760 p = def_file_add_export (pe_def_file, sn, 0, -1,
761 NULL, &is_dup);
762 /* Fill data flag properly, from dlltool.c. */
763 if (!is_dup)
764 p->flag_data = !(symbols[j]->flags & BSF_FUNCTION);
765 }
766 }
767 }
768 }
769 }
770
771 #undef NE
772 #define NE pe_def_file->num_exports
773
774 /* Don't create an empty export table. */
775 if (NE == 0)
776 return;
777
778 resort_needed = FALSE;
779
780 /* Canonicalize the export list. */
781 if (pe_dll_kill_ats)
782 {
783 for (i = 0; i < NE; i++)
784 {
785 /* Check for fastcall/stdcall-decoration, but ignore
786 C++ mangled names. */
787 if (pe_def_file->exports[i].name[0] != '?'
788 && strchr (pe_def_file->exports[i].name, '@'))
789 {
790 /* This will preserve internal_name, which may have been
791 pointing to the same memory as name, or might not
792 have. */
793 int lead_at = (*pe_def_file->exports[i].name == '@');
794 char *tmp = xstrdup (pe_def_file->exports[i].name + lead_at);
795 char *tmp_at = strrchr (tmp, '@');
796
797 if (tmp_at)
798 *tmp_at = 0;
799 else
800 einfo (_("%XCannot export %s: invalid export name\n"),
801 pe_def_file->exports[i].name);
802 pe_def_file->exports[i].name = tmp;
803 resort_needed = TRUE;
804 }
805 }
806 }
807
808 /* Re-sort the exports table as we have possibly changed the order
809 by removing leading @. */
810 if (resort_needed)
811 qsort (pe_def_file->exports, NE, sizeof (pe_def_file->exports[0]),
812 pe_export_sort);
813
814 if (pe_dll_stdcall_aliases)
815 {
816 for (i = 0; i < NE; i++)
817 {
818 if (is_import (pe_def_file->exports[i].name))
819 continue;
820
821 if (strchr (pe_def_file->exports[i].name, '@'))
822 {
823 int is_dup = 1;
824 int lead_at = (*pe_def_file->exports[i].name == '@');
825 char *tmp = xstrdup (pe_def_file->exports[i].name + lead_at);
826
827 *(strchr (tmp, '@')) = 0;
828 if (auto_export (NULL, pe_def_file, tmp))
829 def_file_add_export (pe_def_file, tmp,
830 pe_def_file->exports[i].internal_name,
831 -1, NULL, &is_dup);
832 if (is_dup)
833 free (tmp);
834 }
835 }
836 }
837
838 /* Convenience, but watch out for it changing. */
839 e = pe_def_file->exports;
840
841 for (i = 0, j = 0; i < NE; i++)
842 {
843 if (i > 0 && strcmp (e[i].name, e[i - 1].name) == 0)
844 {
845 /* This is a duplicate. */
846 if (e[j - 1].ordinal != -1
847 && e[i].ordinal != -1
848 && e[j - 1].ordinal != e[i].ordinal)
849 {
850 if (pe_dll_warn_dup_exports)
851 /* xgettext:c-format */
852 einfo (_("%XError, duplicate EXPORT with ordinals: %s (%d vs %d)\n"),
853 e[j - 1].name, e[j - 1].ordinal, e[i].ordinal);
854 }
855 else
856 {
857 if (pe_dll_warn_dup_exports)
858 /* xgettext:c-format */
859 einfo (_("Warning, duplicate EXPORT: %s\n"),
860 e[j - 1].name);
861 }
862
863 if (e[i].ordinal != -1)
864 e[j - 1].ordinal = e[i].ordinal;
865 e[j - 1].flag_private |= e[i].flag_private;
866 e[j - 1].flag_constant |= e[i].flag_constant;
867 e[j - 1].flag_noname |= e[i].flag_noname;
868 e[j - 1].flag_data |= e[i].flag_data;
869 if (e[i].name)
870 free (e[i].name);
871 if (e[i].internal_name)
872 free (e[i].internal_name);
873 if (e[i].its_name)
874 free (e[i].its_name);
875 }
876 else
877 {
878 if (i != j)
879 e[j] = e[i];
880 j++;
881 }
882 }
883 pe_def_file->num_exports = j; /* == NE */
884
885 exported_symbol_offsets = xmalloc (NE * sizeof (bfd_vma));
886 exported_symbol_sections = xmalloc (NE * sizeof (struct bfd_section *));
887
888 memset (exported_symbol_sections, 0, NE * sizeof (struct bfd_section *));
889 max_ordinal = 0;
890 min_ordinal = 65536;
891 count_exported = 0;
892 count_exported_byname = 0;
893 count_with_ordinals = 0;
894
895 for (i = 0; i < NE; i++)
896 {
897 char *name;
898
899 name = xmalloc (strlen (pe_def_file->exports[i].internal_name) + 2);
900 if (pe_details->underscored
901 && (*pe_def_file->exports[i].internal_name != '@'))
902 {
903 *name = '_';
904 strcpy (name + 1, pe_def_file->exports[i].internal_name);
905 }
906 else
907 strcpy (name, pe_def_file->exports[i].internal_name);
908
909 blhe = bfd_link_hash_lookup (info->hash,
910 name,
911 FALSE, FALSE, TRUE);
912
913 if (blhe
914 && (blhe->type == bfd_link_hash_defined
915 || (blhe->type == bfd_link_hash_common)))
916 {
917 count_exported++;
918 if (!pe_def_file->exports[i].flag_noname)
919 count_exported_byname++;
920
921 /* Only fill in the sections. The actual offsets are computed
922 in fill_exported_offsets() after common symbols are laid
923 out. */
924 if (blhe->type == bfd_link_hash_defined)
925 exported_symbol_sections[i] = blhe->u.def.section;
926 else
927 exported_symbol_sections[i] = blhe->u.c.p->section;
928
929 if (pe_def_file->exports[i].ordinal != -1)
930 {
931 if (max_ordinal < pe_def_file->exports[i].ordinal)
932 max_ordinal = pe_def_file->exports[i].ordinal;
933 if (min_ordinal > pe_def_file->exports[i].ordinal)
934 min_ordinal = pe_def_file->exports[i].ordinal;
935 count_with_ordinals++;
936 }
937 }
938 /* Check for forward exports. These are indicated in DEF files by an
939 export directive of the form NAME1 = MODULE-NAME.EXTERNAL-NAME
940 but we must take care not to be fooled when the user wants to export
941 a symbol that actually really has a dot in it, so we only check
942 for them here, after real defined symbols have already been matched. */
943 else if (strchr (pe_def_file->exports[i].internal_name, '.'))
944 {
945 count_exported++;
946 if (!pe_def_file->exports[i].flag_noname)
947 count_exported_byname++;
948
949 pe_def_file->exports[i].flag_forward = 1;
950
951 if (pe_def_file->exports[i].ordinal != -1)
952 {
953 if (max_ordinal < pe_def_file->exports[i].ordinal)
954 max_ordinal = pe_def_file->exports[i].ordinal;
955 if (min_ordinal > pe_def_file->exports[i].ordinal)
956 min_ordinal = pe_def_file->exports[i].ordinal;
957 count_with_ordinals++;
958 }
959 }
960 else if (blhe && blhe->type == bfd_link_hash_undefined)
961 {
962 /* xgettext:c-format */
963 einfo (_("%XCannot export %s: symbol not defined\n"),
964 pe_def_file->exports[i].internal_name);
965 }
966 else if (blhe)
967 {
968 /* xgettext:c-format */
969 einfo (_("%XCannot export %s: symbol wrong type (%d vs %d)\n"),
970 pe_def_file->exports[i].internal_name,
971 blhe->type, bfd_link_hash_defined);
972 }
973 else
974 {
975 /* xgettext:c-format */
976 einfo (_("%XCannot export %s: symbol not found\n"),
977 pe_def_file->exports[i].internal_name);
978 }
979 free (name);
980 }
981 }
982
983 /* Build the bfd that will contain .edata and .reloc sections. */
984
985 static void
986 build_filler_bfd (int include_edata)
987 {
988 lang_input_statement_type *filler_file;
989 filler_file = lang_add_input_file ("dll stuff",
990 lang_input_file_is_fake_enum,
991 NULL);
992 filler_file->the_bfd = filler_bfd = bfd_create ("dll stuff",
993 link_info.output_bfd);
994 if (filler_bfd == NULL
995 || !bfd_set_arch_mach (filler_bfd,
996 bfd_get_arch (link_info.output_bfd),
997 bfd_get_mach (link_info.output_bfd)))
998 {
999 einfo ("%X%P: can not create BFD: %E\n");
1000 return;
1001 }
1002
1003 if (include_edata)
1004 {
1005 edata_s = bfd_make_section_old_way (filler_bfd, ".edata");
1006 if (edata_s == NULL
1007 || !bfd_set_section_flags (filler_bfd, edata_s,
1008 (SEC_HAS_CONTENTS
1009 | SEC_ALLOC
1010 | SEC_LOAD
1011 | SEC_KEEP
1012 | SEC_IN_MEMORY)))
1013 {
1014 einfo ("%X%P: can not create .edata section: %E\n");
1015 return;
1016 }
1017 bfd_set_section_size (filler_bfd, edata_s, edata_sz);
1018 }
1019
1020 reloc_s = bfd_make_section_old_way (filler_bfd, ".reloc");
1021 if (reloc_s == NULL
1022 || !bfd_set_section_flags (filler_bfd, reloc_s,
1023 (SEC_HAS_CONTENTS
1024 | SEC_ALLOC
1025 | SEC_LOAD
1026 | SEC_KEEP
1027 | SEC_IN_MEMORY)))
1028 {
1029 einfo ("%X%P: can not create .reloc section: %E\n");
1030 return;
1031 }
1032
1033 bfd_set_section_size (filler_bfd, reloc_s, 0);
1034
1035 ldlang_add_file (filler_file);
1036 }
1037
1038 /* Gather all the exported symbols and build the .edata section. */
1039
1040 static void
1041 generate_edata (bfd *abfd, struct bfd_link_info *info ATTRIBUTE_UNUSED)
1042 {
1043 int i, next_ordinal;
1044 int name_table_size = 0;
1045 const char *dlnp;
1046
1047 /* First, we need to know how many exported symbols there are,
1048 and what the range of ordinals is. */
1049 if (pe_def_file->name)
1050 dll_name = pe_def_file->name;
1051 else
1052 {
1053 dll_name = abfd->filename;
1054
1055 for (dlnp = dll_name; *dlnp; dlnp++)
1056 if (*dlnp == '\\' || *dlnp == '/' || *dlnp == ':')
1057 dll_name = dlnp + 1;
1058 }
1059
1060 if (count_with_ordinals && max_ordinal > count_exported)
1061 {
1062 if (min_ordinal > max_ordinal - count_exported + 1)
1063 min_ordinal = max_ordinal - count_exported + 1;
1064 }
1065 else
1066 {
1067 min_ordinal = 1;
1068 max_ordinal = count_exported;
1069 }
1070
1071 export_table_size = max_ordinal - min_ordinal + 1;
1072 exported_symbols = xmalloc (export_table_size * sizeof (int));
1073 for (i = 0; i < export_table_size; i++)
1074 exported_symbols[i] = -1;
1075
1076 /* Now we need to assign ordinals to those that don't have them. */
1077 for (i = 0; i < NE; i++)
1078 {
1079 if (exported_symbol_sections[i] ||
1080 pe_def_file->exports[i].flag_forward)
1081 {
1082 if (pe_def_file->exports[i].ordinal != -1)
1083 {
1084 int ei = pe_def_file->exports[i].ordinal - min_ordinal;
1085 int pi = exported_symbols[ei];
1086
1087 if (pi != -1)
1088 {
1089 /* xgettext:c-format */
1090 einfo (_("%XError, ordinal used twice: %d (%s vs %s)\n"),
1091 pe_def_file->exports[i].ordinal,
1092 pe_def_file->exports[i].name,
1093 pe_def_file->exports[pi].name);
1094 }
1095 exported_symbols[ei] = i;
1096 }
1097 if (pe_def_file->exports[i].its_name)
1098 name_table_size += strlen (pe_def_file->exports[i].its_name) + 1;
1099 else
1100 name_table_size += strlen (pe_def_file->exports[i].name) + 1;
1101 }
1102
1103 /* Reserve space for the forward name. */
1104 if (pe_def_file->exports[i].flag_forward)
1105 {
1106 name_table_size += strlen (pe_def_file->exports[i].internal_name) + 1;
1107 }
1108 }
1109
1110 next_ordinal = min_ordinal;
1111 for (i = 0; i < NE; i++)
1112 if ((exported_symbol_sections[i] ||
1113 pe_def_file->exports[i].flag_forward) &&
1114 pe_def_file->exports[i].ordinal == -1)
1115 {
1116 while (exported_symbols[next_ordinal - min_ordinal] != -1)
1117 next_ordinal++;
1118
1119 exported_symbols[next_ordinal - min_ordinal] = i;
1120 pe_def_file->exports[i].ordinal = next_ordinal;
1121 }
1122
1123 /* OK, now we can allocate some memory. */
1124 edata_sz = (40 /* directory */
1125 + 4 * export_table_size /* addresses */
1126 + 4 * count_exported_byname /* name ptrs */
1127 + 2 * count_exported_byname /* ordinals */
1128 + name_table_size + strlen (dll_name) + 1);
1129 }
1130
1131 /* Fill the exported symbol offsets. The preliminary work has already
1132 been done in process_def_file_and_drectve(). */
1133
1134 static void
1135 fill_exported_offsets (bfd *abfd ATTRIBUTE_UNUSED, struct bfd_link_info *info)
1136 {
1137 int i;
1138 struct bfd_link_hash_entry *blhe;
1139
1140 for (i = 0; i < pe_def_file->num_exports; i++)
1141 {
1142 char *name;
1143
1144 name = xmalloc (strlen (pe_def_file->exports[i].internal_name) + 2);
1145 if (pe_details->underscored
1146 && *pe_def_file->exports[i].internal_name != '@')
1147 {
1148 *name = '_';
1149 strcpy (name + 1, pe_def_file->exports[i].internal_name);
1150 }
1151 else
1152 strcpy (name, pe_def_file->exports[i].internal_name);
1153
1154 blhe = bfd_link_hash_lookup (info->hash,
1155 name,
1156 FALSE, FALSE, TRUE);
1157
1158 if (blhe && blhe->type == bfd_link_hash_defined)
1159 exported_symbol_offsets[i] = blhe->u.def.value;
1160
1161 free (name);
1162 }
1163 }
1164
1165 static void
1166 fill_edata (bfd *abfd, struct bfd_link_info *info ATTRIBUTE_UNUSED)
1167 {
1168 int s, hint;
1169 unsigned char *edirectory;
1170 unsigned char *eaddresses;
1171 unsigned char *enameptrs;
1172 unsigned char *eordinals;
1173 char *enamestr;
1174
1175 edata_d = xmalloc (edata_sz);
1176
1177 /* Note use of array pointer math here. */
1178 edirectory = edata_d;
1179 eaddresses = edirectory + 40;
1180 enameptrs = eaddresses + 4 * export_table_size;
1181 eordinals = enameptrs + 4 * count_exported_byname;
1182 enamestr = (char *) eordinals + 2 * count_exported_byname;
1183
1184 #define ERVA(ptr) (((unsigned char *)(ptr) - edata_d) \
1185 + edata_s->output_section->vma - image_base)
1186
1187 memset (edata_d, 0, edata_sz);
1188
1189 if (pe_data (abfd)->insert_timestamp)
1190 H_PUT_32 (abfd, time (0), edata_d + 4);
1191
1192 if (pe_def_file->version_major != -1)
1193 {
1194 bfd_put_16 (abfd, pe_def_file->version_major, edata_d + 8);
1195 bfd_put_16 (abfd, pe_def_file->version_minor, edata_d + 10);
1196 }
1197
1198 bfd_put_32 (abfd, ERVA (enamestr), edata_d + 12);
1199 strcpy (enamestr, dll_name);
1200 enamestr += strlen (enamestr) + 1;
1201 bfd_put_32 (abfd, min_ordinal, edata_d + 16);
1202 bfd_put_32 (abfd, export_table_size, edata_d + 20);
1203 bfd_put_32 (abfd, count_exported_byname, edata_d + 24);
1204 bfd_put_32 (abfd, ERVA (eaddresses), edata_d + 28);
1205 bfd_put_32 (abfd, ERVA (enameptrs), edata_d + 32);
1206 bfd_put_32 (abfd, ERVA (eordinals), edata_d + 36);
1207
1208 fill_exported_offsets (abfd, info);
1209
1210 /* Ok, now for the filling in part.
1211 Scan alphabetically - ie the ordering in the exports[] table,
1212 rather than by ordinal - the ordering in the exported_symbol[]
1213 table. See dlltool.c and:
1214 http://sources.redhat.com/ml/binutils/2003-04/msg00379.html
1215 for more information. */
1216 hint = 0;
1217 for (s = 0; s < NE; s++)
1218 {
1219 struct bfd_section *ssec = exported_symbol_sections[s];
1220 if (pe_def_file->exports[s].ordinal != -1 &&
1221 (pe_def_file->exports[s].flag_forward || ssec != NULL))
1222 {
1223 int ord = pe_def_file->exports[s].ordinal;
1224
1225 if (pe_def_file->exports[s].flag_forward)
1226 {
1227 bfd_put_32 (abfd, ERVA (enamestr),
1228 eaddresses + 4 * (ord - min_ordinal));
1229
1230 strcpy (enamestr, pe_def_file->exports[s].internal_name);
1231 enamestr += strlen (pe_def_file->exports[s].internal_name) + 1;
1232 }
1233 else
1234 {
1235 bfd_vma srva = (exported_symbol_offsets[s]
1236 + ssec->output_section->vma
1237 + ssec->output_offset);
1238
1239 bfd_put_32 (abfd, srva - image_base,
1240 eaddresses + 4 * (ord - min_ordinal));
1241 }
1242
1243 if (!pe_def_file->exports[s].flag_noname)
1244 {
1245 char *ename = pe_def_file->exports[s].name;
1246 if (pe_def_file->exports[s].its_name)
1247 ename = pe_def_file->exports[s].its_name;
1248
1249 bfd_put_32 (abfd, ERVA (enamestr), enameptrs);
1250 enameptrs += 4;
1251 strcpy (enamestr, ename);
1252 enamestr += strlen (enamestr) + 1;
1253 bfd_put_16 (abfd, ord - min_ordinal, eordinals);
1254 eordinals += 2;
1255 pe_def_file->exports[s].hint = hint++;
1256 }
1257 }
1258 }
1259 }
1260
1261
1262 static struct bfd_section *current_sec;
1263
1264 void
1265 pe_walk_relocs_of_symbol (struct bfd_link_info *info,
1266 const char *name,
1267 int (*cb) (arelent *, asection *))
1268 {
1269 bfd *b;
1270 asection *s;
1271
1272 for (b = info->input_bfds; b; b = b->link.next)
1273 {
1274 asymbol **symbols;
1275
1276 if (!bfd_generic_link_read_symbols (b))
1277 {
1278 einfo (_("%B%F: could not read symbols: %E\n"), b);
1279 return;
1280 }
1281
1282 symbols = bfd_get_outsymbols (b);
1283
1284 for (s = b->sections; s; s = s->next)
1285 {
1286 arelent **relocs;
1287 int relsize, nrelocs, i;
1288 int flags = bfd_get_section_flags (b, s);
1289
1290 /* Skip discarded linkonce sections. */
1291 if (flags & SEC_LINK_ONCE
1292 && s->output_section == bfd_abs_section_ptr)
1293 continue;
1294
1295 current_sec = s;
1296
1297 relsize = bfd_get_reloc_upper_bound (b, s);
1298 relocs = xmalloc (relsize);
1299 nrelocs = bfd_canonicalize_reloc (b, s, relocs, symbols);
1300
1301 for (i = 0; i < nrelocs; i++)
1302 {
1303 struct bfd_symbol *sym = *relocs[i]->sym_ptr_ptr;
1304
1305 if (!strcmp (name, sym->name))
1306 cb (relocs[i], s);
1307 }
1308
1309 free (relocs);
1310
1311 /* Warning: the allocated symbols are remembered in BFD and reused
1312 later, so don't free them! */
1313 /* free (symbols); */
1314 }
1315 }
1316 }
1317
1318 /* Gather all the relocations and build the .reloc section. */
1319
1320 static void
1321 generate_reloc (bfd *abfd, struct bfd_link_info *info)
1322 {
1323
1324 /* For .reloc stuff. */
1325 reloc_data_type *reloc_data;
1326 int total_relocs = 0;
1327 int i;
1328 bfd_vma sec_page = (bfd_vma) -1;
1329 bfd_vma page_ptr, page_count;
1330 int bi;
1331 bfd *b;
1332 struct bfd_section *s;
1333
1334 total_relocs = 0;
1335 for (b = info->input_bfds; b; b = b->link.next)
1336 for (s = b->sections; s; s = s->next)
1337 total_relocs += s->reloc_count;
1338
1339 reloc_data = xmalloc (total_relocs * sizeof (reloc_data_type));
1340
1341 total_relocs = 0;
1342 bi = 0;
1343 for (bi = 0, b = info->input_bfds; b; bi++, b = b->link.next)
1344 {
1345 arelent **relocs;
1346 int relsize, nrelocs;
1347
1348 for (s = b->sections; s; s = s->next)
1349 {
1350 bfd_vma sec_vma = s->output_section->vma + s->output_offset;
1351 asymbol **symbols;
1352
1353 /* If it's not loaded, we don't need to relocate it this way. */
1354 if (!(s->output_section->flags & SEC_LOAD))
1355 continue;
1356
1357 /* I don't know why there would be a reloc for these, but I've
1358 seen it happen - DJ */
1359 if (s->output_section == bfd_abs_section_ptr)
1360 continue;
1361
1362 if (s->output_section->vma == 0)
1363 {
1364 /* Huh? Shouldn't happen, but punt if it does. */
1365 einfo ("DJ: zero vma section reloc detected: `%s' #%d f=%d\n",
1366 s->output_section->name, s->output_section->index,
1367 s->output_section->flags);
1368 continue;
1369 }
1370
1371 if (!bfd_generic_link_read_symbols (b))
1372 {
1373 einfo (_("%B%F: could not read symbols: %E\n"), b);
1374 return;
1375 }
1376
1377 symbols = bfd_get_outsymbols (b);
1378 relsize = bfd_get_reloc_upper_bound (b, s);
1379 relocs = xmalloc (relsize);
1380 nrelocs = bfd_canonicalize_reloc (b, s, relocs, symbols);
1381
1382 for (i = 0; i < nrelocs; i++)
1383 {
1384 if (pe_dll_extra_pe_debug)
1385 {
1386 struct bfd_symbol *sym = *relocs[i]->sym_ptr_ptr;
1387 printf ("rel: %s\n", sym->name);
1388 }
1389 if (!relocs[i]->howto->pc_relative
1390 && relocs[i]->howto->type != pe_details->imagebase_reloc)
1391 {
1392 struct bfd_symbol *sym = *relocs[i]->sym_ptr_ptr;
1393
1394 /* Don't create relocs for undefined weak symbols. */
1395 if (sym->flags == BSF_WEAK)
1396 {
1397 struct bfd_link_hash_entry *blhe
1398 = bfd_wrapped_link_hash_lookup (abfd, info, sym->name,
1399 FALSE, FALSE, FALSE);
1400 if (blhe && blhe->type == bfd_link_hash_undefweak)
1401 {
1402 /* Check aux sym and see if it is defined or not. */
1403 struct coff_link_hash_entry *h, *h2;
1404 h = (struct coff_link_hash_entry *)blhe;
1405 if (h->symbol_class != C_NT_WEAK || h->numaux != 1)
1406 continue;
1407 h2 = h->auxbfd->tdata.coff_obj_data->sym_hashes
1408 [h->aux->x_sym.x_tagndx.l];
1409 /* We don't want a base reloc if the aux sym is not
1410 found, undefined, or if it is the constant ABS
1411 zero default value. (We broaden that slightly by
1412 not testing the value, just the section; there's
1413 no reason we'd want a reference to any absolute
1414 address to get relocated during rebasing). */
1415 if (!h2 || h2->root.type == bfd_link_hash_undefined
1416 || h2->root.u.def.section == bfd_abs_section_ptr)
1417 continue;
1418 }
1419 else if (!blhe || blhe->type != bfd_link_hash_defined)
1420 continue;
1421 }
1422 /* Nor for Dwarf FDE references to discarded sections. */
1423 else if (bfd_is_abs_section (sym->section->output_section))
1424 {
1425 /* We only ignore relocs from .eh_frame sections, as
1426 they are discarded by the final link rather than
1427 resolved against the kept section. */
1428 if (!strcmp (s->name, ".eh_frame"))
1429 continue;
1430 }
1431
1432 reloc_data[total_relocs].vma = sec_vma + relocs[i]->address;
1433
1434 #define BITS_AND_SHIFT(bits, shift) (bits * 1000 | shift)
1435
1436 switch BITS_AND_SHIFT (relocs[i]->howto->bitsize,
1437 relocs[i]->howto->rightshift)
1438 {
1439 #ifdef pe_use_x86_64
1440 case BITS_AND_SHIFT (64, 0):
1441 reloc_data[total_relocs].type = 10;
1442 total_relocs++;
1443 break;
1444 #endif
1445 case BITS_AND_SHIFT (32, 0):
1446 reloc_data[total_relocs].type = 3;
1447 total_relocs++;
1448 break;
1449 case BITS_AND_SHIFT (16, 0):
1450 reloc_data[total_relocs].type = 2;
1451 total_relocs++;
1452 break;
1453 case BITS_AND_SHIFT (16, 16):
1454 reloc_data[total_relocs].type = 4;
1455 /* FIXME: we can't know the symbol's right value
1456 yet, but we probably can safely assume that
1457 CE will relocate us in 64k blocks, so leaving
1458 it zero is safe. */
1459 reloc_data[total_relocs].extra = 0;
1460 total_relocs++;
1461 break;
1462 case BITS_AND_SHIFT (26, 2):
1463 reloc_data[total_relocs].type = 5;
1464 total_relocs++;
1465 break;
1466 case BITS_AND_SHIFT (24, 2):
1467 /* FIXME: 0 is ARM_26D, it is defined in bfd/coff-arm.c
1468 Those ARM_xxx definitions should go in proper
1469 header someday. */
1470 if (relocs[i]->howto->type == 0
1471 /* Older GNU linkers used 5 instead of 0 for this reloc. */
1472 || relocs[i]->howto->type == 5)
1473 /* This is an ARM_26D reloc, which is an ARM_26 reloc
1474 that has already been fully processed during a
1475 previous link stage, so ignore it here. */
1476 break;
1477 /* Fall through. */
1478 default:
1479 /* xgettext:c-format */
1480 einfo (_("%XError: %d-bit reloc in dll\n"),
1481 relocs[i]->howto->bitsize);
1482 break;
1483 }
1484 }
1485 }
1486 free (relocs);
1487 /* Warning: the allocated symbols are remembered in BFD and
1488 reused later, so don't free them! */
1489 }
1490 }
1491
1492 /* At this point, we have total_relocs relocation addresses in
1493 reloc_addresses, which are all suitable for the .reloc section.
1494 We must now create the new sections. */
1495 qsort (reloc_data, total_relocs, sizeof (*reloc_data), reloc_sort);
1496
1497 for (i = 0; i < total_relocs; i++)
1498 {
1499 bfd_vma this_page = (reloc_data[i].vma >> 12);
1500
1501 if (this_page != sec_page)
1502 {
1503 reloc_sz = (reloc_sz + 3) & ~3; /* 4-byte align. */
1504 reloc_sz += 8;
1505 sec_page = this_page;
1506 }
1507
1508 reloc_sz += 2;
1509
1510 if (reloc_data[i].type == 4)
1511 reloc_sz += 2;
1512 }
1513
1514 reloc_sz = (reloc_sz + 3) & ~3; /* 4-byte align. */
1515 reloc_d = xmalloc (reloc_sz);
1516 sec_page = (bfd_vma) -1;
1517 reloc_sz = 0;
1518 page_ptr = (bfd_vma) -1;
1519 page_count = 0;
1520
1521 for (i = 0; i < total_relocs; i++)
1522 {
1523 bfd_vma rva = reloc_data[i].vma - image_base;
1524 bfd_vma this_page = (rva & ~0xfff);
1525
1526 if (this_page != sec_page)
1527 {
1528 while (reloc_sz & 3)
1529 reloc_d[reloc_sz++] = 0;
1530
1531 if (page_ptr != (bfd_vma) -1)
1532 bfd_put_32 (abfd, reloc_sz - page_ptr, reloc_d + page_ptr + 4);
1533
1534 bfd_put_32 (abfd, this_page, reloc_d + reloc_sz);
1535 page_ptr = reloc_sz;
1536 reloc_sz += 8;
1537 sec_page = this_page;
1538 page_count = 0;
1539 }
1540
1541 bfd_put_16 (abfd, (rva & 0xfff) + (reloc_data[i].type << 12),
1542 reloc_d + reloc_sz);
1543 reloc_sz += 2;
1544
1545 if (reloc_data[i].type == 4)
1546 {
1547 bfd_put_16 (abfd, reloc_data[i].extra, reloc_d + reloc_sz);
1548 reloc_sz += 2;
1549 }
1550
1551 page_count++;
1552 }
1553
1554 while (reloc_sz & 3)
1555 reloc_d[reloc_sz++] = 0;
1556
1557 if (page_ptr != (bfd_vma) -1)
1558 bfd_put_32 (abfd, reloc_sz - page_ptr, reloc_d + page_ptr + 4);
1559
1560 while (reloc_sz < reloc_s->size)
1561 reloc_d[reloc_sz++] = 0;
1562 }
1563
1564 /* Given the exiting def_file structure, print out a .DEF file that
1565 corresponds to it. */
1566
1567 static void
1568 quoteput (char *s, FILE *f, int needs_quotes)
1569 {
1570 char *cp;
1571
1572 for (cp = s; *cp; cp++)
1573 if (*cp == '\''
1574 || *cp == '"'
1575 || *cp == '\\'
1576 || ISSPACE (*cp)
1577 || *cp == ','
1578 || *cp == ';')
1579 needs_quotes = 1;
1580
1581 if (needs_quotes)
1582 {
1583 putc ('"', f);
1584
1585 while (*s)
1586 {
1587 if (*s == '"' || *s == '\\')
1588 putc ('\\', f);
1589
1590 putc (*s, f);
1591 s++;
1592 }
1593
1594 putc ('"', f);
1595 }
1596 else
1597 fputs (s, f);
1598 }
1599
1600 void
1601 pe_dll_generate_def_file (const char *pe_out_def_filename)
1602 {
1603 int i;
1604 FILE *out = fopen (pe_out_def_filename, "w");
1605
1606 if (out == NULL)
1607 /* xgettext:c-format */
1608 einfo (_("%s: Can't open output def file %s\n"),
1609 program_name, pe_out_def_filename);
1610
1611 if (pe_def_file)
1612 {
1613 if (pe_def_file->name)
1614 {
1615 if (pe_def_file->is_dll)
1616 fprintf (out, "LIBRARY ");
1617 else
1618 fprintf (out, "NAME ");
1619
1620 quoteput (pe_def_file->name, out, 1);
1621
1622 if (pe_data (link_info.output_bfd)->pe_opthdr.ImageBase)
1623 {
1624 fprintf (out, " BASE=0x");
1625 fprintf_vma (out, ((bfd_vma) pe_data (link_info.output_bfd)->pe_opthdr.ImageBase));
1626 }
1627 fprintf (out, "\n");
1628 }
1629
1630 if (pe_def_file->description)
1631 {
1632 fprintf (out, "DESCRIPTION ");
1633 quoteput (pe_def_file->description, out, 1);
1634 fprintf (out, "\n");
1635 }
1636
1637 if (pe_def_file->version_minor != -1)
1638 fprintf (out, "VERSION %d.%d\n", pe_def_file->version_major,
1639 pe_def_file->version_minor);
1640 else if (pe_def_file->version_major != -1)
1641 fprintf (out, "VERSION %d\n", pe_def_file->version_major);
1642
1643 if (pe_def_file->stack_reserve != -1 || pe_def_file->heap_reserve != -1)
1644 fprintf (out, "\n");
1645
1646 if (pe_def_file->stack_commit != -1)
1647 fprintf (out, "STACKSIZE 0x%x,0x%x\n",
1648 pe_def_file->stack_reserve, pe_def_file->stack_commit);
1649 else if (pe_def_file->stack_reserve != -1)
1650 fprintf (out, "STACKSIZE 0x%x\n", pe_def_file->stack_reserve);
1651
1652 if (pe_def_file->heap_commit != -1)
1653 fprintf (out, "HEAPSIZE 0x%x,0x%x\n",
1654 pe_def_file->heap_reserve, pe_def_file->heap_commit);
1655 else if (pe_def_file->heap_reserve != -1)
1656 fprintf (out, "HEAPSIZE 0x%x\n", pe_def_file->heap_reserve);
1657
1658 if (pe_def_file->num_section_defs > 0)
1659 {
1660 fprintf (out, "\nSECTIONS\n\n");
1661
1662 for (i = 0; i < pe_def_file->num_section_defs; i++)
1663 {
1664 fprintf (out, " ");
1665 quoteput (pe_def_file->section_defs[i].name, out, 0);
1666
1667 if (pe_def_file->section_defs[i].class)
1668 {
1669 fprintf (out, " CLASS ");
1670 quoteput (pe_def_file->section_defs[i].class, out, 0);
1671 }
1672
1673 if (pe_def_file->section_defs[i].flag_read)
1674 fprintf (out, " READ");
1675
1676 if (pe_def_file->section_defs[i].flag_write)
1677 fprintf (out, " WRITE");
1678
1679 if (pe_def_file->section_defs[i].flag_execute)
1680 fprintf (out, " EXECUTE");
1681
1682 if (pe_def_file->section_defs[i].flag_shared)
1683 fprintf (out, " SHARED");
1684
1685 fprintf (out, "\n");
1686 }
1687 }
1688
1689 if (pe_def_file->num_exports > 0)
1690 {
1691 fprintf (out, "EXPORTS\n");
1692
1693 for (i = 0; i < pe_def_file->num_exports; i++)
1694 {
1695 def_file_export *e = pe_def_file->exports + i;
1696 fprintf (out, " ");
1697 quoteput (e->name, out, 0);
1698
1699 if (e->internal_name && strcmp (e->internal_name, e->name))
1700 {
1701 fprintf (out, " = ");
1702 quoteput (e->internal_name, out, 0);
1703 }
1704
1705 if (e->ordinal != -1)
1706 fprintf (out, " @%d", e->ordinal);
1707
1708 if (e->flag_private)
1709 fprintf (out, " PRIVATE");
1710
1711 if (e->flag_constant)
1712 fprintf (out, " CONSTANT");
1713
1714 if (e->flag_noname)
1715 fprintf (out, " NONAME");
1716
1717 if (e->flag_data)
1718 fprintf (out, " DATA");
1719
1720 fprintf (out, "\n");
1721 }
1722 }
1723
1724 if (pe_def_file->num_imports > 0)
1725 {
1726 fprintf (out, "\nIMPORTS\n\n");
1727
1728 for (i = 0; i < pe_def_file->num_imports; i++)
1729 {
1730 def_file_import *im = pe_def_file->imports + i;
1731 fprintf (out, " ");
1732
1733 if (im->internal_name
1734 && (!im->name || strcmp (im->internal_name, im->name)))
1735 {
1736 quoteput (im->internal_name, out, 0);
1737 fprintf (out, " = ");
1738 }
1739
1740 quoteput (im->module->name, out, 0);
1741 fprintf (out, ".");
1742
1743 if (im->name)
1744 quoteput (im->name, out, 0);
1745 else
1746 fprintf (out, "%d", im->ordinal);
1747
1748 if (im->its_name)
1749 {
1750 fprintf (out, " == ");
1751 quoteput (im->its_name, out, 0);
1752 }
1753
1754 fprintf (out, "\n");
1755 }
1756 }
1757 }
1758 else
1759 fprintf (out, _("; no contents available\n"));
1760
1761 if (fclose (out) == EOF)
1762 /* xgettext:c-format */
1763 einfo (_("%P: Error closing file `%s'\n"), pe_out_def_filename);
1764 }
1765
1766 /* Generate the import library. */
1767
1768 static asymbol **symtab;
1769 static int symptr;
1770 static int tmp_seq;
1771 static int tmp_seq2;
1772 static const char *dll_filename;
1773 static char *dll_symname;
1774
1775 #define UNDSEC bfd_und_section_ptr
1776
1777 static asection *
1778 quick_section (bfd *abfd, const char *name, int flags, int align)
1779 {
1780 asection *sec;
1781 asymbol *sym;
1782
1783 sec = bfd_make_section_old_way (abfd, name);
1784 bfd_set_section_flags (abfd, sec, flags | SEC_ALLOC | SEC_LOAD | SEC_KEEP);
1785 bfd_set_section_alignment (abfd, sec, align);
1786 /* Remember to undo this before trying to link internally! */
1787 sec->output_section = sec;
1788
1789 sym = bfd_make_empty_symbol (abfd);
1790 symtab[symptr++] = sym;
1791 sym->name = sec->name;
1792 sym->section = sec;
1793 sym->flags = BSF_LOCAL;
1794 sym->value = 0;
1795
1796 return sec;
1797 }
1798
1799 static void
1800 quick_symbol (bfd *abfd,
1801 const char *n1,
1802 const char *n2,
1803 const char *n3,
1804 asection *sec,
1805 int flags,
1806 int addr)
1807 {
1808 asymbol *sym;
1809 char *name = xmalloc (strlen (n1) + strlen (n2) + strlen (n3) + 1);
1810
1811 strcpy (name, n1);
1812 strcat (name, n2);
1813 strcat (name, n3);
1814 sym = bfd_make_empty_symbol (abfd);
1815 sym->name = name;
1816 sym->section = sec;
1817 sym->flags = flags;
1818 sym->value = addr;
1819 symtab[symptr++] = sym;
1820 }
1821
1822 static arelent *reltab = 0;
1823 static int relcount = 0, relsize = 0;
1824
1825 static void
1826 quick_reloc (bfd *abfd, bfd_size_type address, int which_howto, int symidx)
1827 {
1828 if (relcount >= relsize - 1)
1829 {
1830 relsize += 10;
1831 if (reltab)
1832 reltab = xrealloc (reltab, relsize * sizeof (arelent));
1833 else
1834 reltab = xmalloc (relsize * sizeof (arelent));
1835 }
1836 reltab[relcount].address = address;
1837 reltab[relcount].addend = 0;
1838 reltab[relcount].howto = bfd_reloc_type_lookup (abfd, which_howto);
1839 reltab[relcount].sym_ptr_ptr = symtab + symidx;
1840 relcount++;
1841 }
1842
1843 static void
1844 save_relocs (asection *sec)
1845 {
1846 int i;
1847
1848 sec->relocation = reltab;
1849 sec->reloc_count = relcount;
1850 sec->orelocation = xmalloc ((relcount + 1) * sizeof (arelent *));
1851 for (i = 0; i < relcount; i++)
1852 sec->orelocation[i] = sec->relocation + i;
1853 sec->orelocation[relcount] = 0;
1854 sec->flags |= SEC_RELOC;
1855 reltab = 0;
1856 relcount = relsize = 0;
1857 }
1858
1859 /* .section .idata$2
1860 .global __head_my_dll
1861 __head_my_dll:
1862 .rva hname
1863 .long 0
1864 .long 0
1865 .rva __my_dll_iname
1866 .rva fthunk
1867
1868 .section .idata$5
1869 .long 0
1870 fthunk:
1871
1872 .section .idata$4
1873 .long 0
1874 hname: */
1875
1876 static bfd *
1877 make_head (bfd *parent)
1878 {
1879 asection *id2, *id5, *id4;
1880 unsigned char *d2, *d5, *d4;
1881 char *oname;
1882 bfd *abfd;
1883
1884 oname = xmalloc (20);
1885 sprintf (oname, "d%06d.o", tmp_seq);
1886 tmp_seq++;
1887
1888 abfd = bfd_create (oname, parent);
1889 bfd_find_target (pe_details->object_target, abfd);
1890 bfd_make_writable (abfd);
1891
1892 bfd_set_format (abfd, bfd_object);
1893 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
1894
1895 symptr = 0;
1896 symtab = xmalloc (6 * sizeof (asymbol *));
1897 id2 = quick_section (abfd, ".idata$2", SEC_HAS_CONTENTS, 2);
1898 id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
1899 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
1900 quick_symbol (abfd, U ("_head_"), dll_symname, "", id2, BSF_GLOBAL, 0);
1901 quick_symbol (abfd, U (""), dll_symname, "_iname", UNDSEC, BSF_GLOBAL, 0);
1902
1903 /* OK, pay attention here. I got confused myself looking back at
1904 it. We create a four-byte section to mark the beginning of the
1905 list, and we include an offset of 4 in the section, so that the
1906 pointer to the list points to the *end* of this section, which is
1907 the start of the list of sections from other objects. */
1908
1909 bfd_set_section_size (abfd, id2, 20);
1910 d2 = xmalloc (20);
1911 id2->contents = d2;
1912 memset (d2, 0, 20);
1913 if (pe_use_nul_prefixed_import_tables)
1914 d2[0] = d2[16] = PE_IDATA5_SIZE; /* Reloc addend. */
1915 quick_reloc (abfd, 0, BFD_RELOC_RVA, 2);
1916 quick_reloc (abfd, 12, BFD_RELOC_RVA, 4);
1917 quick_reloc (abfd, 16, BFD_RELOC_RVA, 1);
1918 save_relocs (id2);
1919
1920 if (pe_use_nul_prefixed_import_tables)
1921 bfd_set_section_size (abfd, id5, PE_IDATA5_SIZE);
1922 else
1923 bfd_set_section_size (abfd, id5, 0);
1924 d5 = xmalloc (PE_IDATA5_SIZE);
1925 id5->contents = d5;
1926 memset (d5, 0, PE_IDATA5_SIZE);
1927 if (pe_use_nul_prefixed_import_tables)
1928 bfd_set_section_size (abfd, id4, PE_IDATA4_SIZE);
1929 else
1930 bfd_set_section_size (abfd, id4, 0);
1931 d4 = xmalloc (PE_IDATA4_SIZE);
1932 id4->contents = d4;
1933 memset (d4, 0, PE_IDATA4_SIZE);
1934
1935 bfd_set_symtab (abfd, symtab, symptr);
1936
1937 bfd_set_section_contents (abfd, id2, d2, 0, 20);
1938 if (pe_use_nul_prefixed_import_tables)
1939 {
1940 bfd_set_section_contents (abfd, id5, d5, 0, PE_IDATA5_SIZE);
1941 bfd_set_section_contents (abfd, id4, d4, 0, PE_IDATA4_SIZE);
1942 }
1943 else
1944 {
1945 bfd_set_section_contents (abfd, id5, d5, 0, 0);
1946 bfd_set_section_contents (abfd, id4, d4, 0, 0);
1947 }
1948
1949 bfd_make_readable (abfd);
1950 return abfd;
1951 }
1952
1953 /* .section .idata$4
1954 .long 0
1955 [.long 0] for PE+
1956 .section .idata$5
1957 .long 0
1958 [.long 0] for PE+
1959 .section idata$7
1960 .global __my_dll_iname
1961 __my_dll_iname:
1962 .asciz "my.dll" */
1963
1964 static bfd *
1965 make_tail (bfd *parent)
1966 {
1967 asection *id4, *id5, *id7;
1968 unsigned char *d4, *d5, *d7;
1969 int len;
1970 char *oname;
1971 bfd *abfd;
1972
1973 oname = xmalloc (20);
1974 sprintf (oname, "d%06d.o", tmp_seq);
1975 tmp_seq++;
1976
1977 abfd = bfd_create (oname, parent);
1978 bfd_find_target (pe_details->object_target, abfd);
1979 bfd_make_writable (abfd);
1980
1981 bfd_set_format (abfd, bfd_object);
1982 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
1983
1984 symptr = 0;
1985 symtab = xmalloc (5 * sizeof (asymbol *));
1986 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
1987 id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
1988 id7 = quick_section (abfd, ".idata$7", SEC_HAS_CONTENTS, 2);
1989 quick_symbol (abfd, U (""), dll_symname, "_iname", id7, BSF_GLOBAL, 0);
1990
1991 bfd_set_section_size (abfd, id4, PE_IDATA4_SIZE);
1992 d4 = xmalloc (PE_IDATA4_SIZE);
1993 id4->contents = d4;
1994 memset (d4, 0, PE_IDATA4_SIZE);
1995
1996 bfd_set_section_size (abfd, id5, PE_IDATA5_SIZE);
1997 d5 = xmalloc (PE_IDATA5_SIZE);
1998 id5->contents = d5;
1999 memset (d5, 0, PE_IDATA5_SIZE);
2000
2001 len = strlen (dll_filename) + 1;
2002 if (len & 1)
2003 len++;
2004 bfd_set_section_size (abfd, id7, len);
2005 d7 = xmalloc (len);
2006 id7->contents = d7;
2007 strcpy ((char *) d7, dll_filename);
2008 /* If len was odd, the above
2009 strcpy leaves behind an undefined byte. That is harmless,
2010 but we set it to 0 just so the binary dumps are pretty. */
2011 d7[len - 1] = 0;
2012
2013 bfd_set_symtab (abfd, symtab, symptr);
2014
2015 bfd_set_section_contents (abfd, id4, d4, 0, PE_IDATA4_SIZE);
2016 bfd_set_section_contents (abfd, id5, d5, 0, PE_IDATA5_SIZE);
2017 bfd_set_section_contents (abfd, id7, d7, 0, len);
2018
2019 bfd_make_readable (abfd);
2020 return abfd;
2021 }
2022
2023 /* .text
2024 .global _function
2025 .global ___imp_function
2026 .global __imp__function
2027 _function:
2028 jmp *__imp__function:
2029
2030 .section idata$7
2031 .long __head_my_dll
2032
2033 .section .idata$5
2034 ___imp_function:
2035 __imp__function:
2036 iat?
2037 .section .idata$4
2038 iat?
2039 .section .idata$6
2040 ID<ordinal>:
2041 .short <hint>
2042 .asciz "function" xlate? (add underscore, kill at) */
2043
2044 static const unsigned char jmp_ix86_bytes[] =
2045 {
2046 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x90, 0x90
2047 };
2048
2049 /* _function:
2050 mov.l ip+8,r0
2051 mov.l @r0,r0
2052 jmp @r0
2053 nop
2054 .dw __imp_function */
2055
2056 static const unsigned char jmp_sh_bytes[] =
2057 {
2058 0x01, 0xd0, 0x02, 0x60, 0x2b, 0x40, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00
2059 };
2060
2061 /* _function:
2062 lui $t0,<high:__imp_function>
2063 lw $t0,<low:__imp_function>
2064 jr $t0
2065 nop */
2066
2067 static const unsigned char jmp_mips_bytes[] =
2068 {
2069 0x00, 0x00, 0x08, 0x3c, 0x00, 0x00, 0x08, 0x8d,
2070 0x08, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00
2071 };
2072
2073 static const unsigned char jmp_arm_bytes[] =
2074 {
2075 0x00, 0xc0, 0x9f, 0xe5, /* ldr ip, [pc] */
2076 0x00, 0xf0, 0x9c, 0xe5, /* ldr pc, [ip] */
2077 0, 0, 0, 0
2078 };
2079
2080
2081 static bfd *
2082 make_one (def_file_export *exp, bfd *parent, bfd_boolean include_jmp_stub)
2083 {
2084 asection *tx, *id7, *id5, *id4, *id6;
2085 unsigned char *td = NULL, *d7, *d5, *d4, *d6 = NULL;
2086 int len;
2087 char *oname;
2088 bfd *abfd;
2089 const unsigned char *jmp_bytes = NULL;
2090 int jmp_byte_count = 0;
2091
2092 /* Include the jump stub section only if it is needed. A jump
2093 stub is needed if the symbol being imported <sym> is a function
2094 symbol and there is at least one undefined reference to that
2095 symbol. In other words, if all the import references to <sym> are
2096 explicitly through _declspec(dllimport) then the jump stub is not
2097 needed. */
2098 if (include_jmp_stub)
2099 {
2100 switch (pe_details->pe_arch)
2101 {
2102 case PE_ARCH_i386:
2103 jmp_bytes = jmp_ix86_bytes;
2104 jmp_byte_count = sizeof (jmp_ix86_bytes);
2105 break;
2106 case PE_ARCH_sh:
2107 jmp_bytes = jmp_sh_bytes;
2108 jmp_byte_count = sizeof (jmp_sh_bytes);
2109 break;
2110 case PE_ARCH_mips:
2111 jmp_bytes = jmp_mips_bytes;
2112 jmp_byte_count = sizeof (jmp_mips_bytes);
2113 break;
2114 case PE_ARCH_arm:
2115 case PE_ARCH_arm_epoc:
2116 case PE_ARCH_arm_wince:
2117 jmp_bytes = jmp_arm_bytes;
2118 jmp_byte_count = sizeof (jmp_arm_bytes);
2119 break;
2120 default:
2121 abort ();
2122 }
2123 }
2124
2125 oname = xmalloc (20);
2126 sprintf (oname, "d%06d.o", tmp_seq);
2127 tmp_seq++;
2128
2129 abfd = bfd_create (oname, parent);
2130 bfd_find_target (pe_details->object_target, abfd);
2131 bfd_make_writable (abfd);
2132
2133 bfd_set_format (abfd, bfd_object);
2134 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2135
2136 symptr = 0;
2137 symtab = xmalloc (12 * sizeof (asymbol *));
2138
2139 tx = quick_section (abfd, ".text", SEC_CODE | SEC_HAS_CONTENTS | SEC_READONLY, 2);
2140 id7 = quick_section (abfd, ".idata$7", SEC_HAS_CONTENTS, 2);
2141 id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
2142 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
2143 id6 = quick_section (abfd, ".idata$6", SEC_HAS_CONTENTS, 2);
2144
2145 if (*exp->internal_name == '@')
2146 {
2147 quick_symbol (abfd, U ("_head_"), dll_symname, "", UNDSEC,
2148 BSF_GLOBAL, 0);
2149 if (include_jmp_stub)
2150 quick_symbol (abfd, "", exp->internal_name, "", tx, BSF_GLOBAL, 0);
2151 quick_symbol (abfd, "__imp_", exp->internal_name, "", id5,
2152 BSF_GLOBAL, 0);
2153 /* Fastcall applies only to functions,
2154 so no need for auto-import symbol. */
2155 }
2156 else
2157 {
2158 quick_symbol (abfd, U ("_head_"), dll_symname, "", UNDSEC,
2159 BSF_GLOBAL, 0);
2160 if (include_jmp_stub)
2161 quick_symbol (abfd, U (""), exp->internal_name, "", tx,
2162 BSF_GLOBAL, 0);
2163 quick_symbol (abfd, "__imp_", U (""), exp->internal_name, id5,
2164 BSF_GLOBAL, 0);
2165 /* Symbol to reference ord/name of imported
2166 data symbol, used to implement auto-import. */
2167 if (exp->flag_data)
2168 quick_symbol (abfd, "__nm_", U (""), exp->internal_name, id6,
2169 BSF_GLOBAL,0);
2170 }
2171 if (pe_dll_compat_implib)
2172 quick_symbol (abfd, "___imp_", exp->internal_name, "", id5,
2173 BSF_GLOBAL, 0);
2174
2175 if (include_jmp_stub)
2176 {
2177 bfd_set_section_size (abfd, tx, jmp_byte_count);
2178 td = xmalloc (jmp_byte_count);
2179 tx->contents = td;
2180 memcpy (td, jmp_bytes, jmp_byte_count);
2181
2182 switch (pe_details->pe_arch)
2183 {
2184 case PE_ARCH_i386:
2185 #ifdef pe_use_x86_64
2186 quick_reloc (abfd, 2, BFD_RELOC_32_PCREL, 2);
2187 #else
2188 /* Mark this object as SAFESEH compatible. */
2189 quick_symbol (abfd, "", "@feat.00", "", bfd_abs_section_ptr,
2190 BSF_LOCAL, 1);
2191 quick_reloc (abfd, 2, BFD_RELOC_32, 2);
2192 #endif
2193 break;
2194 case PE_ARCH_sh:
2195 quick_reloc (abfd, 8, BFD_RELOC_32, 2);
2196 break;
2197 case PE_ARCH_mips:
2198 quick_reloc (abfd, 0, BFD_RELOC_HI16_S, 2);
2199 quick_reloc (abfd, 0, BFD_RELOC_LO16, 0); /* MIPS_R_PAIR */
2200 quick_reloc (abfd, 4, BFD_RELOC_LO16, 2);
2201 break;
2202 case PE_ARCH_arm:
2203 case PE_ARCH_arm_epoc:
2204 case PE_ARCH_arm_wince:
2205 quick_reloc (abfd, 8, BFD_RELOC_32, 2);
2206 break;
2207 default:
2208 abort ();
2209 }
2210 save_relocs (tx);
2211 }
2212 else
2213 bfd_set_section_size (abfd, tx, 0);
2214
2215 bfd_set_section_size (abfd, id7, 4);
2216 d7 = xmalloc (4);
2217 id7->contents = d7;
2218 memset (d7, 0, 4);
2219 quick_reloc (abfd, 0, BFD_RELOC_RVA, 5);
2220 save_relocs (id7);
2221
2222 bfd_set_section_size (abfd, id5, PE_IDATA5_SIZE);
2223 d5 = xmalloc (PE_IDATA5_SIZE);
2224 id5->contents = d5;
2225 memset (d5, 0, PE_IDATA5_SIZE);
2226
2227 if (exp->flag_noname)
2228 {
2229 d5[0] = exp->ordinal;
2230 d5[1] = exp->ordinal >> 8;
2231 d5[PE_IDATA5_SIZE - 1] = 0x80;
2232 }
2233 else
2234 {
2235 quick_reloc (abfd, 0, BFD_RELOC_RVA, 4);
2236 save_relocs (id5);
2237 }
2238
2239 bfd_set_section_size (abfd, id4, PE_IDATA4_SIZE);
2240 d4 = xmalloc (PE_IDATA4_SIZE);
2241 id4->contents = d4;
2242 memset (d4, 0, PE_IDATA4_SIZE);
2243
2244 if (exp->flag_noname)
2245 {
2246 d4[0] = exp->ordinal;
2247 d4[1] = exp->ordinal >> 8;
2248 d4[PE_IDATA4_SIZE - 1] = 0x80;
2249 }
2250 else
2251 {
2252 quick_reloc (abfd, 0, BFD_RELOC_RVA, 4);
2253 save_relocs (id4);
2254 }
2255
2256 if (exp->flag_noname)
2257 {
2258 len = 0;
2259 bfd_set_section_size (abfd, id6, 0);
2260 }
2261 else
2262 {
2263 /* { short, asciz } */
2264 if (exp->its_name)
2265 len = 2 + strlen (exp->its_name) + 1;
2266 else
2267 len = 2 + strlen (exp->name) + 1;
2268 if (len & 1)
2269 len++;
2270 bfd_set_section_size (abfd, id6, len);
2271 d6 = xmalloc (len);
2272 id6->contents = d6;
2273 memset (d6, 0, len);
2274 d6[0] = exp->hint & 0xff;
2275 d6[1] = exp->hint >> 8;
2276 if (exp->its_name)
2277 strcpy ((char*) d6 + 2, exp->its_name);
2278 else
2279 strcpy ((char *) d6 + 2, exp->name);
2280 }
2281
2282 bfd_set_symtab (abfd, symtab, symptr);
2283
2284 if (include_jmp_stub)
2285 bfd_set_section_contents (abfd, tx, td, 0, jmp_byte_count);
2286 bfd_set_section_contents (abfd, id7, d7, 0, 4);
2287 bfd_set_section_contents (abfd, id5, d5, 0, PE_IDATA5_SIZE);
2288 bfd_set_section_contents (abfd, id4, d4, 0, PE_IDATA4_SIZE);
2289 if (!exp->flag_noname)
2290 bfd_set_section_contents (abfd, id6, d6, 0, len);
2291
2292 bfd_make_readable (abfd);
2293 return abfd;
2294 }
2295
2296 static bfd *
2297 make_singleton_name_imp (const char *import, bfd *parent)
2298 {
2299 /* Name thunks go to idata$4. */
2300 asection *id5;
2301 unsigned char *d5;
2302 char *oname;
2303 bfd *abfd;
2304
2305 oname = xmalloc (20);
2306 sprintf (oname, "nmimp%06d.o", tmp_seq2);
2307 tmp_seq2++;
2308
2309 abfd = bfd_create (oname, parent);
2310 bfd_find_target (pe_details->object_target, abfd);
2311 bfd_make_writable (abfd);
2312
2313 bfd_set_format (abfd, bfd_object);
2314 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2315
2316 symptr = 0;
2317 symtab = xmalloc (3 * sizeof (asymbol *));
2318 id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
2319 quick_symbol (abfd, "__imp_", import, "", id5, BSF_GLOBAL, 0);
2320
2321 /* We need space for the real thunk and for the null terminator. */
2322 bfd_set_section_size (abfd, id5, PE_IDATA5_SIZE * 2);
2323 d5 = xmalloc (PE_IDATA5_SIZE * 2);
2324 id5->contents = d5;
2325 memset (d5, 0, PE_IDATA5_SIZE * 2);
2326 quick_reloc (abfd, 0, BFD_RELOC_RVA, 2);
2327 save_relocs (id5);
2328
2329 bfd_set_symtab (abfd, symtab, symptr);
2330
2331 bfd_set_section_contents (abfd, id5, d5, 0, PE_IDATA4_SIZE * 2);
2332
2333 bfd_make_readable (abfd);
2334 return abfd;
2335 }
2336
2337 static bfd *
2338 make_singleton_name_thunk (const char *import, bfd *parent)
2339 {
2340 /* Name thunks go to idata$4. */
2341 asection *id4;
2342 unsigned char *d4;
2343 char *oname;
2344 bfd *abfd;
2345
2346 oname = xmalloc (20);
2347 sprintf (oname, "nmth%06d.o", tmp_seq);
2348 tmp_seq++;
2349
2350 abfd = bfd_create (oname, parent);
2351 bfd_find_target (pe_details->object_target, abfd);
2352 bfd_make_writable (abfd);
2353
2354 bfd_set_format (abfd, bfd_object);
2355 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2356
2357 symptr = 0;
2358 symtab = xmalloc (3 * sizeof (asymbol *));
2359 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
2360 quick_symbol (abfd, "__nm_thnk_", import, "", id4, BSF_GLOBAL, 0);
2361 quick_symbol (abfd, "__nm_", import, "", UNDSEC, BSF_GLOBAL, 0);
2362
2363 /* We need space for the real thunk and for the null terminator. */
2364 bfd_set_section_size (abfd, id4, PE_IDATA4_SIZE * 2);
2365 d4 = xmalloc (PE_IDATA4_SIZE * 2);
2366 id4->contents = d4;
2367 memset (d4, 0, PE_IDATA4_SIZE * 2);
2368 quick_reloc (abfd, 0, BFD_RELOC_RVA, 2);
2369 save_relocs (id4);
2370
2371 bfd_set_symtab (abfd, symtab, symptr);
2372
2373 bfd_set_section_contents (abfd, id4, d4, 0, PE_IDATA4_SIZE * 2);
2374
2375 bfd_make_readable (abfd);
2376 return abfd;
2377 }
2378
2379 static char *
2380 make_import_fixup_mark (arelent *rel)
2381 {
2382 /* We convert reloc to symbol, for later reference. */
2383 static int counter;
2384 static char *fixup_name = NULL;
2385 static size_t buffer_len = 0;
2386
2387 struct bfd_symbol *sym = *rel->sym_ptr_ptr;
2388
2389 bfd *abfd = bfd_asymbol_bfd (sym);
2390 struct bfd_link_hash_entry *bh;
2391
2392 if (!fixup_name)
2393 {
2394 fixup_name = xmalloc (384);
2395 buffer_len = 384;
2396 }
2397
2398 if (strlen (sym->name) + 25 > buffer_len)
2399 /* Assume 25 chars for "__fu" + counter + "_". If counter is
2400 bigger than 20 digits long, we've got worse problems than
2401 overflowing this buffer... */
2402 {
2403 free (fixup_name);
2404 /* New buffer size is length of symbol, plus 25, but
2405 then rounded up to the nearest multiple of 128. */
2406 buffer_len = ((strlen (sym->name) + 25) + 127) & ~127;
2407 fixup_name = xmalloc (buffer_len);
2408 }
2409
2410 sprintf (fixup_name, "__fu%d_%s", counter++, sym->name);
2411
2412 bh = NULL;
2413 bfd_coff_link_add_one_symbol (&link_info, abfd, fixup_name, BSF_GLOBAL,
2414 current_sec, /* sym->section, */
2415 rel->address, NULL, TRUE, FALSE, &bh);
2416
2417 return fixup_name;
2418 }
2419
2420 /* .section .idata$2
2421 .rva __nm_thnk_SYM (singleton thunk with name of func)
2422 .long 0
2423 .long 0
2424 .rva __my_dll_iname (name of dll)
2425 .rva __fuNN_SYM (pointer to reference (address) in text) */
2426
2427 static bfd *
2428 make_import_fixup_entry (const char *name,
2429 const char *fixup_name,
2430 const char *symname,
2431 bfd *parent)
2432 {
2433 asection *id2;
2434 unsigned char *d2;
2435 char *oname;
2436 bfd *abfd;
2437
2438 oname = xmalloc (20);
2439 sprintf (oname, "fu%06d.o", tmp_seq);
2440 tmp_seq++;
2441
2442 abfd = bfd_create (oname, parent);
2443 bfd_find_target (pe_details->object_target, abfd);
2444 bfd_make_writable (abfd);
2445
2446 bfd_set_format (abfd, bfd_object);
2447 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2448
2449 symptr = 0;
2450 symtab = xmalloc (6 * sizeof (asymbol *));
2451 id2 = quick_section (abfd, ".idata$2", SEC_HAS_CONTENTS, 2);
2452
2453 quick_symbol (abfd, "__nm_thnk_", name, "", UNDSEC, BSF_GLOBAL, 0);
2454 quick_symbol (abfd, U (""), symname, "_iname", UNDSEC, BSF_GLOBAL, 0);
2455 /* For relocator v2 we have to use the .idata$5 element and not
2456 fixup_name. */
2457 if (link_info.pei386_runtime_pseudo_reloc == 2)
2458 quick_symbol (abfd, "__imp_", name, "", UNDSEC, BSF_GLOBAL, 0);
2459 else
2460 quick_symbol (abfd, "", fixup_name, "", UNDSEC, BSF_GLOBAL, 0);
2461
2462 bfd_set_section_size (abfd, id2, 20);
2463 d2 = xmalloc (20);
2464 id2->contents = d2;
2465 memset (d2, 0, 20);
2466
2467 quick_reloc (abfd, 0, BFD_RELOC_RVA, 1);
2468 quick_reloc (abfd, 12, BFD_RELOC_RVA, 2);
2469 quick_reloc (abfd, 16, BFD_RELOC_RVA, 3);
2470 save_relocs (id2);
2471
2472 bfd_set_symtab (abfd, symtab, symptr);
2473
2474 bfd_set_section_contents (abfd, id2, d2, 0, 20);
2475
2476 bfd_make_readable (abfd);
2477 return abfd;
2478 }
2479
2480 /* .section .rdata_runtime_pseudo_reloc
2481 .long addend
2482 .rva __fuNN_SYM (pointer to reference (address) in text) */
2483
2484 static bfd *
2485 make_runtime_pseudo_reloc (const char *name ATTRIBUTE_UNUSED,
2486 const char *fixup_name,
2487 bfd_vma addend ATTRIBUTE_UNUSED,
2488 bfd_vma bitsize,
2489 bfd *parent)
2490 {
2491 asection *rt_rel;
2492 unsigned char *rt_rel_d;
2493 char *oname;
2494 bfd *abfd;
2495 oname = xmalloc (20);
2496 sprintf (oname, "rtr%06d.o", tmp_seq);
2497 tmp_seq++;
2498
2499 abfd = bfd_create (oname, parent);
2500 bfd_find_target (pe_details->object_target, abfd);
2501 bfd_make_writable (abfd);
2502
2503 bfd_set_format (abfd, bfd_object);
2504 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2505
2506 symptr = 0;
2507 if (link_info.pei386_runtime_pseudo_reloc == 2)
2508 {
2509 symtab = xmalloc ((runtime_pseudp_reloc_v2_init ? 3 : 6) * sizeof (asymbol *));
2510 }
2511 else
2512 {
2513 symtab = xmalloc (2 * sizeof (asymbol *));
2514 }
2515 rt_rel = quick_section (abfd, ".rdata_runtime_pseudo_reloc",
2516 SEC_HAS_CONTENTS, 2);
2517
2518 quick_symbol (abfd, "", fixup_name, "", UNDSEC, BSF_GLOBAL, 0);
2519
2520 if (link_info.pei386_runtime_pseudo_reloc == 2)
2521 {
2522 size_t size = 12;
2523 if (! runtime_pseudp_reloc_v2_init)
2524 {
2525 size += 12;
2526 runtime_pseudp_reloc_v2_init = 1;
2527 }
2528 quick_symbol (abfd, "__imp_", name, "", UNDSEC, BSF_GLOBAL, 0);
2529
2530 bfd_set_section_size (abfd, rt_rel, size);
2531 rt_rel_d = xmalloc (size);
2532 rt_rel->contents = rt_rel_d;
2533 memset (rt_rel_d, 0, size);
2534 quick_reloc (abfd, size - 8, BFD_RELOC_RVA, 1);
2535 quick_reloc (abfd, size - 12, BFD_RELOC_RVA, 2);
2536 bfd_put_32 (abfd, bitsize, rt_rel_d + (size - 4));
2537 if (size != 12)
2538 bfd_put_32 (abfd, 1, rt_rel_d + 8);
2539 save_relocs (rt_rel);
2540
2541 bfd_set_symtab (abfd, symtab, symptr);
2542
2543 bfd_set_section_contents (abfd, rt_rel, rt_rel_d, 0, size);
2544 }
2545 else
2546 {
2547 bfd_set_section_size (abfd, rt_rel, 8);
2548 rt_rel_d = xmalloc (8);
2549 rt_rel->contents = rt_rel_d;
2550 memset (rt_rel_d, 0, 8);
2551
2552 bfd_put_32 (abfd, addend, rt_rel_d);
2553 quick_reloc (abfd, 4, BFD_RELOC_RVA, 1);
2554
2555 save_relocs (rt_rel);
2556
2557 bfd_set_symtab (abfd, symtab, symptr);
2558
2559 bfd_set_section_contents (abfd, rt_rel, rt_rel_d, 0, 8);
2560 }
2561 bfd_make_readable (abfd);
2562 return abfd;
2563 }
2564
2565 /* .section .rdata
2566 .rva __pei386_runtime_relocator */
2567
2568 static bfd *
2569 pe_create_runtime_relocator_reference (bfd *parent)
2570 {
2571 asection *extern_rt_rel;
2572 unsigned char *extern_rt_rel_d;
2573 char *oname;
2574 bfd *abfd;
2575
2576 oname = xmalloc (20);
2577 sprintf (oname, "ertr%06d.o", tmp_seq);
2578 tmp_seq++;
2579
2580 abfd = bfd_create (oname, parent);
2581 bfd_find_target (pe_details->object_target, abfd);
2582 bfd_make_writable (abfd);
2583
2584 bfd_set_format (abfd, bfd_object);
2585 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2586
2587 symptr = 0;
2588 symtab = xmalloc (2 * sizeof (asymbol *));
2589 extern_rt_rel = quick_section (abfd, ".rdata", SEC_HAS_CONTENTS, 2);
2590
2591 quick_symbol (abfd, "", U ("_pei386_runtime_relocator"), "", UNDSEC,
2592 BSF_NO_FLAGS, 0);
2593
2594 bfd_set_section_size (abfd, extern_rt_rel, PE_IDATA5_SIZE);
2595 extern_rt_rel_d = xcalloc (1, PE_IDATA5_SIZE);
2596 extern_rt_rel->contents = extern_rt_rel_d;
2597
2598 quick_reloc (abfd, 0, BFD_RELOC_RVA, 1);
2599 save_relocs (extern_rt_rel);
2600
2601 bfd_set_symtab (abfd, symtab, symptr);
2602
2603 bfd_set_section_contents (abfd, extern_rt_rel, extern_rt_rel_d, 0, PE_IDATA5_SIZE);
2604
2605 bfd_make_readable (abfd);
2606 return abfd;
2607 }
2608
2609 void
2610 pe_create_import_fixup (arelent *rel, asection *s, bfd_vma addend)
2611 {
2612 char buf[300];
2613 struct bfd_symbol *sym = *rel->sym_ptr_ptr;
2614 struct bfd_link_hash_entry *name_thunk_sym;
2615 struct bfd_link_hash_entry *name_imp_sym;
2616 const char *name = sym->name;
2617 char *fixup_name = make_import_fixup_mark (rel);
2618 bfd *b;
2619 int need_import_table = 1;
2620
2621 sprintf (buf, "__imp_%s", name);
2622 name_imp_sym = bfd_link_hash_lookup (link_info.hash, buf, 0, 0, 1);
2623
2624 sprintf (buf, "__nm_thnk_%s", name);
2625
2626 name_thunk_sym = bfd_link_hash_lookup (link_info.hash, buf, 0, 0, 1);
2627
2628 /* For version 2 pseudo relocation we don't need to add an import
2629 if the import symbol is already present. */
2630 if (link_info.pei386_runtime_pseudo_reloc == 2
2631 && name_imp_sym
2632 && name_imp_sym->type == bfd_link_hash_defined)
2633 need_import_table = 0;
2634
2635 if (need_import_table == 1
2636 && (!name_thunk_sym || name_thunk_sym->type != bfd_link_hash_defined))
2637 {
2638 b = make_singleton_name_thunk (name, link_info.output_bfd);
2639 add_bfd_to_link (b, b->filename, &link_info);
2640
2641 /* If we ever use autoimport, we have to cast text section writable.
2642 But not for version 2. */
2643 if (link_info.pei386_runtime_pseudo_reloc != 2)
2644 {
2645 config.text_read_only = FALSE;
2646 link_info.output_bfd->flags &= ~WP_TEXT;
2647 }
2648 if (link_info.pei386_runtime_pseudo_reloc == 2)
2649 {
2650 b = make_singleton_name_imp (name, link_info.output_bfd);
2651 add_bfd_to_link (b, b->filename, &link_info);
2652 }
2653 }
2654
2655 if ((addend == 0 || link_info.pei386_runtime_pseudo_reloc)
2656 && need_import_table == 1)
2657 {
2658 extern char * pe_data_import_dll;
2659 char * symname = pe_data_import_dll ? pe_data_import_dll : "unknown";
2660
2661 b = make_import_fixup_entry (name, fixup_name, symname,
2662 link_info.output_bfd);
2663 add_bfd_to_link (b, b->filename, &link_info);
2664 }
2665
2666 if ((link_info.pei386_runtime_pseudo_reloc != 0 && addend != 0)
2667 || link_info.pei386_runtime_pseudo_reloc == 2)
2668 {
2669 if (pe_dll_extra_pe_debug)
2670 printf ("creating runtime pseudo-reloc entry for %s (addend=%d)\n",
2671 fixup_name, (int) addend);
2672
2673 b = make_runtime_pseudo_reloc (name, fixup_name, addend, rel->howto->bitsize,
2674 link_info.output_bfd);
2675 add_bfd_to_link (b, b->filename, &link_info);
2676
2677 if (runtime_pseudo_relocs_created == 0)
2678 {
2679 b = pe_create_runtime_relocator_reference (link_info.output_bfd);
2680 add_bfd_to_link (b, b->filename, &link_info);
2681 }
2682 runtime_pseudo_relocs_created++;
2683 }
2684 else if (addend != 0)
2685 {
2686 einfo (_("%C: variable '%T' can't be auto-imported. Please read the documentation for ld's --enable-auto-import for details.\n"),
2687 s->owner, s, rel->address, sym->name);
2688 einfo ("%X");
2689 }
2690 }
2691
2692
2693 void
2694 pe_dll_generate_implib (def_file *def, const char *impfilename, struct bfd_link_info *info)
2695 {
2696 int i;
2697 bfd *ar_head;
2698 bfd *ar_tail;
2699 bfd *outarch;
2700 bfd *ibfd;
2701 bfd *head = 0;
2702
2703 dll_filename = (def->name) ? def->name : dll_name;
2704 dll_symname = xstrdup (dll_filename);
2705 for (i = 0; dll_symname[i]; i++)
2706 if (!ISALNUM (dll_symname[i]))
2707 dll_symname[i] = '_';
2708
2709 unlink_if_ordinary (impfilename);
2710
2711 outarch = bfd_openw (impfilename, 0);
2712
2713 if (!outarch)
2714 {
2715 /* xgettext:c-format */
2716 einfo (_("%XCan't open .lib file: %s\n"), impfilename);
2717 return;
2718 }
2719
2720 if (verbose)
2721 /* xgettext:c-format */
2722 info_msg (_("Creating library file: %s\n"), impfilename);
2723
2724 bfd_set_format (outarch, bfd_archive);
2725 outarch->has_armap = 1;
2726
2727 /* Work out a reasonable size of things to put onto one line. */
2728 ar_head = make_head (outarch);
2729
2730 /* Iterate the input BFDs, looking for exclude-modules-for-implib. */
2731 for (ibfd = info->input_bfds; ibfd; ibfd = ibfd->link.next)
2732 {
2733 /* Iterate the exclude list. */
2734 struct exclude_list_struct *ex;
2735 char found;
2736 for (ex = excludes, found = 0; ex && !found; ex = ex->next)
2737 {
2738 if (ex->type != EXCLUDEFORIMPLIB)
2739 continue;
2740 found = (filename_cmp (ex->string, ibfd->filename) == 0);
2741 }
2742 /* If it matched, we must open a fresh BFD for it (the original
2743 input BFD is still needed for the DLL's final link) and add
2744 it into the archive member chain. */
2745 if (found)
2746 {
2747 bfd *newbfd = bfd_openr (ibfd->my_archive
2748 ? ibfd->my_archive->filename : ibfd->filename, NULL);
2749 if (!newbfd)
2750 {
2751 einfo (_("%Xbfd_openr %s: %E\n"), ibfd->filename);
2752 return;
2753 }
2754 if (ibfd->my_archive)
2755 {
2756 /* Must now iterate through archive until we find the
2757 required member. A minor shame that we'll open the
2758 archive once per member that we require from it, and
2759 leak those archive bfds rather than reuse them. */
2760 bfd *arbfd = newbfd;
2761 if (!bfd_check_format_matches (arbfd, bfd_archive, NULL))
2762 {
2763 einfo (_("%X%s(%s): can't find member in non-archive file"),
2764 ibfd->my_archive->filename, ibfd->filename);
2765 return;
2766 }
2767 newbfd = NULL;
2768 while ((newbfd = bfd_openr_next_archived_file (arbfd, newbfd)) != 0)
2769 {
2770 if (filename_cmp (newbfd->filename, ibfd->filename) == 0)
2771 break;
2772 }
2773 if (!newbfd)
2774 {
2775 einfo (_("%X%s(%s): can't find member in archive"),
2776 ibfd->my_archive->filename, ibfd->filename);
2777 return;
2778 }
2779 }
2780 newbfd->archive_next = head;
2781 head = newbfd;
2782 }
2783 }
2784
2785 for (i = 0; i < def->num_exports; i++)
2786 {
2787 /* The import library doesn't know about the internal name. */
2788 char *internal = def->exports[i].internal_name;
2789 bfd *n;
2790
2791 /* Don't add PRIVATE entries to import lib. */
2792 if (pe_def_file->exports[i].flag_private)
2793 continue;
2794
2795 def->exports[i].internal_name = def->exports[i].name;
2796
2797 /* PR 19803: If a symbol has been discard due to garbage
2798 collection then do not create any exports for it. */
2799 {
2800 struct coff_link_hash_entry *h;
2801
2802 h = coff_link_hash_lookup (coff_hash_table (info), internal,
2803 FALSE, FALSE, FALSE);
2804 if (h != NULL
2805 /* If the symbol is hidden and undefined then it
2806 has been swept up by garbage collection. */
2807 && h->symbol_class == C_HIDDEN
2808 && h->root.u.def.section == bfd_und_section_ptr)
2809 continue;
2810
2811 /* If necessary, check with an underscore prefix as well. */
2812 if (pe_details->underscored && internal[0] != '@')
2813 {
2814 char *name;
2815
2816 name = xmalloc (strlen (internal) + 2);
2817 sprintf (name, "_%s", internal);
2818
2819 h = coff_link_hash_lookup (coff_hash_table (info), name,
2820 FALSE, FALSE, FALSE);
2821 free (name);
2822
2823 if (h != NULL
2824 /* If the symbol is hidden and undefined then it
2825 has been swept up by garbage collection. */
2826 && h->symbol_class == C_HIDDEN
2827 && h->root.u.def.section == bfd_und_section_ptr)
2828 continue;
2829 }
2830 }
2831
2832 n = make_one (def->exports + i, outarch,
2833 ! (def->exports + i)->flag_data);
2834 n->archive_next = head;
2835 head = n;
2836 def->exports[i].internal_name = internal;
2837 }
2838
2839 ar_tail = make_tail (outarch);
2840
2841 if (ar_head == NULL || ar_tail == NULL)
2842 return;
2843
2844 /* Now stick them all into the archive. */
2845 ar_head->archive_next = head;
2846 ar_tail->archive_next = ar_head;
2847 head = ar_tail;
2848
2849 if (! bfd_set_archive_head (outarch, head))
2850 einfo ("%Xbfd_set_archive_head: %E\n");
2851
2852 if (! bfd_close (outarch))
2853 einfo ("%Xbfd_close %s: %E\n", impfilename);
2854
2855 while (head != NULL)
2856 {
2857 bfd *n = head->archive_next;
2858 bfd_close (head);
2859 head = n;
2860 }
2861 }
2862
2863 static int undef_count = 0;
2864
2865 struct key_value
2866 {
2867 char *key;
2868 const char *oname;
2869 };
2870
2871 static struct key_value *udef_table;
2872
2873 static int undef_sort_cmp (const void *l1, const void *r1)
2874 {
2875 const struct key_value *l = l1;
2876 const struct key_value *r = r1;
2877
2878 return strcmp (l->key, r->key);
2879 }
2880
2881 static struct bfd_link_hash_entry *
2882 pe_find_cdecl_alias_match (struct bfd_link_info *linfo, char *name)
2883 {
2884 struct bfd_link_hash_entry *h = NULL;
2885 struct key_value *kv;
2886 struct key_value key;
2887 char *at, *lname = (char *) alloca (strlen (name) + 3);
2888
2889 strcpy (lname, name);
2890
2891 at = strchr (lname + (lname[0] == '@'), '@');
2892 if (at)
2893 at[1] = 0;
2894
2895 key.key = lname;
2896 kv = bsearch (&key, udef_table, undef_count, sizeof (struct key_value),
2897 undef_sort_cmp);
2898
2899 if (kv)
2900 {
2901 h = bfd_link_hash_lookup (linfo->hash, kv->oname, FALSE, FALSE, FALSE);
2902 if (h->type == bfd_link_hash_undefined)
2903 return h;
2904 }
2905 if (lname[0] == '?')
2906 return NULL;
2907 if (at || lname[0] == '@')
2908 {
2909 if (lname[0] == '@')
2910 {
2911 if (pe_details->underscored)
2912 lname[0] = '_';
2913 else
2914 strcpy (lname, lname + 1);
2915 key.key = lname;
2916 kv = bsearch (&key, udef_table, undef_count,
2917 sizeof (struct key_value), undef_sort_cmp);
2918 if (kv)
2919 {
2920 h = bfd_link_hash_lookup (linfo->hash, kv->oname, FALSE, FALSE, FALSE);
2921 if (h->type == bfd_link_hash_undefined)
2922 return h;
2923 }
2924 }
2925 if (at)
2926 *strchr (lname, '@') = 0;
2927 key.key = lname;
2928 kv = bsearch (&key, udef_table, undef_count,
2929 sizeof (struct key_value), undef_sort_cmp);
2930 if (kv)
2931 {
2932 h = bfd_link_hash_lookup (linfo->hash, kv->oname, FALSE, FALSE, FALSE);
2933 if (h->type == bfd_link_hash_undefined)
2934 return h;
2935 }
2936 return NULL;
2937 }
2938
2939 strcat (lname, "@");
2940 key.key = lname;
2941 kv = bsearch (&key, udef_table, undef_count,
2942 sizeof (struct key_value), undef_sort_cmp);
2943
2944 if (kv)
2945 {
2946 h = bfd_link_hash_lookup (linfo->hash, kv->oname, FALSE, FALSE, FALSE);
2947 if (h->type == bfd_link_hash_undefined)
2948 return h;
2949 }
2950
2951 if (lname[0] == '_' && pe_details->underscored)
2952 lname[0] = '@';
2953 else
2954 {
2955 memmove (lname + 1, lname, strlen (lname) + 1);
2956 lname[0] = '@';
2957 }
2958 key.key = lname;
2959
2960 kv = bsearch (&key, udef_table, undef_count,
2961 sizeof (struct key_value), undef_sort_cmp);
2962
2963 if (kv)
2964 {
2965 h = bfd_link_hash_lookup (linfo->hash, kv->oname, FALSE, FALSE, FALSE);
2966 if (h->type == bfd_link_hash_undefined)
2967 return h;
2968 }
2969
2970 return NULL;
2971 }
2972
2973 static bfd_boolean
2974 pe_undef_count (struct bfd_link_hash_entry *h ATTRIBUTE_UNUSED,
2975 void *inf ATTRIBUTE_UNUSED)
2976 {
2977 if (h->type == bfd_link_hash_undefined)
2978 undef_count++;
2979 return TRUE;
2980 }
2981
2982 static bfd_boolean
2983 pe_undef_fill (struct bfd_link_hash_entry *h, void *inf ATTRIBUTE_UNUSED)
2984 {
2985 if (h->type == bfd_link_hash_undefined)
2986 {
2987 char *at;
2988
2989 udef_table[undef_count].key = xstrdup (h->root.string);
2990 at = strchr (udef_table[undef_count].key
2991 + (udef_table[undef_count].key[0] == '@'), '@');
2992 if (at)
2993 at[1] = 0;
2994 udef_table[undef_count].oname = h->root.string;
2995 undef_count++;
2996 }
2997 return TRUE;
2998 }
2999
3000 static void
3001 pe_create_undef_table (void)
3002 {
3003 undef_count = 0;
3004
3005 /* count undefined symbols */
3006
3007 bfd_link_hash_traverse (link_info.hash, pe_undef_count, "");
3008
3009 /* create and fill the corresponding table */
3010 udef_table = xmalloc (undef_count * sizeof (struct key_value));
3011
3012 undef_count = 0;
3013 bfd_link_hash_traverse (link_info.hash, pe_undef_fill, "");
3014
3015 /* sort items */
3016 qsort (udef_table, undef_count, sizeof (struct key_value), undef_sort_cmp);
3017 }
3018
3019 static void
3020 add_bfd_to_link (bfd *abfd, const char *name, struct bfd_link_info *linfo)
3021 {
3022 lang_input_statement_type *fake_file;
3023
3024 fake_file = lang_add_input_file (name,
3025 lang_input_file_is_fake_enum,
3026 NULL);
3027 fake_file->the_bfd = abfd;
3028 ldlang_add_file (fake_file);
3029
3030 if (!bfd_link_add_symbols (abfd, linfo))
3031 einfo ("%Xaddsym %s: %E\n", name);
3032 }
3033
3034 void
3035 pe_process_import_defs (bfd *output_bfd, struct bfd_link_info *linfo)
3036 {
3037 int i, j;
3038 def_file_module *module;
3039 def_file_import *imp;
3040
3041 pe_dll_id_target (bfd_get_target (output_bfd));
3042
3043 if (!pe_def_file)
3044 return;
3045
3046 imp = pe_def_file->imports;
3047
3048 pe_create_undef_table ();
3049
3050 for (module = pe_def_file->modules; module; module = module->next)
3051 {
3052 int do_this_dll = 0;
3053
3054 for (i = 0; i < pe_def_file->num_imports && imp[i].module != module; i++)
3055 ;
3056 if (i >= pe_def_file->num_imports)
3057 continue;
3058
3059 dll_filename = module->name;
3060 dll_symname = xstrdup (module->name);
3061 for (j = 0; dll_symname[j]; j++)
3062 if (!ISALNUM (dll_symname[j]))
3063 dll_symname[j] = '_';
3064
3065 for (; i < pe_def_file->num_imports && imp[i].module == module; i++)
3066 {
3067 def_file_export exp;
3068 struct bfd_link_hash_entry *blhe;
3069 int lead_at = (*imp[i].internal_name == '@');
3070 /* See if we need this import. */
3071 size_t len = strlen (imp[i].internal_name);
3072 char *name = xmalloc (len + 2 + 6);
3073 bfd_boolean include_jmp_stub = FALSE;
3074 bfd_boolean is_cdecl = FALSE;
3075 bfd_boolean is_undef = FALSE;
3076
3077 if (!lead_at && strchr (imp[i].internal_name, '@') == NULL)
3078 is_cdecl = TRUE;
3079
3080 if (lead_at)
3081 sprintf (name, "%s", imp[i].internal_name);
3082 else
3083 sprintf (name, "%s%s",U (""), imp[i].internal_name);
3084
3085 blhe = bfd_link_hash_lookup (linfo->hash, name,
3086 FALSE, FALSE, FALSE);
3087
3088 /* Include the jump stub for <sym> only if the <sym>
3089 is undefined. */
3090 if (!blhe || (blhe && blhe->type != bfd_link_hash_undefined))
3091 {
3092 if (lead_at)
3093 sprintf (name, "%s%s", "__imp_", imp[i].internal_name);
3094 else
3095 sprintf (name, "%s%s%s", "__imp_", U (""),
3096 imp[i].internal_name);
3097
3098 blhe = bfd_link_hash_lookup (linfo->hash, name,
3099 FALSE, FALSE, FALSE);
3100 if (blhe)
3101 is_undef = (blhe->type == bfd_link_hash_undefined);
3102 }
3103 else
3104 {
3105 include_jmp_stub = TRUE;
3106 is_undef = (blhe->type == bfd_link_hash_undefined);
3107 }
3108
3109 if (is_cdecl && (!blhe || (blhe && blhe->type != bfd_link_hash_undefined)))
3110 {
3111 sprintf (name, "%s%s",U (""), imp[i].internal_name);
3112 blhe = pe_find_cdecl_alias_match (linfo, name);
3113 include_jmp_stub = TRUE;
3114 if (blhe)
3115 is_undef = (blhe->type == bfd_link_hash_undefined);
3116 }
3117
3118 free (name);
3119
3120 if (is_undef)
3121 {
3122 bfd *one;
3123 /* We do. */
3124 if (!do_this_dll)
3125 {
3126 bfd *ar_head = make_head (output_bfd);
3127 add_bfd_to_link (ar_head, ar_head->filename, linfo);
3128 do_this_dll = 1;
3129 }
3130 exp.internal_name = imp[i].internal_name;
3131 exp.name = imp[i].name;
3132 exp.its_name = imp[i].its_name;
3133 exp.ordinal = imp[i].ordinal;
3134 exp.hint = exp.ordinal >= 0 ? exp.ordinal : 0;
3135 exp.flag_private = 0;
3136 exp.flag_constant = 0;
3137 exp.flag_data = imp[i].data;
3138 exp.flag_noname = exp.name ? 0 : 1;
3139 one = make_one (&exp, output_bfd, (! exp.flag_data) && include_jmp_stub);
3140 add_bfd_to_link (one, one->filename, linfo);
3141 }
3142 }
3143 if (do_this_dll)
3144 {
3145 bfd *ar_tail = make_tail (output_bfd);
3146 add_bfd_to_link (ar_tail, ar_tail->filename, linfo);
3147 }
3148
3149 free (dll_symname);
3150 }
3151
3152 while (undef_count)
3153 {
3154 --undef_count;
3155 free (udef_table[undef_count].key);
3156 }
3157 free (udef_table);
3158 }
3159
3160 /* We were handed a *.DLL file. Parse it and turn it into a set of
3161 IMPORTS directives in the def file. Return TRUE if the file was
3162 handled, FALSE if not. */
3163
3164 static unsigned int
3165 pe_get16 (bfd *abfd, int where)
3166 {
3167 unsigned char b[2];
3168
3169 bfd_seek (abfd, (file_ptr) where, SEEK_SET);
3170 bfd_bread (b, (bfd_size_type) 2, abfd);
3171 return b[0] + (b[1] << 8);
3172 }
3173
3174 static unsigned int
3175 pe_get32 (bfd *abfd, int where)
3176 {
3177 unsigned char b[4];
3178
3179 bfd_seek (abfd, (file_ptr) where, SEEK_SET);
3180 bfd_bread (b, (bfd_size_type) 4, abfd);
3181 return b[0] + (b[1] << 8) + (b[2] << 16) + (b[3] << 24);
3182 }
3183
3184 static unsigned int
3185 pe_as32 (void *ptr)
3186 {
3187 unsigned char *b = ptr;
3188
3189 return b[0] + (b[1] << 8) + (b[2] << 16) + (b[3] << 24);
3190 }
3191
3192 bfd_boolean
3193 pe_implied_import_dll (const char *filename)
3194 {
3195 bfd *dll;
3196 bfd_vma pe_header_offset, opthdr_ofs, num_entries, i;
3197 bfd_vma export_rva, export_size, nsections, secptr, expptr;
3198 bfd_vma exp_funcbase;
3199 unsigned char *expdata;
3200 char *erva;
3201 bfd_vma name_rvas, nexp;
3202 const char *dllname;
3203 /* Initialization with start > end guarantees that is_data
3204 will not be set by mistake, and avoids compiler warning. */
3205 bfd_vma data_start = 1;
3206 bfd_vma data_end = 0;
3207 bfd_vma rdata_start = 1;
3208 bfd_vma rdata_end = 0;
3209 bfd_vma bss_start = 1;
3210 bfd_vma bss_end = 0;
3211
3212 /* No, I can't use bfd here. kernel32.dll puts its export table in
3213 the middle of the .rdata section. */
3214 dll = bfd_openr (filename, pe_details->target_name);
3215 if (!dll)
3216 {
3217 einfo ("%Xopen %s: %E\n", filename);
3218 return FALSE;
3219 }
3220
3221 /* PEI dlls seem to be bfd_objects. */
3222 if (!bfd_check_format (dll, bfd_object))
3223 {
3224 einfo ("%X%s: this doesn't appear to be a DLL\n", filename);
3225 return FALSE;
3226 }
3227
3228 /* Get pe_header, optional header and numbers of directory entries. */
3229 pe_header_offset = pe_get32 (dll, 0x3c);
3230 opthdr_ofs = pe_header_offset + 4 + 20;
3231 #ifdef pe_use_x86_64
3232 num_entries = pe_get32 (dll, opthdr_ofs + 92 + 4 * 4); /* & NumberOfRvaAndSizes. */
3233 #else
3234 num_entries = pe_get32 (dll, opthdr_ofs + 92);
3235 #endif
3236
3237 /* No import or export directory entry. */
3238 if (num_entries < 1)
3239 return FALSE;
3240
3241 #ifdef pe_use_x86_64
3242 export_rva = pe_get32 (dll, opthdr_ofs + 96 + 4 * 4);
3243 export_size = pe_get32 (dll, opthdr_ofs + 100 + 4 * 4);
3244 #else
3245 export_rva = pe_get32 (dll, opthdr_ofs + 96);
3246 export_size = pe_get32 (dll, opthdr_ofs + 100);
3247 #endif
3248
3249 /* No export table - nothing to export. */
3250 if (export_size == 0)
3251 return FALSE;
3252
3253 nsections = pe_get16 (dll, pe_header_offset + 4 + 2);
3254 secptr = (pe_header_offset + 4 + 20 +
3255 pe_get16 (dll, pe_header_offset + 4 + 16));
3256 expptr = 0;
3257
3258 /* Get the rva and size of the export section. */
3259 for (i = 0; i < nsections; i++)
3260 {
3261 char sname[8];
3262 bfd_vma secptr1 = secptr + 40 * i;
3263 bfd_vma vaddr = pe_get32 (dll, secptr1 + 12);
3264 bfd_vma vsize = pe_get32 (dll, secptr1 + 16);
3265 bfd_vma fptr = pe_get32 (dll, secptr1 + 20);
3266
3267 bfd_seek (dll, (file_ptr) secptr1, SEEK_SET);
3268 bfd_bread (sname, (bfd_size_type) 8, dll);
3269
3270 if (vaddr <= export_rva && vaddr + vsize > export_rva)
3271 {
3272 expptr = fptr + (export_rva - vaddr);
3273 if (export_rva + export_size > vaddr + vsize)
3274 export_size = vsize - (export_rva - vaddr);
3275 break;
3276 }
3277 }
3278
3279 /* Scan sections and store the base and size of the
3280 data and bss segments in data/base_start/end. */
3281 for (i = 0; i < nsections; i++)
3282 {
3283 bfd_vma secptr1 = secptr + 40 * i;
3284 bfd_vma vsize = pe_get32 (dll, secptr1 + 8);
3285 bfd_vma vaddr = pe_get32 (dll, secptr1 + 12);
3286 bfd_vma flags = pe_get32 (dll, secptr1 + 36);
3287 char sec_name[9];
3288
3289 sec_name[8] = '\0';
3290 bfd_seek (dll, (file_ptr) secptr1 + 0, SEEK_SET);
3291 bfd_bread (sec_name, (bfd_size_type) 8, dll);
3292
3293 if (strcmp(sec_name,".data") == 0)
3294 {
3295 data_start = vaddr;
3296 data_end = vaddr + vsize;
3297
3298 if (pe_dll_extra_pe_debug)
3299 printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n",
3300 __FUNCTION__, sec_name, (unsigned long) vaddr,
3301 (unsigned long) (vaddr + vsize), (unsigned long) flags);
3302 }
3303 else if (strcmp(sec_name,".rdata") == 0)
3304 {
3305 rdata_start = vaddr;
3306 rdata_end = vaddr + vsize;
3307
3308 if (pe_dll_extra_pe_debug)
3309 printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n",
3310 __FUNCTION__, sec_name, (unsigned long) vaddr,
3311 (unsigned long) (vaddr + vsize), (unsigned long) flags);
3312 }
3313 else if (strcmp (sec_name,".bss") == 0)
3314 {
3315 bss_start = vaddr;
3316 bss_end = vaddr + vsize;
3317
3318 if (pe_dll_extra_pe_debug)
3319 printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n",
3320 __FUNCTION__, sec_name, (unsigned long) vaddr,
3321 (unsigned long) (vaddr + vsize), (unsigned long) flags);
3322 }
3323 }
3324
3325 expdata = xmalloc (export_size);
3326 bfd_seek (dll, (file_ptr) expptr, SEEK_SET);
3327 bfd_bread (expdata, (bfd_size_type) export_size, dll);
3328 erva = (char *) expdata - export_rva;
3329
3330 if (pe_def_file == 0)
3331 pe_def_file = def_file_empty ();
3332
3333 nexp = pe_as32 (expdata + 24);
3334 name_rvas = pe_as32 (expdata + 32);
3335 exp_funcbase = pe_as32 (expdata + 28);
3336
3337 /* Use internal dll name instead of filename
3338 to enable symbolic dll linking. */
3339 dllname = erva + pe_as32 (expdata + 12);
3340
3341 /* Check to see if the dll has already been added to
3342 the definition list and if so return without error.
3343 This avoids multiple symbol definitions. */
3344 if (def_get_module (pe_def_file, dllname))
3345 {
3346 if (pe_dll_extra_pe_debug)
3347 printf ("%s is already loaded\n", dllname);
3348 return TRUE;
3349 }
3350
3351 /* Iterate through the list of symbols. */
3352 for (i = 0; i < nexp; i++)
3353 {
3354 /* Pointer to the names vector. */
3355 bfd_vma name_rva = pe_as32 (erva + name_rvas + i * 4);
3356 def_file_import *imp;
3357 /* Pointer to the function address vector. */
3358 bfd_vma func_rva = pe_as32 (erva + exp_funcbase + i * 4);
3359 int is_data = 0;
3360
3361 /* Skip unwanted symbols, which are
3362 exported in buggy auto-import releases. */
3363 if (! CONST_STRNEQ (erva + name_rva, "__nm_"))
3364 {
3365 int is_dup = 0;
3366 /* is_data is true if the address is in the data, rdata or bss
3367 segment. */
3368 is_data =
3369 (func_rva >= data_start && func_rva < data_end)
3370 || (func_rva >= rdata_start && func_rva < rdata_end)
3371 || (func_rva >= bss_start && func_rva < bss_end);
3372
3373 imp = def_file_add_import (pe_def_file, erva + name_rva,
3374 dllname, i, NULL, NULL, &is_dup);
3375 /* Mark symbol type. */
3376 if (!is_dup)
3377 imp->data = is_data;
3378
3379 if (pe_dll_extra_pe_debug)
3380 printf ("%s dll-name: %s sym: %s addr: 0x%lx %s\n",
3381 __FUNCTION__, dllname, erva + name_rva,
3382 (unsigned long) func_rva, is_data ? "(data)" : "");
3383 }
3384 }
3385
3386 return TRUE;
3387 }
3388
3389 void
3390 pe_output_file_set_long_section_names (bfd *abfd)
3391 {
3392 if (pe_use_coff_long_section_names < 0)
3393 return;
3394 if (!bfd_coff_set_long_section_names (abfd, pe_use_coff_long_section_names))
3395 einfo (_("%XError: can't use long section names on this arch\n"));
3396 }
3397
3398 /* These are the main functions, called from the emulation. The first
3399 is called after the bfds are read, so we can guess at how much space
3400 we need. The second is called after everything is placed, so we
3401 can put the right values in place. */
3402
3403 void
3404 pe_dll_build_sections (bfd *abfd, struct bfd_link_info *info)
3405 {
3406 pe_dll_id_target (bfd_get_target (abfd));
3407 pe_output_file_set_long_section_names (abfd);
3408 process_def_file_and_drectve (abfd, info);
3409
3410 if (pe_def_file->num_exports == 0 && !bfd_link_pic (info))
3411 return;
3412
3413 generate_edata (abfd, info);
3414 build_filler_bfd (1);
3415 pe_output_file_set_long_section_names (filler_bfd);
3416 }
3417
3418 void
3419 pe_exe_build_sections (bfd *abfd, struct bfd_link_info *info ATTRIBUTE_UNUSED)
3420 {
3421 pe_dll_id_target (bfd_get_target (abfd));
3422 pe_output_file_set_long_section_names (abfd);
3423 build_filler_bfd (0);
3424 pe_output_file_set_long_section_names (filler_bfd);
3425 }
3426
3427 void
3428 pe_dll_fill_sections (bfd *abfd, struct bfd_link_info *info)
3429 {
3430 pe_dll_id_target (bfd_get_target (abfd));
3431 pe_output_file_set_long_section_names (abfd);
3432 image_base = pe_data (abfd)->pe_opthdr.ImageBase;
3433
3434 generate_reloc (abfd, info);
3435 if (reloc_sz > 0)
3436 {
3437 bfd_set_section_size (filler_bfd, reloc_s, reloc_sz);
3438
3439 /* Resize the sections. */
3440 lang_reset_memory_regions ();
3441 lang_size_sections (NULL, TRUE);
3442
3443 /* Redo special stuff. */
3444 ldemul_after_allocation ();
3445
3446 /* Do the assignments again. */
3447 lang_do_assignments (lang_final_phase_enum);
3448 }
3449
3450 fill_edata (abfd, info);
3451
3452 if (bfd_link_dll (info))
3453 pe_data (abfd)->dll = 1;
3454
3455 edata_s->contents = edata_d;
3456 reloc_s->contents = reloc_d;
3457 }
3458
3459 void
3460 pe_exe_fill_sections (bfd *abfd, struct bfd_link_info *info)
3461 {
3462 pe_dll_id_target (bfd_get_target (abfd));
3463 pe_output_file_set_long_section_names (abfd);
3464 image_base = pe_data (abfd)->pe_opthdr.ImageBase;
3465
3466 generate_reloc (abfd, info);
3467 if (reloc_sz > 0)
3468 {
3469 bfd_set_section_size (filler_bfd, reloc_s, reloc_sz);
3470
3471 /* Resize the sections. */
3472 lang_reset_memory_regions ();
3473 lang_size_sections (NULL, TRUE);
3474
3475 /* Redo special stuff. */
3476 ldemul_after_allocation ();
3477
3478 /* Do the assignments again. */
3479 lang_do_assignments (lang_final_phase_enum);
3480 }
3481 reloc_s->contents = reloc_d;
3482 }
3483
3484 bfd_boolean
3485 pe_bfd_is_dll (bfd *abfd)
3486 {
3487 return (bfd_get_format (abfd) == bfd_object
3488 && obj_pe (abfd)
3489 && pe_data (abfd)->dll);
3490 }
This page took 0.1627 seconds and 5 git commands to generate.