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