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