opcodes/
[binutils.git] / ld / pe-dll.c
blob43caa0c5982a5df111c237f2c3ec7e5f06f00943
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 "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.
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 const char *name;
171 int len;
173 autofilter_entry_type;
175 typedef struct
177 const char *target_name;
178 const char *object_target;
179 unsigned int imagebase_reloc;
180 int pe_arch;
181 int bfd_arch;
182 bfd_boolean underscored;
183 const autofilter_entry_type* autofilter_symbollist;
185 pe_details_type;
187 static const 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 const 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 const 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 const pe_details_type *pe_details;
301 /* Do not specify library suffix explicitly, to allow for dllized versions. */
302 static const 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 const 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 const autofilter_entry_type autofilter_symbolprefixlist[] =
334 /* _imp_ is treated specially, as it is always underscored. */
335 /* { STRING_COMMA_LEN ("_imp_") }, */
336 /* Don't export some c++ symbols. */
337 { STRING_COMMA_LEN ("__rtti_") },
338 { STRING_COMMA_LEN ("__builtin_") },
339 /* Don't re-export auto-imported symbols. */
340 { STRING_COMMA_LEN ("_nm_") },
341 /* Don't export symbols specifying internal DLL layout. */
342 { STRING_COMMA_LEN ("_head_") },
343 { STRING_COMMA_LEN (NULL) }
346 static const autofilter_entry_type autofilter_symbolsuffixlist[] =
348 { STRING_COMMA_LEN ("_iname") },
349 { STRING_COMMA_LEN (NULL) }
352 #define U(str) (pe_details->underscored ? "_" str : str)
354 void
355 pe_dll_id_target (const char *target)
357 int i;
359 for (i = 0; pe_detail_list[i].target_name; i++)
360 if (strcmp (pe_detail_list[i].target_name, target) == 0
361 || strcmp (pe_detail_list[i].object_target, target) == 0)
363 pe_details = pe_detail_list + i;
364 return;
366 einfo (_("%XUnsupported PEI architecture: %s\n"), target);
367 exit (1);
370 /* Helper functions for qsort. Relocs must be sorted so that we can write
371 them out by pages. */
373 typedef struct
375 bfd_vma vma;
376 char type;
377 short extra;
379 reloc_data_type;
381 static int
382 reloc_sort (const void *va, const void *vb)
384 bfd_vma a = ((const reloc_data_type *) va)->vma;
385 bfd_vma b = ((const reloc_data_type *) vb)->vma;
387 return (a > b) ? 1 : ((a < b) ? -1 : 0);
390 static int
391 pe_export_sort (const void *va, const void *vb)
393 const def_file_export *a = va;
394 const def_file_export *b = vb;
396 return strcmp (a->name, b->name);
399 /* Read and process the .DEF file. */
401 /* These correspond to the entries in pe_def_file->exports[]. I use
402 exported_symbol_sections[i] to tag whether or not the symbol was
403 defined, since we can't export symbols we don't have. */
405 static bfd_vma *exported_symbol_offsets;
406 static struct bfd_section **exported_symbol_sections;
407 static int export_table_size;
408 static int count_exported;
409 static int count_exported_byname;
410 static int count_with_ordinals;
411 static const char *dll_name;
412 static int min_ordinal, max_ordinal;
413 static int *exported_symbols;
415 typedef struct exclude_list_struct
417 char *string;
418 struct exclude_list_struct *next;
419 int type;
421 exclude_list_struct;
423 static struct exclude_list_struct *excludes = 0;
425 void
426 pe_dll_add_excludes (const char *new_excludes, const int type)
428 char *local_copy;
429 char *exclude_string;
431 local_copy = xstrdup (new_excludes);
433 exclude_string = strtok (local_copy, ",:");
434 for (; exclude_string; exclude_string = strtok (NULL, ",:"))
436 struct exclude_list_struct *new_exclude;
438 new_exclude = xmalloc (sizeof (struct exclude_list_struct));
439 new_exclude->string = xmalloc (strlen (exclude_string) + 1);
440 strcpy (new_exclude->string, exclude_string);
441 new_exclude->type = type;
442 new_exclude->next = excludes;
443 excludes = new_exclude;
446 free (local_copy);
449 static bfd_boolean
450 is_import (const char* n)
452 return (CONST_STRNEQ (n, "__imp_"));
455 /* abfd is a bfd containing n (or NULL)
456 It can be used for contextual checks. */
458 static int
459 auto_export (bfd *abfd, def_file *d, const char *n)
461 int i;
462 struct exclude_list_struct *ex;
463 const autofilter_entry_type *afptr;
464 const char * libname = 0;
465 if (abfd && abfd->my_archive)
466 libname = lbasename (abfd->my_archive->filename);
468 for (i = 0; i < d->num_exports; i++)
469 if (strcmp (d->exports[i].name, n) == 0)
470 return 0;
472 if (pe_dll_do_default_excludes)
474 const char * p;
475 int len;
477 if (pe_dll_extra_pe_debug)
478 printf ("considering exporting: %s, abfd=%p, abfd->my_arc=%p\n",
479 n, abfd, abfd->my_archive);
481 /* First of all, make context checks:
482 Don't export anything from standard libs. */
483 if (libname)
485 afptr = autofilter_liblist;
487 while (afptr->name)
489 if (strncmp (libname, afptr->name, afptr->len) == 0 )
490 return 0;
491 afptr++;
495 /* Next, exclude symbols from certain startup objects. */
497 if (abfd && (p = lbasename (abfd->filename)))
499 afptr = autofilter_objlist;
500 while (afptr->name)
502 if (strcmp (p, afptr->name) == 0)
503 return 0;
504 afptr++;
508 /* Don't try to blindly exclude all symbols
509 that begin with '__'; this was tried and
510 it is too restrictive. Instead we have
511 a target specific list to use: */
512 afptr = pe_details->autofilter_symbollist;
514 while (afptr->name)
516 if (strcmp (n, afptr->name) == 0)
517 return 0;
519 afptr++;
522 /* Next, exclude symbols starting with ... */
523 afptr = autofilter_symbolprefixlist;
524 while (afptr->name)
526 if (strncmp (n, afptr->name, afptr->len) == 0)
527 return 0;
529 afptr++;
532 /* Finally, exclude symbols ending with ... */
533 len = strlen (n);
534 afptr = autofilter_symbolsuffixlist;
535 while (afptr->name)
537 if ((len >= afptr->len)
538 /* Add 1 to insure match with trailing '\0'. */
539 && strncmp (n + len - afptr->len, afptr->name,
540 afptr->len + 1) == 0)
541 return 0;
543 afptr++;
547 for (ex = excludes; ex; ex = ex->next)
549 if (ex->type == 1) /* exclude-libs */
551 if (libname
552 && ((strcmp (libname, ex->string) == 0)
553 || (strcasecmp ("ALL", ex->string) == 0)))
554 return 0;
556 else if (strcmp (n, ex->string) == 0)
557 return 0;
560 return 1;
563 static void
564 process_def_file (bfd *abfd ATTRIBUTE_UNUSED, struct bfd_link_info *info)
566 int i, j;
567 struct bfd_link_hash_entry *blhe;
568 bfd *b;
569 struct bfd_section *s;
570 def_file_export *e = 0;
572 if (!pe_def_file)
573 pe_def_file = def_file_empty ();
575 /* First, run around to all the objects looking for the .drectve
576 sections, and push those into the def file too. */
577 for (b = info->input_bfds; b; b = b->link_next)
579 s = bfd_get_section_by_name (b, ".drectve");
580 if (s)
582 long size = s->size;
583 char *buf = xmalloc (size);
585 bfd_get_section_contents (b, s, buf, 0, size);
586 def_file_add_directive (pe_def_file, buf, size);
587 free (buf);
591 /* If we are not building a DLL, when there are no exports
592 we do not build an export table at all. */
593 if (!pe_dll_export_everything && pe_def_file->num_exports == 0
594 && info->executable)
595 return;
597 /* Now, maybe export everything else the default way. */
598 if (pe_dll_export_everything || pe_def_file->num_exports == 0)
600 for (b = info->input_bfds; b; b = b->link_next)
602 asymbol **symbols;
603 int nsyms, symsize;
605 symsize = bfd_get_symtab_upper_bound (b);
606 symbols = xmalloc (symsize);
607 nsyms = bfd_canonicalize_symtab (b, symbols);
609 for (j = 0; j < nsyms; j++)
611 /* We should export symbols which are either global or not
612 anything at all. (.bss data is the latter)
613 We should not export undefined symbols. */
614 if (symbols[j]->section != &bfd_und_section
615 && ((symbols[j]->flags & BSF_GLOBAL)
616 || (symbols[j]->flags == BFD_FORT_COMM_DEFAULT_VALUE)))
618 const char *sn = symbols[j]->name;
620 /* We should not re-export imported stuff. */
622 char *name;
623 if (is_import (sn))
624 continue;
626 name = xmalloc (strlen ("__imp_") + strlen (sn) + 1);
627 sprintf (name, "%s%s", "__imp_", sn);
629 blhe = bfd_link_hash_lookup (info->hash, name,
630 FALSE, FALSE, FALSE);
631 free (name);
633 if (blhe && blhe->type == bfd_link_hash_defined)
634 continue;
637 if (pe_details->underscored && *sn == '_')
638 sn++;
640 if (auto_export (b, pe_def_file, sn))
642 def_file_export *p;
643 p=def_file_add_export (pe_def_file, sn, 0, -1);
644 /* Fill data flag properly, from dlltool.c. */
645 p->flag_data = !(symbols[j]->flags & BSF_FUNCTION);
652 #undef NE
653 #define NE pe_def_file->num_exports
655 /* Canonicalize the export list. */
656 if (pe_dll_kill_ats)
658 for (i = 0; i < NE; i++)
660 if (strchr (pe_def_file->exports[i].name, '@'))
662 /* This will preserve internal_name, which may have been
663 pointing to the same memory as name, or might not
664 have. */
665 int lead_at = (*pe_def_file->exports[i].name == '@');
666 char *tmp = xstrdup (pe_def_file->exports[i].name + lead_at);
667 char *tmp_at = strchr (tmp, '@');
669 if (tmp_at)
670 *tmp_at = 0;
671 else
672 einfo (_("%XCannot export %s: invalid export name\n"),
673 pe_def_file->exports[i].name);
674 pe_def_file->exports[i].name = tmp;
679 if (pe_dll_stdcall_aliases)
681 for (i = 0; i < NE; i++)
683 if (is_import (pe_def_file->exports[i].name))
684 continue;
686 if (strchr (pe_def_file->exports[i].name, '@'))
688 int lead_at = (*pe_def_file->exports[i].name == '@');
689 char *tmp = xstrdup (pe_def_file->exports[i].name + lead_at);
691 *(strchr (tmp, '@')) = 0;
692 if (auto_export (NULL, pe_def_file, tmp))
693 def_file_add_export (pe_def_file, tmp,
694 pe_def_file->exports[i].internal_name,
695 -1);
696 else
697 free (tmp);
702 /* Convenience, but watch out for it changing. */
703 e = pe_def_file->exports;
705 exported_symbol_offsets = xmalloc (NE * sizeof (bfd_vma));
706 exported_symbol_sections = xmalloc (NE * sizeof (struct bfd_section *));
708 memset (exported_symbol_sections, 0, NE * sizeof (struct bfd_section *));
709 max_ordinal = 0;
710 min_ordinal = 65536;
711 count_exported = 0;
712 count_exported_byname = 0;
713 count_with_ordinals = 0;
715 qsort (pe_def_file->exports, NE, sizeof (pe_def_file->exports[0]),
716 pe_export_sort);
717 for (i = 0, j = 0; i < NE; i++)
719 if (i > 0 && strcmp (e[i].name, e[i - 1].name) == 0)
721 /* This is a duplicate. */
722 if (e[j - 1].ordinal != -1
723 && e[i].ordinal != -1
724 && e[j - 1].ordinal != e[i].ordinal)
726 if (pe_dll_warn_dup_exports)
727 /* xgettext:c-format */
728 einfo (_("%XError, duplicate EXPORT with ordinals: %s (%d vs %d)\n"),
729 e[j - 1].name, e[j - 1].ordinal, e[i].ordinal);
731 else
733 if (pe_dll_warn_dup_exports)
734 /* xgettext:c-format */
735 einfo (_("Warning, duplicate EXPORT: %s\n"),
736 e[j - 1].name);
739 if (e[i].ordinal != -1)
740 e[j - 1].ordinal = e[i].ordinal;
741 e[j - 1].flag_private |= e[i].flag_private;
742 e[j - 1].flag_constant |= e[i].flag_constant;
743 e[j - 1].flag_noname |= e[i].flag_noname;
744 e[j - 1].flag_data |= e[i].flag_data;
746 else
748 if (i != j)
749 e[j] = e[i];
750 j++;
753 pe_def_file->num_exports = j; /* == NE */
755 for (i = 0; i < NE; i++)
757 char *name;
759 /* Check for forward exports */
760 if (strchr (pe_def_file->exports[i].internal_name, '.'))
762 count_exported++;
763 if (!pe_def_file->exports[i].flag_noname)
764 count_exported_byname++;
766 pe_def_file->exports[i].flag_forward = 1;
768 if (pe_def_file->exports[i].ordinal != -1)
770 if (max_ordinal < pe_def_file->exports[i].ordinal)
771 max_ordinal = pe_def_file->exports[i].ordinal;
772 if (min_ordinal > pe_def_file->exports[i].ordinal)
773 min_ordinal = pe_def_file->exports[i].ordinal;
774 count_with_ordinals++;
777 continue;
780 name = xmalloc (strlen (pe_def_file->exports[i].internal_name) + 2);
781 if (pe_details->underscored
782 && (*pe_def_file->exports[i].internal_name != '@'))
784 *name = '_';
785 strcpy (name + 1, pe_def_file->exports[i].internal_name);
787 else
788 strcpy (name, pe_def_file->exports[i].internal_name);
790 blhe = bfd_link_hash_lookup (info->hash,
791 name,
792 FALSE, FALSE, TRUE);
794 if (blhe
795 && (blhe->type == bfd_link_hash_defined
796 || (blhe->type == bfd_link_hash_common)))
798 count_exported++;
799 if (!pe_def_file->exports[i].flag_noname)
800 count_exported_byname++;
802 /* Only fill in the sections. The actual offsets are computed
803 in fill_exported_offsets() after common symbols are laid
804 out. */
805 if (blhe->type == bfd_link_hash_defined)
806 exported_symbol_sections[i] = blhe->u.def.section;
807 else
808 exported_symbol_sections[i] = blhe->u.c.p->section;
810 if (pe_def_file->exports[i].ordinal != -1)
812 if (max_ordinal < pe_def_file->exports[i].ordinal)
813 max_ordinal = pe_def_file->exports[i].ordinal;
814 if (min_ordinal > pe_def_file->exports[i].ordinal)
815 min_ordinal = pe_def_file->exports[i].ordinal;
816 count_with_ordinals++;
819 else if (blhe && blhe->type == bfd_link_hash_undefined)
821 /* xgettext:c-format */
822 einfo (_("%XCannot export %s: symbol not defined\n"),
823 pe_def_file->exports[i].internal_name);
825 else if (blhe)
827 /* xgettext:c-format */
828 einfo (_("%XCannot export %s: symbol wrong type (%d vs %d)\n"),
829 pe_def_file->exports[i].internal_name,
830 blhe->type, bfd_link_hash_defined);
832 else
834 /* xgettext:c-format */
835 einfo (_("%XCannot export %s: symbol not found\n"),
836 pe_def_file->exports[i].internal_name);
838 free (name);
842 /* Build the bfd that will contain .edata and .reloc sections. */
844 static void
845 build_filler_bfd (int include_edata)
847 lang_input_statement_type *filler_file;
848 filler_file = lang_add_input_file ("dll stuff",
849 lang_input_file_is_fake_enum,
850 NULL);
851 filler_file->the_bfd = filler_bfd = bfd_create ("dll stuff", output_bfd);
852 if (filler_bfd == NULL
853 || !bfd_set_arch_mach (filler_bfd,
854 bfd_get_arch (output_bfd),
855 bfd_get_mach (output_bfd)))
857 einfo ("%X%P: can not create BFD: %E\n");
858 return;
861 if (include_edata)
863 edata_s = bfd_make_section_old_way (filler_bfd, ".edata");
864 if (edata_s == NULL
865 || !bfd_set_section_flags (filler_bfd, edata_s,
866 (SEC_HAS_CONTENTS
867 | SEC_ALLOC
868 | SEC_LOAD
869 | SEC_KEEP
870 | SEC_IN_MEMORY)))
872 einfo ("%X%P: can not create .edata section: %E\n");
873 return;
875 bfd_set_section_size (filler_bfd, edata_s, edata_sz);
878 reloc_s = bfd_make_section_old_way (filler_bfd, ".reloc");
879 if (reloc_s == NULL
880 || !bfd_set_section_flags (filler_bfd, reloc_s,
881 (SEC_HAS_CONTENTS
882 | SEC_ALLOC
883 | SEC_LOAD
884 | SEC_KEEP
885 | SEC_IN_MEMORY)))
887 einfo ("%X%P: can not create .reloc section: %E\n");
888 return;
891 bfd_set_section_size (filler_bfd, reloc_s, 0);
893 ldlang_add_file (filler_file);
896 /* Gather all the exported symbols and build the .edata section. */
898 static void
899 generate_edata (bfd *abfd, struct bfd_link_info *info ATTRIBUTE_UNUSED)
901 int i, next_ordinal;
902 int name_table_size = 0;
903 const char *dlnp;
905 /* First, we need to know how many exported symbols there are,
906 and what the range of ordinals is. */
907 if (pe_def_file->name)
908 dll_name = pe_def_file->name;
909 else
911 dll_name = abfd->filename;
913 for (dlnp = dll_name; *dlnp; dlnp++)
914 if (*dlnp == '\\' || *dlnp == '/' || *dlnp == ':')
915 dll_name = dlnp + 1;
918 if (count_with_ordinals && max_ordinal > count_exported)
920 if (min_ordinal > max_ordinal - count_exported + 1)
921 min_ordinal = max_ordinal - count_exported + 1;
923 else
925 min_ordinal = 1;
926 max_ordinal = count_exported;
929 export_table_size = max_ordinal - min_ordinal + 1;
930 exported_symbols = xmalloc (export_table_size * sizeof (int));
931 for (i = 0; i < export_table_size; i++)
932 exported_symbols[i] = -1;
934 /* Now we need to assign ordinals to those that don't have them. */
935 for (i = 0; i < NE; i++)
937 if (exported_symbol_sections[i] ||
938 pe_def_file->exports[i].flag_forward)
940 if (pe_def_file->exports[i].ordinal != -1)
942 int ei = pe_def_file->exports[i].ordinal - min_ordinal;
943 int pi = exported_symbols[ei];
945 if (pi != -1)
947 /* xgettext:c-format */
948 einfo (_("%XError, ordinal used twice: %d (%s vs %s)\n"),
949 pe_def_file->exports[i].ordinal,
950 pe_def_file->exports[i].name,
951 pe_def_file->exports[pi].name);
953 exported_symbols[ei] = i;
955 name_table_size += strlen (pe_def_file->exports[i].name) + 1;
958 /* Reserve space for the forward name. */
959 if (pe_def_file->exports[i].flag_forward)
961 name_table_size += strlen (pe_def_file->exports[i].internal_name) + 1;
965 next_ordinal = min_ordinal;
966 for (i = 0; i < NE; i++)
967 if ((exported_symbol_sections[i] ||
968 pe_def_file->exports[i].flag_forward) &&
969 pe_def_file->exports[i].ordinal == -1)
971 while (exported_symbols[next_ordinal - min_ordinal] != -1)
972 next_ordinal++;
974 exported_symbols[next_ordinal - min_ordinal] = i;
975 pe_def_file->exports[i].ordinal = next_ordinal;
978 /* OK, now we can allocate some memory. */
979 edata_sz = (40 /* directory */
980 + 4 * export_table_size /* addresses */
981 + 4 * count_exported_byname /* name ptrs */
982 + 2 * count_exported_byname /* ordinals */
983 + name_table_size + strlen (dll_name) + 1);
986 /* Fill the exported symbol offsets. The preliminary work has already
987 been done in process_def_file(). */
989 static void
990 fill_exported_offsets (bfd *abfd ATTRIBUTE_UNUSED, struct bfd_link_info *info)
992 int i;
993 struct bfd_link_hash_entry *blhe;
995 for (i = 0; i < pe_def_file->num_exports; i++)
997 char *name;
999 name = xmalloc (strlen (pe_def_file->exports[i].internal_name) + 2);
1000 if (pe_details->underscored
1001 && *pe_def_file->exports[i].internal_name != '@')
1003 *name = '_';
1004 strcpy (name + 1, pe_def_file->exports[i].internal_name);
1006 else
1007 strcpy (name, pe_def_file->exports[i].internal_name);
1009 blhe = bfd_link_hash_lookup (info->hash,
1010 name,
1011 FALSE, FALSE, TRUE);
1013 if (blhe && blhe->type == bfd_link_hash_defined)
1014 exported_symbol_offsets[i] = blhe->u.def.value;
1016 free (name);
1020 static void
1021 fill_edata (bfd *abfd, struct bfd_link_info *info ATTRIBUTE_UNUSED)
1023 int s, hint;
1024 unsigned char *edirectory;
1025 unsigned char *eaddresses;
1026 unsigned char *enameptrs;
1027 unsigned char *eordinals;
1028 char *enamestr;
1029 time_t now;
1031 time (&now);
1033 edata_d = xmalloc (edata_sz);
1035 /* Note use of array pointer math here. */
1036 edirectory = edata_d;
1037 eaddresses = edata_d + 40;
1038 enameptrs = eaddresses + 4 * export_table_size;
1039 eordinals = enameptrs + 4 * count_exported_byname;
1040 enamestr = (char *) eordinals + 2 * count_exported_byname;
1042 #define ERVA(ptr) (((unsigned char *)(ptr) - edata_d) \
1043 + edata_s->output_section->vma - image_base)
1045 memset (edata_d, 0, edata_sz);
1046 bfd_put_32 (abfd, now, edata_d + 4);
1047 if (pe_def_file->version_major != -1)
1049 bfd_put_16 (abfd, pe_def_file->version_major, edata_d + 8);
1050 bfd_put_16 (abfd, pe_def_file->version_minor, edata_d + 10);
1053 bfd_put_32 (abfd, ERVA (enamestr), edata_d + 12);
1054 strcpy (enamestr, dll_name);
1055 enamestr += strlen (enamestr) + 1;
1056 bfd_put_32 (abfd, min_ordinal, edata_d + 16);
1057 bfd_put_32 (abfd, export_table_size, edata_d + 20);
1058 bfd_put_32 (abfd, count_exported_byname, edata_d + 24);
1059 bfd_put_32 (abfd, ERVA (eaddresses), edata_d + 28);
1060 bfd_put_32 (abfd, ERVA (enameptrs), edata_d + 32);
1061 bfd_put_32 (abfd, ERVA (eordinals), edata_d + 36);
1063 fill_exported_offsets (abfd, info);
1065 /* Ok, now for the filling in part.
1066 Scan alphabetically - ie the ordering in the exports[] table,
1067 rather than by ordinal - the ordering in the exported_symbol[]
1068 table. See dlltool.c and:
1069 http://sources.redhat.com/ml/binutils/2003-04/msg00379.html
1070 for more information. */
1071 hint = 0;
1072 for (s = 0; s < NE; s++)
1074 struct bfd_section *ssec = exported_symbol_sections[s];
1075 if (pe_def_file->exports[s].ordinal != -1 &&
1076 (pe_def_file->exports[s].flag_forward || ssec != NULL))
1078 int ord = pe_def_file->exports[s].ordinal;
1080 if (pe_def_file->exports[s].flag_forward)
1082 bfd_put_32 (abfd, ERVA (enamestr),
1083 eaddresses + 4 * (ord - min_ordinal));
1085 strcpy (enamestr, pe_def_file->exports[s].internal_name);
1086 enamestr += strlen (pe_def_file->exports[s].internal_name) + 1;
1088 else
1090 unsigned long srva = (exported_symbol_offsets[s]
1091 + ssec->output_section->vma
1092 + ssec->output_offset);
1094 bfd_put_32 (abfd, srva - image_base,
1095 eaddresses + 4 * (ord - min_ordinal));
1098 if (!pe_def_file->exports[s].flag_noname)
1100 char *ename = pe_def_file->exports[s].name;
1102 bfd_put_32 (abfd, ERVA (enamestr), enameptrs);
1103 enameptrs += 4;
1104 strcpy (enamestr, ename);
1105 enamestr += strlen (enamestr) + 1;
1106 bfd_put_16 (abfd, ord - min_ordinal, eordinals);
1107 eordinals += 2;
1108 pe_def_file->exports[s].hint = hint++;
1115 static struct bfd_section *current_sec;
1117 void
1118 pe_walk_relocs_of_symbol (struct bfd_link_info *info,
1119 const char *name,
1120 int (*cb) (arelent *, asection *))
1122 bfd *b;
1123 asection *s;
1125 for (b = info->input_bfds; b; b = b->link_next)
1127 asymbol **symbols;
1128 int nsyms, symsize;
1130 symsize = bfd_get_symtab_upper_bound (b);
1131 symbols = xmalloc (symsize);
1132 nsyms = bfd_canonicalize_symtab (b, symbols);
1134 for (s = b->sections; s; s = s->next)
1136 arelent **relocs;
1137 int relsize, nrelocs, i;
1138 int flags = bfd_get_section_flags (b, s);
1140 /* Skip discarded linkonce sections. */
1141 if (flags & SEC_LINK_ONCE
1142 && s->output_section == bfd_abs_section_ptr)
1143 continue;
1145 current_sec = s;
1147 relsize = bfd_get_reloc_upper_bound (b, s);
1148 relocs = xmalloc (relsize);
1149 nrelocs = bfd_canonicalize_reloc (b, s, relocs, symbols);
1151 for (i = 0; i < nrelocs; i++)
1153 struct bfd_symbol *sym = *relocs[i]->sym_ptr_ptr;
1155 if (!strcmp (name, sym->name))
1156 cb (relocs[i], s);
1159 free (relocs);
1161 /* Warning: the allocated symbols are remembered in BFD and reused
1162 later, so don't free them! */
1163 /* free (symbols); */
1168 /* Gather all the relocations and build the .reloc section. */
1170 static void
1171 generate_reloc (bfd *abfd, struct bfd_link_info *info)
1174 /* For .reloc stuff. */
1175 reloc_data_type *reloc_data;
1176 int total_relocs = 0;
1177 int i;
1178 unsigned long sec_page = (unsigned long) -1;
1179 unsigned long page_ptr, page_count;
1180 int bi;
1181 bfd *b;
1182 struct bfd_section *s;
1184 total_relocs = 0;
1185 for (b = info->input_bfds; b; b = b->link_next)
1186 for (s = b->sections; s; s = s->next)
1187 total_relocs += s->reloc_count;
1189 reloc_data = xmalloc (total_relocs * sizeof (reloc_data_type));
1191 total_relocs = 0;
1192 bi = 0;
1193 for (bi = 0, b = info->input_bfds; b; bi++, b = b->link_next)
1195 arelent **relocs;
1196 int relsize, nrelocs, i;
1198 for (s = b->sections; s; s = s->next)
1200 unsigned long sec_vma = s->output_section->vma + s->output_offset;
1201 asymbol **symbols;
1202 int nsyms, symsize;
1204 /* If it's not loaded, we don't need to relocate it this way. */
1205 if (!(s->output_section->flags & SEC_LOAD))
1206 continue;
1208 /* I don't know why there would be a reloc for these, but I've
1209 seen it happen - DJ */
1210 if (s->output_section == &bfd_abs_section)
1211 continue;
1213 if (s->output_section->vma == 0)
1215 /* Huh? Shouldn't happen, but punt if it does. */
1216 einfo ("DJ: zero vma section reloc detected: `%s' #%d f=%d\n",
1217 s->output_section->name, s->output_section->index,
1218 s->output_section->flags);
1219 continue;
1222 symsize = bfd_get_symtab_upper_bound (b);
1223 symbols = xmalloc (symsize);
1224 nsyms = bfd_canonicalize_symtab (b, symbols);
1226 relsize = bfd_get_reloc_upper_bound (b, s);
1227 relocs = xmalloc (relsize);
1228 nrelocs = bfd_canonicalize_reloc (b, s, relocs, symbols);
1230 for (i = 0; i < nrelocs; i++)
1232 if (pe_dll_extra_pe_debug)
1234 struct bfd_symbol *sym = *relocs[i]->sym_ptr_ptr;
1235 printf ("rel: %s\n", sym->name);
1237 if (!relocs[i]->howto->pc_relative
1238 && relocs[i]->howto->type != pe_details->imagebase_reloc)
1240 bfd_vma sym_vma;
1241 struct bfd_symbol *sym = *relocs[i]->sym_ptr_ptr;
1243 sym_vma = (relocs[i]->addend
1244 + sym->value
1245 + sym->section->vma
1246 + sym->section->output_offset
1247 + sym->section->output_section->vma);
1248 reloc_data[total_relocs].vma = sec_vma + relocs[i]->address;
1250 #define BITS_AND_SHIFT(bits, shift) (bits * 1000 | shift)
1252 switch BITS_AND_SHIFT (relocs[i]->howto->bitsize,
1253 relocs[i]->howto->rightshift)
1255 #ifdef pe_use_x86_64
1256 case BITS_AND_SHIFT (64, 0):
1257 reloc_data[total_relocs].type = 10;
1258 total_relocs++;
1259 break;
1260 #endif
1261 case BITS_AND_SHIFT (32, 0):
1262 reloc_data[total_relocs].type = 3;
1263 total_relocs++;
1264 break;
1265 case BITS_AND_SHIFT (16, 0):
1266 reloc_data[total_relocs].type = 2;
1267 total_relocs++;
1268 break;
1269 case BITS_AND_SHIFT (16, 16):
1270 reloc_data[total_relocs].type = 4;
1271 /* FIXME: we can't know the symbol's right value
1272 yet, but we probably can safely assume that
1273 CE will relocate us in 64k blocks, so leaving
1274 it zero is safe. */
1275 reloc_data[total_relocs].extra = 0;
1276 total_relocs++;
1277 break;
1278 case BITS_AND_SHIFT (26, 2):
1279 reloc_data[total_relocs].type = 5;
1280 total_relocs++;
1281 break;
1282 case BITS_AND_SHIFT (24, 2):
1283 /* FIXME: 0 is ARM_26D, it is defined in bfd/coff-arm.c
1284 Those ARM_xxx definitions should go in proper
1285 header someday. */
1286 if (relocs[i]->howto->type == 0
1287 /* Older GNU linkers used 5 instead of 0 for this reloc. */
1288 || relocs[i]->howto->type == 5)
1289 /* This is an ARM_26D reloc, which is an ARM_26 reloc
1290 that has already been fully processed during a
1291 previous link stage, so ignore it here. */
1292 break;
1293 /* Fall through. */
1294 default:
1295 /* xgettext:c-format */
1296 einfo (_("%XError: %d-bit reloc in dll\n"),
1297 relocs[i]->howto->bitsize);
1298 break;
1302 free (relocs);
1303 /* Warning: the allocated symbols are remembered in BFD and
1304 reused later, so don't free them! */
1308 /* At this point, we have total_relocs relocation addresses in
1309 reloc_addresses, which are all suitable for the .reloc section.
1310 We must now create the new sections. */
1311 qsort (reloc_data, total_relocs, sizeof (*reloc_data), reloc_sort);
1313 for (i = 0; i < total_relocs; i++)
1315 unsigned long this_page = (reloc_data[i].vma >> 12);
1317 if (this_page != sec_page)
1319 reloc_sz = (reloc_sz + 3) & ~3; /* 4-byte align. */
1320 reloc_sz += 8;
1321 sec_page = this_page;
1324 reloc_sz += 2;
1326 if (reloc_data[i].type == 4)
1327 reloc_sz += 2;
1330 reloc_sz = (reloc_sz + 3) & ~3; /* 4-byte align. */
1331 reloc_d = xmalloc (reloc_sz);
1332 sec_page = (unsigned long) -1;
1333 reloc_sz = 0;
1334 page_ptr = (unsigned long) -1;
1335 page_count = 0;
1337 for (i = 0; i < total_relocs; i++)
1339 unsigned long rva = reloc_data[i].vma - image_base;
1340 unsigned long this_page = (rva & ~0xfff);
1342 if (this_page != sec_page)
1344 while (reloc_sz & 3)
1345 reloc_d[reloc_sz++] = 0;
1347 if (page_ptr != (unsigned long) -1)
1348 bfd_put_32 (abfd, reloc_sz - page_ptr, reloc_d + page_ptr + 4);
1350 bfd_put_32 (abfd, this_page, reloc_d + reloc_sz);
1351 page_ptr = reloc_sz;
1352 reloc_sz += 8;
1353 sec_page = this_page;
1354 page_count = 0;
1357 bfd_put_16 (abfd, (rva & 0xfff) + (reloc_data[i].type << 12),
1358 reloc_d + reloc_sz);
1359 reloc_sz += 2;
1361 if (reloc_data[i].type == 4)
1363 bfd_put_16 (abfd, reloc_data[i].extra, reloc_d + reloc_sz);
1364 reloc_sz += 2;
1367 page_count++;
1370 while (reloc_sz & 3)
1371 reloc_d[reloc_sz++] = 0;
1373 if (page_ptr != (unsigned long) -1)
1374 bfd_put_32 (abfd, reloc_sz - page_ptr, reloc_d + page_ptr + 4);
1376 while (reloc_sz < reloc_s->size)
1377 reloc_d[reloc_sz++] = 0;
1380 /* Given the exiting def_file structure, print out a .DEF file that
1381 corresponds to it. */
1383 static void
1384 quoteput (char *s, FILE *f, int needs_quotes)
1386 char *cp;
1388 for (cp = s; *cp; cp++)
1389 if (*cp == '\''
1390 || *cp == '"'
1391 || *cp == '\\'
1392 || ISSPACE (*cp)
1393 || *cp == ','
1394 || *cp == ';')
1395 needs_quotes = 1;
1397 if (needs_quotes)
1399 putc ('"', f);
1401 while (*s)
1403 if (*s == '"' || *s == '\\')
1404 putc ('\\', f);
1406 putc (*s, f);
1407 s++;
1410 putc ('"', f);
1412 else
1413 fputs (s, f);
1416 void
1417 pe_dll_generate_def_file (const char *pe_out_def_filename)
1419 int i;
1420 FILE *out = fopen (pe_out_def_filename, "w");
1422 if (out == NULL)
1423 /* xgettext:c-format */
1424 einfo (_("%s: Can't open output def file %s\n"),
1425 program_name, pe_out_def_filename);
1427 if (pe_def_file)
1429 if (pe_def_file->name)
1431 if (pe_def_file->is_dll)
1432 fprintf (out, "LIBRARY ");
1433 else
1434 fprintf (out, "NAME ");
1436 quoteput (pe_def_file->name, out, 1);
1438 if (pe_data (output_bfd)->pe_opthdr.ImageBase)
1439 fprintf (out, " BASE=0x%lx",
1440 (unsigned long) pe_data (output_bfd)->pe_opthdr.ImageBase);
1441 fprintf (out, "\n");
1444 if (pe_def_file->description)
1446 fprintf (out, "DESCRIPTION ");
1447 quoteput (pe_def_file->description, out, 1);
1448 fprintf (out, "\n");
1451 if (pe_def_file->version_minor != -1)
1452 fprintf (out, "VERSION %d.%d\n", pe_def_file->version_major,
1453 pe_def_file->version_minor);
1454 else if (pe_def_file->version_major != -1)
1455 fprintf (out, "VERSION %d\n", pe_def_file->version_major);
1457 if (pe_def_file->stack_reserve != -1 || pe_def_file->heap_reserve != -1)
1458 fprintf (out, "\n");
1460 if (pe_def_file->stack_commit != -1)
1461 fprintf (out, "STACKSIZE 0x%x,0x%x\n",
1462 pe_def_file->stack_reserve, pe_def_file->stack_commit);
1463 else if (pe_def_file->stack_reserve != -1)
1464 fprintf (out, "STACKSIZE 0x%x\n", pe_def_file->stack_reserve);
1466 if (pe_def_file->heap_commit != -1)
1467 fprintf (out, "HEAPSIZE 0x%x,0x%x\n",
1468 pe_def_file->heap_reserve, pe_def_file->heap_commit);
1469 else if (pe_def_file->heap_reserve != -1)
1470 fprintf (out, "HEAPSIZE 0x%x\n", pe_def_file->heap_reserve);
1472 if (pe_def_file->num_section_defs > 0)
1474 fprintf (out, "\nSECTIONS\n\n");
1476 for (i = 0; i < pe_def_file->num_section_defs; i++)
1478 fprintf (out, " ");
1479 quoteput (pe_def_file->section_defs[i].name, out, 0);
1481 if (pe_def_file->section_defs[i].class)
1483 fprintf (out, " CLASS ");
1484 quoteput (pe_def_file->section_defs[i].class, out, 0);
1487 if (pe_def_file->section_defs[i].flag_read)
1488 fprintf (out, " READ");
1490 if (pe_def_file->section_defs[i].flag_write)
1491 fprintf (out, " WRITE");
1493 if (pe_def_file->section_defs[i].flag_execute)
1494 fprintf (out, " EXECUTE");
1496 if (pe_def_file->section_defs[i].flag_shared)
1497 fprintf (out, " SHARED");
1499 fprintf (out, "\n");
1503 if (pe_def_file->num_exports > 0)
1505 fprintf (out, "EXPORTS\n");
1507 for (i = 0; i < pe_def_file->num_exports; i++)
1509 def_file_export *e = pe_def_file->exports + i;
1510 fprintf (out, " ");
1511 quoteput (e->name, out, 0);
1513 if (e->internal_name && strcmp (e->internal_name, e->name))
1515 fprintf (out, " = ");
1516 quoteput (e->internal_name, out, 0);
1519 if (e->ordinal != -1)
1520 fprintf (out, " @%d", e->ordinal);
1522 if (e->flag_private)
1523 fprintf (out, " PRIVATE");
1525 if (e->flag_constant)
1526 fprintf (out, " CONSTANT");
1528 if (e->flag_noname)
1529 fprintf (out, " NONAME");
1531 if (e->flag_data)
1532 fprintf (out, " DATA");
1534 fprintf (out, "\n");
1538 if (pe_def_file->num_imports > 0)
1540 fprintf (out, "\nIMPORTS\n\n");
1542 for (i = 0; i < pe_def_file->num_imports; i++)
1544 def_file_import *im = pe_def_file->imports + i;
1545 fprintf (out, " ");
1547 if (im->internal_name
1548 && (!im->name || strcmp (im->internal_name, im->name)))
1550 quoteput (im->internal_name, out, 0);
1551 fprintf (out, " = ");
1554 quoteput (im->module->name, out, 0);
1555 fprintf (out, ".");
1557 if (im->name)
1558 quoteput (im->name, out, 0);
1559 else
1560 fprintf (out, "%d", im->ordinal);
1562 fprintf (out, "\n");
1566 else
1567 fprintf (out, _("; no contents available\n"));
1569 if (fclose (out) == EOF)
1570 /* xgettext:c-format */
1571 einfo (_("%P: Error closing file `%s'\n"), pe_out_def_filename);
1574 /* Generate the import library. */
1576 static asymbol **symtab;
1577 static int symptr;
1578 static int tmp_seq;
1579 static const char *dll_filename;
1580 static char *dll_symname;
1582 #define UNDSEC (asection *) &bfd_und_section
1584 static asection *
1585 quick_section (bfd *abfd, const char *name, int flags, int align)
1587 asection *sec;
1588 asymbol *sym;
1590 sec = bfd_make_section_old_way (abfd, name);
1591 bfd_set_section_flags (abfd, sec, flags | SEC_ALLOC | SEC_LOAD | SEC_KEEP);
1592 bfd_set_section_alignment (abfd, sec, align);
1593 /* Remember to undo this before trying to link internally! */
1594 sec->output_section = sec;
1596 sym = bfd_make_empty_symbol (abfd);
1597 symtab[symptr++] = sym;
1598 sym->name = sec->name;
1599 sym->section = sec;
1600 sym->flags = BSF_LOCAL;
1601 sym->value = 0;
1603 return sec;
1606 static void
1607 quick_symbol (bfd *abfd,
1608 const char *n1,
1609 const char *n2,
1610 const char *n3,
1611 asection *sec,
1612 int flags,
1613 int addr)
1615 asymbol *sym;
1616 char *name = xmalloc (strlen (n1) + strlen (n2) + strlen (n3) + 1);
1618 strcpy (name, n1);
1619 strcat (name, n2);
1620 strcat (name, n3);
1621 sym = bfd_make_empty_symbol (abfd);
1622 sym->name = name;
1623 sym->section = sec;
1624 sym->flags = flags;
1625 sym->value = addr;
1626 symtab[symptr++] = sym;
1629 static arelent *reltab = 0;
1630 static int relcount = 0, relsize = 0;
1632 static void
1633 quick_reloc (bfd *abfd, int address, int which_howto, int symidx)
1635 if (relcount >= relsize - 1)
1637 relsize += 10;
1638 if (reltab)
1639 reltab = xrealloc (reltab, relsize * sizeof (arelent));
1640 else
1641 reltab = xmalloc (relsize * sizeof (arelent));
1643 reltab[relcount].address = address;
1644 reltab[relcount].addend = 0;
1645 reltab[relcount].howto = bfd_reloc_type_lookup (abfd, which_howto);
1646 reltab[relcount].sym_ptr_ptr = symtab + symidx;
1647 relcount++;
1650 static void
1651 save_relocs (asection *sec)
1653 int i;
1655 sec->relocation = reltab;
1656 sec->reloc_count = relcount;
1657 sec->orelocation = xmalloc ((relcount + 1) * sizeof (arelent *));
1658 for (i = 0; i < relcount; i++)
1659 sec->orelocation[i] = sec->relocation + i;
1660 sec->orelocation[relcount] = 0;
1661 sec->flags |= SEC_RELOC;
1662 reltab = 0;
1663 relcount = relsize = 0;
1666 /* .section .idata$2
1667 .global __head_my_dll
1668 __head_my_dll:
1669 .rva hname
1670 .long 0
1671 .long 0
1672 .rva __my_dll_iname
1673 .rva fthunk
1675 .section .idata$5
1676 .long 0
1677 fthunk:
1679 .section .idata$4
1680 .long 0
1681 hname: */
1683 static bfd *
1684 make_head (bfd *parent)
1686 asection *id2, *id5, *id4;
1687 unsigned char *d2, *d5, *d4;
1688 char *oname;
1689 bfd *abfd;
1691 oname = xmalloc (20);
1692 sprintf (oname, "d%06d.o", tmp_seq);
1693 tmp_seq++;
1695 abfd = bfd_create (oname, parent);
1696 bfd_find_target (pe_details->object_target, abfd);
1697 bfd_make_writable (abfd);
1699 bfd_set_format (abfd, bfd_object);
1700 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
1702 symptr = 0;
1703 symtab = xmalloc (6 * sizeof (asymbol *));
1704 id2 = quick_section (abfd, ".idata$2", SEC_HAS_CONTENTS, 2);
1705 id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
1706 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
1707 quick_symbol (abfd, U ("_head_"), dll_symname, "", id2, BSF_GLOBAL, 0);
1708 quick_symbol (abfd, U (""), dll_symname, "_iname", UNDSEC, BSF_GLOBAL, 0);
1710 /* OK, pay attention here. I got confused myself looking back at
1711 it. We create a four-byte section to mark the beginning of the
1712 list, and we include an offset of 4 in the section, so that the
1713 pointer to the list points to the *end* of this section, which is
1714 the start of the list of sections from other objects. */
1716 bfd_set_section_size (abfd, id2, 20);
1717 d2 = xmalloc (20);
1718 id2->contents = d2;
1719 memset (d2, 0, 20);
1720 d2[0] = d2[16] = 4; /* Reloc addend. */
1721 quick_reloc (abfd, 0, BFD_RELOC_RVA, 2);
1722 quick_reloc (abfd, 12, BFD_RELOC_RVA, 4);
1723 quick_reloc (abfd, 16, BFD_RELOC_RVA, 1);
1724 save_relocs (id2);
1726 bfd_set_section_size (abfd, id5, PE_IDATA5_SIZE);
1727 d5 = xmalloc (PE_IDATA5_SIZE);
1728 id5->contents = d5;
1729 memset (d5, 0, PE_IDATA5_SIZE);
1731 bfd_set_section_size (abfd, id4, PE_IDATA4_SIZE);
1732 d4 = xmalloc (PE_IDATA4_SIZE);
1733 id4->contents = d4;
1734 memset (d4, 0, PE_IDATA4_SIZE);
1736 bfd_set_symtab (abfd, symtab, symptr);
1738 bfd_set_section_contents (abfd, id2, d2, 0, 20);
1739 bfd_set_section_contents (abfd, id5, d5, 0, PE_IDATA5_SIZE);
1740 bfd_set_section_contents (abfd, id4, d4, 0, PE_IDATA4_SIZE);
1742 bfd_make_readable (abfd);
1743 return abfd;
1746 /* .section .idata$4
1747 .long 0
1748 [.long 0] for PE+
1749 .section .idata$5
1750 .long 0
1751 [.long 0] for PE+
1752 .section idata$7
1753 .global __my_dll_iname
1754 __my_dll_iname:
1755 .asciz "my.dll" */
1757 static bfd *
1758 make_tail (bfd *parent)
1760 asection *id4, *id5, *id7;
1761 unsigned char *d4, *d5, *d7;
1762 int len;
1763 char *oname;
1764 bfd *abfd;
1766 oname = xmalloc (20);
1767 sprintf (oname, "d%06d.o", tmp_seq);
1768 tmp_seq++;
1770 abfd = bfd_create (oname, parent);
1771 bfd_find_target (pe_details->object_target, abfd);
1772 bfd_make_writable (abfd);
1774 bfd_set_format (abfd, bfd_object);
1775 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
1777 symptr = 0;
1778 symtab = xmalloc (5 * sizeof (asymbol *));
1779 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
1780 id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
1781 id7 = quick_section (abfd, ".idata$7", SEC_HAS_CONTENTS, 2);
1782 quick_symbol (abfd, U (""), dll_symname, "_iname", id7, BSF_GLOBAL, 0);
1784 bfd_set_section_size (abfd, id4, PE_IDATA4_SIZE);
1785 d4 = xmalloc (PE_IDATA4_SIZE);
1786 id4->contents = d4;
1787 memset (d4, 0, PE_IDATA4_SIZE);
1789 bfd_set_section_size (abfd, id5, PE_IDATA5_SIZE);
1790 d5 = xmalloc (PE_IDATA5_SIZE);
1791 id5->contents = d5;
1792 memset (d5, 0, PE_IDATA5_SIZE);
1794 len = strlen (dll_filename) + 1;
1795 if (len & 1)
1796 len++;
1797 bfd_set_section_size (abfd, id7, len);
1798 d7 = xmalloc (len);
1799 id7->contents = d7;
1800 strcpy ((char *) d7, dll_filename);
1801 /* If len was odd, the above
1802 strcpy leaves behind an undefined byte. That is harmless,
1803 but we set it to 0 just so the binary dumps are pretty. */
1804 d7[len - 1] = 0;
1806 bfd_set_symtab (abfd, symtab, symptr);
1808 bfd_set_section_contents (abfd, id4, d4, 0, PE_IDATA4_SIZE);
1809 bfd_set_section_contents (abfd, id5, d5, 0, PE_IDATA5_SIZE);
1810 bfd_set_section_contents (abfd, id7, d7, 0, len);
1812 bfd_make_readable (abfd);
1813 return abfd;
1816 /* .text
1817 .global _function
1818 .global ___imp_function
1819 .global __imp__function
1820 _function:
1821 jmp *__imp__function:
1823 .section idata$7
1824 .long __head_my_dll
1826 .section .idata$5
1827 ___imp_function:
1828 __imp__function:
1829 iat?
1830 .section .idata$4
1831 iat?
1832 .section .idata$6
1833 ID<ordinal>:
1834 .short <hint>
1835 .asciz "function" xlate? (add underscore, kill at) */
1837 static const unsigned char jmp_ix86_bytes[] =
1839 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x90, 0x90
1842 /* _function:
1843 mov.l ip+8,r0
1844 mov.l @r0,r0
1845 jmp @r0
1847 .dw __imp_function */
1849 static const unsigned char jmp_sh_bytes[] =
1851 0x01, 0xd0, 0x02, 0x60, 0x2b, 0x40, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00
1854 /* _function:
1855 lui $t0,<high:__imp_function>
1856 lw $t0,<low:__imp_function>
1857 jr $t0
1858 nop */
1860 static const unsigned char jmp_mips_bytes[] =
1862 0x00, 0x00, 0x08, 0x3c, 0x00, 0x00, 0x08, 0x8d,
1863 0x08, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00
1866 static const unsigned char jmp_arm_bytes[] =
1868 0x00, 0xc0, 0x9f, 0xe5, /* ldr ip, [pc] */
1869 0x00, 0xf0, 0x9c, 0xe5, /* ldr pc, [ip] */
1870 0, 0, 0, 0
1874 static bfd *
1875 make_one (def_file_export *exp, bfd *parent)
1877 asection *tx, *id7, *id5, *id4, *id6;
1878 unsigned char *td = NULL, *d7, *d5, *d4, *d6 = NULL;
1879 int len;
1880 char *oname;
1881 bfd *abfd;
1882 const unsigned char *jmp_bytes = NULL;
1883 int jmp_byte_count = 0;
1885 switch (pe_details->pe_arch)
1887 case PE_ARCH_i386:
1888 jmp_bytes = jmp_ix86_bytes;
1889 jmp_byte_count = sizeof (jmp_ix86_bytes);
1890 break;
1891 case PE_ARCH_sh:
1892 jmp_bytes = jmp_sh_bytes;
1893 jmp_byte_count = sizeof (jmp_sh_bytes);
1894 break;
1895 case PE_ARCH_mips:
1896 jmp_bytes = jmp_mips_bytes;
1897 jmp_byte_count = sizeof (jmp_mips_bytes);
1898 break;
1899 case PE_ARCH_arm:
1900 case PE_ARCH_arm_epoc:
1901 case PE_ARCH_arm_wince:
1902 jmp_bytes = jmp_arm_bytes;
1903 jmp_byte_count = sizeof (jmp_arm_bytes);
1904 break;
1905 default:
1906 abort ();
1909 oname = xmalloc (20);
1910 sprintf (oname, "d%06d.o", tmp_seq);
1911 tmp_seq++;
1913 abfd = bfd_create (oname, parent);
1914 bfd_find_target (pe_details->object_target, abfd);
1915 bfd_make_writable (abfd);
1917 bfd_set_format (abfd, bfd_object);
1918 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
1920 symptr = 0;
1921 symtab = xmalloc (11 * sizeof (asymbol *));
1922 tx = quick_section (abfd, ".text", SEC_CODE|SEC_HAS_CONTENTS, 2);
1923 id7 = quick_section (abfd, ".idata$7", SEC_HAS_CONTENTS, 2);
1924 id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
1925 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
1926 id6 = quick_section (abfd, ".idata$6", SEC_HAS_CONTENTS, 2);
1928 if (*exp->internal_name == '@')
1930 quick_symbol (abfd, U ("_head_"), dll_symname, "", UNDSEC,
1931 BSF_GLOBAL, 0);
1932 if (! exp->flag_data)
1933 quick_symbol (abfd, "", exp->internal_name, "", tx, BSF_GLOBAL, 0);
1934 quick_symbol (abfd, "__imp_", exp->internal_name, "", id5,
1935 BSF_GLOBAL, 0);
1936 /* Fastcall applies only to functions,
1937 so no need for auto-import symbol. */
1939 else
1941 quick_symbol (abfd, U ("_head_"), dll_symname, "", UNDSEC,
1942 BSF_GLOBAL, 0);
1943 if (! exp->flag_data)
1944 quick_symbol (abfd, U (""), exp->internal_name, "", tx,
1945 BSF_GLOBAL, 0);
1946 quick_symbol (abfd, "__imp_", U (""), exp->internal_name, id5,
1947 BSF_GLOBAL, 0);
1948 /* Symbol to reference ord/name of imported
1949 data symbol, used to implement auto-import. */
1950 if (exp->flag_data)
1951 quick_symbol (abfd, U ("_nm_"), U (""), exp->internal_name, id6,
1952 BSF_GLOBAL,0);
1954 if (pe_dll_compat_implib)
1955 quick_symbol (abfd, U ("__imp_"), exp->internal_name, "", id5,
1956 BSF_GLOBAL, 0);
1958 if (! exp->flag_data)
1960 bfd_set_section_size (abfd, tx, jmp_byte_count);
1961 td = xmalloc (jmp_byte_count);
1962 tx->contents = td;
1963 memcpy (td, jmp_bytes, jmp_byte_count);
1965 switch (pe_details->pe_arch)
1967 case PE_ARCH_i386:
1968 quick_reloc (abfd, 2, BFD_RELOC_32, 2);
1969 break;
1970 case PE_ARCH_sh:
1971 quick_reloc (abfd, 8, BFD_RELOC_32, 2);
1972 break;
1973 case PE_ARCH_mips:
1974 quick_reloc (abfd, 0, BFD_RELOC_HI16_S, 2);
1975 quick_reloc (abfd, 0, BFD_RELOC_LO16, 0); /* MIPS_R_PAIR */
1976 quick_reloc (abfd, 4, BFD_RELOC_LO16, 2);
1977 break;
1978 case PE_ARCH_arm:
1979 case PE_ARCH_arm_epoc:
1980 case PE_ARCH_arm_wince:
1981 quick_reloc (abfd, 8, BFD_RELOC_32, 2);
1982 break;
1983 default:
1984 abort ();
1986 save_relocs (tx);
1989 bfd_set_section_size (abfd, id7, 4);
1990 d7 = xmalloc (4);
1991 id7->contents = d7;
1992 memset (d7, 0, 4);
1993 quick_reloc (abfd, 0, BFD_RELOC_RVA, 5);
1994 save_relocs (id7);
1996 bfd_set_section_size (abfd, id5, PE_IDATA5_SIZE);
1997 d5 = xmalloc (PE_IDATA5_SIZE);
1998 id5->contents = d5;
1999 memset (d5, 0, PE_IDATA5_SIZE);
2001 if (exp->flag_noname)
2003 d5[0] = exp->ordinal;
2004 d5[1] = exp->ordinal >> 8;
2005 d5[PE_IDATA5_SIZE - 1] = 0x80;
2007 else
2009 quick_reloc (abfd, 0, BFD_RELOC_RVA, 4);
2010 save_relocs (id5);
2013 bfd_set_section_size (abfd, id4, PE_IDATA4_SIZE);
2014 d4 = xmalloc (PE_IDATA4_SIZE);
2015 id4->contents = d4;
2016 memset (d4, 0, PE_IDATA4_SIZE);
2018 if (exp->flag_noname)
2020 d4[0] = exp->ordinal;
2021 d4[1] = exp->ordinal >> 8;
2022 d4[PE_IDATA4_SIZE - 1] = 0x80;
2024 else
2026 quick_reloc (abfd, 0, BFD_RELOC_RVA, 4);
2027 save_relocs (id4);
2030 if (exp->flag_noname)
2032 len = 0;
2033 bfd_set_section_size (abfd, id6, 0);
2035 else
2037 /* { short, asciz } */
2038 len = 2 + strlen (exp->name) + 1;
2039 if (len & 1)
2040 len++;
2041 bfd_set_section_size (abfd, id6, len);
2042 d6 = xmalloc (len);
2043 id6->contents = d6;
2044 memset (d6, 0, len);
2045 d6[0] = exp->hint & 0xff;
2046 d6[1] = exp->hint >> 8;
2047 strcpy ((char *) d6 + 2, exp->name);
2050 bfd_set_symtab (abfd, symtab, symptr);
2052 bfd_set_section_contents (abfd, tx, td, 0, jmp_byte_count);
2053 bfd_set_section_contents (abfd, id7, d7, 0, 4);
2054 bfd_set_section_contents (abfd, id5, d5, 0, PE_IDATA5_SIZE);
2055 bfd_set_section_contents (abfd, id4, d4, 0, PE_IDATA4_SIZE);
2056 if (!exp->flag_noname)
2057 bfd_set_section_contents (abfd, id6, d6, 0, len);
2059 bfd_make_readable (abfd);
2060 return abfd;
2063 static bfd *
2064 make_singleton_name_thunk (const char *import, bfd *parent)
2066 /* Name thunks go to idata$4. */
2067 asection *id4;
2068 unsigned char *d4;
2069 char *oname;
2070 bfd *abfd;
2072 oname = xmalloc (20);
2073 sprintf (oname, "nmth%06d.o", tmp_seq);
2074 tmp_seq++;
2076 abfd = bfd_create (oname, parent);
2077 bfd_find_target (pe_details->object_target, abfd);
2078 bfd_make_writable (abfd);
2080 bfd_set_format (abfd, bfd_object);
2081 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2083 symptr = 0;
2084 symtab = xmalloc (3 * sizeof (asymbol *));
2085 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
2086 quick_symbol (abfd, U ("_nm_thnk_"), import, "", id4, BSF_GLOBAL, 0);
2087 quick_symbol (abfd, U ("_nm_"), import, "", UNDSEC, BSF_GLOBAL, 0);
2089 /* We need space for the real thunk and for the null terminator. */
2090 bfd_set_section_size (abfd, id4, PE_IDATA4_SIZE * 2);
2091 d4 = xmalloc (PE_IDATA4_SIZE * 2);
2092 id4->contents = d4;
2093 memset (d4, 0, PE_IDATA4_SIZE * 2);
2094 quick_reloc (abfd, 0, BFD_RELOC_RVA, 2);
2095 save_relocs (id4);
2097 bfd_set_symtab (abfd, symtab, symptr);
2099 bfd_set_section_contents (abfd, id4, d4, 0, PE_IDATA4_SIZE * 2);
2101 bfd_make_readable (abfd);
2102 return abfd;
2105 static char *
2106 make_import_fixup_mark (arelent *rel)
2108 /* We convert reloc to symbol, for later reference. */
2109 static int counter;
2110 static char *fixup_name = NULL;
2111 static size_t buffer_len = 0;
2113 struct bfd_symbol *sym = *rel->sym_ptr_ptr;
2115 bfd *abfd = bfd_asymbol_bfd (sym);
2116 struct bfd_link_hash_entry *bh;
2118 if (!fixup_name)
2120 fixup_name = xmalloc (384);
2121 buffer_len = 384;
2124 if (strlen (sym->name) + 25 > buffer_len)
2125 /* Assume 25 chars for "__fu" + counter + "_". If counter is
2126 bigger than 20 digits long, we've got worse problems than
2127 overflowing this buffer... */
2129 free (fixup_name);
2130 /* New buffer size is length of symbol, plus 25, but
2131 then rounded up to the nearest multiple of 128. */
2132 buffer_len = ((strlen (sym->name) + 25) + 127) & ~127;
2133 fixup_name = xmalloc (buffer_len);
2136 sprintf (fixup_name, "__fu%d_%s", counter++, sym->name);
2138 bh = NULL;
2139 bfd_coff_link_add_one_symbol (&link_info, abfd, fixup_name, BSF_GLOBAL,
2140 current_sec, /* sym->section, */
2141 rel->address, NULL, TRUE, FALSE, &bh);
2143 return fixup_name;
2146 /* .section .idata$2
2147 .rva __nm_thnk_SYM (singleton thunk with name of func)
2148 .long 0
2149 .long 0
2150 .rva __my_dll_iname (name of dll)
2151 .rva __fuNN_SYM (pointer to reference (address) in text) */
2153 static bfd *
2154 make_import_fixup_entry (const char *name,
2155 const char *fixup_name,
2156 const char *dll_symname,
2157 bfd *parent)
2159 asection *id2;
2160 unsigned char *d2;
2161 char *oname;
2162 bfd *abfd;
2164 oname = xmalloc (20);
2165 sprintf (oname, "fu%06d.o", tmp_seq);
2166 tmp_seq++;
2168 abfd = bfd_create (oname, parent);
2169 bfd_find_target (pe_details->object_target, abfd);
2170 bfd_make_writable (abfd);
2172 bfd_set_format (abfd, bfd_object);
2173 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2175 symptr = 0;
2176 symtab = xmalloc (6 * sizeof (asymbol *));
2177 id2 = quick_section (abfd, ".idata$2", SEC_HAS_CONTENTS, 2);
2179 quick_symbol (abfd, U ("_nm_thnk_"), name, "", UNDSEC, BSF_GLOBAL, 0);
2180 quick_symbol (abfd, U (""), dll_symname, "_iname", UNDSEC, BSF_GLOBAL, 0);
2181 quick_symbol (abfd, "", fixup_name, "", UNDSEC, BSF_GLOBAL, 0);
2183 bfd_set_section_size (abfd, id2, 20);
2184 d2 = xmalloc (20);
2185 id2->contents = d2;
2186 memset (d2, 0, 20);
2188 quick_reloc (abfd, 0, BFD_RELOC_RVA, 1);
2189 quick_reloc (abfd, 12, BFD_RELOC_RVA, 2);
2190 quick_reloc (abfd, 16, BFD_RELOC_RVA, 3);
2191 save_relocs (id2);
2193 bfd_set_symtab (abfd, symtab, symptr);
2195 bfd_set_section_contents (abfd, id2, d2, 0, 20);
2197 bfd_make_readable (abfd);
2198 return abfd;
2201 /* .section .rdata_runtime_pseudo_reloc
2202 .long addend
2203 .rva __fuNN_SYM (pointer to reference (address) in text) */
2205 static bfd *
2206 make_runtime_pseudo_reloc (const char *name ATTRIBUTE_UNUSED,
2207 const char *fixup_name,
2208 int addend,
2209 bfd *parent)
2211 asection *rt_rel;
2212 unsigned char *rt_rel_d;
2213 char *oname;
2214 bfd *abfd;
2216 oname = xmalloc (20);
2217 sprintf (oname, "rtr%06d.o", tmp_seq);
2218 tmp_seq++;
2220 abfd = bfd_create (oname, parent);
2221 bfd_find_target (pe_details->object_target, abfd);
2222 bfd_make_writable (abfd);
2224 bfd_set_format (abfd, bfd_object);
2225 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2227 symptr = 0;
2228 symtab = xmalloc (2 * sizeof (asymbol *));
2229 rt_rel = quick_section (abfd, ".rdata_runtime_pseudo_reloc",
2230 SEC_HAS_CONTENTS, 2);
2232 quick_symbol (abfd, "", fixup_name, "", UNDSEC, BSF_GLOBAL, 0);
2234 bfd_set_section_size (abfd, rt_rel, 8);
2235 rt_rel_d = xmalloc (8);
2236 rt_rel->contents = rt_rel_d;
2237 memset (rt_rel_d, 0, 8);
2238 bfd_put_32 (abfd, addend, rt_rel_d);
2240 quick_reloc (abfd, 4, BFD_RELOC_RVA, 1);
2241 save_relocs (rt_rel);
2243 bfd_set_symtab (abfd, symtab, symptr);
2245 bfd_set_section_contents (abfd, rt_rel, rt_rel_d, 0, 8);
2247 bfd_make_readable (abfd);
2248 return abfd;
2251 /* .section .rdata
2252 .rva __pei386_runtime_relocator */
2254 static bfd *
2255 pe_create_runtime_relocator_reference (bfd *parent)
2257 asection *extern_rt_rel;
2258 unsigned char *extern_rt_rel_d;
2259 char *oname;
2260 bfd *abfd;
2262 oname = xmalloc (20);
2263 sprintf (oname, "ertr%06d.o", tmp_seq);
2264 tmp_seq++;
2266 abfd = bfd_create (oname, parent);
2267 bfd_find_target (pe_details->object_target, abfd);
2268 bfd_make_writable (abfd);
2270 bfd_set_format (abfd, bfd_object);
2271 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2273 symptr = 0;
2274 symtab = xmalloc (2 * sizeof (asymbol *));
2275 extern_rt_rel = quick_section (abfd, ".rdata", SEC_HAS_CONTENTS, 2);
2277 quick_symbol (abfd, "", U ("_pei386_runtime_relocator"), "", UNDSEC,
2278 BSF_NO_FLAGS, 0);
2280 bfd_set_section_size (abfd, extern_rt_rel, 4);
2281 extern_rt_rel_d = xmalloc (4);
2282 extern_rt_rel->contents = extern_rt_rel_d;
2284 quick_reloc (abfd, 0, BFD_RELOC_RVA, 1);
2285 save_relocs (extern_rt_rel);
2287 bfd_set_symtab (abfd, symtab, symptr);
2289 bfd_set_section_contents (abfd, extern_rt_rel, extern_rt_rel_d, 0, 4);
2291 bfd_make_readable (abfd);
2292 return abfd;
2295 void
2296 pe_create_import_fixup (arelent *rel, asection *s, int addend)
2298 char buf[300];
2299 struct bfd_symbol *sym = *rel->sym_ptr_ptr;
2300 struct bfd_link_hash_entry *name_thunk_sym;
2301 const char *name = sym->name;
2302 char *fixup_name = make_import_fixup_mark (rel);
2303 bfd *b;
2305 sprintf (buf, U ("_nm_thnk_%s"), name);
2307 name_thunk_sym = bfd_link_hash_lookup (link_info.hash, buf, 0, 0, 1);
2309 if (!name_thunk_sym || name_thunk_sym->type != bfd_link_hash_defined)
2311 bfd *b = make_singleton_name_thunk (name, output_bfd);
2312 add_bfd_to_link (b, b->filename, &link_info);
2314 /* If we ever use autoimport, we have to cast text section writable. */
2315 config.text_read_only = FALSE;
2316 output_bfd->flags &= ~WP_TEXT;
2319 if (addend == 0 || link_info.pei386_runtime_pseudo_reloc)
2321 extern char * pe_data_import_dll;
2322 char * dll_symname = pe_data_import_dll ? pe_data_import_dll : "unknown";
2324 b = make_import_fixup_entry (name, fixup_name, dll_symname, output_bfd);
2325 add_bfd_to_link (b, b->filename, &link_info);
2328 if (addend != 0)
2330 if (link_info.pei386_runtime_pseudo_reloc)
2332 if (pe_dll_extra_pe_debug)
2333 printf ("creating runtime pseudo-reloc entry for %s (addend=%d)\n",
2334 fixup_name, addend);
2335 b = make_runtime_pseudo_reloc (name, fixup_name, addend, output_bfd);
2336 add_bfd_to_link (b, b->filename, &link_info);
2338 if (runtime_pseudo_relocs_created == 0)
2340 b = pe_create_runtime_relocator_reference (output_bfd);
2341 add_bfd_to_link (b, b->filename, &link_info);
2343 runtime_pseudo_relocs_created++;
2345 else
2347 einfo (_("%C: variable '%T' can't be auto-imported. Please read the documentation for ld's --enable-auto-import for details.\n"),
2348 s->owner, s, rel->address, sym->name);
2349 einfo ("%X");
2355 void
2356 pe_dll_generate_implib (def_file *def, const char *impfilename)
2358 int i;
2359 bfd *ar_head;
2360 bfd *ar_tail;
2361 bfd *outarch;
2362 bfd *head = 0;
2364 dll_filename = (def->name) ? def->name : dll_name;
2365 dll_symname = xstrdup (dll_filename);
2366 for (i = 0; dll_symname[i]; i++)
2367 if (!ISALNUM (dll_symname[i]))
2368 dll_symname[i] = '_';
2370 unlink_if_ordinary (impfilename);
2372 outarch = bfd_openw (impfilename, 0);
2374 if (!outarch)
2376 /* xgettext:c-format */
2377 einfo (_("%XCan't open .lib file: %s\n"), impfilename);
2378 return;
2381 /* xgettext:c-format */
2382 info_msg (_("Creating library file: %s\n"), impfilename);
2384 bfd_set_format (outarch, bfd_archive);
2385 outarch->has_armap = 1;
2387 /* Work out a reasonable size of things to put onto one line. */
2388 ar_head = make_head (outarch);
2390 for (i = 0; i < def->num_exports; i++)
2392 /* The import library doesn't know about the internal name. */
2393 char *internal = def->exports[i].internal_name;
2394 bfd *n;
2396 /* Don't add PRIVATE entries to import lib. */
2397 if (pe_def_file->exports[i].flag_private)
2398 continue;
2399 def->exports[i].internal_name = def->exports[i].name;
2400 n = make_one (def->exports + i, outarch);
2401 n->next = head;
2402 head = n;
2403 def->exports[i].internal_name = internal;
2406 ar_tail = make_tail (outarch);
2408 if (ar_head == NULL || ar_tail == NULL)
2409 return;
2411 /* Now stick them all into the archive. */
2412 ar_head->next = head;
2413 ar_tail->next = ar_head;
2414 head = ar_tail;
2416 if (! bfd_set_archive_head (outarch, head))
2417 einfo ("%Xbfd_set_archive_head: %E\n");
2419 if (! bfd_close (outarch))
2420 einfo ("%Xbfd_close %s: %E\n", impfilename);
2422 while (head != NULL)
2424 bfd *n = head->next;
2425 bfd_close (head);
2426 head = n;
2430 static void
2431 add_bfd_to_link (bfd *abfd, const char *name, struct bfd_link_info *link_info)
2433 lang_input_statement_type *fake_file;
2435 fake_file = lang_add_input_file (name,
2436 lang_input_file_is_fake_enum,
2437 NULL);
2438 fake_file->the_bfd = abfd;
2439 ldlang_add_file (fake_file);
2441 if (!bfd_link_add_symbols (abfd, link_info))
2442 einfo ("%Xaddsym %s: %E\n", name);
2445 void
2446 pe_process_import_defs (bfd *output_bfd, struct bfd_link_info *link_info)
2448 def_file_module *module;
2450 pe_dll_id_target (bfd_get_target (output_bfd));
2452 if (!pe_def_file)
2453 return;
2455 for (module = pe_def_file->modules; module; module = module->next)
2457 int i, do_this_dll;
2459 dll_filename = module->name;
2460 dll_symname = xstrdup (module->name);
2461 for (i = 0; dll_symname[i]; i++)
2462 if (!ISALNUM (dll_symname[i]))
2463 dll_symname[i] = '_';
2465 do_this_dll = 0;
2467 for (i = 0; i < pe_def_file->num_imports; i++)
2468 if (pe_def_file->imports[i].module == module)
2470 def_file_export exp;
2471 struct bfd_link_hash_entry *blhe;
2472 int lead_at = (*pe_def_file->imports[i].internal_name == '@');
2473 /* See if we need this import. */
2474 size_t len = strlen (pe_def_file->imports[i].internal_name);
2475 char *name = xmalloc (len + 2 + 6);
2477 if (lead_at)
2478 sprintf (name, "%s",
2479 pe_def_file->imports[i].internal_name);
2480 else
2481 sprintf (name, "%s%s",U (""),
2482 pe_def_file->imports[i].internal_name);
2484 blhe = bfd_link_hash_lookup (link_info->hash, name,
2485 FALSE, FALSE, FALSE);
2487 if (!blhe || (blhe && blhe->type != bfd_link_hash_undefined))
2489 if (lead_at)
2490 sprintf (name, "%s%s", "__imp_",
2491 pe_def_file->imports[i].internal_name);
2492 else
2493 sprintf (name, "%s%s%s", "__imp_", U (""),
2494 pe_def_file->imports[i].internal_name);
2496 blhe = bfd_link_hash_lookup (link_info->hash, name,
2497 FALSE, FALSE, FALSE);
2499 free (name);
2501 if (blhe && blhe->type == bfd_link_hash_undefined)
2503 bfd *one;
2504 /* We do. */
2505 if (!do_this_dll)
2507 bfd *ar_head = make_head (output_bfd);
2508 add_bfd_to_link (ar_head, ar_head->filename, link_info);
2509 do_this_dll = 1;
2511 exp.internal_name = pe_def_file->imports[i].internal_name;
2512 exp.name = pe_def_file->imports[i].name;
2513 exp.ordinal = pe_def_file->imports[i].ordinal;
2514 exp.hint = exp.ordinal >= 0 ? exp.ordinal : 0;
2515 exp.flag_private = 0;
2516 exp.flag_constant = 0;
2517 exp.flag_data = pe_def_file->imports[i].data;
2518 exp.flag_noname = exp.name ? 0 : 1;
2519 one = make_one (&exp, output_bfd);
2520 add_bfd_to_link (one, one->filename, link_info);
2523 if (do_this_dll)
2525 bfd *ar_tail = make_tail (output_bfd);
2526 add_bfd_to_link (ar_tail, ar_tail->filename, link_info);
2529 free (dll_symname);
2533 /* We were handed a *.DLL file. Parse it and turn it into a set of
2534 IMPORTS directives in the def file. Return TRUE if the file was
2535 handled, FALSE if not. */
2537 static unsigned int
2538 pe_get16 (bfd *abfd, int where)
2540 unsigned char b[2];
2542 bfd_seek (abfd, (file_ptr) where, SEEK_SET);
2543 bfd_bread (b, (bfd_size_type) 2, abfd);
2544 return b[0] + (b[1] << 8);
2547 static unsigned int
2548 pe_get32 (bfd *abfd, int where)
2550 unsigned char b[4];
2552 bfd_seek (abfd, (file_ptr) where, SEEK_SET);
2553 bfd_bread (b, (bfd_size_type) 4, abfd);
2554 return b[0] + (b[1] << 8) + (b[2] << 16) + (b[3] << 24);
2557 static unsigned int
2558 pe_as32 (void *ptr)
2560 unsigned char *b = ptr;
2562 return b[0] + (b[1] << 8) + (b[2] << 16) + (b[3] << 24);
2565 bfd_boolean
2566 pe_implied_import_dll (const char *filename)
2568 bfd *dll;
2569 unsigned long pe_header_offset, opthdr_ofs, num_entries, i;
2570 unsigned long export_rva, export_size, nsections, secptr, expptr;
2571 unsigned long exp_funcbase;
2572 unsigned char *expdata;
2573 char *erva;
2574 unsigned long name_rvas, ordinals, nexp, ordbase;
2575 const char *dll_name;
2576 /* Initialization with start > end guarantees that is_data
2577 will not be set by mistake, and avoids compiler warning. */
2578 unsigned long data_start = 1;
2579 unsigned long data_end = 0;
2580 unsigned long rdata_start = 1;
2581 unsigned long rdata_end = 0;
2582 unsigned long bss_start = 1;
2583 unsigned long bss_end = 0;
2585 /* No, I can't use bfd here. kernel32.dll puts its export table in
2586 the middle of the .rdata section. */
2587 dll = bfd_openr (filename, pe_details->target_name);
2588 if (!dll)
2590 einfo ("%Xopen %s: %E\n", filename);
2591 return FALSE;
2594 /* PEI dlls seem to be bfd_objects. */
2595 if (!bfd_check_format (dll, bfd_object))
2597 einfo ("%X%s: this doesn't appear to be a DLL\n", filename);
2598 return FALSE;
2601 /* Get pe_header, optional header and numbers of export entries. */
2602 pe_header_offset = pe_get32 (dll, 0x3c);
2603 opthdr_ofs = pe_header_offset + 4 + 20;
2604 #ifdef pe_use_x86_64
2605 num_entries = pe_get32 (dll, opthdr_ofs + 92 + 4 * 4); /* & NumberOfRvaAndSizes. */
2606 #else
2607 num_entries = pe_get32 (dll, opthdr_ofs + 92);
2608 #endif
2610 if (num_entries < 1) /* No exports. */
2611 return FALSE;
2613 #ifdef pe_use_x86_64
2614 export_rva = pe_get32 (dll, opthdr_ofs + 96 + 4 * 4);
2615 export_size = pe_get32 (dll, opthdr_ofs + 100 + 4 * 4);
2616 #else
2617 export_rva = pe_get32 (dll, opthdr_ofs + 96);
2618 export_size = pe_get32 (dll, opthdr_ofs + 100);
2619 #endif
2621 nsections = pe_get16 (dll, pe_header_offset + 4 + 2);
2622 secptr = (pe_header_offset + 4 + 20 +
2623 pe_get16 (dll, pe_header_offset + 4 + 16));
2624 expptr = 0;
2626 /* Get the rva and size of the export section. */
2627 for (i = 0; i < nsections; i++)
2629 char sname[8];
2630 unsigned long secptr1 = secptr + 40 * i;
2631 unsigned long vaddr = pe_get32 (dll, secptr1 + 12);
2632 unsigned long vsize = pe_get32 (dll, secptr1 + 16);
2633 unsigned long fptr = pe_get32 (dll, secptr1 + 20);
2635 bfd_seek (dll, (file_ptr) secptr1, SEEK_SET);
2636 bfd_bread (sname, (bfd_size_type) 8, dll);
2638 if (vaddr <= export_rva && vaddr + vsize > export_rva)
2640 expptr = fptr + (export_rva - vaddr);
2641 if (export_rva + export_size > vaddr + vsize)
2642 export_size = vsize - (export_rva - vaddr);
2643 break;
2647 /* Scan sections and store the base and size of the
2648 data and bss segments in data/base_start/end. */
2649 for (i = 0; i < nsections; i++)
2651 unsigned long secptr1 = secptr + 40 * i;
2652 unsigned long vsize = pe_get32 (dll, secptr1 + 8);
2653 unsigned long vaddr = pe_get32 (dll, secptr1 + 12);
2654 unsigned long flags = pe_get32 (dll, secptr1 + 36);
2655 char sec_name[9];
2657 sec_name[8] = '\0';
2658 bfd_seek (dll, (file_ptr) secptr1 + 0, SEEK_SET);
2659 bfd_bread (sec_name, (bfd_size_type) 8, dll);
2661 if (strcmp(sec_name,".data") == 0)
2663 data_start = vaddr;
2664 data_end = vaddr + vsize;
2666 if (pe_dll_extra_pe_debug)
2667 printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n",
2668 __FUNCTION__, sec_name, vaddr, vaddr + vsize, flags);
2670 else if (strcmp(sec_name,".rdata") == 0)
2672 rdata_start = vaddr;
2673 rdata_end = vaddr + vsize;
2675 if (pe_dll_extra_pe_debug)
2676 printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n",
2677 __FUNCTION__, sec_name, vaddr, vaddr + vsize, flags);
2679 else if (strcmp (sec_name,".bss") == 0)
2681 bss_start = vaddr;
2682 bss_end = vaddr + vsize;
2684 if (pe_dll_extra_pe_debug)
2685 printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n",
2686 __FUNCTION__, sec_name, vaddr, vaddr + vsize, flags);
2690 expdata = xmalloc (export_size);
2691 bfd_seek (dll, (file_ptr) expptr, SEEK_SET);
2692 bfd_bread (expdata, (bfd_size_type) export_size, dll);
2693 erva = (char *) expdata - export_rva;
2695 if (pe_def_file == 0)
2696 pe_def_file = def_file_empty ();
2698 nexp = pe_as32 (expdata + 24);
2699 name_rvas = pe_as32 (expdata + 32);
2700 ordinals = pe_as32 (expdata + 36);
2701 ordbase = pe_as32 (expdata + 16);
2702 exp_funcbase = pe_as32 (expdata + 28);
2704 /* Use internal dll name instead of filename
2705 to enable symbolic dll linking. */
2706 dll_name = erva + pe_as32 (expdata + 12);
2708 /* Check to see if the dll has already been added to
2709 the definition list and if so return without error.
2710 This avoids multiple symbol definitions. */
2711 if (def_get_module (pe_def_file, dll_name))
2713 if (pe_dll_extra_pe_debug)
2714 printf ("%s is already loaded\n", dll_name);
2715 return TRUE;
2718 /* Iterate through the list of symbols. */
2719 for (i = 0; i < nexp; i++)
2721 /* Pointer to the names vector. */
2722 unsigned long name_rva = pe_as32 (erva + name_rvas + i * 4);
2723 def_file_import *imp;
2724 /* Pointer to the function address vector. */
2725 unsigned long func_rva = pe_as32 (erva + exp_funcbase + i * 4);
2726 int is_data = 0;
2728 /* Skip unwanted symbols, which are
2729 exported in buggy auto-import releases. */
2730 if (! CONST_STRNEQ (erva + name_rva, "_nm_"))
2732 /* is_data is true if the address is in the data, rdata or bss
2733 segment. */
2734 is_data =
2735 (func_rva >= data_start && func_rva < data_end)
2736 || (func_rva >= rdata_start && func_rva < rdata_end)
2737 || (func_rva >= bss_start && func_rva < bss_end);
2739 imp = def_file_add_import (pe_def_file, erva + name_rva,
2740 dll_name, i, 0);
2741 /* Mark symbol type. */
2742 imp->data = is_data;
2744 if (pe_dll_extra_pe_debug)
2745 printf ("%s dll-name: %s sym: %s addr: 0x%lx %s\n",
2746 __FUNCTION__, dll_name, erva + name_rva,
2747 func_rva, is_data ? "(data)" : "");
2751 return TRUE;
2754 /* These are the main functions, called from the emulation. The first
2755 is called after the bfds are read, so we can guess at how much space
2756 we need. The second is called after everything is placed, so we
2757 can put the right values in place. */
2759 void
2760 pe_dll_build_sections (bfd *abfd, struct bfd_link_info *info)
2762 pe_dll_id_target (bfd_get_target (abfd));
2763 process_def_file (abfd, info);
2765 if (pe_def_file->num_exports == 0 && !info->shared)
2766 return;
2768 generate_edata (abfd, info);
2769 build_filler_bfd (1);
2772 void
2773 pe_exe_build_sections (bfd *abfd, struct bfd_link_info *info ATTRIBUTE_UNUSED)
2775 pe_dll_id_target (bfd_get_target (abfd));
2776 build_filler_bfd (0);
2779 void
2780 pe_dll_fill_sections (bfd *abfd, struct bfd_link_info *info)
2782 pe_dll_id_target (bfd_get_target (abfd));
2783 image_base = pe_data (abfd)->pe_opthdr.ImageBase;
2785 generate_reloc (abfd, info);
2786 if (reloc_sz > 0)
2788 bfd_set_section_size (filler_bfd, reloc_s, reloc_sz);
2790 /* Resize the sections. */
2791 lang_reset_memory_regions ();
2792 lang_size_sections (NULL, TRUE);
2794 /* Redo special stuff. */
2795 ldemul_after_allocation ();
2797 /* Do the assignments again. */
2798 lang_do_assignments ();
2801 fill_edata (abfd, info);
2803 if (info->shared && !info->pie)
2804 pe_data (abfd)->dll = 1;
2806 edata_s->contents = edata_d;
2807 reloc_s->contents = reloc_d;
2810 void
2811 pe_exe_fill_sections (bfd *abfd, struct bfd_link_info *info)
2813 pe_dll_id_target (bfd_get_target (abfd));
2814 image_base = pe_data (abfd)->pe_opthdr.ImageBase;
2816 generate_reloc (abfd, info);
2817 if (reloc_sz > 0)
2819 bfd_set_section_size (filler_bfd, reloc_s, reloc_sz);
2821 /* Resize the sections. */
2822 lang_reset_memory_regions ();
2823 lang_size_sections (NULL, TRUE);
2825 /* Redo special stuff. */
2826 ldemul_after_allocation ();
2828 /* Do the assignments again. */
2829 lang_do_assignments ();
2831 reloc_s->contents = reloc_d;