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