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