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