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