Add x86_64-mingw64 target
[binutils.git] / ld / pe-dll.c
blob994af1402af868d28e7acf8d8b103808813fdeab
1 /* Routines to help build PEI-format DLLs (Win32 etc)
2 Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006
3 Free Software Foundation, Inc.
4 Written by DJ Delorie <dj@cygnus.com>
6 This file is part of GLD, the Gnu Linker.
8 GLD 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 2, or (at your option)
11 any later version.
13 GLD 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.
18 You should have received a copy of the GNU General Public License
19 along with GLD; see the file COPYING. If not, write to the Free
20 Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
21 02110-1301, USA. */
23 #include "bfd.h"
24 #include "sysdep.h"
25 #include "bfdlink.h"
26 #include "libiberty.h"
27 #include "safe-ctype.h"
29 #include <time.h>
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"
44 #ifdef pe_use_x86_64
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
53 #else
55 #include "pe-dll.h"
57 #endif
59 #ifndef PE_IDATA4_SIZE
60 #define PE_IDATA4_SIZE 4
61 #endif
63 #ifndef PE_IDATA5_SIZE
64 #define PE_IDATA5_SIZE 4
65 #endif
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.
74 See also: ld/emultempl/pe.em and ld/emultempl/pep.em. */
76 /* Auto-import feature by Paul Sokolovsky
78 Quick facts:
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).
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.
88 3. Auto-import is fully compatible with standard import method and they
89 can be mixed together.
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).
96 Idea
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
102 mov dll_var,%eax,
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, ;-) .
115 Implementation
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 "om 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.
144 See also: ld/emultempl/pe.em and ld/emultempl/pep.em. */
146 static void add_bfd_to_link (bfd *, const char *, struct bfd_link_info *);
148 /* For emultempl/pe.em. */
150 def_file * pe_def_file = 0;
151 int pe_dll_export_everything = 0;
152 int pe_dll_do_default_excludes = 1;
153 int pe_dll_kill_ats = 0;
154 int pe_dll_stdcall_aliases = 0;
155 int pe_dll_warn_dup_exports = 0;
156 int pe_dll_compat_implib = 0;
157 int pe_dll_extra_pe_debug = 0;
159 /* Static variables and types. */
161 static bfd_vma image_base;
162 static bfd *filler_bfd;
163 static struct bfd_section *edata_s, *reloc_s;
164 static unsigned char *edata_d, *reloc_d;
165 static size_t edata_sz, reloc_sz;
166 static int runtime_pseudo_relocs_created = 0;
168 typedef struct
170 char *name;
171 int len;
173 autofilter_entry_type;
175 typedef struct
177 char *target_name;
178 char *object_target;
179 unsigned int imagebase_reloc;
180 int pe_arch;
181 int bfd_arch;
182 bfd_boolean underscored;
183 autofilter_entry_type* autofilter_symbollist;
185 pe_details_type;
187 static autofilter_entry_type autofilter_symbollist_generic[] =
189 { STRING_COMMA_LEN (".text") },
190 /* Entry point symbols. */
191 { STRING_COMMA_LEN ("DllMain") },
192 { STRING_COMMA_LEN ("DllMainCRTStartup") },
193 { STRING_COMMA_LEN ("_DllMainCRTStartup") },
194 /* Runtime pseudo-reloc. */
195 { STRING_COMMA_LEN ("_pei386_runtime_relocator") },
196 { STRING_COMMA_LEN ("do_pseudo_reloc") },
197 { STRING_COMMA_LEN (NULL) }
200 static autofilter_entry_type autofilter_symbollist_i386[] =
202 { STRING_COMMA_LEN (".text") },
203 /* Entry point symbols, and entry hooks. */
204 { STRING_COMMA_LEN ("cygwin_crt0") },
205 { STRING_COMMA_LEN ("DllMain@12") },
206 { STRING_COMMA_LEN ("DllEntryPoint@0") },
207 { STRING_COMMA_LEN ("DllMainCRTStartup@12") },
208 { STRING_COMMA_LEN ("_cygwin_dll_entry@12") },
209 { STRING_COMMA_LEN ("_cygwin_crt0_common@8") },
210 { STRING_COMMA_LEN ("_cygwin_noncygwin_dll_entry@12") },
211 { STRING_COMMA_LEN ("cygwin_attach_dll") },
212 { STRING_COMMA_LEN ("cygwin_premain0") },
213 { STRING_COMMA_LEN ("cygwin_premain1") },
214 { STRING_COMMA_LEN ("cygwin_premain2") },
215 { STRING_COMMA_LEN ("cygwin_premain3") },
216 /* Runtime pseudo-reloc. */
217 { STRING_COMMA_LEN ("_pei386_runtime_relocator") },
218 { STRING_COMMA_LEN ("do_pseudo_reloc") },
219 /* Global vars that should not be exported. */
220 { STRING_COMMA_LEN ("impure_ptr") },
221 { STRING_COMMA_LEN ("_impure_ptr") },
222 { STRING_COMMA_LEN ("_fmode") },
223 { STRING_COMMA_LEN ("environ") },
224 { STRING_COMMA_LEN (NULL) }
227 #define PE_ARCH_i386 1
228 #define PE_ARCH_sh 2
229 #define PE_ARCH_mips 3
230 #define PE_ARCH_arm 4
231 #define PE_ARCH_arm_epoc 5
232 #define PE_ARCH_arm_wince 6
234 static pe_details_type pe_detail_list[] =
237 #ifdef pe_use_x86_64
238 "pei-x86-64",
239 "pe-x86-64",
240 3 /* R_IMAGEBASE */,
241 #else
242 "pei-i386",
243 "pe-i386",
244 7 /* R_IMAGEBASE */,
245 #endif
246 PE_ARCH_i386,
247 bfd_arch_i386,
248 TRUE,
249 autofilter_symbollist_i386
252 "pei-shl",
253 "pe-shl",
254 16 /* R_SH_IMAGEBASE */,
255 PE_ARCH_sh,
256 bfd_arch_sh,
257 TRUE,
258 autofilter_symbollist_generic
261 "pei-mips",
262 "pe-mips",
263 34 /* MIPS_R_RVA */,
264 PE_ARCH_mips,
265 bfd_arch_mips,
266 FALSE,
267 autofilter_symbollist_generic
270 "pei-arm-little",
271 "pe-arm-little",
272 11 /* ARM_RVA32 */,
273 PE_ARCH_arm,
274 bfd_arch_arm,
275 TRUE,
276 autofilter_symbollist_generic
279 "epoc-pei-arm-little",
280 "epoc-pe-arm-little",
281 11 /* ARM_RVA32 */,
282 PE_ARCH_arm_epoc,
283 bfd_arch_arm,
284 FALSE,
285 autofilter_symbollist_generic
288 "pei-arm-wince-little",
289 "pe-arm-wince-little",
290 2, /* ARM_RVA32 on Windows CE, see bfd/coff-arm.c. */
291 PE_ARCH_arm_wince,
292 bfd_arch_arm,
293 FALSE,
294 autofilter_symbollist_generic
296 { NULL, NULL, 0, 0, 0, FALSE, NULL }
299 static pe_details_type *pe_details;
301 /* Do not specify library suffix explicitly, to allow for dllized versions. */
302 static autofilter_entry_type autofilter_liblist[] =
304 { STRING_COMMA_LEN ("libcegcc") },
305 { STRING_COMMA_LEN ("libcygwin") },
306 { STRING_COMMA_LEN ("libgcc") },
307 { STRING_COMMA_LEN ("libstdc++") },
308 { STRING_COMMA_LEN ("libmingw32") },
309 { STRING_COMMA_LEN ("libmingwex") },
310 { STRING_COMMA_LEN ("libg2c") },
311 { STRING_COMMA_LEN ("libsupc++") },
312 { STRING_COMMA_LEN ("libobjc") },
313 { STRING_COMMA_LEN ("libgcj") },
314 { STRING_COMMA_LEN (NULL) }
317 static autofilter_entry_type autofilter_objlist[] =
319 { STRING_COMMA_LEN ("crt0.o") },
320 { STRING_COMMA_LEN ("crt1.o") },
321 { STRING_COMMA_LEN ("crt2.o") },
322 { STRING_COMMA_LEN ("dllcrt1.o") },
323 { STRING_COMMA_LEN ("dllcrt2.o") },
324 { STRING_COMMA_LEN ("gcrt0.o") },
325 { STRING_COMMA_LEN ("gcrt1.o") },
326 { STRING_COMMA_LEN ("gcrt2.o") },
327 { STRING_COMMA_LEN ("crtbegin.o") },
328 { STRING_COMMA_LEN ("crtend.o") },
329 { STRING_COMMA_LEN (NULL) }
332 static autofilter_entry_type autofilter_symbolprefixlist[] =
334 { STRING_COMMA_LEN ("__imp_") },
335 /* Do __imp_ explicitly to save time. */
336 { STRING_COMMA_LEN ("__rtti_") },
337 /* Don't re-export auto-imported symbols. */
338 { STRING_COMMA_LEN ("_nm_") },
339 { STRING_COMMA_LEN ("__builtin_") },
340 /* Don't export symbols specifying internal DLL layout. */
341 { STRING_COMMA_LEN ("_head_") },
342 { STRING_COMMA_LEN (NULL) }
345 static autofilter_entry_type autofilter_symbolsuffixlist[] =
347 { STRING_COMMA_LEN ("_iname") },
348 { STRING_COMMA_LEN (NULL) }
351 #define U(str) (pe_details->underscored ? "_" str : str)
353 void
354 pe_dll_id_target (const char *target)
356 int i;
358 for (i = 0; pe_detail_list[i].target_name; i++)
359 if (strcmp (pe_detail_list[i].target_name, target) == 0
360 || strcmp (pe_detail_list[i].object_target, target) == 0)
362 pe_details = pe_detail_list + i;
363 return;
365 einfo (_("%XUnsupported PEI architecture: %s\n"), target);
366 exit (1);
369 /* Helper functions for qsort. Relocs must be sorted so that we can write
370 them out by pages. */
372 typedef struct
374 bfd_vma vma;
375 char type;
376 short extra;
378 reloc_data_type;
380 static int
381 reloc_sort (const void *va, const void *vb)
383 bfd_vma a = ((const reloc_data_type *) va)->vma;
384 bfd_vma b = ((const reloc_data_type *) vb)->vma;
386 return (a > b) ? 1 : ((a < b) ? -1 : 0);
389 static int
390 pe_export_sort (const void *va, const void *vb)
392 const def_file_export *a = va;
393 const def_file_export *b = vb;
395 return strcmp (a->name, b->name);
398 /* Read and process the .DEF file. */
400 /* These correspond to the entries in pe_def_file->exports[]. I use
401 exported_symbol_sections[i] to tag whether or not the symbol was
402 defined, since we can't export symbols we don't have. */
404 static bfd_vma *exported_symbol_offsets;
405 static struct bfd_section **exported_symbol_sections;
406 static int export_table_size;
407 static int count_exported;
408 static int count_exported_byname;
409 static int count_with_ordinals;
410 static const char *dll_name;
411 static int min_ordinal, max_ordinal;
412 static int *exported_symbols;
414 typedef struct exclude_list_struct
416 char *string;
417 struct exclude_list_struct *next;
418 int type;
420 exclude_list_struct;
422 static struct exclude_list_struct *excludes = 0;
424 void
425 pe_dll_add_excludes (const char *new_excludes, const int type)
427 char *local_copy;
428 char *exclude_string;
430 local_copy = xstrdup (new_excludes);
432 exclude_string = strtok (local_copy, ",:");
433 for (; exclude_string; exclude_string = strtok (NULL, ",:"))
435 struct exclude_list_struct *new_exclude;
437 new_exclude = xmalloc (sizeof (struct exclude_list_struct));
438 new_exclude->string = xmalloc (strlen (exclude_string) + 1);
439 strcpy (new_exclude->string, exclude_string);
440 new_exclude->type = type;
441 new_exclude->next = excludes;
442 excludes = new_exclude;
445 free (local_copy);
449 /* abfd is a bfd containing n (or NULL)
450 It can be used for contextual checks. */
452 static int
453 auto_export (bfd *abfd, def_file *d, const char *n)
455 int i;
456 struct exclude_list_struct *ex;
457 autofilter_entry_type *afptr;
458 const char * libname = 0;
459 if (abfd && abfd->my_archive)
460 libname = lbasename (abfd->my_archive->filename);
462 /* We should not re-export imported stuff. */
463 if (CONST_STRNEQ (n, "_imp_"))
464 return 0;
466 for (i = 0; i < d->num_exports; i++)
467 if (strcmp (d->exports[i].name, n) == 0)
468 return 0;
470 if (pe_dll_do_default_excludes)
472 const char * p;
473 int len;
475 if (pe_dll_extra_pe_debug)
476 printf ("considering exporting: %s, abfd=%p, abfd->my_arc=%p\n",
477 n, abfd, abfd->my_archive);
479 /* First of all, make context checks:
480 Don't export anything from standard libs. */
481 if (libname)
483 afptr = autofilter_liblist;
485 while (afptr->name)
487 if (strncmp (libname, afptr->name, afptr->len) == 0 )
488 return 0;
489 afptr++;
493 /* Next, exclude symbols from certain startup objects. */
495 if (abfd && (p = lbasename (abfd->filename)))
497 afptr = autofilter_objlist;
498 while (afptr->name)
500 if (strcmp (p, afptr->name) == 0)
501 return 0;
502 afptr++;
506 /* Don't try to blindly exclude all symbols
507 that begin with '__'; this was tried and
508 it is too restrictive. Instead we have
509 a target specific list to use: */
510 afptr = pe_details->autofilter_symbollist;
512 while (afptr->name)
514 if (strcmp (n, afptr->name) == 0)
515 return 0;
517 afptr++;
520 /* Next, exclude symbols starting with ... */
521 afptr = autofilter_symbolprefixlist;
522 while (afptr->name)
524 if (strncmp (n, afptr->name, afptr->len) == 0)
525 return 0;
527 afptr++;
530 /* Finally, exclude symbols ending with ... */
531 len = strlen (n);
532 afptr = autofilter_symbolsuffixlist;
533 while (afptr->name)
535 if ((len >= afptr->len)
536 /* Add 1 to insure match with trailing '\0'. */
537 && strncmp (n + len - afptr->len, afptr->name,
538 afptr->len + 1) == 0)
539 return 0;
541 afptr++;
545 for (ex = excludes; ex; ex = ex->next)
547 if (ex->type == 1) /* exclude-libs */
549 if (libname
550 && ((strcmp (libname, ex->string) == 0)
551 || (strcasecmp ("ALL", ex->string) == 0)))
552 return 0;
554 else if (strcmp (n, ex->string) == 0)
555 return 0;
558 return 1;
561 static void
562 process_def_file (bfd *abfd ATTRIBUTE_UNUSED, struct bfd_link_info *info)
564 int i, j;
565 struct bfd_link_hash_entry *blhe;
566 bfd *b;
567 struct bfd_section *s;
568 def_file_export *e = 0;
570 if (!pe_def_file)
571 pe_def_file = def_file_empty ();
573 /* First, run around to all the objects looking for the .drectve
574 sections, and push those into the def file too. */
575 for (b = info->input_bfds; b; b = b->link_next)
577 s = bfd_get_section_by_name (b, ".drectve");
578 if (s)
580 long size = s->size;
581 char *buf = xmalloc (size);
583 bfd_get_section_contents (b, s, buf, 0, size);
584 def_file_add_directive (pe_def_file, buf, size);
585 free (buf);
589 /* If we are not building a DLL, when there are no exports
590 we do not build an export table at all. */
591 if (!pe_dll_export_everything && pe_def_file->num_exports == 0
592 && info->executable)
593 return;
595 /* Now, maybe export everything else the default way. */
596 if (pe_dll_export_everything || pe_def_file->num_exports == 0)
598 for (b = info->input_bfds; b; b = b->link_next)
600 asymbol **symbols;
601 int nsyms, symsize;
603 symsize = bfd_get_symtab_upper_bound (b);
604 symbols = xmalloc (symsize);
605 nsyms = bfd_canonicalize_symtab (b, symbols);
607 for (j = 0; j < nsyms; j++)
609 /* We should export symbols which are either global or not
610 anything at all. (.bss data is the latter)
611 We should not export undefined symbols. */
612 if (symbols[j]->section != &bfd_und_section
613 && ((symbols[j]->flags & BSF_GLOBAL)
614 || (symbols[j]->flags == BFD_FORT_COMM_DEFAULT_VALUE)))
616 const char *sn = symbols[j]->name;
618 /* We should not re-export imported stuff. */
620 char *name = xmalloc (strlen (sn) + 2 + 6);
621 sprintf (name, "%s%s", U("_imp_"), sn);
623 blhe = bfd_link_hash_lookup (info->hash, name,
624 FALSE, FALSE, FALSE);
625 free (name);
627 if (blhe && blhe->type == bfd_link_hash_defined)
628 continue;
631 if (*sn == '_')
632 sn++;
634 if (auto_export (b, pe_def_file, sn))
636 def_file_export *p;
637 p=def_file_add_export (pe_def_file, sn, 0, -1);
638 /* Fill data flag properly, from dlltool.c. */
639 p->flag_data = !(symbols[j]->flags & BSF_FUNCTION);
646 #undef NE
647 #define NE pe_def_file->num_exports
649 /* Canonicalize the export list. */
650 if (pe_dll_kill_ats)
652 for (i = 0; i < NE; i++)
654 if (strchr (pe_def_file->exports[i].name, '@'))
656 /* This will preserve internal_name, which may have been
657 pointing to the same memory as name, or might not
658 have. */
659 int lead_at = (*pe_def_file->exports[i].name == '@');
660 char *tmp = xstrdup (pe_def_file->exports[i].name + lead_at);
661 char *tmp_at = strchr (tmp, '@');
663 if (tmp_at)
664 *tmp_at = 0;
665 else
666 einfo (_("%XCannot export %s: invalid export name\n"),
667 pe_def_file->exports[i].name);
668 pe_def_file->exports[i].name = tmp;
673 if (pe_dll_stdcall_aliases)
675 for (i = 0; i < NE; i++)
677 if (strchr (pe_def_file->exports[i].name, '@'))
679 int lead_at = (*pe_def_file->exports[i].name == '@');
680 char *tmp = xstrdup (pe_def_file->exports[i].name + lead_at);
682 *(strchr (tmp, '@')) = 0;
683 if (auto_export (NULL, pe_def_file, tmp))
684 def_file_add_export (pe_def_file, tmp,
685 pe_def_file->exports[i].internal_name,
686 -1);
687 else
688 free (tmp);
693 /* Convenience, but watch out for it changing. */
694 e = pe_def_file->exports;
696 exported_symbol_offsets = xmalloc (NE * sizeof (bfd_vma));
697 exported_symbol_sections = xmalloc (NE * sizeof (struct bfd_section *));
699 memset (exported_symbol_sections, 0, NE * sizeof (struct bfd_section *));
700 max_ordinal = 0;
701 min_ordinal = 65536;
702 count_exported = 0;
703 count_exported_byname = 0;
704 count_with_ordinals = 0;
706 qsort (pe_def_file->exports, NE, sizeof (pe_def_file->exports[0]),
707 pe_export_sort);
708 for (i = 0, j = 0; i < NE; i++)
710 if (i > 0 && strcmp (e[i].name, e[i - 1].name) == 0)
712 /* This is a duplicate. */
713 if (e[j - 1].ordinal != -1
714 && e[i].ordinal != -1
715 && e[j - 1].ordinal != e[i].ordinal)
717 if (pe_dll_warn_dup_exports)
718 /* xgettext:c-format */
719 einfo (_("%XError, duplicate EXPORT with ordinals: %s (%d vs %d)\n"),
720 e[j - 1].name, e[j - 1].ordinal, e[i].ordinal);
722 else
724 if (pe_dll_warn_dup_exports)
725 /* xgettext:c-format */
726 einfo (_("Warning, duplicate EXPORT: %s\n"),
727 e[j - 1].name);
730 if (e[i].ordinal != -1)
731 e[j - 1].ordinal = e[i].ordinal;
732 e[j - 1].flag_private |= e[i].flag_private;
733 e[j - 1].flag_constant |= e[i].flag_constant;
734 e[j - 1].flag_noname |= e[i].flag_noname;
735 e[j - 1].flag_data |= e[i].flag_data;
737 else
739 if (i != j)
740 e[j] = e[i];
741 j++;
744 pe_def_file->num_exports = j; /* == NE */
746 for (i = 0; i < NE; i++)
748 char *name;
750 /* Check for forward exports */
751 if (strchr (pe_def_file->exports[i].internal_name, '.'))
753 count_exported++;
754 if (!pe_def_file->exports[i].flag_noname)
755 count_exported_byname++;
757 pe_def_file->exports[i].flag_forward = 1;
759 if (pe_def_file->exports[i].ordinal != -1)
761 if (max_ordinal < pe_def_file->exports[i].ordinal)
762 max_ordinal = pe_def_file->exports[i].ordinal;
763 if (min_ordinal > pe_def_file->exports[i].ordinal)
764 min_ordinal = pe_def_file->exports[i].ordinal;
765 count_with_ordinals++;
768 continue;
771 name = xmalloc (strlen (pe_def_file->exports[i].internal_name) + 2);
772 if (pe_details->underscored
773 && (*pe_def_file->exports[i].internal_name != '@'))
775 *name = '_';
776 strcpy (name + 1, pe_def_file->exports[i].internal_name);
778 else
779 strcpy (name, pe_def_file->exports[i].internal_name);
781 blhe = bfd_link_hash_lookup (info->hash,
782 name,
783 FALSE, FALSE, TRUE);
785 if (blhe
786 && (blhe->type == bfd_link_hash_defined
787 || (blhe->type == bfd_link_hash_common)))
789 count_exported++;
790 if (!pe_def_file->exports[i].flag_noname)
791 count_exported_byname++;
793 /* Only fill in the sections. The actual offsets are computed
794 in fill_exported_offsets() after common symbols are laid
795 out. */
796 if (blhe->type == bfd_link_hash_defined)
797 exported_symbol_sections[i] = blhe->u.def.section;
798 else
799 exported_symbol_sections[i] = blhe->u.c.p->section;
801 if (pe_def_file->exports[i].ordinal != -1)
803 if (max_ordinal < pe_def_file->exports[i].ordinal)
804 max_ordinal = pe_def_file->exports[i].ordinal;
805 if (min_ordinal > pe_def_file->exports[i].ordinal)
806 min_ordinal = pe_def_file->exports[i].ordinal;
807 count_with_ordinals++;
810 else if (blhe && blhe->type == bfd_link_hash_undefined)
812 /* xgettext:c-format */
813 einfo (_("%XCannot export %s: symbol not defined\n"),
814 pe_def_file->exports[i].internal_name);
816 else if (blhe)
818 /* xgettext:c-format */
819 einfo (_("%XCannot export %s: symbol wrong type (%d vs %d)\n"),
820 pe_def_file->exports[i].internal_name,
821 blhe->type, bfd_link_hash_defined);
823 else
825 /* xgettext:c-format */
826 einfo (_("%XCannot export %s: symbol not found\n"),
827 pe_def_file->exports[i].internal_name);
829 free (name);
833 /* Build the bfd that will contain .edata and .reloc sections. */
835 static void
836 build_filler_bfd (int include_edata)
838 lang_input_statement_type *filler_file;
839 filler_file = lang_add_input_file ("dll stuff",
840 lang_input_file_is_fake_enum,
841 NULL);
842 filler_file->the_bfd = filler_bfd = bfd_create ("dll stuff", output_bfd);
843 if (filler_bfd == NULL
844 || !bfd_set_arch_mach (filler_bfd,
845 bfd_get_arch (output_bfd),
846 bfd_get_mach (output_bfd)))
848 einfo ("%X%P: can not create BFD: %E\n");
849 return;
852 if (include_edata)
854 edata_s = bfd_make_section_old_way (filler_bfd, ".edata");
855 if (edata_s == NULL
856 || !bfd_set_section_flags (filler_bfd, edata_s,
857 (SEC_HAS_CONTENTS
858 | SEC_ALLOC
859 | SEC_LOAD
860 | SEC_KEEP
861 | SEC_IN_MEMORY)))
863 einfo ("%X%P: can not create .edata section: %E\n");
864 return;
866 bfd_set_section_size (filler_bfd, edata_s, edata_sz);
869 reloc_s = bfd_make_section_old_way (filler_bfd, ".reloc");
870 if (reloc_s == NULL
871 || !bfd_set_section_flags (filler_bfd, reloc_s,
872 (SEC_HAS_CONTENTS
873 | SEC_ALLOC
874 | SEC_LOAD
875 | SEC_KEEP
876 | SEC_IN_MEMORY)))
878 einfo ("%X%P: can not create .reloc section: %E\n");
879 return;
882 bfd_set_section_size (filler_bfd, reloc_s, 0);
884 ldlang_add_file (filler_file);
887 /* Gather all the exported symbols and build the .edata section. */
889 static void
890 generate_edata (bfd *abfd, struct bfd_link_info *info ATTRIBUTE_UNUSED)
892 int i, next_ordinal;
893 int name_table_size = 0;
894 const char *dlnp;
896 /* First, we need to know how many exported symbols there are,
897 and what the range of ordinals is. */
898 if (pe_def_file->name)
899 dll_name = pe_def_file->name;
900 else
902 dll_name = abfd->filename;
904 for (dlnp = dll_name; *dlnp; dlnp++)
905 if (*dlnp == '\\' || *dlnp == '/' || *dlnp == ':')
906 dll_name = dlnp + 1;
909 if (count_with_ordinals && max_ordinal > count_exported)
911 if (min_ordinal > max_ordinal - count_exported + 1)
912 min_ordinal = max_ordinal - count_exported + 1;
914 else
916 min_ordinal = 1;
917 max_ordinal = count_exported;
920 export_table_size = max_ordinal - min_ordinal + 1;
921 exported_symbols = xmalloc (export_table_size * sizeof (int));
922 for (i = 0; i < export_table_size; i++)
923 exported_symbols[i] = -1;
925 /* Now we need to assign ordinals to those that don't have them. */
926 for (i = 0; i < NE; i++)
928 if (exported_symbol_sections[i] ||
929 pe_def_file->exports[i].flag_forward)
931 if (pe_def_file->exports[i].ordinal != -1)
933 int ei = pe_def_file->exports[i].ordinal - min_ordinal;
934 int pi = exported_symbols[ei];
936 if (pi != -1)
938 /* xgettext:c-format */
939 einfo (_("%XError, ordinal used twice: %d (%s vs %s)\n"),
940 pe_def_file->exports[i].ordinal,
941 pe_def_file->exports[i].name,
942 pe_def_file->exports[pi].name);
944 exported_symbols[ei] = i;
946 name_table_size += strlen (pe_def_file->exports[i].name) + 1;
949 /* Reserve space for the forward name. */
950 if (pe_def_file->exports[i].flag_forward)
952 name_table_size += strlen (pe_def_file->exports[i].internal_name) + 1;
956 next_ordinal = min_ordinal;
957 for (i = 0; i < NE; i++)
958 if ((exported_symbol_sections[i] ||
959 pe_def_file->exports[i].flag_forward) &&
960 pe_def_file->exports[i].ordinal == -1)
962 while (exported_symbols[next_ordinal - min_ordinal] != -1)
963 next_ordinal++;
965 exported_symbols[next_ordinal - min_ordinal] = i;
966 pe_def_file->exports[i].ordinal = next_ordinal;
969 /* OK, now we can allocate some memory. */
970 edata_sz = (40 /* directory */
971 + 4 * export_table_size /* addresses */
972 + 4 * count_exported_byname /* name ptrs */
973 + 2 * count_exported_byname /* ordinals */
974 + name_table_size + strlen (dll_name) + 1);
977 /* Fill the exported symbol offsets. The preliminary work has already
978 been done in process_def_file(). */
980 static void
981 fill_exported_offsets (bfd *abfd ATTRIBUTE_UNUSED, struct bfd_link_info *info)
983 int i;
984 struct bfd_link_hash_entry *blhe;
986 for (i = 0; i < pe_def_file->num_exports; i++)
988 char *name;
990 name = xmalloc (strlen (pe_def_file->exports[i].internal_name) + 2);
991 if (pe_details->underscored
992 && *pe_def_file->exports[i].internal_name != '@')
994 *name = '_';
995 strcpy (name + 1, pe_def_file->exports[i].internal_name);
997 else
998 strcpy (name, pe_def_file->exports[i].internal_name);
1000 blhe = bfd_link_hash_lookup (info->hash,
1001 name,
1002 FALSE, FALSE, TRUE);
1004 if (blhe && blhe->type == bfd_link_hash_defined)
1005 exported_symbol_offsets[i] = blhe->u.def.value;
1007 free (name);
1011 static void
1012 fill_edata (bfd *abfd, struct bfd_link_info *info ATTRIBUTE_UNUSED)
1014 int s, hint;
1015 unsigned char *edirectory;
1016 unsigned char *eaddresses;
1017 unsigned char *enameptrs;
1018 unsigned char *eordinals;
1019 char *enamestr;
1020 time_t now;
1022 time (&now);
1024 edata_d = xmalloc (edata_sz);
1026 /* Note use of array pointer math here. */
1027 edirectory = edata_d;
1028 eaddresses = edata_d + 40;
1029 enameptrs = eaddresses + 4 * export_table_size;
1030 eordinals = enameptrs + 4 * count_exported_byname;
1031 enamestr = (char *) eordinals + 2 * count_exported_byname;
1033 #define ERVA(ptr) (((unsigned char *)(ptr) - edata_d) \
1034 + edata_s->output_section->vma - image_base)
1036 memset (edata_d, 0, edata_sz);
1037 bfd_put_32 (abfd, now, edata_d + 4);
1038 if (pe_def_file->version_major != -1)
1040 bfd_put_16 (abfd, pe_def_file->version_major, edata_d + 8);
1041 bfd_put_16 (abfd, pe_def_file->version_minor, edata_d + 10);
1044 bfd_put_32 (abfd, ERVA (enamestr), edata_d + 12);
1045 strcpy (enamestr, dll_name);
1046 enamestr += strlen (enamestr) + 1;
1047 bfd_put_32 (abfd, min_ordinal, edata_d + 16);
1048 bfd_put_32 (abfd, export_table_size, edata_d + 20);
1049 bfd_put_32 (abfd, count_exported_byname, edata_d + 24);
1050 bfd_put_32 (abfd, ERVA (eaddresses), edata_d + 28);
1051 bfd_put_32 (abfd, ERVA (enameptrs), edata_d + 32);
1052 bfd_put_32 (abfd, ERVA (eordinals), edata_d + 36);
1054 fill_exported_offsets (abfd, info);
1056 /* Ok, now for the filling in part.
1057 Scan alphabetically - ie the ordering in the exports[] table,
1058 rather than by ordinal - the ordering in the exported_symbol[]
1059 table. See dlltool.c and:
1060 http://sources.redhat.com/ml/binutils/2003-04/msg00379.html
1061 for more information. */
1062 hint = 0;
1063 for (s = 0; s < NE; s++)
1065 struct bfd_section *ssec = exported_symbol_sections[s];
1066 if (pe_def_file->exports[s].ordinal != -1 &&
1067 (pe_def_file->exports[s].flag_forward || ssec != NULL))
1069 int ord = pe_def_file->exports[s].ordinal;
1071 if (pe_def_file->exports[s].flag_forward)
1073 bfd_put_32 (abfd, ERVA (enamestr),
1074 eaddresses + 4 * (ord - min_ordinal));
1076 strcpy (enamestr, pe_def_file->exports[s].internal_name);
1077 enamestr += strlen (pe_def_file->exports[s].internal_name) + 1;
1079 else
1081 unsigned long srva = (exported_symbol_offsets[s]
1082 + ssec->output_section->vma
1083 + ssec->output_offset);
1085 bfd_put_32 (abfd, srva - image_base,
1086 eaddresses + 4 * (ord - min_ordinal));
1089 if (!pe_def_file->exports[s].flag_noname)
1091 char *ename = pe_def_file->exports[s].name;
1093 bfd_put_32 (abfd, ERVA (enamestr), enameptrs);
1094 enameptrs += 4;
1095 strcpy (enamestr, ename);
1096 enamestr += strlen (enamestr) + 1;
1097 bfd_put_16 (abfd, ord - min_ordinal, eordinals);
1098 eordinals += 2;
1099 pe_def_file->exports[s].hint = hint++;
1106 static struct bfd_section *current_sec;
1108 void
1109 pe_walk_relocs_of_symbol (struct bfd_link_info *info,
1110 const char *name,
1111 int (*cb) (arelent *, asection *))
1113 bfd *b;
1114 asection *s;
1116 for (b = info->input_bfds; b; b = b->link_next)
1118 asymbol **symbols;
1119 int nsyms, symsize;
1121 symsize = bfd_get_symtab_upper_bound (b);
1122 symbols = xmalloc (symsize);
1123 nsyms = bfd_canonicalize_symtab (b, symbols);
1125 for (s = b->sections; s; s = s->next)
1127 arelent **relocs;
1128 int relsize, nrelocs, i;
1129 int flags = bfd_get_section_flags (b, s);
1131 /* Skip discarded linkonce sections. */
1132 if (flags & SEC_LINK_ONCE
1133 && s->output_section == bfd_abs_section_ptr)
1134 continue;
1136 current_sec = s;
1138 relsize = bfd_get_reloc_upper_bound (b, s);
1139 relocs = xmalloc (relsize);
1140 nrelocs = bfd_canonicalize_reloc (b, s, relocs, symbols);
1142 for (i = 0; i < nrelocs; i++)
1144 struct bfd_symbol *sym = *relocs[i]->sym_ptr_ptr;
1146 if (!strcmp (name, sym->name))
1147 cb (relocs[i], s);
1150 free (relocs);
1152 /* Warning: the allocated symbols are remembered in BFD and reused
1153 later, so don't free them! */
1154 /* free (symbols); */
1159 /* Gather all the relocations and build the .reloc section. */
1161 static void
1162 generate_reloc (bfd *abfd, struct bfd_link_info *info)
1165 /* For .reloc stuff. */
1166 reloc_data_type *reloc_data;
1167 int total_relocs = 0;
1168 int i;
1169 unsigned long sec_page = (unsigned long) -1;
1170 unsigned long page_ptr, page_count;
1171 int bi;
1172 bfd *b;
1173 struct bfd_section *s;
1175 total_relocs = 0;
1176 for (b = info->input_bfds; b; b = b->link_next)
1177 for (s = b->sections; s; s = s->next)
1178 total_relocs += s->reloc_count;
1180 reloc_data = xmalloc (total_relocs * sizeof (reloc_data_type));
1182 total_relocs = 0;
1183 bi = 0;
1184 for (bi = 0, b = info->input_bfds; b; bi++, b = b->link_next)
1186 arelent **relocs;
1187 int relsize, nrelocs, i;
1189 for (s = b->sections; s; s = s->next)
1191 unsigned long sec_vma = s->output_section->vma + s->output_offset;
1192 asymbol **symbols;
1193 int nsyms, symsize;
1195 /* If it's not loaded, we don't need to relocate it this way. */
1196 if (!(s->output_section->flags & SEC_LOAD))
1197 continue;
1199 /* I don't know why there would be a reloc for these, but I've
1200 seen it happen - DJ */
1201 if (s->output_section == &bfd_abs_section)
1202 continue;
1204 if (s->output_section->vma == 0)
1206 /* Huh? Shouldn't happen, but punt if it does. */
1207 einfo ("DJ: zero vma section reloc detected: `%s' #%d f=%d\n",
1208 s->output_section->name, s->output_section->index,
1209 s->output_section->flags);
1210 continue;
1213 symsize = bfd_get_symtab_upper_bound (b);
1214 symbols = xmalloc (symsize);
1215 nsyms = bfd_canonicalize_symtab (b, symbols);
1217 relsize = bfd_get_reloc_upper_bound (b, s);
1218 relocs = xmalloc (relsize);
1219 nrelocs = bfd_canonicalize_reloc (b, s, relocs, symbols);
1221 for (i = 0; i < nrelocs; i++)
1223 if (pe_dll_extra_pe_debug)
1225 struct bfd_symbol *sym = *relocs[i]->sym_ptr_ptr;
1226 printf ("rel: %s\n", sym->name);
1228 if (!relocs[i]->howto->pc_relative
1229 && relocs[i]->howto->type != pe_details->imagebase_reloc)
1231 bfd_vma sym_vma;
1232 struct bfd_symbol *sym = *relocs[i]->sym_ptr_ptr;
1234 sym_vma = (relocs[i]->addend
1235 + sym->value
1236 + sym->section->vma
1237 + sym->section->output_offset
1238 + sym->section->output_section->vma);
1239 reloc_data[total_relocs].vma = sec_vma + relocs[i]->address;
1241 #define BITS_AND_SHIFT(bits, shift) (bits * 1000 | shift)
1243 switch BITS_AND_SHIFT (relocs[i]->howto->bitsize,
1244 relocs[i]->howto->rightshift)
1246 #ifdef pe_use_x86_64
1247 case BITS_AND_SHIFT (64, 0):
1248 reloc_data[total_relocs].type = 10;
1249 total_relocs++;
1250 break;
1251 #endif
1252 case BITS_AND_SHIFT (32, 0):
1253 reloc_data[total_relocs].type = 3;
1254 total_relocs++;
1255 break;
1256 case BITS_AND_SHIFT (16, 0):
1257 reloc_data[total_relocs].type = 2;
1258 total_relocs++;
1259 break;
1260 case BITS_AND_SHIFT (16, 16):
1261 reloc_data[total_relocs].type = 4;
1262 /* FIXME: we can't know the symbol's right value
1263 yet, but we probably can safely assume that
1264 CE will relocate us in 64k blocks, so leaving
1265 it zero is safe. */
1266 reloc_data[total_relocs].extra = 0;
1267 total_relocs++;
1268 break;
1269 case BITS_AND_SHIFT (26, 2):
1270 reloc_data[total_relocs].type = 5;
1271 total_relocs++;
1272 break;
1273 case BITS_AND_SHIFT (24, 2):
1274 /* FIXME: 0 is ARM_26D, it is defined in bfd/coff-arm.c
1275 Those ARM_xxx definitions should go in proper
1276 header someday. */
1277 if (relocs[i]->howto->type == 0
1278 /* Older GNU linkers used 5 instead of 0 for this reloc. */
1279 || relocs[i]->howto->type == 5)
1280 /* This is an ARM_26D reloc, which is an ARM_26 reloc
1281 that has already been fully processed during a
1282 previous link stage, so ignore it here. */
1283 break;
1284 /* Fall through. */
1285 default:
1286 /* xgettext:c-format */
1287 einfo (_("%XError: %d-bit reloc in dll\n"),
1288 relocs[i]->howto->bitsize);
1289 break;
1293 free (relocs);
1294 /* Warning: the allocated symbols are remembered in BFD and
1295 reused later, so don't free them! */
1299 /* At this point, we have total_relocs relocation addresses in
1300 reloc_addresses, which are all suitable for the .reloc section.
1301 We must now create the new sections. */
1302 qsort (reloc_data, total_relocs, sizeof (*reloc_data), reloc_sort);
1304 for (i = 0; i < total_relocs; i++)
1306 unsigned long this_page = (reloc_data[i].vma >> 12);
1308 if (this_page != sec_page)
1310 reloc_sz = (reloc_sz + 3) & ~3; /* 4-byte align. */
1311 reloc_sz += 8;
1312 sec_page = this_page;
1315 reloc_sz += 2;
1317 if (reloc_data[i].type == 4)
1318 reloc_sz += 2;
1321 reloc_sz = (reloc_sz + 3) & ~3; /* 4-byte align. */
1322 reloc_d = xmalloc (reloc_sz);
1323 sec_page = (unsigned long) -1;
1324 reloc_sz = 0;
1325 page_ptr = (unsigned long) -1;
1326 page_count = 0;
1328 for (i = 0; i < total_relocs; i++)
1330 unsigned long rva = reloc_data[i].vma - image_base;
1331 unsigned long this_page = (rva & ~0xfff);
1333 if (this_page != sec_page)
1335 while (reloc_sz & 3)
1336 reloc_d[reloc_sz++] = 0;
1338 if (page_ptr != (unsigned long) -1)
1339 bfd_put_32 (abfd, reloc_sz - page_ptr, reloc_d + page_ptr + 4);
1341 bfd_put_32 (abfd, this_page, reloc_d + reloc_sz);
1342 page_ptr = reloc_sz;
1343 reloc_sz += 8;
1344 sec_page = this_page;
1345 page_count = 0;
1348 bfd_put_16 (abfd, (rva & 0xfff) + (reloc_data[i].type << 12),
1349 reloc_d + reloc_sz);
1350 reloc_sz += 2;
1352 if (reloc_data[i].type == 4)
1354 bfd_put_16 (abfd, reloc_data[i].extra, reloc_d + reloc_sz);
1355 reloc_sz += 2;
1358 page_count++;
1361 while (reloc_sz & 3)
1362 reloc_d[reloc_sz++] = 0;
1364 if (page_ptr != (unsigned long) -1)
1365 bfd_put_32 (abfd, reloc_sz - page_ptr, reloc_d + page_ptr + 4);
1367 while (reloc_sz < reloc_s->size)
1368 reloc_d[reloc_sz++] = 0;
1371 /* Given the exiting def_file structure, print out a .DEF file that
1372 corresponds to it. */
1374 static void
1375 quoteput (char *s, FILE *f, int needs_quotes)
1377 char *cp;
1379 for (cp = s; *cp; cp++)
1380 if (*cp == '\''
1381 || *cp == '"'
1382 || *cp == '\\'
1383 || ISSPACE (*cp)
1384 || *cp == ','
1385 || *cp == ';')
1386 needs_quotes = 1;
1388 if (needs_quotes)
1390 putc ('"', f);
1392 while (*s)
1394 if (*s == '"' || *s == '\\')
1395 putc ('\\', f);
1397 putc (*s, f);
1398 s++;
1401 putc ('"', f);
1403 else
1404 fputs (s, f);
1407 void
1408 pe_dll_generate_def_file (const char *pe_out_def_filename)
1410 int i;
1411 FILE *out = fopen (pe_out_def_filename, "w");
1413 if (out == NULL)
1414 /* xgettext:c-format */
1415 einfo (_("%s: Can't open output def file %s\n"),
1416 program_name, pe_out_def_filename);
1418 if (pe_def_file)
1420 if (pe_def_file->name)
1422 if (pe_def_file->is_dll)
1423 fprintf (out, "LIBRARY ");
1424 else
1425 fprintf (out, "NAME ");
1427 quoteput (pe_def_file->name, out, 1);
1429 if (pe_data (output_bfd)->pe_opthdr.ImageBase)
1430 fprintf (out, " BASE=0x%lx",
1431 (unsigned long) pe_data (output_bfd)->pe_opthdr.ImageBase);
1432 fprintf (out, "\n");
1435 if (pe_def_file->description)
1437 fprintf (out, "DESCRIPTION ");
1438 quoteput (pe_def_file->description, out, 1);
1439 fprintf (out, "\n");
1442 if (pe_def_file->version_minor != -1)
1443 fprintf (out, "VERSION %d.%d\n", pe_def_file->version_major,
1444 pe_def_file->version_minor);
1445 else if (pe_def_file->version_major != -1)
1446 fprintf (out, "VERSION %d\n", pe_def_file->version_major);
1448 if (pe_def_file->stack_reserve != -1 || pe_def_file->heap_reserve != -1)
1449 fprintf (out, "\n");
1451 if (pe_def_file->stack_commit != -1)
1452 fprintf (out, "STACKSIZE 0x%x,0x%x\n",
1453 pe_def_file->stack_reserve, pe_def_file->stack_commit);
1454 else if (pe_def_file->stack_reserve != -1)
1455 fprintf (out, "STACKSIZE 0x%x\n", pe_def_file->stack_reserve);
1457 if (pe_def_file->heap_commit != -1)
1458 fprintf (out, "HEAPSIZE 0x%x,0x%x\n",
1459 pe_def_file->heap_reserve, pe_def_file->heap_commit);
1460 else if (pe_def_file->heap_reserve != -1)
1461 fprintf (out, "HEAPSIZE 0x%x\n", pe_def_file->heap_reserve);
1463 if (pe_def_file->num_section_defs > 0)
1465 fprintf (out, "\nSECTIONS\n\n");
1467 for (i = 0; i < pe_def_file->num_section_defs; i++)
1469 fprintf (out, " ");
1470 quoteput (pe_def_file->section_defs[i].name, out, 0);
1472 if (pe_def_file->section_defs[i].class)
1474 fprintf (out, " CLASS ");
1475 quoteput (pe_def_file->section_defs[i].class, out, 0);
1478 if (pe_def_file->section_defs[i].flag_read)
1479 fprintf (out, " READ");
1481 if (pe_def_file->section_defs[i].flag_write)
1482 fprintf (out, " WRITE");
1484 if (pe_def_file->section_defs[i].flag_execute)
1485 fprintf (out, " EXECUTE");
1487 if (pe_def_file->section_defs[i].flag_shared)
1488 fprintf (out, " SHARED");
1490 fprintf (out, "\n");
1494 if (pe_def_file->num_exports > 0)
1496 fprintf (out, "EXPORTS\n");
1498 for (i = 0; i < pe_def_file->num_exports; i++)
1500 def_file_export *e = pe_def_file->exports + i;
1501 fprintf (out, " ");
1502 quoteput (e->name, out, 0);
1504 if (e->internal_name && strcmp (e->internal_name, e->name))
1506 fprintf (out, " = ");
1507 quoteput (e->internal_name, out, 0);
1510 if (e->ordinal != -1)
1511 fprintf (out, " @%d", e->ordinal);
1513 if (e->flag_private)
1514 fprintf (out, " PRIVATE");
1516 if (e->flag_constant)
1517 fprintf (out, " CONSTANT");
1519 if (e->flag_noname)
1520 fprintf (out, " NONAME");
1522 if (e->flag_data)
1523 fprintf (out, " DATA");
1525 fprintf (out, "\n");
1529 if (pe_def_file->num_imports > 0)
1531 fprintf (out, "\nIMPORTS\n\n");
1533 for (i = 0; i < pe_def_file->num_imports; i++)
1535 def_file_import *im = pe_def_file->imports + i;
1536 fprintf (out, " ");
1538 if (im->internal_name
1539 && (!im->name || strcmp (im->internal_name, im->name)))
1541 quoteput (im->internal_name, out, 0);
1542 fprintf (out, " = ");
1545 quoteput (im->module->name, out, 0);
1546 fprintf (out, ".");
1548 if (im->name)
1549 quoteput (im->name, out, 0);
1550 else
1551 fprintf (out, "%d", im->ordinal);
1553 fprintf (out, "\n");
1557 else
1558 fprintf (out, _("; no contents available\n"));
1560 if (fclose (out) == EOF)
1561 /* xgettext:c-format */
1562 einfo (_("%P: Error closing file `%s'\n"), pe_out_def_filename);
1565 /* Generate the import library. */
1567 static asymbol **symtab;
1568 static int symptr;
1569 static int tmp_seq;
1570 static const char *dll_filename;
1571 static char *dll_symname;
1573 #define UNDSEC (asection *) &bfd_und_section
1575 static asection *
1576 quick_section (bfd *abfd, const char *name, int flags, int align)
1578 asection *sec;
1579 asymbol *sym;
1581 sec = bfd_make_section_old_way (abfd, name);
1582 bfd_set_section_flags (abfd, sec, flags | SEC_ALLOC | SEC_LOAD | SEC_KEEP);
1583 bfd_set_section_alignment (abfd, sec, align);
1584 /* Remember to undo this before trying to link internally! */
1585 sec->output_section = sec;
1587 sym = bfd_make_empty_symbol (abfd);
1588 symtab[symptr++] = sym;
1589 sym->name = sec->name;
1590 sym->section = sec;
1591 sym->flags = BSF_LOCAL;
1592 sym->value = 0;
1594 return sec;
1597 static void
1598 quick_symbol (bfd *abfd,
1599 const char *n1,
1600 const char *n2,
1601 const char *n3,
1602 asection *sec,
1603 int flags,
1604 int addr)
1606 asymbol *sym;
1607 char *name = xmalloc (strlen (n1) + strlen (n2) + strlen (n3) + 1);
1609 strcpy (name, n1);
1610 strcat (name, n2);
1611 strcat (name, n3);
1612 sym = bfd_make_empty_symbol (abfd);
1613 sym->name = name;
1614 sym->section = sec;
1615 sym->flags = flags;
1616 sym->value = addr;
1617 symtab[symptr++] = sym;
1620 static arelent *reltab = 0;
1621 static int relcount = 0, relsize = 0;
1623 static void
1624 quick_reloc (bfd *abfd, int address, int which_howto, int symidx)
1626 if (relcount >= relsize - 1)
1628 relsize += 10;
1629 if (reltab)
1630 reltab = xrealloc (reltab, relsize * sizeof (arelent));
1631 else
1632 reltab = xmalloc (relsize * sizeof (arelent));
1634 reltab[relcount].address = address;
1635 reltab[relcount].addend = 0;
1636 reltab[relcount].howto = bfd_reloc_type_lookup (abfd, which_howto);
1637 reltab[relcount].sym_ptr_ptr = symtab + symidx;
1638 relcount++;
1641 static void
1642 save_relocs (asection *sec)
1644 int i;
1646 sec->relocation = reltab;
1647 sec->reloc_count = relcount;
1648 sec->orelocation = xmalloc ((relcount + 1) * sizeof (arelent *));
1649 for (i = 0; i < relcount; i++)
1650 sec->orelocation[i] = sec->relocation + i;
1651 sec->orelocation[relcount] = 0;
1652 sec->flags |= SEC_RELOC;
1653 reltab = 0;
1654 relcount = relsize = 0;
1657 /* .section .idata$2
1658 .global __head_my_dll
1659 __head_my_dll:
1660 .rva hname
1661 .long 0
1662 .long 0
1663 .rva __my_dll_iname
1664 .rva fthunk
1666 .section .idata$5
1667 .long 0
1668 fthunk:
1670 .section .idata$4
1671 .long 0
1672 hname: */
1674 static bfd *
1675 make_head (bfd *parent)
1677 asection *id2, *id5, *id4;
1678 unsigned char *d2, *d5, *d4;
1679 char *oname;
1680 bfd *abfd;
1682 oname = xmalloc (20);
1683 sprintf (oname, "d%06d.o", tmp_seq);
1684 tmp_seq++;
1686 abfd = bfd_create (oname, parent);
1687 bfd_find_target (pe_details->object_target, abfd);
1688 bfd_make_writable (abfd);
1690 bfd_set_format (abfd, bfd_object);
1691 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
1693 symptr = 0;
1694 symtab = xmalloc (6 * sizeof (asymbol *));
1695 id2 = quick_section (abfd, ".idata$2", SEC_HAS_CONTENTS, 2);
1696 id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
1697 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
1698 quick_symbol (abfd, U ("_head_"), dll_symname, "", id2, BSF_GLOBAL, 0);
1699 quick_symbol (abfd, U (""), dll_symname, "_iname", UNDSEC, BSF_GLOBAL, 0);
1701 /* OK, pay attention here. I got confused myself looking back at
1702 it. We create a four-byte section to mark the beginning of the
1703 list, and we include an offset of 4 in the section, so that the
1704 pointer to the list points to the *end* of this section, which is
1705 the start of the list of sections from other objects. */
1707 bfd_set_section_size (abfd, id2, 20);
1708 d2 = xmalloc (20);
1709 id2->contents = d2;
1710 memset (d2, 0, 20);
1711 d2[0] = d2[16] = 4; /* Reloc addend. */
1712 quick_reloc (abfd, 0, BFD_RELOC_RVA, 2);
1713 quick_reloc (abfd, 12, BFD_RELOC_RVA, 4);
1714 quick_reloc (abfd, 16, BFD_RELOC_RVA, 1);
1715 save_relocs (id2);
1717 bfd_set_section_size (abfd, id5, PE_IDATA5_SIZE);
1718 d5 = xmalloc (PE_IDATA5_SIZE);
1719 id5->contents = d5;
1720 memset (d5, 0, PE_IDATA5_SIZE);
1722 bfd_set_section_size (abfd, id4, PE_IDATA4_SIZE);
1723 d4 = xmalloc (PE_IDATA4_SIZE);
1724 id4->contents = d4;
1725 memset (d4, 0, PE_IDATA4_SIZE);
1727 bfd_set_symtab (abfd, symtab, symptr);
1729 bfd_set_section_contents (abfd, id2, d2, 0, 20);
1730 bfd_set_section_contents (abfd, id5, d5, 0, PE_IDATA5_SIZE);
1731 bfd_set_section_contents (abfd, id4, d4, 0, PE_IDATA4_SIZE);
1733 bfd_make_readable (abfd);
1734 return abfd;
1737 /* .section .idata$4
1738 .long 0
1739 [.long 0] for PE+
1740 .section .idata$5
1741 .long 0
1742 [.long 0] for PE+
1743 .section idata$7
1744 .global __my_dll_iname
1745 __my_dll_iname:
1746 .asciz "my.dll" */
1748 static bfd *
1749 make_tail (bfd *parent)
1751 asection *id4, *id5, *id7;
1752 unsigned char *d4, *d5, *d7;
1753 int len;
1754 char *oname;
1755 bfd *abfd;
1757 oname = xmalloc (20);
1758 sprintf (oname, "d%06d.o", tmp_seq);
1759 tmp_seq++;
1761 abfd = bfd_create (oname, parent);
1762 bfd_find_target (pe_details->object_target, abfd);
1763 bfd_make_writable (abfd);
1765 bfd_set_format (abfd, bfd_object);
1766 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
1768 symptr = 0;
1769 symtab = xmalloc (5 * sizeof (asymbol *));
1770 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
1771 id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
1772 id7 = quick_section (abfd, ".idata$7", SEC_HAS_CONTENTS, 2);
1773 quick_symbol (abfd, U (""), dll_symname, "_iname", id7, BSF_GLOBAL, 0);
1775 bfd_set_section_size (abfd, id4, PE_IDATA4_SIZE);
1776 d4 = xmalloc (PE_IDATA4_SIZE);
1777 id4->contents = d4;
1778 memset (d4, 0, PE_IDATA4_SIZE);
1780 bfd_set_section_size (abfd, id5, PE_IDATA5_SIZE);
1781 d5 = xmalloc (PE_IDATA5_SIZE);
1782 id5->contents = d5;
1783 memset (d5, 0, PE_IDATA5_SIZE);
1785 len = strlen (dll_filename) + 1;
1786 if (len & 1)
1787 len++;
1788 bfd_set_section_size (abfd, id7, len);
1789 d7 = xmalloc (len);
1790 id7->contents = d7;
1791 strcpy ((char *) d7, dll_filename);
1793 bfd_set_symtab (abfd, symtab, symptr);
1795 bfd_set_section_contents (abfd, id4, d4, 0, PE_IDATA4_SIZE);
1796 bfd_set_section_contents (abfd, id5, d5, 0, PE_IDATA5_SIZE);
1797 bfd_set_section_contents (abfd, id7, d7, 0, len);
1799 bfd_make_readable (abfd);
1800 return abfd;
1803 /* .text
1804 .global _function
1805 .global ___imp_function
1806 .global __imp__function
1807 _function:
1808 jmp *__imp__function:
1810 .section idata$7
1811 .long __head_my_dll
1813 .section .idata$5
1814 ___imp_function:
1815 __imp__function:
1816 iat?
1817 .section .idata$4
1818 iat?
1819 .section .idata$6
1820 ID<ordinal>:
1821 .short <hint>
1822 .asciz "function" xlate? (add underscore, kill at) */
1824 static unsigned char jmp_ix86_bytes[] =
1826 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x90, 0x90
1829 /* _function:
1830 mov.l ip+8,r0
1831 mov.l @r0,r0
1832 jmp @r0
1834 .dw __imp_function */
1836 static unsigned char jmp_sh_bytes[] =
1838 0x01, 0xd0, 0x02, 0x60, 0x2b, 0x40, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00
1841 /* _function:
1842 lui $t0,<high:__imp_function>
1843 lw $t0,<low:__imp_function>
1844 jr $t0
1845 nop */
1847 static unsigned char jmp_mips_bytes[] =
1849 0x00, 0x00, 0x08, 0x3c, 0x00, 0x00, 0x08, 0x8d,
1850 0x08, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00
1853 static unsigned char jmp_arm_bytes[] =
1855 0x00, 0xc0, 0x9f, 0xe5, /* ldr ip, [pc] */
1856 0x00, 0xf0, 0x9c, 0xe5, /* ldr pc, [ip] */
1857 0, 0, 0, 0
1861 static bfd *
1862 make_one (def_file_export *exp, bfd *parent)
1864 asection *tx, *id7, *id5, *id4, *id6;
1865 unsigned char *td = NULL, *d7, *d5, *d4, *d6 = NULL;
1866 int len;
1867 char *oname;
1868 bfd *abfd;
1869 unsigned char *jmp_bytes = NULL;
1870 int jmp_byte_count = 0;
1872 switch (pe_details->pe_arch)
1874 case PE_ARCH_i386:
1875 jmp_bytes = jmp_ix86_bytes;
1876 jmp_byte_count = sizeof (jmp_ix86_bytes);
1877 break;
1878 case PE_ARCH_sh:
1879 jmp_bytes = jmp_sh_bytes;
1880 jmp_byte_count = sizeof (jmp_sh_bytes);
1881 break;
1882 case PE_ARCH_mips:
1883 jmp_bytes = jmp_mips_bytes;
1884 jmp_byte_count = sizeof (jmp_mips_bytes);
1885 break;
1886 case PE_ARCH_arm:
1887 case PE_ARCH_arm_epoc:
1888 case PE_ARCH_arm_wince:
1889 jmp_bytes = jmp_arm_bytes;
1890 jmp_byte_count = sizeof (jmp_arm_bytes);
1891 break;
1892 default:
1893 abort ();
1896 oname = xmalloc (20);
1897 sprintf (oname, "d%06d.o", tmp_seq);
1898 tmp_seq++;
1900 abfd = bfd_create (oname, parent);
1901 bfd_find_target (pe_details->object_target, abfd);
1902 bfd_make_writable (abfd);
1904 bfd_set_format (abfd, bfd_object);
1905 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
1907 symptr = 0;
1908 symtab = xmalloc (11 * sizeof (asymbol *));
1909 tx = quick_section (abfd, ".text", SEC_CODE|SEC_HAS_CONTENTS, 2);
1910 id7 = quick_section (abfd, ".idata$7", SEC_HAS_CONTENTS, 2);
1911 id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
1912 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
1913 id6 = quick_section (abfd, ".idata$6", SEC_HAS_CONTENTS, 2);
1915 if (*exp->internal_name == '@')
1917 quick_symbol (abfd, U ("_head_"), dll_symname, "", UNDSEC,
1918 BSF_GLOBAL, 0);
1919 if (! exp->flag_data)
1920 quick_symbol (abfd, "", exp->internal_name, "", tx, BSF_GLOBAL, 0);
1921 quick_symbol (abfd, U ("_imp_"), exp->internal_name, "", id5,
1922 BSF_GLOBAL, 0);
1923 /* Fastcall applies only to functions,
1924 so no need for auto-import symbol. */
1926 else
1928 quick_symbol (abfd, U ("_head_"), dll_symname, "", UNDSEC,
1929 BSF_GLOBAL, 0);
1930 if (! exp->flag_data)
1931 quick_symbol (abfd, U (""), exp->internal_name, "", tx,
1932 BSF_GLOBAL, 0);
1933 quick_symbol (abfd, U ("_imp__"), exp->internal_name, "", id5,
1934 BSF_GLOBAL, 0);
1935 /* Symbol to reference ord/name of imported
1936 data symbol, used to implement auto-import. */
1937 if (exp->flag_data)
1938 quick_symbol (abfd, U("_nm__"), exp->internal_name, "", id6,
1939 BSF_GLOBAL,0);
1941 if (pe_dll_compat_implib)
1942 quick_symbol (abfd, U ("__imp_"), exp->internal_name, "", id5,
1943 BSF_GLOBAL, 0);
1945 if (! exp->flag_data)
1947 bfd_set_section_size (abfd, tx, jmp_byte_count);
1948 td = xmalloc (jmp_byte_count);
1949 tx->contents = td;
1950 memcpy (td, jmp_bytes, jmp_byte_count);
1952 switch (pe_details->pe_arch)
1954 case PE_ARCH_i386:
1955 quick_reloc (abfd, 2, BFD_RELOC_32, 2);
1956 break;
1957 case PE_ARCH_sh:
1958 quick_reloc (abfd, 8, BFD_RELOC_32, 2);
1959 break;
1960 case PE_ARCH_mips:
1961 quick_reloc (abfd, 0, BFD_RELOC_HI16_S, 2);
1962 quick_reloc (abfd, 0, BFD_RELOC_LO16, 0); /* MIPS_R_PAIR */
1963 quick_reloc (abfd, 4, BFD_RELOC_LO16, 2);
1964 break;
1965 case PE_ARCH_arm:
1966 case PE_ARCH_arm_epoc:
1967 case PE_ARCH_arm_wince:
1968 quick_reloc (abfd, 8, BFD_RELOC_32, 2);
1969 break;
1970 default:
1971 abort ();
1973 save_relocs (tx);
1976 bfd_set_section_size (abfd, id7, 4);
1977 d7 = xmalloc (4);
1978 id7->contents = d7;
1979 memset (d7, 0, 4);
1980 quick_reloc (abfd, 0, BFD_RELOC_RVA, 5);
1981 save_relocs (id7);
1983 bfd_set_section_size (abfd, id5, PE_IDATA5_SIZE);
1984 d5 = xmalloc (PE_IDATA5_SIZE);
1985 id5->contents = d5;
1986 memset (d5, 0, PE_IDATA5_SIZE);
1988 if (exp->flag_noname)
1990 d5[0] = exp->ordinal;
1991 d5[1] = exp->ordinal >> 8;
1992 d5[PE_IDATA5_SIZE - 1] = 0x80;
1994 else
1996 quick_reloc (abfd, 0, BFD_RELOC_RVA, 4);
1997 save_relocs (id5);
2000 bfd_set_section_size (abfd, id4, PE_IDATA4_SIZE);
2001 d4 = xmalloc (PE_IDATA4_SIZE);
2002 id4->contents = d4;
2003 memset (d4, 0, PE_IDATA4_SIZE);
2005 if (exp->flag_noname)
2007 d4[0] = exp->ordinal;
2008 d4[1] = exp->ordinal >> 8;
2009 d4[PE_IDATA4_SIZE - 1] = 0x80;
2011 else
2013 quick_reloc (abfd, 0, BFD_RELOC_RVA, 4);
2014 save_relocs (id4);
2017 if (exp->flag_noname)
2019 len = 0;
2020 bfd_set_section_size (abfd, id6, 0);
2022 else
2024 len = strlen (exp->name) + 3;
2025 if (len & 1)
2026 len++;
2027 bfd_set_section_size (abfd, id6, len);
2028 d6 = xmalloc (len);
2029 id6->contents = d6;
2030 memset (d6, 0, len);
2031 d6[0] = exp->hint & 0xff;
2032 d6[1] = exp->hint >> 8;
2033 strcpy ((char *) d6 + 2, exp->name);
2036 bfd_set_symtab (abfd, symtab, symptr);
2038 bfd_set_section_contents (abfd, tx, td, 0, jmp_byte_count);
2039 bfd_set_section_contents (abfd, id7, d7, 0, 4);
2040 bfd_set_section_contents (abfd, id5, d5, 0, PE_IDATA5_SIZE);
2041 bfd_set_section_contents (abfd, id4, d4, 0, PE_IDATA4_SIZE);
2042 if (!exp->flag_noname)
2043 bfd_set_section_contents (abfd, id6, d6, 0, len);
2045 bfd_make_readable (abfd);
2046 return abfd;
2049 static bfd *
2050 make_singleton_name_thunk (const char *import, bfd *parent)
2052 /* Name thunks go to idata$4. */
2053 asection *id4;
2054 unsigned char *d4;
2055 char *oname;
2056 bfd *abfd;
2058 oname = xmalloc (20);
2059 sprintf (oname, "nmth%06d.o", tmp_seq);
2060 tmp_seq++;
2062 abfd = bfd_create (oname, parent);
2063 bfd_find_target (pe_details->object_target, abfd);
2064 bfd_make_writable (abfd);
2066 bfd_set_format (abfd, bfd_object);
2067 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2069 symptr = 0;
2070 symtab = xmalloc (3 * sizeof (asymbol *));
2071 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
2072 quick_symbol (abfd, U ("_nm_thnk_"), import, "", id4, BSF_GLOBAL, 0);
2073 quick_symbol (abfd, U ("_nm_"), import, "", UNDSEC, BSF_GLOBAL, 0);
2075 bfd_set_section_size (abfd, id4, PE_IDATA4_SIZE);
2076 d4 = xmalloc (PE_IDATA4_SIZE);
2077 id4->contents = d4;
2078 memset (d4, 0, PE_IDATA4_SIZE);
2079 quick_reloc (abfd, 0, BFD_RELOC_RVA, 2);
2080 save_relocs (id4);
2082 bfd_set_symtab (abfd, symtab, symptr);
2084 bfd_set_section_contents (abfd, id4, d4, 0, PE_IDATA4_SIZE);
2086 bfd_make_readable (abfd);
2087 return abfd;
2090 static char *
2091 make_import_fixup_mark (arelent *rel)
2093 /* We convert reloc to symbol, for later reference. */
2094 static int counter;
2095 static char *fixup_name = NULL;
2096 static size_t buffer_len = 0;
2098 struct bfd_symbol *sym = *rel->sym_ptr_ptr;
2100 bfd *abfd = bfd_asymbol_bfd (sym);
2101 struct bfd_link_hash_entry *bh;
2103 if (!fixup_name)
2105 fixup_name = xmalloc (384);
2106 buffer_len = 384;
2109 if (strlen (sym->name) + 25 > buffer_len)
2110 /* Assume 25 chars for "__fu" + counter + "_". If counter is
2111 bigger than 20 digits long, we've got worse problems than
2112 overflowing this buffer... */
2114 free (fixup_name);
2115 /* New buffer size is length of symbol, plus 25, but
2116 then rounded up to the nearest multiple of 128. */
2117 buffer_len = ((strlen (sym->name) + 25) + 127) & ~127;
2118 fixup_name = xmalloc (buffer_len);
2121 sprintf (fixup_name, "__fu%d_%s", counter++, sym->name);
2123 bh = NULL;
2124 bfd_coff_link_add_one_symbol (&link_info, abfd, fixup_name, BSF_GLOBAL,
2125 current_sec, /* sym->section, */
2126 rel->address, NULL, TRUE, FALSE, &bh);
2128 return fixup_name;
2131 /* .section .idata$2
2132 .rva __nm_thnk_SYM (singleton thunk with name of func)
2133 .long 0
2134 .long 0
2135 .rva __my_dll_iname (name of dll)
2136 .rva __fuNN_SYM (pointer to reference (address) in text) */
2138 static bfd *
2139 make_import_fixup_entry (const char *name,
2140 const char *fixup_name,
2141 const char *dll_symname,
2142 bfd *parent)
2144 asection *id2;
2145 unsigned char *d2;
2146 char *oname;
2147 bfd *abfd;
2149 oname = xmalloc (20);
2150 sprintf (oname, "fu%06d.o", tmp_seq);
2151 tmp_seq++;
2153 abfd = bfd_create (oname, parent);
2154 bfd_find_target (pe_details->object_target, abfd);
2155 bfd_make_writable (abfd);
2157 bfd_set_format (abfd, bfd_object);
2158 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2160 symptr = 0;
2161 symtab = xmalloc (6 * sizeof (asymbol *));
2162 id2 = quick_section (abfd, ".idata$2", SEC_HAS_CONTENTS, 2);
2164 quick_symbol (abfd, U ("_nm_thnk_"), name, "", UNDSEC, BSF_GLOBAL, 0);
2165 quick_symbol (abfd, U (""), dll_symname, "_iname", UNDSEC, BSF_GLOBAL, 0);
2166 quick_symbol (abfd, "", fixup_name, "", UNDSEC, BSF_GLOBAL, 0);
2168 bfd_set_section_size (abfd, id2, 20);
2169 d2 = xmalloc (20);
2170 id2->contents = d2;
2171 memset (d2, 0, 20);
2173 quick_reloc (abfd, 0, BFD_RELOC_RVA, 1);
2174 quick_reloc (abfd, 12, BFD_RELOC_RVA, 2);
2175 quick_reloc (abfd, 16, BFD_RELOC_RVA, 3);
2176 save_relocs (id2);
2178 bfd_set_symtab (abfd, symtab, symptr);
2180 bfd_set_section_contents (abfd, id2, d2, 0, 20);
2182 bfd_make_readable (abfd);
2183 return abfd;
2186 /* .section .rdata_runtime_pseudo_reloc
2187 .long addend
2188 .rva __fuNN_SYM (pointer to reference (address) in text) */
2190 static bfd *
2191 make_runtime_pseudo_reloc (const char *name ATTRIBUTE_UNUSED,
2192 const char *fixup_name,
2193 int addend,
2194 bfd *parent)
2196 asection *rt_rel;
2197 unsigned char *rt_rel_d;
2198 char *oname;
2199 bfd *abfd;
2201 oname = xmalloc (20);
2202 sprintf (oname, "rtr%06d.o", tmp_seq);
2203 tmp_seq++;
2205 abfd = bfd_create (oname, parent);
2206 bfd_find_target (pe_details->object_target, abfd);
2207 bfd_make_writable (abfd);
2209 bfd_set_format (abfd, bfd_object);
2210 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2212 symptr = 0;
2213 symtab = xmalloc (2 * sizeof (asymbol *));
2214 rt_rel = quick_section (abfd, ".rdata_runtime_pseudo_reloc",
2215 SEC_HAS_CONTENTS, 2);
2217 quick_symbol (abfd, "", fixup_name, "", UNDSEC, BSF_GLOBAL, 0);
2219 bfd_set_section_size (abfd, rt_rel, 8);
2220 rt_rel_d = xmalloc (8);
2221 rt_rel->contents = rt_rel_d;
2222 memset (rt_rel_d, 0, 8);
2223 bfd_put_32 (abfd, addend, rt_rel_d);
2225 quick_reloc (abfd, 4, BFD_RELOC_RVA, 1);
2226 save_relocs (rt_rel);
2228 bfd_set_symtab (abfd, symtab, symptr);
2230 bfd_set_section_contents (abfd, rt_rel, rt_rel_d, 0, 8);
2232 bfd_make_readable (abfd);
2233 return abfd;
2236 /* .section .rdata
2237 .rva __pei386_runtime_relocator */
2239 static bfd *
2240 pe_create_runtime_relocator_reference (bfd *parent)
2242 asection *extern_rt_rel;
2243 unsigned char *extern_rt_rel_d;
2244 char *oname;
2245 bfd *abfd;
2247 oname = xmalloc (20);
2248 sprintf (oname, "ertr%06d.o", tmp_seq);
2249 tmp_seq++;
2251 abfd = bfd_create (oname, parent);
2252 bfd_find_target (pe_details->object_target, abfd);
2253 bfd_make_writable (abfd);
2255 bfd_set_format (abfd, bfd_object);
2256 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2258 symptr = 0;
2259 symtab = xmalloc (2 * sizeof (asymbol *));
2260 extern_rt_rel = quick_section (abfd, ".rdata", SEC_HAS_CONTENTS, 2);
2262 quick_symbol (abfd, "", "__pei386_runtime_relocator", "", UNDSEC,
2263 BSF_NO_FLAGS, 0);
2265 bfd_set_section_size (abfd, extern_rt_rel, 4);
2266 extern_rt_rel_d = xmalloc (4);
2267 extern_rt_rel->contents = extern_rt_rel_d;
2269 quick_reloc (abfd, 0, BFD_RELOC_RVA, 1);
2270 save_relocs (extern_rt_rel);
2272 bfd_set_symtab (abfd, symtab, symptr);
2274 bfd_set_section_contents (abfd, extern_rt_rel, extern_rt_rel_d, 0, 4);
2276 bfd_make_readable (abfd);
2277 return abfd;
2280 void
2281 pe_create_import_fixup (arelent *rel, asection *s, int addend)
2283 char buf[300];
2284 struct bfd_symbol *sym = *rel->sym_ptr_ptr;
2285 struct bfd_link_hash_entry *name_thunk_sym;
2286 const char *name = sym->name;
2287 char *fixup_name = make_import_fixup_mark (rel);
2288 bfd *b;
2290 sprintf (buf, U ("_nm_thnk_%s"), name);
2292 name_thunk_sym = bfd_link_hash_lookup (link_info.hash, buf, 0, 0, 1);
2294 if (!name_thunk_sym || name_thunk_sym->type != bfd_link_hash_defined)
2296 bfd *b = make_singleton_name_thunk (name, output_bfd);
2297 add_bfd_to_link (b, b->filename, &link_info);
2299 /* If we ever use autoimport, we have to cast text section writable. */
2300 config.text_read_only = FALSE;
2301 output_bfd->flags &= ~WP_TEXT;
2304 if (addend == 0 || link_info.pei386_runtime_pseudo_reloc)
2306 extern char * pe_data_import_dll;
2307 char * dll_symname = pe_data_import_dll ? pe_data_import_dll : "unknown";
2309 b = make_import_fixup_entry (name, fixup_name, dll_symname, output_bfd);
2310 add_bfd_to_link (b, b->filename, &link_info);
2313 if (addend != 0)
2315 if (link_info.pei386_runtime_pseudo_reloc)
2317 if (pe_dll_extra_pe_debug)
2318 printf ("creating runtime pseudo-reloc entry for %s (addend=%d)\n",
2319 fixup_name, addend);
2320 b = make_runtime_pseudo_reloc (name, fixup_name, addend, output_bfd);
2321 add_bfd_to_link (b, b->filename, &link_info);
2323 if (runtime_pseudo_relocs_created == 0)
2325 b = pe_create_runtime_relocator_reference (output_bfd);
2326 add_bfd_to_link (b, b->filename, &link_info);
2328 runtime_pseudo_relocs_created++;
2330 else
2332 einfo (_("%C: variable '%T' can't be auto-imported. Please read the documentation for ld's --enable-auto-import for details.\n"),
2333 s->owner, s, rel->address, sym->name);
2334 einfo ("%X");
2340 void
2341 pe_dll_generate_implib (def_file *def, const char *impfilename)
2343 int i;
2344 bfd *ar_head;
2345 bfd *ar_tail;
2346 bfd *outarch;
2347 bfd *head = 0;
2349 dll_filename = (def->name) ? def->name : dll_name;
2350 dll_symname = xstrdup (dll_filename);
2351 for (i = 0; dll_symname[i]; i++)
2352 if (!ISALNUM (dll_symname[i]))
2353 dll_symname[i] = '_';
2355 unlink_if_ordinary (impfilename);
2357 outarch = bfd_openw (impfilename, 0);
2359 if (!outarch)
2361 /* xgettext:c-format */
2362 einfo (_("%XCan't open .lib file: %s\n"), impfilename);
2363 return;
2366 /* xgettext:c-format */
2367 info_msg (_("Creating library file: %s\n"), impfilename);
2369 bfd_set_format (outarch, bfd_archive);
2370 outarch->has_armap = 1;
2372 /* Work out a reasonable size of things to put onto one line. */
2373 ar_head = make_head (outarch);
2375 for (i = 0; i < def->num_exports; i++)
2377 /* The import library doesn't know about the internal name. */
2378 char *internal = def->exports[i].internal_name;
2379 bfd *n;
2381 /* Don't add PRIVATE entries to import lib. */
2382 if (pe_def_file->exports[i].flag_private)
2383 continue;
2384 def->exports[i].internal_name = def->exports[i].name;
2385 n = make_one (def->exports + i, outarch);
2386 n->next = head;
2387 head = n;
2388 def->exports[i].internal_name = internal;
2391 ar_tail = make_tail (outarch);
2393 if (ar_head == NULL || ar_tail == NULL)
2394 return;
2396 /* Now stick them all into the archive. */
2397 ar_head->next = head;
2398 ar_tail->next = ar_head;
2399 head = ar_tail;
2401 if (! bfd_set_archive_head (outarch, head))
2402 einfo ("%Xbfd_set_archive_head: %E\n");
2404 if (! bfd_close (outarch))
2405 einfo ("%Xbfd_close %s: %E\n", impfilename);
2407 while (head != NULL)
2409 bfd *n = head->next;
2410 bfd_close (head);
2411 head = n;
2415 static void
2416 add_bfd_to_link (bfd *abfd, const char *name, struct bfd_link_info *link_info)
2418 lang_input_statement_type *fake_file;
2420 fake_file = lang_add_input_file (name,
2421 lang_input_file_is_fake_enum,
2422 NULL);
2423 fake_file->the_bfd = abfd;
2424 ldlang_add_file (fake_file);
2426 if (!bfd_link_add_symbols (abfd, link_info))
2427 einfo ("%Xaddsym %s: %E\n", name);
2430 void
2431 pe_process_import_defs (bfd *output_bfd, struct bfd_link_info *link_info)
2433 def_file_module *module;
2435 pe_dll_id_target (bfd_get_target (output_bfd));
2437 if (!pe_def_file)
2438 return;
2440 for (module = pe_def_file->modules; module; module = module->next)
2442 int i, do_this_dll;
2444 dll_filename = module->name;
2445 dll_symname = xstrdup (module->name);
2446 for (i = 0; dll_symname[i]; i++)
2447 if (!ISALNUM (dll_symname[i]))
2448 dll_symname[i] = '_';
2450 do_this_dll = 0;
2452 for (i = 0; i < pe_def_file->num_imports; i++)
2453 if (pe_def_file->imports[i].module == module)
2455 def_file_export exp;
2456 struct bfd_link_hash_entry *blhe;
2457 int lead_at = (*pe_def_file->imports[i].internal_name == '@');
2458 /* See if we need this import. */
2459 size_t len = strlen (pe_def_file->imports[i].internal_name);
2460 char *name = xmalloc (len + 2 + 6);
2462 if (lead_at)
2463 sprintf (name, "%s%s", "",
2464 pe_def_file->imports[i].internal_name);
2465 else
2466 sprintf (name, "%s%s",U (""),
2467 pe_def_file->imports[i].internal_name);
2469 blhe = bfd_link_hash_lookup (link_info->hash, name,
2470 FALSE, FALSE, FALSE);
2472 if (!blhe || (blhe && blhe->type != bfd_link_hash_undefined))
2474 if (lead_at)
2475 sprintf (name, "%s%s", U ("_imp_"),
2476 pe_def_file->imports[i].internal_name);
2477 else
2478 sprintf (name, "%s%s", U ("_imp__"),
2479 pe_def_file->imports[i].internal_name);
2481 blhe = bfd_link_hash_lookup (link_info->hash, name,
2482 FALSE, FALSE, FALSE);
2484 free (name);
2486 if (blhe && blhe->type == bfd_link_hash_undefined)
2488 bfd *one;
2489 /* We do. */
2490 if (!do_this_dll)
2492 bfd *ar_head = make_head (output_bfd);
2493 add_bfd_to_link (ar_head, ar_head->filename, link_info);
2494 do_this_dll = 1;
2496 exp.internal_name = pe_def_file->imports[i].internal_name;
2497 exp.name = pe_def_file->imports[i].name;
2498 exp.ordinal = pe_def_file->imports[i].ordinal;
2499 exp.hint = exp.ordinal >= 0 ? exp.ordinal : 0;
2500 exp.flag_private = 0;
2501 exp.flag_constant = 0;
2502 exp.flag_data = pe_def_file->imports[i].data;
2503 exp.flag_noname = exp.name ? 0 : 1;
2504 one = make_one (&exp, output_bfd);
2505 add_bfd_to_link (one, one->filename, link_info);
2508 if (do_this_dll)
2510 bfd *ar_tail = make_tail (output_bfd);
2511 add_bfd_to_link (ar_tail, ar_tail->filename, link_info);
2514 free (dll_symname);
2518 /* We were handed a *.DLL file. Parse it and turn it into a set of
2519 IMPORTS directives in the def file. Return TRUE if the file was
2520 handled, FALSE if not. */
2522 static unsigned int
2523 pe_get16 (bfd *abfd, int where)
2525 unsigned char b[2];
2527 bfd_seek (abfd, (file_ptr) where, SEEK_SET);
2528 bfd_bread (b, (bfd_size_type) 2, abfd);
2529 return b[0] + (b[1] << 8);
2532 static unsigned int
2533 pe_get32 (bfd *abfd, int where)
2535 unsigned char b[4];
2537 bfd_seek (abfd, (file_ptr) where, SEEK_SET);
2538 bfd_bread (b, (bfd_size_type) 4, abfd);
2539 return b[0] + (b[1] << 8) + (b[2] << 16) + (b[3] << 24);
2542 static unsigned int
2543 pe_as32 (void *ptr)
2545 unsigned char *b = ptr;
2547 return b[0] + (b[1] << 8) + (b[2] << 16) + (b[3] << 24);
2550 bfd_boolean
2551 pe_implied_import_dll (const char *filename)
2553 bfd *dll;
2554 unsigned long pe_header_offset, opthdr_ofs, num_entries, i;
2555 unsigned long export_rva, export_size, nsections, secptr, expptr;
2556 unsigned long exp_funcbase;
2557 unsigned char *expdata;
2558 char *erva;
2559 unsigned long name_rvas, ordinals, nexp, ordbase;
2560 const char *dll_name;
2561 /* Initialization with start > end guarantees that is_data
2562 will not be set by mistake, and avoids compiler warning. */
2563 unsigned long data_start = 1;
2564 unsigned long data_end = 0;
2565 unsigned long rdata_start = 1;
2566 unsigned long rdata_end = 0;
2567 unsigned long bss_start = 1;
2568 unsigned long bss_end = 0;
2570 /* No, I can't use bfd here. kernel32.dll puts its export table in
2571 the middle of the .rdata section. */
2572 dll = bfd_openr (filename, pe_details->target_name);
2573 if (!dll)
2575 einfo ("%Xopen %s: %E\n", filename);
2576 return FALSE;
2579 /* PEI dlls seem to be bfd_objects. */
2580 if (!bfd_check_format (dll, bfd_object))
2582 einfo ("%X%s: this doesn't appear to be a DLL\n", filename);
2583 return FALSE;
2586 /* Get pe_header, optional header and numbers of export entries. */
2587 pe_header_offset = pe_get32 (dll, 0x3c);
2588 opthdr_ofs = pe_header_offset + 4 + 20;
2589 #ifdef pe_use_x86_64
2590 num_entries = pe_get32 (dll, opthdr_ofs + 92 + 4 * 4); /* & NumberOfRvaAndSizes. */
2591 #else
2592 num_entries = pe_get32 (dll, opthdr_ofs + 92);
2593 #endif
2595 if (num_entries < 1) /* No exports. */
2596 return FALSE;
2598 #ifdef pe_use_x86_64
2599 export_rva = pe_get32 (dll, opthdr_ofs + 96 + 4 * 4);
2600 export_size = pe_get32 (dll, opthdr_ofs + 100 + 4 * 4);
2601 #else
2602 export_rva = pe_get32 (dll, opthdr_ofs + 96);
2603 export_size = pe_get32 (dll, opthdr_ofs + 100);
2604 #endif
2606 nsections = pe_get16 (dll, pe_header_offset + 4 + 2);
2607 secptr = (pe_header_offset + 4 + 20 +
2608 pe_get16 (dll, pe_header_offset + 4 + 16));
2609 expptr = 0;
2611 /* Get the rva and size of the export section. */
2612 for (i = 0; i < nsections; i++)
2614 char sname[8];
2615 unsigned long secptr1 = secptr + 40 * i;
2616 unsigned long vaddr = pe_get32 (dll, secptr1 + 12);
2617 unsigned long vsize = pe_get32 (dll, secptr1 + 16);
2618 unsigned long fptr = pe_get32 (dll, secptr1 + 20);
2620 bfd_seek (dll, (file_ptr) secptr1, SEEK_SET);
2621 bfd_bread (sname, (bfd_size_type) 8, dll);
2623 if (vaddr <= export_rva && vaddr + vsize > export_rva)
2625 expptr = fptr + (export_rva - vaddr);
2626 if (export_rva + export_size > vaddr + vsize)
2627 export_size = vsize - (export_rva - vaddr);
2628 break;
2632 /* Scan sections and store the base and size of the
2633 data and bss segments in data/base_start/end. */
2634 for (i = 0; i < nsections; i++)
2636 unsigned long secptr1 = secptr + 40 * i;
2637 unsigned long vsize = pe_get32 (dll, secptr1 + 8);
2638 unsigned long vaddr = pe_get32 (dll, secptr1 + 12);
2639 unsigned long flags = pe_get32 (dll, secptr1 + 36);
2640 char sec_name[9];
2642 sec_name[8] = '\0';
2643 bfd_seek (dll, (file_ptr) secptr1 + 0, SEEK_SET);
2644 bfd_bread (sec_name, (bfd_size_type) 8, dll);
2646 if (strcmp(sec_name,".data") == 0)
2648 data_start = vaddr;
2649 data_end = vaddr + vsize;
2651 if (pe_dll_extra_pe_debug)
2652 printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n",
2653 __FUNCTION__, sec_name, vaddr, vaddr + vsize, flags);
2655 else if (strcmp(sec_name,".rdata") == 0)
2657 rdata_start = vaddr;
2658 rdata_end = vaddr + vsize;
2660 if (pe_dll_extra_pe_debug)
2661 printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n",
2662 __FUNCTION__, sec_name, vaddr, vaddr + vsize, flags);
2664 else if (strcmp (sec_name,".bss") == 0)
2666 bss_start = vaddr;
2667 bss_end = vaddr + vsize;
2669 if (pe_dll_extra_pe_debug)
2670 printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n",
2671 __FUNCTION__, sec_name, vaddr, vaddr + vsize, flags);
2675 expdata = xmalloc (export_size);
2676 bfd_seek (dll, (file_ptr) expptr, SEEK_SET);
2677 bfd_bread (expdata, (bfd_size_type) export_size, dll);
2678 erva = (char *) expdata - export_rva;
2680 if (pe_def_file == 0)
2681 pe_def_file = def_file_empty ();
2683 nexp = pe_as32 (expdata + 24);
2684 name_rvas = pe_as32 (expdata + 32);
2685 ordinals = pe_as32 (expdata + 36);
2686 ordbase = pe_as32 (expdata + 16);
2687 exp_funcbase = pe_as32 (expdata + 28);
2689 /* Use internal dll name instead of filename
2690 to enable symbolic dll linking. */
2691 dll_name = erva + pe_as32 (expdata + 12);
2693 /* Check to see if the dll has already been added to
2694 the definition list and if so return without error.
2695 This avoids multiple symbol definitions. */
2696 if (def_get_module (pe_def_file, dll_name))
2698 if (pe_dll_extra_pe_debug)
2699 printf ("%s is already loaded\n", dll_name);
2700 return TRUE;
2703 /* Iterate through the list of symbols. */
2704 for (i = 0; i < nexp; i++)
2706 /* Pointer to the names vector. */
2707 unsigned long name_rva = pe_as32 (erva + name_rvas + i * 4);
2708 def_file_import *imp;
2709 /* Pointer to the function address vector. */
2710 unsigned long func_rva = pe_as32 (erva + exp_funcbase + i * 4);
2711 int is_data = 0;
2713 /* Skip unwanted symbols, which are
2714 exported in buggy auto-import releases. */
2715 if (! CONST_STRNEQ (erva + name_rva, "_nm_"))
2717 /* is_data is true if the address is in the data, rdata or bss
2718 segment. */
2719 is_data =
2720 (func_rva >= data_start && func_rva < data_end)
2721 || (func_rva >= rdata_start && func_rva < rdata_end)
2722 || (func_rva >= bss_start && func_rva < bss_end);
2724 imp = def_file_add_import (pe_def_file, erva + name_rva,
2725 dll_name, i, 0);
2726 /* Mark symbol type. */
2727 imp->data = is_data;
2729 if (pe_dll_extra_pe_debug)
2730 printf ("%s dll-name: %s sym: %s addr: 0x%lx %s\n",
2731 __FUNCTION__, dll_name, erva + name_rva,
2732 func_rva, is_data ? "(data)" : "");
2736 return TRUE;
2739 /* These are the main functions, called from the emulation. The first
2740 is called after the bfds are read, so we can guess at how much space
2741 we need. The second is called after everything is placed, so we
2742 can put the right values in place. */
2744 void
2745 pe_dll_build_sections (bfd *abfd, struct bfd_link_info *info)
2747 pe_dll_id_target (bfd_get_target (abfd));
2748 process_def_file (abfd, info);
2750 if (pe_def_file->num_exports == 0 && !info->shared)
2751 return;
2753 generate_edata (abfd, info);
2754 build_filler_bfd (1);
2757 void
2758 pe_exe_build_sections (bfd *abfd, struct bfd_link_info *info ATTRIBUTE_UNUSED)
2760 pe_dll_id_target (bfd_get_target (abfd));
2761 build_filler_bfd (0);
2764 void
2765 pe_dll_fill_sections (bfd *abfd, struct bfd_link_info *info)
2767 pe_dll_id_target (bfd_get_target (abfd));
2768 image_base = pe_data (abfd)->pe_opthdr.ImageBase;
2770 generate_reloc (abfd, info);
2771 if (reloc_sz > 0)
2773 bfd_set_section_size (filler_bfd, reloc_s, reloc_sz);
2775 /* Resize the sections. */
2776 lang_reset_memory_regions ();
2777 lang_size_sections (NULL, TRUE);
2779 /* Redo special stuff. */
2780 ldemul_after_allocation ();
2782 /* Do the assignments again. */
2783 lang_do_assignments ();
2786 fill_edata (abfd, info);
2788 if (info->shared && !info->pie)
2789 pe_data (abfd)->dll = 1;
2791 edata_s->contents = edata_d;
2792 reloc_s->contents = reloc_d;
2795 void
2796 pe_exe_fill_sections (bfd *abfd, struct bfd_link_info *info)
2798 pe_dll_id_target (bfd_get_target (abfd));
2799 image_base = pe_data (abfd)->pe_opthdr.ImageBase;
2801 generate_reloc (abfd, info);
2802 if (reloc_sz > 0)
2804 bfd_set_section_size (filler_bfd, reloc_s, reloc_sz);
2806 /* Resize the sections. */
2807 lang_reset_memory_regions ();
2808 lang_size_sections (NULL, TRUE);
2810 /* Redo special stuff. */
2811 ldemul_after_allocation ();
2813 /* Do the assignments again. */
2814 lang_do_assignments ();
2816 reloc_s->contents = reloc_d;