Lost bit belonging to the last commit.
[binutils.git] / ld / pe-dll.c
blob2edfdecb710527a14f82dccb4c3c847d95b9fa3a
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"
43 #include "pe-dll.h"
45 /* This file turns a regular Windows PE image into a DLL. Because of
46 the complexity of this operation, it has been broken down into a
47 number of separate modules which are all called by the main function
48 at the end of this file. This function is not re-entrant and is
49 normally only called once, so static variables are used to reduce
50 the number of parameters and return values required.
52 See also: ld/emultempl/pe.em. */
54 /* Auto-import feature by Paul Sokolovsky
56 Quick facts:
58 1. With this feature on, DLL clients can import variables from DLL
59 without any concern from their side (for example, without any source
60 code modifications).
62 2. This is done completely in bounds of the PE specification (to be fair,
63 there's a place where it pokes nose out of, but in practice it works).
64 So, resulting module can be used with any other PE compiler/linker.
66 3. Auto-import is fully compatible with standard import method and they
67 can be mixed together.
69 4. Overheads: space: 8 bytes per imported symbol, plus 20 for each
70 reference to it; load time: negligible; virtual/physical memory: should be
71 less than effect of DLL relocation, and I sincerely hope it doesn't affect
72 DLL sharability (too much).
74 Idea
76 The obvious and only way to get rid of dllimport insanity is to make client
77 access variable directly in the DLL, bypassing extra dereference. I.e.,
78 whenever client contains something like
80 mov dll_var,%eax,
82 address of dll_var in the command should be relocated to point into loaded
83 DLL. The aim is to make OS loader do so, and than make ld help with that.
84 Import section of PE made following way: there's a vector of structures
85 each describing imports from particular DLL. Each such structure points
86 to two other parallel vectors: one holding imported names, and one which
87 will hold address of corresponding imported name. So, the solution is
88 de-vectorize these structures, making import locations be sparse and
89 pointing directly into code. Before continuing, it is worth a note that,
90 while authors strives to make PE act ELF-like, there're some other people
91 make ELF act PE-like: elfvector, ;-) .
93 Implementation
95 For each reference of data symbol to be imported from DLL (to set of which
96 belong symbols with name <sym>, if __imp_<sym> is found in implib), the
97 import fixup entry is generated. That entry is of type
98 IMAGE_IMPORT_DESCRIPTOR and stored in .idata$2 subsection. Each
99 fixup entry contains pointer to symbol's address within .text section
100 (marked with __fuN_<sym> symbol, where N is integer), pointer to DLL name
101 (so, DLL name is referenced by multiple entries), and pointer to symbol
102 name thunk. Symbol name thunk is singleton vector (__nm_th_<symbol>)
103 pointing to IMAGE_IMPORT_BY_NAME structure (__nm_<symbol>) directly
104 containing imported name. Here comes that "om the edge" problem mentioned
105 above: PE specification rambles that name vector (OriginalFirstThunk)
106 should run in parallel with addresses vector (FirstThunk), i.e. that they
107 should have same number of elements and terminated with zero. We violate
108 this, since FirstThunk points directly into machine code. But in practice,
109 OS loader implemented the sane way: it goes thru OriginalFirstThunk and
110 puts addresses to FirstThunk, not something else. It once again should be
111 noted that dll and symbol name structures are reused across fixup entries
112 and should be there anyway to support standard import stuff, so sustained
113 overhead is 20 bytes per reference. Other question is whether having several
114 IMAGE_IMPORT_DESCRIPTORS for the same DLL is possible. Answer is yes, it is
115 done even by native compiler/linker (libth32's functions are in fact reside
116 in windows9x kernel32.dll, so if you use it, you have two
117 IMAGE_IMPORT_DESCRIPTORS for kernel32.dll). Yet other question is whether
118 referencing the same PE structures several times is valid. The answer is why
119 not, prohibiting that (detecting violation) would require more work on
120 behalf of loader than not doing it.
122 See also: ld/emultempl/pe.em. */
124 static void add_bfd_to_link (bfd *, const char *, struct bfd_link_info *);
126 /* For emultempl/pe.em. */
128 def_file * pe_def_file = 0;
129 int pe_dll_export_everything = 0;
130 int pe_dll_do_default_excludes = 1;
131 int pe_dll_kill_ats = 0;
132 int pe_dll_stdcall_aliases = 0;
133 int pe_dll_warn_dup_exports = 0;
134 int pe_dll_compat_implib = 0;
135 int pe_dll_extra_pe_debug = 0;
137 /* Static variables and types. */
139 static bfd_vma image_base;
140 static bfd *filler_bfd;
141 static struct bfd_section *edata_s, *reloc_s;
142 static unsigned char *edata_d, *reloc_d;
143 static size_t edata_sz, reloc_sz;
144 static int runtime_pseudo_relocs_created = 0;
146 typedef struct
148 char *target_name;
149 char *object_target;
150 unsigned int imagebase_reloc;
151 int pe_arch;
152 int bfd_arch;
153 int underscored;
155 pe_details_type;
157 typedef struct
159 char *name;
160 int len;
162 autofilter_entry_type;
164 #define PE_ARCH_i386 1
165 #define PE_ARCH_sh 2
166 #define PE_ARCH_mips 3
167 #define PE_ARCH_arm 4
168 #define PE_ARCH_arm_epoc 5
170 static pe_details_type pe_detail_list[] =
173 "pei-i386",
174 "pe-i386",
175 7 /* R_IMAGEBASE */,
176 PE_ARCH_i386,
177 bfd_arch_i386,
181 "pei-shl",
182 "pe-shl",
183 16 /* R_SH_IMAGEBASE */,
184 PE_ARCH_sh,
185 bfd_arch_sh,
189 "pei-mips",
190 "pe-mips",
191 34 /* MIPS_R_RVA */,
192 PE_ARCH_mips,
193 bfd_arch_mips,
197 "pei-arm-little",
198 "pe-arm-little",
199 11 /* ARM_RVA32 */,
200 PE_ARCH_arm,
201 bfd_arch_arm,
205 "epoc-pei-arm-little",
206 "epoc-pe-arm-little",
207 11 /* ARM_RVA32 */,
208 PE_ARCH_arm_epoc,
209 bfd_arch_arm,
212 { NULL, NULL, 0, 0, 0, 0 }
215 static pe_details_type *pe_details;
217 static autofilter_entry_type autofilter_symbollist[] =
219 { "DllMain", 7 },
220 { "DllMainCRTStartup", 17 },
221 { "_DllMainCRTStartup", 18 },
222 { "DllMain@12", 10 },
223 { "DllEntryPoint@0", 15 },
224 { "DllMainCRTStartup@12", 20 },
225 { "_cygwin_dll_entry@12", 20 },
226 { "_cygwin_crt0_common@8", 21 },
227 { "_cygwin_noncygwin_dll_entry@12", 30 },
228 { "impure_ptr", 10 },
229 { "_pei386_runtime_relocator", 25 },
230 { "do_pseudo_reloc", 15 },
231 { "cygwin_crt0", 11 },
232 { ".text", 5 },
233 { NULL, 0 }
236 /* Do not specify library suffix explicitly, to allow for dllized versions. */
237 static autofilter_entry_type autofilter_liblist[] =
239 { "libcegcc", 8 },
240 { "libcygwin", 9 },
241 { "libgcc", 6 },
242 { "libstdc++", 9 },
243 { "libmingw32", 10 },
244 { "libmingwex", 10 },
245 { "libg2c", 6 },
246 { "libsupc++", 9 },
247 { "libobjc", 7 },
248 { "libgcj", 6 },
249 { NULL, 0 }
252 static autofilter_entry_type autofilter_objlist[] =
254 { "crt0.o", 6 },
255 { "crt1.o", 6 },
256 { "crt2.o", 6 },
257 { "dllcrt1.o", 9 },
258 { "dllcrt2.o", 9 },
259 { "gcrt0.o", 7 },
260 { "gcrt1.o", 7 },
261 { "gcrt2.o", 7 },
262 { "crtbegin.o", 10 },
263 { "crtend.o", 8 },
264 { NULL, 0 }
267 static autofilter_entry_type autofilter_symbolprefixlist[] =
269 { "__imp_", 6 },
270 /* Do __imp_ explicitly to save time. */
271 { "__rtti_", 7 },
272 { ".idata$", 7 },
273 /* Don't re-export auto-imported symbols. */
274 { "_nm_", 4 },
275 { "__builtin_", 10 },
276 /* Don't export symbols specifying internal DLL layout. */
277 { "_head_", 6 },
278 { "_fmode", 6 },
279 { "_impure_ptr", 11 },
280 { "cygwin_attach_dll", 17 },
281 { "cygwin_premain0", 15 },
282 { "cygwin_premain1", 15 },
283 { "cygwin_premain2", 15 },
284 { "cygwin_premain3", 15 },
285 { "environ", 7 },
286 { NULL, 0 }
289 static autofilter_entry_type autofilter_symbolsuffixlist[] =
291 { "_iname", 6 },
292 { NULL, 0 }
295 #define U(str) (pe_details->underscored ? "_" str : str)
297 void
298 pe_dll_id_target (const char *target)
300 int i;
302 for (i = 0; pe_detail_list[i].target_name; i++)
303 if (strcmp (pe_detail_list[i].target_name, target) == 0
304 || strcmp (pe_detail_list[i].object_target, target) == 0)
306 pe_details = pe_detail_list + i;
307 return;
309 einfo (_("%XUnsupported PEI architecture: %s\n"), target);
310 exit (1);
313 /* Helper functions for qsort. Relocs must be sorted so that we can write
314 them out by pages. */
316 typedef struct
318 bfd_vma vma;
319 char type;
320 short extra;
322 reloc_data_type;
324 static int
325 reloc_sort (const void *va, const void *vb)
327 bfd_vma a = ((const reloc_data_type *) va)->vma;
328 bfd_vma b = ((const reloc_data_type *) vb)->vma;
330 return (a > b) ? 1 : ((a < b) ? -1 : 0);
333 static int
334 pe_export_sort (const void *va, const void *vb)
336 const def_file_export *a = va;
337 const def_file_export *b = vb;
339 return strcmp (a->name, b->name);
342 /* Read and process the .DEF file. */
344 /* These correspond to the entries in pe_def_file->exports[]. I use
345 exported_symbol_sections[i] to tag whether or not the symbol was
346 defined, since we can't export symbols we don't have. */
348 static bfd_vma *exported_symbol_offsets;
349 static struct bfd_section **exported_symbol_sections;
350 static int export_table_size;
351 static int count_exported;
352 static int count_exported_byname;
353 static int count_with_ordinals;
354 static const char *dll_name;
355 static int min_ordinal, max_ordinal;
356 static int *exported_symbols;
358 typedef struct exclude_list_struct
360 char *string;
361 struct exclude_list_struct *next;
362 int type;
364 exclude_list_struct;
366 static struct exclude_list_struct *excludes = 0;
368 void
369 pe_dll_add_excludes (const char *new_excludes, const int type)
371 char *local_copy;
372 char *exclude_string;
374 local_copy = xstrdup (new_excludes);
376 exclude_string = strtok (local_copy, ",:");
377 for (; exclude_string; exclude_string = strtok (NULL, ",:"))
379 struct exclude_list_struct *new_exclude;
381 new_exclude = xmalloc (sizeof (struct exclude_list_struct));
382 new_exclude->string = xmalloc (strlen (exclude_string) + 1);
383 strcpy (new_exclude->string, exclude_string);
384 new_exclude->type = type;
385 new_exclude->next = excludes;
386 excludes = new_exclude;
389 free (local_copy);
393 /* abfd is a bfd containing n (or NULL)
394 It can be used for contextual checks. */
396 static int
397 auto_export (bfd *abfd, def_file *d, const char *n)
399 int i;
400 struct exclude_list_struct *ex;
401 autofilter_entry_type *afptr;
402 const char * libname = 0;
403 if (abfd && abfd->my_archive)
404 libname = lbasename (abfd->my_archive->filename);
406 /* We should not re-export imported stuff. */
407 if (strncmp (n, "_imp_", 5) == 0)
408 return 0;
410 for (i = 0; i < d->num_exports; i++)
411 if (strcmp (d->exports[i].name, n) == 0)
412 return 0;
414 if (pe_dll_do_default_excludes)
416 const char * p;
417 int len;
419 if (pe_dll_extra_pe_debug)
420 printf ("considering exporting: %s, abfd=%p, abfd->my_arc=%p\n",
421 n, abfd, abfd->my_archive);
423 /* First of all, make context checks:
424 Don't export anything from standard libs. */
425 if (libname)
427 afptr = autofilter_liblist;
429 while (afptr->name)
431 if (strncmp (libname, afptr->name, afptr->len) == 0 )
432 return 0;
433 afptr++;
437 /* Next, exclude symbols from certain startup objects. */
439 if (abfd && (p = lbasename (abfd->filename)))
441 afptr = autofilter_objlist;
442 while (afptr->name)
444 if (strcmp (p, afptr->name) == 0)
445 return 0;
446 afptr++;
450 /* Don't try to blindly exclude all symbols
451 that begin with '__'; this was tried and
452 it is too restrictive. */
454 /* Then, exclude specific symbols. */
455 afptr = autofilter_symbollist;
456 while (afptr->name)
458 if (strcmp (n, afptr->name) == 0)
459 return 0;
461 afptr++;
464 /* Next, exclude symbols starting with ... */
465 afptr = autofilter_symbolprefixlist;
466 while (afptr->name)
468 if (strncmp (n, afptr->name, afptr->len) == 0)
469 return 0;
471 afptr++;
474 /* Finally, exclude symbols ending with ... */
475 len = strlen (n);
476 afptr = autofilter_symbolsuffixlist;
477 while (afptr->name)
479 if ((len >= afptr->len)
480 /* Add 1 to insure match with trailing '\0'. */
481 && strncmp (n + len - afptr->len, afptr->name,
482 afptr->len + 1) == 0)
483 return 0;
485 afptr++;
489 for (ex = excludes; ex; ex = ex->next)
491 if (ex->type == 1) /* exclude-libs */
493 if (libname
494 && ((strcmp (libname, ex->string) == 0)
495 || (strcasecmp ("ALL", ex->string) == 0)))
496 return 0;
498 else if (strcmp (n, ex->string) == 0)
499 return 0;
502 return 1;
505 static void
506 process_def_file (bfd *abfd ATTRIBUTE_UNUSED, struct bfd_link_info *info)
508 int i, j;
509 struct bfd_link_hash_entry *blhe;
510 bfd *b;
511 struct bfd_section *s;
512 def_file_export *e = 0;
514 if (!pe_def_file)
515 pe_def_file = def_file_empty ();
517 /* First, run around to all the objects looking for the .drectve
518 sections, and push those into the def file too. */
519 for (b = info->input_bfds; b; b = b->link_next)
521 s = bfd_get_section_by_name (b, ".drectve");
522 if (s)
524 long size = s->size;
525 char *buf = xmalloc (size);
527 bfd_get_section_contents (b, s, buf, 0, size);
528 def_file_add_directive (pe_def_file, buf, size);
529 free (buf);
533 /* If we are not building a DLL, when there are no exports
534 we do not build an export table at all. */
535 if (!pe_dll_export_everything && pe_def_file->num_exports == 0
536 && info->executable)
537 return;
539 /* Now, maybe export everything else the default way. */
540 if (pe_dll_export_everything || pe_def_file->num_exports == 0)
542 for (b = info->input_bfds; b; b = b->link_next)
544 asymbol **symbols;
545 int nsyms, symsize;
547 symsize = bfd_get_symtab_upper_bound (b);
548 symbols = xmalloc (symsize);
549 nsyms = bfd_canonicalize_symtab (b, symbols);
551 for (j = 0; j < nsyms; j++)
553 /* We should export symbols which are either global or not
554 anything at all. (.bss data is the latter)
555 We should not export undefined symbols. */
556 if (symbols[j]->section != &bfd_und_section
557 && ((symbols[j]->flags & BSF_GLOBAL)
558 || (symbols[j]->flags == BFD_FORT_COMM_DEFAULT_VALUE)))
560 const char *sn = symbols[j]->name;
562 /* We should not re-export imported stuff. */
564 char *name = xmalloc (strlen (sn) + 2 + 6);
565 sprintf (name, "%s%s", U("_imp_"), sn);
567 blhe = bfd_link_hash_lookup (info->hash, name,
568 FALSE, FALSE, FALSE);
569 free (name);
571 if (blhe && blhe->type == bfd_link_hash_defined)
572 continue;
575 if (*sn == '_')
576 sn++;
578 if (auto_export (b, pe_def_file, sn))
580 def_file_export *p;
581 p=def_file_add_export (pe_def_file, sn, 0, -1);
582 /* Fill data flag properly, from dlltool.c. */
583 p->flag_data = !(symbols[j]->flags & BSF_FUNCTION);
590 #undef NE
591 #define NE pe_def_file->num_exports
593 /* Canonicalize the export list. */
594 if (pe_dll_kill_ats)
596 for (i = 0; i < NE; i++)
598 if (strchr (pe_def_file->exports[i].name, '@'))
600 /* This will preserve internal_name, which may have been
601 pointing to the same memory as name, or might not
602 have. */
603 int lead_at = (*pe_def_file->exports[i].name == '@');
604 char *tmp = xstrdup (pe_def_file->exports[i].name + lead_at);
605 char *tmp_at = strchr (tmp, '@');
607 if (tmp_at)
608 *tmp_at = 0;
609 else
610 einfo (_("%XCannot export %s: invalid export name\n"),
611 pe_def_file->exports[i].name);
612 pe_def_file->exports[i].name = tmp;
617 if (pe_dll_stdcall_aliases)
619 for (i = 0; i < NE; i++)
621 if (strchr (pe_def_file->exports[i].name, '@'))
623 int lead_at = (*pe_def_file->exports[i].name == '@');
624 char *tmp = xstrdup (pe_def_file->exports[i].name + lead_at);
626 *(strchr (tmp, '@')) = 0;
627 if (auto_export (NULL, pe_def_file, tmp))
628 def_file_add_export (pe_def_file, tmp,
629 pe_def_file->exports[i].internal_name,
630 -1);
631 else
632 free (tmp);
637 /* Convenience, but watch out for it changing. */
638 e = pe_def_file->exports;
640 exported_symbol_offsets = xmalloc (NE * sizeof (bfd_vma));
641 exported_symbol_sections = xmalloc (NE * sizeof (struct bfd_section *));
643 memset (exported_symbol_sections, 0, NE * sizeof (struct bfd_section *));
644 max_ordinal = 0;
645 min_ordinal = 65536;
646 count_exported = 0;
647 count_exported_byname = 0;
648 count_with_ordinals = 0;
650 qsort (pe_def_file->exports, NE, sizeof (pe_def_file->exports[0]),
651 pe_export_sort);
652 for (i = 0, j = 0; i < NE; i++)
654 if (i > 0 && strcmp (e[i].name, e[i - 1].name) == 0)
656 /* This is a duplicate. */
657 if (e[j - 1].ordinal != -1
658 && e[i].ordinal != -1
659 && e[j - 1].ordinal != e[i].ordinal)
661 if (pe_dll_warn_dup_exports)
662 /* xgettext:c-format */
663 einfo (_("%XError, duplicate EXPORT with ordinals: %s (%d vs %d)\n"),
664 e[j - 1].name, e[j - 1].ordinal, e[i].ordinal);
666 else
668 if (pe_dll_warn_dup_exports)
669 /* xgettext:c-format */
670 einfo (_("Warning, duplicate EXPORT: %s\n"),
671 e[j - 1].name);
674 if (e[i].ordinal != -1)
675 e[j - 1].ordinal = e[i].ordinal;
676 e[j - 1].flag_private |= e[i].flag_private;
677 e[j - 1].flag_constant |= e[i].flag_constant;
678 e[j - 1].flag_noname |= e[i].flag_noname;
679 e[j - 1].flag_data |= e[i].flag_data;
681 else
683 if (i != j)
684 e[j] = e[i];
685 j++;
688 pe_def_file->num_exports = j; /* == NE */
690 for (i = 0; i < NE; i++)
692 char *name;
694 /* Check for forward exports */
695 if (strchr (pe_def_file->exports[i].internal_name, '.'))
697 count_exported++;
698 if (!pe_def_file->exports[i].flag_noname)
699 count_exported_byname++;
701 pe_def_file->exports[i].flag_forward = 1;
703 if (pe_def_file->exports[i].ordinal != -1)
705 if (max_ordinal < pe_def_file->exports[i].ordinal)
706 max_ordinal = pe_def_file->exports[i].ordinal;
707 if (min_ordinal > pe_def_file->exports[i].ordinal)
708 min_ordinal = pe_def_file->exports[i].ordinal;
709 count_with_ordinals++;
712 continue;
715 name = xmalloc (strlen (pe_def_file->exports[i].internal_name) + 2);
716 if (pe_details->underscored
717 && (*pe_def_file->exports[i].internal_name != '@'))
719 *name = '_';
720 strcpy (name + 1, pe_def_file->exports[i].internal_name);
722 else
723 strcpy (name, pe_def_file->exports[i].internal_name);
725 blhe = bfd_link_hash_lookup (info->hash,
726 name,
727 FALSE, FALSE, TRUE);
729 if (blhe
730 && (blhe->type == bfd_link_hash_defined
731 || (blhe->type == bfd_link_hash_common)))
733 count_exported++;
734 if (!pe_def_file->exports[i].flag_noname)
735 count_exported_byname++;
737 /* Only fill in the sections. The actual offsets are computed
738 in fill_exported_offsets() after common symbols are laid
739 out. */
740 if (blhe->type == bfd_link_hash_defined)
741 exported_symbol_sections[i] = blhe->u.def.section;
742 else
743 exported_symbol_sections[i] = blhe->u.c.p->section;
745 if (pe_def_file->exports[i].ordinal != -1)
747 if (max_ordinal < pe_def_file->exports[i].ordinal)
748 max_ordinal = pe_def_file->exports[i].ordinal;
749 if (min_ordinal > pe_def_file->exports[i].ordinal)
750 min_ordinal = pe_def_file->exports[i].ordinal;
751 count_with_ordinals++;
754 else if (blhe && blhe->type == bfd_link_hash_undefined)
756 /* xgettext:c-format */
757 einfo (_("%XCannot export %s: symbol not defined\n"),
758 pe_def_file->exports[i].internal_name);
760 else if (blhe)
762 /* xgettext:c-format */
763 einfo (_("%XCannot export %s: symbol wrong type (%d vs %d)\n"),
764 pe_def_file->exports[i].internal_name,
765 blhe->type, bfd_link_hash_defined);
767 else
769 /* xgettext:c-format */
770 einfo (_("%XCannot export %s: symbol not found\n"),
771 pe_def_file->exports[i].internal_name);
773 free (name);
777 /* Build the bfd that will contain .edata and .reloc sections. */
779 static void
780 build_filler_bfd (int include_edata)
782 lang_input_statement_type *filler_file;
783 filler_file = lang_add_input_file ("dll stuff",
784 lang_input_file_is_fake_enum,
785 NULL);
786 filler_file->the_bfd = filler_bfd = bfd_create ("dll stuff", output_bfd);
787 if (filler_bfd == NULL
788 || !bfd_set_arch_mach (filler_bfd,
789 bfd_get_arch (output_bfd),
790 bfd_get_mach (output_bfd)))
792 einfo ("%X%P: can not create BFD: %E\n");
793 return;
796 if (include_edata)
798 edata_s = bfd_make_section_old_way (filler_bfd, ".edata");
799 if (edata_s == NULL
800 || !bfd_set_section_flags (filler_bfd, edata_s,
801 (SEC_HAS_CONTENTS
802 | SEC_ALLOC
803 | SEC_LOAD
804 | SEC_KEEP
805 | SEC_IN_MEMORY)))
807 einfo ("%X%P: can not create .edata section: %E\n");
808 return;
810 bfd_set_section_size (filler_bfd, edata_s, edata_sz);
813 reloc_s = bfd_make_section_old_way (filler_bfd, ".reloc");
814 if (reloc_s == NULL
815 || !bfd_set_section_flags (filler_bfd, reloc_s,
816 (SEC_HAS_CONTENTS
817 | SEC_ALLOC
818 | SEC_LOAD
819 | SEC_KEEP
820 | SEC_IN_MEMORY)))
822 einfo ("%X%P: can not create .reloc section: %E\n");
823 return;
826 bfd_set_section_size (filler_bfd, reloc_s, 0);
828 ldlang_add_file (filler_file);
831 /* Gather all the exported symbols and build the .edata section. */
833 static void
834 generate_edata (bfd *abfd, struct bfd_link_info *info ATTRIBUTE_UNUSED)
836 int i, next_ordinal;
837 int name_table_size = 0;
838 const char *dlnp;
840 /* First, we need to know how many exported symbols there are,
841 and what the range of ordinals is. */
842 if (pe_def_file->name)
843 dll_name = pe_def_file->name;
844 else
846 dll_name = abfd->filename;
848 for (dlnp = dll_name; *dlnp; dlnp++)
849 if (*dlnp == '\\' || *dlnp == '/' || *dlnp == ':')
850 dll_name = dlnp + 1;
853 if (count_with_ordinals && max_ordinal > count_exported)
855 if (min_ordinal > max_ordinal - count_exported + 1)
856 min_ordinal = max_ordinal - count_exported + 1;
858 else
860 min_ordinal = 1;
861 max_ordinal = count_exported;
864 export_table_size = max_ordinal - min_ordinal + 1;
865 exported_symbols = xmalloc (export_table_size * sizeof (int));
866 for (i = 0; i < export_table_size; i++)
867 exported_symbols[i] = -1;
869 /* Now we need to assign ordinals to those that don't have them. */
870 for (i = 0; i < NE; i++)
872 if (exported_symbol_sections[i] ||
873 pe_def_file->exports[i].flag_forward)
875 if (pe_def_file->exports[i].ordinal != -1)
877 int ei = pe_def_file->exports[i].ordinal - min_ordinal;
878 int pi = exported_symbols[ei];
880 if (pi != -1)
882 /* xgettext:c-format */
883 einfo (_("%XError, ordinal used twice: %d (%s vs %s)\n"),
884 pe_def_file->exports[i].ordinal,
885 pe_def_file->exports[i].name,
886 pe_def_file->exports[pi].name);
888 exported_symbols[ei] = i;
890 name_table_size += strlen (pe_def_file->exports[i].name) + 1;
893 /* Reserve space for the forward name. */
894 if (pe_def_file->exports[i].flag_forward)
896 name_table_size += strlen (pe_def_file->exports[i].internal_name) + 1;
900 next_ordinal = min_ordinal;
901 for (i = 0; i < NE; i++)
902 if ((exported_symbol_sections[i] ||
903 pe_def_file->exports[i].flag_forward) &&
904 pe_def_file->exports[i].ordinal == -1)
906 while (exported_symbols[next_ordinal - min_ordinal] != -1)
907 next_ordinal++;
909 exported_symbols[next_ordinal - min_ordinal] = i;
910 pe_def_file->exports[i].ordinal = next_ordinal;
913 /* OK, now we can allocate some memory. */
914 edata_sz = (40 /* directory */
915 + 4 * export_table_size /* addresses */
916 + 4 * count_exported_byname /* name ptrs */
917 + 2 * count_exported_byname /* ordinals */
918 + name_table_size + strlen (dll_name) + 1);
921 /* Fill the exported symbol offsets. The preliminary work has already
922 been done in process_def_file(). */
924 static void
925 fill_exported_offsets (bfd *abfd ATTRIBUTE_UNUSED, struct bfd_link_info *info)
927 int i;
928 struct bfd_link_hash_entry *blhe;
930 for (i = 0; i < pe_def_file->num_exports; i++)
932 char *name;
934 name = xmalloc (strlen (pe_def_file->exports[i].internal_name) + 2);
935 if (pe_details->underscored
936 && *pe_def_file->exports[i].internal_name != '@')
938 *name = '_';
939 strcpy (name + 1, pe_def_file->exports[i].internal_name);
941 else
942 strcpy (name, pe_def_file->exports[i].internal_name);
944 blhe = bfd_link_hash_lookup (info->hash,
945 name,
946 FALSE, FALSE, TRUE);
948 if (blhe && blhe->type == bfd_link_hash_defined)
949 exported_symbol_offsets[i] = blhe->u.def.value;
951 free (name);
955 static void
956 fill_edata (bfd *abfd, struct bfd_link_info *info ATTRIBUTE_UNUSED)
958 int s, hint;
959 unsigned char *edirectory;
960 unsigned char *eaddresses;
961 unsigned char *enameptrs;
962 unsigned char *eordinals;
963 char *enamestr;
964 time_t now;
966 time (&now);
968 edata_d = xmalloc (edata_sz);
970 /* Note use of array pointer math here. */
971 edirectory = edata_d;
972 eaddresses = edata_d + 40;
973 enameptrs = eaddresses + 4 * export_table_size;
974 eordinals = enameptrs + 4 * count_exported_byname;
975 enamestr = (char *) eordinals + 2 * count_exported_byname;
977 #define ERVA(ptr) (((unsigned char *)(ptr) - edata_d) \
978 + edata_s->output_section->vma - image_base)
980 memset (edata_d, 0, edata_sz);
981 bfd_put_32 (abfd, now, edata_d + 4);
982 if (pe_def_file->version_major != -1)
984 bfd_put_16 (abfd, pe_def_file->version_major, edata_d + 8);
985 bfd_put_16 (abfd, pe_def_file->version_minor, edata_d + 10);
988 bfd_put_32 (abfd, ERVA (enamestr), edata_d + 12);
989 strcpy (enamestr, dll_name);
990 enamestr += strlen (enamestr) + 1;
991 bfd_put_32 (abfd, min_ordinal, edata_d + 16);
992 bfd_put_32 (abfd, export_table_size, edata_d + 20);
993 bfd_put_32 (abfd, count_exported_byname, edata_d + 24);
994 bfd_put_32 (abfd, ERVA (eaddresses), edata_d + 28);
995 bfd_put_32 (abfd, ERVA (enameptrs), edata_d + 32);
996 bfd_put_32 (abfd, ERVA (eordinals), edata_d + 36);
998 fill_exported_offsets (abfd, info);
1000 /* Ok, now for the filling in part.
1001 Scan alphabetically - ie the ordering in the exports[] table,
1002 rather than by ordinal - the ordering in the exported_symbol[]
1003 table. See dlltool.c and:
1004 http://sources.redhat.com/ml/binutils/2003-04/msg00379.html
1005 for more information. */
1006 hint = 0;
1007 for (s = 0; s < NE; s++)
1009 struct bfd_section *ssec = exported_symbol_sections[s];
1010 if (pe_def_file->exports[s].ordinal != -1 &&
1011 (pe_def_file->exports[s].flag_forward || ssec != NULL))
1013 int ord = pe_def_file->exports[s].ordinal;
1015 if (pe_def_file->exports[s].flag_forward)
1017 bfd_put_32 (abfd, ERVA (enamestr),
1018 eaddresses + 4 * (ord - min_ordinal));
1020 strcpy (enamestr, pe_def_file->exports[s].internal_name);
1021 enamestr += strlen (pe_def_file->exports[s].internal_name) + 1;
1023 else
1025 unsigned long srva = (exported_symbol_offsets[s]
1026 + ssec->output_section->vma
1027 + ssec->output_offset);
1029 bfd_put_32 (abfd, srva - image_base,
1030 eaddresses + 4 * (ord - min_ordinal));
1033 if (!pe_def_file->exports[s].flag_noname)
1035 char *ename = pe_def_file->exports[s].name;
1037 bfd_put_32 (abfd, ERVA (enamestr), enameptrs);
1038 enameptrs += 4;
1039 strcpy (enamestr, ename);
1040 enamestr += strlen (enamestr) + 1;
1041 bfd_put_16 (abfd, ord - min_ordinal, eordinals);
1042 eordinals += 2;
1043 pe_def_file->exports[s].hint = hint++;
1050 static struct bfd_section *current_sec;
1052 void
1053 pe_walk_relocs_of_symbol (struct bfd_link_info *info,
1054 const char *name,
1055 int (*cb) (arelent *, asection *))
1057 bfd *b;
1058 asection *s;
1060 for (b = info->input_bfds; b; b = b->link_next)
1062 asymbol **symbols;
1063 int nsyms, symsize;
1065 symsize = bfd_get_symtab_upper_bound (b);
1066 symbols = xmalloc (symsize);
1067 nsyms = bfd_canonicalize_symtab (b, symbols);
1069 for (s = b->sections; s; s = s->next)
1071 arelent **relocs;
1072 int relsize, nrelocs, i;
1073 int flags = bfd_get_section_flags (b, s);
1075 /* Skip discarded linkonce sections. */
1076 if (flags & SEC_LINK_ONCE
1077 && s->output_section == bfd_abs_section_ptr)
1078 continue;
1080 current_sec = s;
1082 relsize = bfd_get_reloc_upper_bound (b, s);
1083 relocs = xmalloc (relsize);
1084 nrelocs = bfd_canonicalize_reloc (b, s, relocs, symbols);
1086 for (i = 0; i < nrelocs; i++)
1088 struct bfd_symbol *sym = *relocs[i]->sym_ptr_ptr;
1090 if (!strcmp (name, sym->name))
1091 cb (relocs[i], s);
1094 free (relocs);
1096 /* Warning: the allocated symbols are remembered in BFD and reused
1097 later, so don't free them! */
1098 /* free (symbols); */
1103 /* Gather all the relocations and build the .reloc section. */
1105 static void
1106 generate_reloc (bfd *abfd, struct bfd_link_info *info)
1109 /* For .reloc stuff. */
1110 reloc_data_type *reloc_data;
1111 int total_relocs = 0;
1112 int i;
1113 unsigned long sec_page = (unsigned long) -1;
1114 unsigned long page_ptr, page_count;
1115 int bi;
1116 bfd *b;
1117 struct bfd_section *s;
1119 total_relocs = 0;
1120 for (b = info->input_bfds; b; b = b->link_next)
1121 for (s = b->sections; s; s = s->next)
1122 total_relocs += s->reloc_count;
1124 reloc_data = xmalloc (total_relocs * sizeof (reloc_data_type));
1126 total_relocs = 0;
1127 bi = 0;
1128 for (bi = 0, b = info->input_bfds; b; bi++, b = b->link_next)
1130 arelent **relocs;
1131 int relsize, nrelocs, i;
1133 for (s = b->sections; s; s = s->next)
1135 unsigned long sec_vma = s->output_section->vma + s->output_offset;
1136 asymbol **symbols;
1137 int nsyms, symsize;
1139 /* If it's not loaded, we don't need to relocate it this way. */
1140 #if 0 /* Some toolchains can generate .data sections without a SEC_LOAD flag but with relocs. */
1141 if (!(s->output_section->flags & SEC_LOAD))
1142 continue;
1143 #endif
1144 /* Huh ? */
1145 if (strncmp (bfd_get_section_name (abfd, s), ".idata",6) == 0)
1146 continue;
1148 /* I don't know why there would be a reloc for these, but I've
1149 seen it happen - DJ */
1150 if (s->output_section == &bfd_abs_section)
1151 continue;
1153 if (s->output_section->vma == 0)
1155 /* Huh? Shouldn't happen, but punt if it does. */
1156 einfo ("DJ: zero vma section reloc detected: `%s' #%d f=%d\n",
1157 s->output_section->name, s->output_section->index,
1158 s->output_section->flags);
1159 continue;
1162 symsize = bfd_get_symtab_upper_bound (b);
1163 symbols = xmalloc (symsize);
1164 nsyms = bfd_canonicalize_symtab (b, symbols);
1166 relsize = bfd_get_reloc_upper_bound (b, s);
1167 relocs = xmalloc (relsize);
1168 nrelocs = bfd_canonicalize_reloc (b, s, relocs, symbols);
1170 for (i = 0; i < nrelocs; i++)
1172 if (pe_dll_extra_pe_debug)
1174 struct bfd_symbol *sym = *relocs[i]->sym_ptr_ptr;
1175 printf ("rel: %s\n", sym->name);
1177 if (!relocs[i]->howto->pc_relative
1178 && relocs[i]->howto->type != pe_details->imagebase_reloc)
1180 bfd_vma sym_vma;
1181 struct bfd_symbol *sym = *relocs[i]->sym_ptr_ptr;
1183 sym_vma = (relocs[i]->addend
1184 + sym->value
1185 + sym->section->vma
1186 + sym->section->output_offset
1187 + sym->section->output_section->vma);
1188 reloc_data[total_relocs].vma = sec_vma + relocs[i]->address;
1190 #define BITS_AND_SHIFT(bits, shift) (bits * 1000 | shift)
1192 switch BITS_AND_SHIFT (relocs[i]->howto->bitsize,
1193 relocs[i]->howto->rightshift)
1195 case BITS_AND_SHIFT (32, 0):
1196 reloc_data[total_relocs].type = 3;
1197 total_relocs++;
1198 break;
1199 case BITS_AND_SHIFT (16, 0):
1200 reloc_data[total_relocs].type = 2;
1201 total_relocs++;
1202 break;
1203 case BITS_AND_SHIFT (16, 16):
1204 reloc_data[total_relocs].type = 4;
1205 /* FIXME: we can't know the symbol's right value
1206 yet, but we probably can safely assume that
1207 CE will relocate us in 64k blocks, so leaving
1208 it zero is safe. */
1209 reloc_data[total_relocs].extra = 0;
1210 total_relocs++;
1211 break;
1212 case BITS_AND_SHIFT (26, 2):
1213 reloc_data[total_relocs].type = 5;
1214 total_relocs++;
1215 break;
1216 case BITS_AND_SHIFT (24, 2):
1217 /* FIXME: 0 is ARM_26D, it is defined in bfd/coff-arm.c
1218 Those ARM_xxx definitions should go in proper
1219 header someday. */
1220 if (relocs[i]->howto->type == 0
1221 /* Older GNU linkers used 5 instead of 0 for this reloc. */
1222 || relocs[i]->howto->type == 5)
1223 /* This is an ARM_26D reloc, which is an ARM_26 reloc
1224 that has already been fully processed during a
1225 previous link stage, so ignore it here. */
1226 break;
1227 /* Fall through. */
1228 default:
1229 /* xgettext:c-format */
1230 einfo (_("%XError: %d-bit reloc in dll\n"),
1231 relocs[i]->howto->bitsize);
1232 break;
1236 free (relocs);
1237 /* Warning: the allocated symbols are remembered in BFD and
1238 reused later, so don't free them! */
1242 /* At this point, we have total_relocs relocation addresses in
1243 reloc_addresses, which are all suitable for the .reloc section.
1244 We must now create the new sections. */
1245 qsort (reloc_data, total_relocs, sizeof (*reloc_data), reloc_sort);
1247 for (i = 0; i < total_relocs; i++)
1249 unsigned long this_page = (reloc_data[i].vma >> 12);
1251 if (this_page != sec_page)
1253 reloc_sz = (reloc_sz + 3) & ~3; /* 4-byte align. */
1254 reloc_sz += 8;
1255 sec_page = this_page;
1258 reloc_sz += 2;
1260 if (reloc_data[i].type == 4)
1261 reloc_sz += 2;
1264 reloc_sz = (reloc_sz + 3) & ~3; /* 4-byte align. */
1265 reloc_d = xmalloc (reloc_sz);
1266 sec_page = (unsigned long) -1;
1267 reloc_sz = 0;
1268 page_ptr = (unsigned long) -1;
1269 page_count = 0;
1271 for (i = 0; i < total_relocs; i++)
1273 unsigned long rva = reloc_data[i].vma - image_base;
1274 unsigned long this_page = (rva & ~0xfff);
1276 if (this_page != sec_page)
1278 while (reloc_sz & 3)
1279 reloc_d[reloc_sz++] = 0;
1281 if (page_ptr != (unsigned long) -1)
1282 bfd_put_32 (abfd, reloc_sz - page_ptr, reloc_d + page_ptr + 4);
1284 bfd_put_32 (abfd, this_page, reloc_d + reloc_sz);
1285 page_ptr = reloc_sz;
1286 reloc_sz += 8;
1287 sec_page = this_page;
1288 page_count = 0;
1291 bfd_put_16 (abfd, (rva & 0xfff) + (reloc_data[i].type << 12),
1292 reloc_d + reloc_sz);
1293 reloc_sz += 2;
1295 if (reloc_data[i].type == 4)
1297 bfd_put_16 (abfd, reloc_data[i].extra, reloc_d + reloc_sz);
1298 reloc_sz += 2;
1301 page_count++;
1304 while (reloc_sz & 3)
1305 reloc_d[reloc_sz++] = 0;
1307 if (page_ptr != (unsigned long) -1)
1308 bfd_put_32 (abfd, reloc_sz - page_ptr, reloc_d + page_ptr + 4);
1310 while (reloc_sz < reloc_s->size)
1311 reloc_d[reloc_sz++] = 0;
1314 /* Given the exiting def_file structure, print out a .DEF file that
1315 corresponds to it. */
1317 static void
1318 quoteput (char *s, FILE *f, int needs_quotes)
1320 char *cp;
1322 for (cp = s; *cp; cp++)
1323 if (*cp == '\''
1324 || *cp == '"'
1325 || *cp == '\\'
1326 || ISSPACE (*cp)
1327 || *cp == ','
1328 || *cp == ';')
1329 needs_quotes = 1;
1331 if (needs_quotes)
1333 putc ('"', f);
1335 while (*s)
1337 if (*s == '"' || *s == '\\')
1338 putc ('\\', f);
1340 putc (*s, f);
1341 s++;
1344 putc ('"', f);
1346 else
1347 fputs (s, f);
1350 void
1351 pe_dll_generate_def_file (const char *pe_out_def_filename)
1353 int i;
1354 FILE *out = fopen (pe_out_def_filename, "w");
1356 if (out == NULL)
1357 /* xgettext:c-format */
1358 einfo (_("%s: Can't open output def file %s\n"),
1359 program_name, pe_out_def_filename);
1361 if (pe_def_file)
1363 if (pe_def_file->name)
1365 if (pe_def_file->is_dll)
1366 fprintf (out, "LIBRARY ");
1367 else
1368 fprintf (out, "NAME ");
1370 quoteput (pe_def_file->name, out, 1);
1372 if (pe_data (output_bfd)->pe_opthdr.ImageBase)
1373 fprintf (out, " BASE=0x%lx",
1374 (unsigned long) pe_data (output_bfd)->pe_opthdr.ImageBase);
1375 fprintf (out, "\n");
1378 if (pe_def_file->description)
1380 fprintf (out, "DESCRIPTION ");
1381 quoteput (pe_def_file->description, out, 1);
1382 fprintf (out, "\n");
1385 if (pe_def_file->version_minor != -1)
1386 fprintf (out, "VERSION %d.%d\n", pe_def_file->version_major,
1387 pe_def_file->version_minor);
1388 else if (pe_def_file->version_major != -1)
1389 fprintf (out, "VERSION %d\n", pe_def_file->version_major);
1391 if (pe_def_file->stack_reserve != -1 || pe_def_file->heap_reserve != -1)
1392 fprintf (out, "\n");
1394 if (pe_def_file->stack_commit != -1)
1395 fprintf (out, "STACKSIZE 0x%x,0x%x\n",
1396 pe_def_file->stack_reserve, pe_def_file->stack_commit);
1397 else if (pe_def_file->stack_reserve != -1)
1398 fprintf (out, "STACKSIZE 0x%x\n", pe_def_file->stack_reserve);
1400 if (pe_def_file->heap_commit != -1)
1401 fprintf (out, "HEAPSIZE 0x%x,0x%x\n",
1402 pe_def_file->heap_reserve, pe_def_file->heap_commit);
1403 else if (pe_def_file->heap_reserve != -1)
1404 fprintf (out, "HEAPSIZE 0x%x\n", pe_def_file->heap_reserve);
1406 if (pe_def_file->num_section_defs > 0)
1408 fprintf (out, "\nSECTIONS\n\n");
1410 for (i = 0; i < pe_def_file->num_section_defs; i++)
1412 fprintf (out, " ");
1413 quoteput (pe_def_file->section_defs[i].name, out, 0);
1415 if (pe_def_file->section_defs[i].class)
1417 fprintf (out, " CLASS ");
1418 quoteput (pe_def_file->section_defs[i].class, out, 0);
1421 if (pe_def_file->section_defs[i].flag_read)
1422 fprintf (out, " READ");
1424 if (pe_def_file->section_defs[i].flag_write)
1425 fprintf (out, " WRITE");
1427 if (pe_def_file->section_defs[i].flag_execute)
1428 fprintf (out, " EXECUTE");
1430 if (pe_def_file->section_defs[i].flag_shared)
1431 fprintf (out, " SHARED");
1433 fprintf (out, "\n");
1437 if (pe_def_file->num_exports > 0)
1439 fprintf (out, "EXPORTS\n");
1441 for (i = 0; i < pe_def_file->num_exports; i++)
1443 def_file_export *e = pe_def_file->exports + i;
1444 fprintf (out, " ");
1445 quoteput (e->name, out, 0);
1447 if (e->internal_name && strcmp (e->internal_name, e->name))
1449 fprintf (out, " = ");
1450 quoteput (e->internal_name, out, 0);
1453 if (e->ordinal != -1)
1454 fprintf (out, " @%d", e->ordinal);
1456 if (e->flag_private)
1457 fprintf (out, " PRIVATE");
1459 if (e->flag_constant)
1460 fprintf (out, " CONSTANT");
1462 if (e->flag_noname)
1463 fprintf (out, " NONAME");
1465 if (e->flag_data)
1466 fprintf (out, " DATA");
1468 fprintf (out, "\n");
1472 if (pe_def_file->num_imports > 0)
1474 fprintf (out, "\nIMPORTS\n\n");
1476 for (i = 0; i < pe_def_file->num_imports; i++)
1478 def_file_import *im = pe_def_file->imports + i;
1479 fprintf (out, " ");
1481 if (im->internal_name
1482 && (!im->name || strcmp (im->internal_name, im->name)))
1484 quoteput (im->internal_name, out, 0);
1485 fprintf (out, " = ");
1488 quoteput (im->module->name, out, 0);
1489 fprintf (out, ".");
1491 if (im->name)
1492 quoteput (im->name, out, 0);
1493 else
1494 fprintf (out, "%d", im->ordinal);
1496 fprintf (out, "\n");
1500 else
1501 fprintf (out, _("; no contents available\n"));
1503 if (fclose (out) == EOF)
1504 /* xgettext:c-format */
1505 einfo (_("%P: Error closing file `%s'\n"), pe_out_def_filename);
1508 /* Generate the import library. */
1510 static asymbol **symtab;
1511 static int symptr;
1512 static int tmp_seq;
1513 static const char *dll_filename;
1514 static char *dll_symname;
1516 #define UNDSEC (asection *) &bfd_und_section
1518 static asection *
1519 quick_section (bfd *abfd, const char *name, int flags, int align)
1521 asection *sec;
1522 asymbol *sym;
1524 sec = bfd_make_section_old_way (abfd, name);
1525 bfd_set_section_flags (abfd, sec, flags | SEC_ALLOC | SEC_LOAD | SEC_KEEP);
1526 bfd_set_section_alignment (abfd, sec, align);
1527 /* Remember to undo this before trying to link internally! */
1528 sec->output_section = sec;
1530 sym = bfd_make_empty_symbol (abfd);
1531 symtab[symptr++] = sym;
1532 sym->name = sec->name;
1533 sym->section = sec;
1534 sym->flags = BSF_LOCAL;
1535 sym->value = 0;
1537 return sec;
1540 static void
1541 quick_symbol (bfd *abfd,
1542 const char *n1,
1543 const char *n2,
1544 const char *n3,
1545 asection *sec,
1546 int flags,
1547 int addr)
1549 asymbol *sym;
1550 char *name = xmalloc (strlen (n1) + strlen (n2) + strlen (n3) + 1);
1552 strcpy (name, n1);
1553 strcat (name, n2);
1554 strcat (name, n3);
1555 sym = bfd_make_empty_symbol (abfd);
1556 sym->name = name;
1557 sym->section = sec;
1558 sym->flags = flags;
1559 sym->value = addr;
1560 symtab[symptr++] = sym;
1563 static arelent *reltab = 0;
1564 static int relcount = 0, relsize = 0;
1566 static void
1567 quick_reloc (bfd *abfd, int address, int which_howto, int symidx)
1569 if (relcount >= relsize - 1)
1571 relsize += 10;
1572 if (reltab)
1573 reltab = xrealloc (reltab, relsize * sizeof (arelent));
1574 else
1575 reltab = xmalloc (relsize * sizeof (arelent));
1577 reltab[relcount].address = address;
1578 reltab[relcount].addend = 0;
1579 reltab[relcount].howto = bfd_reloc_type_lookup (abfd, which_howto);
1580 reltab[relcount].sym_ptr_ptr = symtab + symidx;
1581 relcount++;
1584 static void
1585 save_relocs (asection *sec)
1587 int i;
1589 sec->relocation = reltab;
1590 sec->reloc_count = relcount;
1591 sec->orelocation = xmalloc ((relcount + 1) * sizeof (arelent *));
1592 for (i = 0; i < relcount; i++)
1593 sec->orelocation[i] = sec->relocation + i;
1594 sec->orelocation[relcount] = 0;
1595 sec->flags |= SEC_RELOC;
1596 reltab = 0;
1597 relcount = relsize = 0;
1600 /* .section .idata$2
1601 .global __head_my_dll
1602 __head_my_dll:
1603 .rva hname
1604 .long 0
1605 .long 0
1606 .rva __my_dll_iname
1607 .rva fthunk
1609 .section .idata$5
1610 .long 0
1611 fthunk:
1613 .section .idata$4
1614 .long 0
1615 hname: */
1617 static bfd *
1618 make_head (bfd *parent)
1620 asection *id2, *id5, *id4;
1621 unsigned char *d2, *d5, *d4;
1622 char *oname;
1623 bfd *abfd;
1625 oname = xmalloc (20);
1626 sprintf (oname, "d%06d.o", tmp_seq);
1627 tmp_seq++;
1629 abfd = bfd_create (oname, parent);
1630 bfd_find_target (pe_details->object_target, abfd);
1631 bfd_make_writable (abfd);
1633 bfd_set_format (abfd, bfd_object);
1634 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
1636 symptr = 0;
1637 symtab = xmalloc (6 * sizeof (asymbol *));
1638 id2 = quick_section (abfd, ".idata$2", SEC_HAS_CONTENTS, 2);
1639 id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
1640 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
1641 quick_symbol (abfd, U ("_head_"), dll_symname, "", id2, BSF_GLOBAL, 0);
1642 quick_symbol (abfd, U (""), dll_symname, "_iname", UNDSEC, BSF_GLOBAL, 0);
1644 /* OK, pay attention here. I got confused myself looking back at
1645 it. We create a four-byte section to mark the beginning of the
1646 list, and we include an offset of 4 in the section, so that the
1647 pointer to the list points to the *end* of this section, which is
1648 the start of the list of sections from other objects. */
1650 bfd_set_section_size (abfd, id2, 20);
1651 d2 = xmalloc (20);
1652 id2->contents = d2;
1653 memset (d2, 0, 20);
1654 d2[0] = d2[16] = 4; /* Reloc addend. */
1655 quick_reloc (abfd, 0, BFD_RELOC_RVA, 2);
1656 quick_reloc (abfd, 12, BFD_RELOC_RVA, 4);
1657 quick_reloc (abfd, 16, BFD_RELOC_RVA, 1);
1658 save_relocs (id2);
1660 bfd_set_section_size (abfd, id5, 4);
1661 d5 = xmalloc (4);
1662 id5->contents = d5;
1663 memset (d5, 0, 4);
1665 bfd_set_section_size (abfd, id4, 4);
1666 d4 = xmalloc (4);
1667 id4->contents = d4;
1668 memset (d4, 0, 4);
1670 bfd_set_symtab (abfd, symtab, symptr);
1672 bfd_set_section_contents (abfd, id2, d2, 0, 20);
1673 bfd_set_section_contents (abfd, id5, d5, 0, 4);
1674 bfd_set_section_contents (abfd, id4, d4, 0, 4);
1676 bfd_make_readable (abfd);
1677 return abfd;
1680 /* .section .idata$4
1681 .long 0
1682 .section .idata$5
1683 .long 0
1684 .section idata$7
1685 .global __my_dll_iname
1686 __my_dll_iname:
1687 .asciz "my.dll" */
1689 static bfd *
1690 make_tail (bfd *parent)
1692 asection *id4, *id5, *id7;
1693 unsigned char *d4, *d5, *d7;
1694 int len;
1695 char *oname;
1696 bfd *abfd;
1698 oname = xmalloc (20);
1699 sprintf (oname, "d%06d.o", tmp_seq);
1700 tmp_seq++;
1702 abfd = bfd_create (oname, parent);
1703 bfd_find_target (pe_details->object_target, abfd);
1704 bfd_make_writable (abfd);
1706 bfd_set_format (abfd, bfd_object);
1707 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
1709 symptr = 0;
1710 symtab = xmalloc (5 * sizeof (asymbol *));
1711 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
1712 id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
1713 id7 = quick_section (abfd, ".idata$7", SEC_HAS_CONTENTS, 2);
1714 quick_symbol (abfd, U (""), dll_symname, "_iname", id7, BSF_GLOBAL, 0);
1716 bfd_set_section_size (abfd, id4, 4);
1717 d4 = xmalloc (4);
1718 id4->contents = d4;
1719 memset (d4, 0, 4);
1721 bfd_set_section_size (abfd, id5, 4);
1722 d5 = xmalloc (4);
1723 id5->contents = d5;
1724 memset (d5, 0, 4);
1726 len = strlen (dll_filename) + 1;
1727 if (len & 1)
1728 len++;
1729 bfd_set_section_size (abfd, id7, len);
1730 d7 = xmalloc (len);
1731 id7->contents = d7;
1732 strcpy ((char *) d7, dll_filename);
1734 bfd_set_symtab (abfd, symtab, symptr);
1736 bfd_set_section_contents (abfd, id4, d4, 0, 4);
1737 bfd_set_section_contents (abfd, id5, d5, 0, 4);
1738 bfd_set_section_contents (abfd, id7, d7, 0, len);
1740 bfd_make_readable (abfd);
1741 return abfd;
1744 /* .text
1745 .global _function
1746 .global ___imp_function
1747 .global __imp__function
1748 _function:
1749 jmp *__imp__function:
1751 .section idata$7
1752 .long __head_my_dll
1754 .section .idata$5
1755 ___imp_function:
1756 __imp__function:
1757 iat?
1758 .section .idata$4
1759 iat?
1760 .section .idata$6
1761 ID<ordinal>:
1762 .short <hint>
1763 .asciz "function" xlate? (add underscore, kill at) */
1765 static unsigned char jmp_ix86_bytes[] =
1767 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x90, 0x90
1770 /* _function:
1771 mov.l ip+8,r0
1772 mov.l @r0,r0
1773 jmp @r0
1775 .dw __imp_function */
1777 static unsigned char jmp_sh_bytes[] =
1779 0x01, 0xd0, 0x02, 0x60, 0x2b, 0x40, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00
1782 /* _function:
1783 lui $t0,<high:__imp_function>
1784 lw $t0,<low:__imp_function>
1785 jr $t0
1786 nop */
1788 static unsigned char jmp_mips_bytes[] =
1790 0x00, 0x00, 0x08, 0x3c, 0x00, 0x00, 0x08, 0x8d,
1791 0x08, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00
1794 static unsigned char jmp_arm_bytes[] =
1796 0x00, 0xc0, 0x9f, 0xe5, /* ldr ip, [pc] */
1797 0x00, 0xf0, 0x9c, 0xe5, /* ldr pc, [ip] */
1798 0, 0, 0, 0
1802 static bfd *
1803 make_one (def_file_export *exp, bfd *parent)
1805 asection *tx, *id7, *id5, *id4, *id6;
1806 unsigned char *td = NULL, *d7, *d5, *d4, *d6 = NULL;
1807 int len;
1808 char *oname;
1809 bfd *abfd;
1810 unsigned char *jmp_bytes = NULL;
1811 int jmp_byte_count = 0;
1813 switch (pe_details->pe_arch)
1815 case PE_ARCH_i386:
1816 jmp_bytes = jmp_ix86_bytes;
1817 jmp_byte_count = sizeof (jmp_ix86_bytes);
1818 break;
1819 case PE_ARCH_sh:
1820 jmp_bytes = jmp_sh_bytes;
1821 jmp_byte_count = sizeof (jmp_sh_bytes);
1822 break;
1823 case PE_ARCH_mips:
1824 jmp_bytes = jmp_mips_bytes;
1825 jmp_byte_count = sizeof (jmp_mips_bytes);
1826 break;
1827 case PE_ARCH_arm:
1828 jmp_bytes = jmp_arm_bytes;
1829 jmp_byte_count = sizeof (jmp_arm_bytes);
1830 break;
1831 default:
1832 abort ();
1835 oname = xmalloc (20);
1836 sprintf (oname, "d%06d.o", tmp_seq);
1837 tmp_seq++;
1839 abfd = bfd_create (oname, parent);
1840 bfd_find_target (pe_details->object_target, abfd);
1841 bfd_make_writable (abfd);
1843 bfd_set_format (abfd, bfd_object);
1844 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
1846 symptr = 0;
1847 symtab = xmalloc (11 * sizeof (asymbol *));
1848 tx = quick_section (abfd, ".text", SEC_CODE|SEC_HAS_CONTENTS, 2);
1849 id7 = quick_section (abfd, ".idata$7", SEC_HAS_CONTENTS, 2);
1850 id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
1851 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
1852 id6 = quick_section (abfd, ".idata$6", SEC_HAS_CONTENTS, 2);
1854 if (*exp->internal_name == '@')
1856 quick_symbol (abfd, U ("_head_"), dll_symname, "", UNDSEC,
1857 BSF_GLOBAL, 0);
1858 if (! exp->flag_data)
1859 quick_symbol (abfd, "", exp->internal_name, "", tx, BSF_GLOBAL, 0);
1860 quick_symbol (abfd, U ("_imp_"), exp->internal_name, "", id5,
1861 BSF_GLOBAL, 0);
1862 /* Fastcall applies only to functions,
1863 so no need for auto-import symbol. */
1865 else
1867 quick_symbol (abfd, U ("_head_"), dll_symname, "", UNDSEC,
1868 BSF_GLOBAL, 0);
1869 if (! exp->flag_data)
1870 quick_symbol (abfd, U (""), exp->internal_name, "", tx,
1871 BSF_GLOBAL, 0);
1872 quick_symbol (abfd, U ("_imp__"), exp->internal_name, "", id5,
1873 BSF_GLOBAL, 0);
1874 /* Symbol to reference ord/name of imported
1875 data symbol, used to implement auto-import. */
1876 if (exp->flag_data)
1877 quick_symbol (abfd, U("_nm__"), exp->internal_name, "", id6,
1878 BSF_GLOBAL,0);
1880 if (pe_dll_compat_implib)
1881 quick_symbol (abfd, U ("__imp_"), exp->internal_name, "", id5,
1882 BSF_GLOBAL, 0);
1884 if (! exp->flag_data)
1886 bfd_set_section_size (abfd, tx, jmp_byte_count);
1887 td = xmalloc (jmp_byte_count);
1888 tx->contents = td;
1889 memcpy (td, jmp_bytes, jmp_byte_count);
1891 switch (pe_details->pe_arch)
1893 case PE_ARCH_i386:
1894 quick_reloc (abfd, 2, BFD_RELOC_32, 2);
1895 break;
1896 case PE_ARCH_sh:
1897 quick_reloc (abfd, 8, BFD_RELOC_32, 2);
1898 break;
1899 case PE_ARCH_mips:
1900 quick_reloc (abfd, 0, BFD_RELOC_HI16_S, 2);
1901 quick_reloc (abfd, 0, BFD_RELOC_LO16, 0); /* MIPS_R_PAIR */
1902 quick_reloc (abfd, 4, BFD_RELOC_LO16, 2);
1903 break;
1904 case PE_ARCH_arm:
1905 quick_reloc (abfd, 8, BFD_RELOC_32, 2);
1906 break;
1907 default:
1908 abort ();
1910 save_relocs (tx);
1913 bfd_set_section_size (abfd, id7, 4);
1914 d7 = xmalloc (4);
1915 id7->contents = d7;
1916 memset (d7, 0, 4);
1917 quick_reloc (abfd, 0, BFD_RELOC_RVA, 5);
1918 save_relocs (id7);
1920 bfd_set_section_size (abfd, id5, 4);
1921 d5 = xmalloc (4);
1922 id5->contents = d5;
1923 memset (d5, 0, 4);
1925 if (exp->flag_noname)
1927 d5[0] = exp->ordinal;
1928 d5[1] = exp->ordinal >> 8;
1929 d5[3] = 0x80;
1931 else
1933 quick_reloc (abfd, 0, BFD_RELOC_RVA, 4);
1934 save_relocs (id5);
1937 bfd_set_section_size (abfd, id4, 4);
1938 d4 = xmalloc (4);
1939 id4->contents = d4;
1940 memset (d4, 0, 4);
1942 if (exp->flag_noname)
1944 d4[0] = exp->ordinal;
1945 d4[1] = exp->ordinal >> 8;
1946 d4[3] = 0x80;
1948 else
1950 quick_reloc (abfd, 0, BFD_RELOC_RVA, 4);
1951 save_relocs (id4);
1954 if (exp->flag_noname)
1956 len = 0;
1957 bfd_set_section_size (abfd, id6, 0);
1959 else
1961 len = strlen (exp->name) + 3;
1962 if (len & 1)
1963 len++;
1964 bfd_set_section_size (abfd, id6, len);
1965 d6 = xmalloc (len);
1966 id6->contents = d6;
1967 memset (d6, 0, len);
1968 d6[0] = exp->hint & 0xff;
1969 d6[1] = exp->hint >> 8;
1970 strcpy ((char *) d6 + 2, exp->name);
1973 bfd_set_symtab (abfd, symtab, symptr);
1975 bfd_set_section_contents (abfd, tx, td, 0, jmp_byte_count);
1976 bfd_set_section_contents (abfd, id7, d7, 0, 4);
1977 bfd_set_section_contents (abfd, id5, d5, 0, 4);
1978 bfd_set_section_contents (abfd, id4, d4, 0, 4);
1979 if (!exp->flag_noname)
1980 bfd_set_section_contents (abfd, id6, d6, 0, len);
1982 bfd_make_readable (abfd);
1983 return abfd;
1986 static bfd *
1987 make_singleton_name_thunk (const char *import, bfd *parent)
1989 /* Name thunks go to idata$4. */
1990 asection *id4;
1991 unsigned char *d4;
1992 char *oname;
1993 bfd *abfd;
1995 oname = xmalloc (20);
1996 sprintf (oname, "nmth%06d.o", tmp_seq);
1997 tmp_seq++;
1999 abfd = bfd_create (oname, parent);
2000 bfd_find_target (pe_details->object_target, abfd);
2001 bfd_make_writable (abfd);
2003 bfd_set_format (abfd, bfd_object);
2004 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2006 symptr = 0;
2007 symtab = xmalloc (3 * sizeof (asymbol *));
2008 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
2009 quick_symbol (abfd, U ("_nm_thnk_"), import, "", id4, BSF_GLOBAL, 0);
2010 quick_symbol (abfd, U ("_nm_"), import, "", UNDSEC, BSF_GLOBAL, 0);
2012 bfd_set_section_size (abfd, id4, 8);
2013 d4 = xmalloc (4);
2014 id4->contents = d4;
2015 memset (d4, 0, 8);
2016 quick_reloc (abfd, 0, BFD_RELOC_RVA, 2);
2017 save_relocs (id4);
2019 bfd_set_symtab (abfd, symtab, symptr);
2021 bfd_set_section_contents (abfd, id4, d4, 0, 8);
2023 bfd_make_readable (abfd);
2024 return abfd;
2027 static char *
2028 make_import_fixup_mark (arelent *rel)
2030 /* We convert reloc to symbol, for later reference. */
2031 static int counter;
2032 static char *fixup_name = NULL;
2033 static size_t buffer_len = 0;
2035 struct bfd_symbol *sym = *rel->sym_ptr_ptr;
2037 bfd *abfd = bfd_asymbol_bfd (sym);
2038 struct bfd_link_hash_entry *bh;
2040 if (!fixup_name)
2042 fixup_name = xmalloc (384);
2043 buffer_len = 384;
2046 if (strlen (sym->name) + 25 > buffer_len)
2047 /* Assume 25 chars for "__fu" + counter + "_". If counter is
2048 bigger than 20 digits long, we've got worse problems than
2049 overflowing this buffer... */
2051 free (fixup_name);
2052 /* New buffer size is length of symbol, plus 25, but
2053 then rounded up to the nearest multiple of 128. */
2054 buffer_len = ((strlen (sym->name) + 25) + 127) & ~127;
2055 fixup_name = xmalloc (buffer_len);
2058 sprintf (fixup_name, "__fu%d_%s", counter++, sym->name);
2060 bh = NULL;
2061 bfd_coff_link_add_one_symbol (&link_info, abfd, fixup_name, BSF_GLOBAL,
2062 current_sec, /* sym->section, */
2063 rel->address, NULL, TRUE, FALSE, &bh);
2065 if (0)
2067 struct coff_link_hash_entry *myh;
2069 myh = (struct coff_link_hash_entry *) bh;
2070 printf ("type:%d\n", myh->type);
2071 printf ("%s\n", myh->root.u.def.section->name);
2074 return fixup_name;
2077 /* .section .idata$2
2078 .rva __nm_thnk_SYM (singleton thunk with name of func)
2079 .long 0
2080 .long 0
2081 .rva __my_dll_iname (name of dll)
2082 .rva __fuNN_SYM (pointer to reference (address) in text) */
2084 static bfd *
2085 make_import_fixup_entry (const char *name,
2086 const char *fixup_name,
2087 const char *dll_symname,
2088 bfd *parent)
2090 asection *id2;
2091 unsigned char *d2;
2092 char *oname;
2093 bfd *abfd;
2095 oname = xmalloc (20);
2096 sprintf (oname, "fu%06d.o", tmp_seq);
2097 tmp_seq++;
2099 abfd = bfd_create (oname, parent);
2100 bfd_find_target (pe_details->object_target, abfd);
2101 bfd_make_writable (abfd);
2103 bfd_set_format (abfd, bfd_object);
2104 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2106 symptr = 0;
2107 symtab = xmalloc (6 * sizeof (asymbol *));
2108 id2 = quick_section (abfd, ".idata$2", SEC_HAS_CONTENTS, 2);
2110 quick_symbol (abfd, U ("_nm_thnk_"), name, "", UNDSEC, BSF_GLOBAL, 0);
2111 quick_symbol (abfd, U (""), dll_symname, "_iname", UNDSEC, BSF_GLOBAL, 0);
2112 quick_symbol (abfd, "", fixup_name, "", UNDSEC, BSF_GLOBAL, 0);
2114 bfd_set_section_size (abfd, id2, 20);
2115 d2 = xmalloc (20);
2116 id2->contents = d2;
2117 memset (d2, 0, 20);
2119 quick_reloc (abfd, 0, BFD_RELOC_RVA, 1);
2120 quick_reloc (abfd, 12, BFD_RELOC_RVA, 2);
2121 quick_reloc (abfd, 16, BFD_RELOC_RVA, 3);
2122 save_relocs (id2);
2124 bfd_set_symtab (abfd, symtab, symptr);
2126 bfd_set_section_contents (abfd, id2, d2, 0, 20);
2128 bfd_make_readable (abfd);
2129 return abfd;
2132 /* .section .rdata_runtime_pseudo_reloc
2133 .long addend
2134 .rva __fuNN_SYM (pointer to reference (address) in text) */
2136 static bfd *
2137 make_runtime_pseudo_reloc (const char *name ATTRIBUTE_UNUSED,
2138 const char *fixup_name,
2139 int addend,
2140 bfd *parent)
2142 asection *rt_rel;
2143 unsigned char *rt_rel_d;
2144 char *oname;
2145 bfd *abfd;
2147 oname = xmalloc (20);
2148 sprintf (oname, "rtr%06d.o", tmp_seq);
2149 tmp_seq++;
2151 abfd = bfd_create (oname, parent);
2152 bfd_find_target (pe_details->object_target, abfd);
2153 bfd_make_writable (abfd);
2155 bfd_set_format (abfd, bfd_object);
2156 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2158 symptr = 0;
2159 symtab = xmalloc (2 * sizeof (asymbol *));
2160 rt_rel = quick_section (abfd, ".rdata_runtime_pseudo_reloc",
2161 SEC_HAS_CONTENTS, 2);
2163 quick_symbol (abfd, "", fixup_name, "", UNDSEC, BSF_GLOBAL, 0);
2165 bfd_set_section_size (abfd, rt_rel, 8);
2166 rt_rel_d = xmalloc (8);
2167 rt_rel->contents = rt_rel_d;
2168 memset (rt_rel_d, 0, 8);
2169 bfd_put_32 (abfd, addend, rt_rel_d);
2171 quick_reloc (abfd, 4, BFD_RELOC_RVA, 1);
2172 save_relocs (rt_rel);
2174 bfd_set_symtab (abfd, symtab, symptr);
2176 bfd_set_section_contents (abfd, rt_rel, rt_rel_d, 0, 8);
2178 bfd_make_readable (abfd);
2179 return abfd;
2182 /* .section .rdata
2183 .rva __pei386_runtime_relocator */
2185 static bfd *
2186 pe_create_runtime_relocator_reference (bfd *parent)
2188 asection *extern_rt_rel;
2189 unsigned char *extern_rt_rel_d;
2190 char *oname;
2191 bfd *abfd;
2193 oname = xmalloc (20);
2194 sprintf (oname, "ertr%06d.o", tmp_seq);
2195 tmp_seq++;
2197 abfd = bfd_create (oname, parent);
2198 bfd_find_target (pe_details->object_target, abfd);
2199 bfd_make_writable (abfd);
2201 bfd_set_format (abfd, bfd_object);
2202 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2204 symptr = 0;
2205 symtab = xmalloc (2 * sizeof (asymbol *));
2206 extern_rt_rel = quick_section (abfd, ".rdata", SEC_HAS_CONTENTS, 2);
2208 quick_symbol (abfd, "", "__pei386_runtime_relocator", "", UNDSEC,
2209 BSF_NO_FLAGS, 0);
2211 bfd_set_section_size (abfd, extern_rt_rel, 4);
2212 extern_rt_rel_d = xmalloc (4);
2213 extern_rt_rel->contents = extern_rt_rel_d;
2215 quick_reloc (abfd, 0, BFD_RELOC_RVA, 1);
2216 save_relocs (extern_rt_rel);
2218 bfd_set_symtab (abfd, symtab, symptr);
2220 bfd_set_section_contents (abfd, extern_rt_rel, extern_rt_rel_d, 0, 4);
2222 bfd_make_readable (abfd);
2223 return abfd;
2226 void
2227 pe_create_import_fixup (arelent *rel, asection *s, int addend)
2229 char buf[300];
2230 struct bfd_symbol *sym = *rel->sym_ptr_ptr;
2231 struct bfd_link_hash_entry *name_thunk_sym;
2232 const char *name = sym->name;
2233 char *fixup_name = make_import_fixup_mark (rel);
2234 bfd *b;
2236 sprintf (buf, U ("_nm_thnk_%s"), name);
2238 name_thunk_sym = bfd_link_hash_lookup (link_info.hash, buf, 0, 0, 1);
2240 if (!name_thunk_sym || name_thunk_sym->type != bfd_link_hash_defined)
2242 bfd *b = make_singleton_name_thunk (name, output_bfd);
2243 add_bfd_to_link (b, b->filename, &link_info);
2245 /* If we ever use autoimport, we have to cast text section writable. */
2246 config.text_read_only = FALSE;
2247 output_bfd->flags &= ~WP_TEXT;
2250 if (addend == 0 || link_info.pei386_runtime_pseudo_reloc)
2252 extern char * pe_data_import_dll;
2253 char * dll_symname = pe_data_import_dll ? pe_data_import_dll : "unknown";
2255 b = make_import_fixup_entry (name, fixup_name, dll_symname, output_bfd);
2256 add_bfd_to_link (b, b->filename, &link_info);
2259 if (addend != 0)
2261 if (link_info.pei386_runtime_pseudo_reloc)
2263 if (pe_dll_extra_pe_debug)
2264 printf ("creating runtime pseudo-reloc entry for %s (addend=%d)\n",
2265 fixup_name, addend);
2266 b = make_runtime_pseudo_reloc (name, fixup_name, addend, output_bfd);
2267 add_bfd_to_link (b, b->filename, &link_info);
2269 if (runtime_pseudo_relocs_created == 0)
2271 b = pe_create_runtime_relocator_reference (output_bfd);
2272 add_bfd_to_link (b, b->filename, &link_info);
2274 runtime_pseudo_relocs_created++;
2276 else
2278 einfo (_("%C: variable '%T' can't be auto-imported. Please read the documentation for ld's --enable-auto-import for details.\n"),
2279 s->owner, s, rel->address, sym->name);
2280 einfo ("%X");
2286 void
2287 pe_dll_generate_implib (def_file *def, const char *impfilename)
2289 int i;
2290 bfd *ar_head;
2291 bfd *ar_tail;
2292 bfd *outarch;
2293 bfd *head = 0;
2295 dll_filename = (def->name) ? def->name : dll_name;
2296 dll_symname = xstrdup (dll_filename);
2297 for (i = 0; dll_symname[i]; i++)
2298 if (!ISALNUM (dll_symname[i]))
2299 dll_symname[i] = '_';
2301 unlink_if_ordinary (impfilename);
2303 outarch = bfd_openw (impfilename, 0);
2305 if (!outarch)
2307 /* xgettext:c-format */
2308 einfo (_("%XCan't open .lib file: %s\n"), impfilename);
2309 return;
2312 /* xgettext:c-format */
2313 info_msg (_("Creating library file: %s\n"), impfilename);
2315 bfd_set_format (outarch, bfd_archive);
2316 outarch->has_armap = 1;
2318 /* Work out a reasonable size of things to put onto one line. */
2319 ar_head = make_head (outarch);
2321 for (i = 0; i < def->num_exports; i++)
2323 /* The import library doesn't know about the internal name. */
2324 char *internal = def->exports[i].internal_name;
2325 bfd *n;
2327 /* Don't add PRIVATE entries to import lib. */
2328 if (pe_def_file->exports[i].flag_private)
2329 continue;
2330 def->exports[i].internal_name = def->exports[i].name;
2331 n = make_one (def->exports + i, outarch);
2332 n->next = head;
2333 head = n;
2334 def->exports[i].internal_name = internal;
2337 ar_tail = make_tail (outarch);
2339 if (ar_head == NULL || ar_tail == NULL)
2340 return;
2342 /* Now stick them all into the archive. */
2343 ar_head->next = head;
2344 ar_tail->next = ar_head;
2345 head = ar_tail;
2347 if (! bfd_set_archive_head (outarch, head))
2348 einfo ("%Xbfd_set_archive_head: %E\n");
2350 if (! bfd_close (outarch))
2351 einfo ("%Xbfd_close %s: %E\n", impfilename);
2353 while (head != NULL)
2355 bfd *n = head->next;
2356 bfd_close (head);
2357 head = n;
2361 static void
2362 add_bfd_to_link (bfd *abfd, const char *name, struct bfd_link_info *link_info)
2364 lang_input_statement_type *fake_file;
2366 fake_file = lang_add_input_file (name,
2367 lang_input_file_is_fake_enum,
2368 NULL);
2369 fake_file->the_bfd = abfd;
2370 ldlang_add_file (fake_file);
2372 if (!bfd_link_add_symbols (abfd, link_info))
2373 einfo ("%Xaddsym %s: %E\n", name);
2376 void
2377 pe_process_import_defs (bfd *output_bfd, struct bfd_link_info *link_info)
2379 def_file_module *module;
2381 pe_dll_id_target (bfd_get_target (output_bfd));
2383 if (!pe_def_file)
2384 return;
2386 for (module = pe_def_file->modules; module; module = module->next)
2388 int i, do_this_dll;
2390 dll_filename = module->name;
2391 dll_symname = xstrdup (module->name);
2392 for (i = 0; dll_symname[i]; i++)
2393 if (!ISALNUM (dll_symname[i]))
2394 dll_symname[i] = '_';
2396 do_this_dll = 0;
2398 for (i = 0; i < pe_def_file->num_imports; i++)
2399 if (pe_def_file->imports[i].module == module)
2401 def_file_export exp;
2402 struct bfd_link_hash_entry *blhe;
2403 int lead_at = (*pe_def_file->imports[i].internal_name == '@');
2404 /* See if we need this import. */
2405 size_t len = strlen (pe_def_file->imports[i].internal_name);
2406 char *name = xmalloc (len + 2 + 6);
2408 if (lead_at)
2409 sprintf (name, "%s%s", "",
2410 pe_def_file->imports[i].internal_name);
2411 else
2412 sprintf (name, "%s%s",U (""),
2413 pe_def_file->imports[i].internal_name);
2415 blhe = bfd_link_hash_lookup (link_info->hash, name,
2416 FALSE, FALSE, FALSE);
2418 if (!blhe || (blhe && blhe->type != bfd_link_hash_undefined))
2420 if (lead_at)
2421 sprintf (name, "%s%s", U ("_imp_"),
2422 pe_def_file->imports[i].internal_name);
2423 else
2424 sprintf (name, "%s%s", U ("_imp__"),
2425 pe_def_file->imports[i].internal_name);
2427 blhe = bfd_link_hash_lookup (link_info->hash, name,
2428 FALSE, FALSE, FALSE);
2430 free (name);
2432 if (blhe && blhe->type == bfd_link_hash_undefined)
2434 bfd *one;
2435 /* We do. */
2436 if (!do_this_dll)
2438 bfd *ar_head = make_head (output_bfd);
2439 add_bfd_to_link (ar_head, ar_head->filename, link_info);
2440 do_this_dll = 1;
2442 exp.internal_name = pe_def_file->imports[i].internal_name;
2443 exp.name = pe_def_file->imports[i].name;
2444 exp.ordinal = pe_def_file->imports[i].ordinal;
2445 exp.hint = exp.ordinal >= 0 ? exp.ordinal : 0;
2446 exp.flag_private = 0;
2447 exp.flag_constant = 0;
2448 exp.flag_data = pe_def_file->imports[i].data;
2449 exp.flag_noname = exp.name ? 0 : 1;
2450 one = make_one (&exp, output_bfd);
2451 add_bfd_to_link (one, one->filename, link_info);
2454 if (do_this_dll)
2456 bfd *ar_tail = make_tail (output_bfd);
2457 add_bfd_to_link (ar_tail, ar_tail->filename, link_info);
2460 free (dll_symname);
2464 /* We were handed a *.DLL file. Parse it and turn it into a set of
2465 IMPORTS directives in the def file. Return TRUE if the file was
2466 handled, FALSE if not. */
2468 static unsigned int
2469 pe_get16 (bfd *abfd, int where)
2471 unsigned char b[2];
2473 bfd_seek (abfd, (file_ptr) where, SEEK_SET);
2474 bfd_bread (b, (bfd_size_type) 2, abfd);
2475 return b[0] + (b[1] << 8);
2478 static unsigned int
2479 pe_get32 (bfd *abfd, int where)
2481 unsigned char b[4];
2483 bfd_seek (abfd, (file_ptr) where, SEEK_SET);
2484 bfd_bread (b, (bfd_size_type) 4, abfd);
2485 return b[0] + (b[1] << 8) + (b[2] << 16) + (b[3] << 24);
2488 static unsigned int
2489 pe_as32 (void *ptr)
2491 unsigned char *b = ptr;
2493 return b[0] + (b[1] << 8) + (b[2] << 16) + (b[3] << 24);
2496 bfd_boolean
2497 pe_implied_import_dll (const char *filename)
2499 bfd *dll;
2500 unsigned long pe_header_offset, opthdr_ofs, num_entries, i;
2501 unsigned long export_rva, export_size, nsections, secptr, expptr;
2502 unsigned long exp_funcbase;
2503 unsigned char *expdata;
2504 char *erva;
2505 unsigned long name_rvas, ordinals, nexp, ordbase;
2506 const char *dll_name;
2507 /* Initialization with start > end guarantees that is_data
2508 will not be set by mistake, and avoids compiler warning. */
2509 unsigned long data_start = 1;
2510 unsigned long data_end = 0;
2511 unsigned long rdata_start = 1;
2512 unsigned long rdata_end = 0;
2513 unsigned long bss_start = 1;
2514 unsigned long bss_end = 0;
2516 /* No, I can't use bfd here. kernel32.dll puts its export table in
2517 the middle of the .rdata section. */
2518 dll = bfd_openr (filename, pe_details->target_name);
2519 if (!dll)
2521 einfo ("%Xopen %s: %E\n", filename);
2522 return FALSE;
2525 /* PEI dlls seem to be bfd_objects. */
2526 if (!bfd_check_format (dll, bfd_object))
2528 einfo ("%X%s: this doesn't appear to be a DLL\n", filename);
2529 return FALSE;
2532 /* Get pe_header, optional header and numbers of export entries. */
2533 pe_header_offset = pe_get32 (dll, 0x3c);
2534 opthdr_ofs = pe_header_offset + 4 + 20;
2535 num_entries = pe_get32 (dll, opthdr_ofs + 92);
2537 if (num_entries < 1) /* No exports. */
2538 return FALSE;
2540 export_rva = pe_get32 (dll, opthdr_ofs + 96);
2541 export_size = pe_get32 (dll, opthdr_ofs + 100);
2542 nsections = pe_get16 (dll, pe_header_offset + 4 + 2);
2543 secptr = (pe_header_offset + 4 + 20 +
2544 pe_get16 (dll, pe_header_offset + 4 + 16));
2545 expptr = 0;
2547 /* Get the rva and size of the export section. */
2548 for (i = 0; i < nsections; i++)
2550 char sname[8];
2551 unsigned long secptr1 = secptr + 40 * i;
2552 unsigned long vaddr = pe_get32 (dll, secptr1 + 12);
2553 unsigned long vsize = pe_get32 (dll, secptr1 + 16);
2554 unsigned long fptr = pe_get32 (dll, secptr1 + 20);
2556 bfd_seek (dll, (file_ptr) secptr1, SEEK_SET);
2557 bfd_bread (sname, (bfd_size_type) 8, dll);
2559 if (vaddr <= export_rva && vaddr + vsize > export_rva)
2561 expptr = fptr + (export_rva - vaddr);
2562 if (export_rva + export_size > vaddr + vsize)
2563 export_size = vsize - (export_rva - vaddr);
2564 break;
2568 /* Scan sections and store the base and size of the
2569 data and bss segments in data/base_start/end. */
2570 for (i = 0; i < nsections; i++)
2572 unsigned long secptr1 = secptr + 40 * i;
2573 unsigned long vsize = pe_get32 (dll, secptr1 + 8);
2574 unsigned long vaddr = pe_get32 (dll, secptr1 + 12);
2575 unsigned long flags = pe_get32 (dll, secptr1 + 36);
2576 char sec_name[9];
2578 sec_name[8] = '\0';
2579 bfd_seek (dll, (file_ptr) secptr1 + 0, SEEK_SET);
2580 bfd_bread (sec_name, (bfd_size_type) 8, dll);
2582 if (strcmp(sec_name,".data") == 0)
2584 data_start = vaddr;
2585 data_end = vaddr + vsize;
2587 if (pe_dll_extra_pe_debug)
2588 printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n",
2589 __FUNCTION__, sec_name, vaddr, vaddr + vsize, flags);
2591 else if (strcmp(sec_name,".rdata") == 0)
2593 rdata_start = vaddr;
2594 rdata_end = vaddr + vsize;
2596 if (pe_dll_extra_pe_debug)
2597 printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n",
2598 __FUNCTION__, sec_name, vaddr, vaddr + vsize, flags);
2600 else if (strcmp (sec_name,".bss") == 0)
2602 bss_start = vaddr;
2603 bss_end = vaddr + vsize;
2605 if (pe_dll_extra_pe_debug)
2606 printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n",
2607 __FUNCTION__, sec_name, vaddr, vaddr + vsize, flags);
2611 expdata = xmalloc (export_size);
2612 bfd_seek (dll, (file_ptr) expptr, SEEK_SET);
2613 bfd_bread (expdata, (bfd_size_type) export_size, dll);
2614 erva = (char *) expdata - export_rva;
2616 if (pe_def_file == 0)
2617 pe_def_file = def_file_empty ();
2619 nexp = pe_as32 (expdata + 24);
2620 name_rvas = pe_as32 (expdata + 32);
2621 ordinals = pe_as32 (expdata + 36);
2622 ordbase = pe_as32 (expdata + 16);
2623 exp_funcbase = pe_as32 (expdata + 28);
2625 /* Use internal dll name instead of filename
2626 to enable symbolic dll linking. */
2627 dll_name = erva + pe_as32 (expdata + 12);
2629 /* Check to see if the dll has already been added to
2630 the definition list and if so return without error.
2631 This avoids multiple symbol definitions. */
2632 if (def_get_module (pe_def_file, dll_name))
2634 if (pe_dll_extra_pe_debug)
2635 printf ("%s is already loaded\n", dll_name);
2636 return TRUE;
2639 /* Iterate through the list of symbols. */
2640 for (i = 0; i < nexp; i++)
2642 /* Pointer to the names vector. */
2643 unsigned long name_rva = pe_as32 (erva + name_rvas + i * 4);
2644 def_file_import *imp;
2645 /* Pointer to the function address vector. */
2646 unsigned long func_rva = pe_as32 (erva + exp_funcbase + i * 4);
2647 int is_data = 0;
2649 /* Skip unwanted symbols, which are
2650 exported in buggy auto-import releases. */
2651 if (strncmp (erva + name_rva, "_nm_", 4) != 0)
2653 /* is_data is true if the address is in the data, rdata or bss
2654 segment. */
2655 is_data =
2656 (func_rva >= data_start && func_rva < data_end)
2657 || (func_rva >= rdata_start && func_rva < rdata_end)
2658 || (func_rva >= bss_start && func_rva < bss_end);
2660 imp = def_file_add_import (pe_def_file, erva + name_rva,
2661 dll_name, i, 0);
2662 /* Mark symbol type. */
2663 imp->data = is_data;
2665 if (pe_dll_extra_pe_debug)
2666 printf ("%s dll-name: %s sym: %s addr: 0x%lx %s\n",
2667 __FUNCTION__, dll_name, erva + name_rva,
2668 func_rva, is_data ? "(data)" : "");
2672 return TRUE;
2675 /* These are the main functions, called from the emulation. The first
2676 is called after the bfds are read, so we can guess at how much space
2677 we need. The second is called after everything is placed, so we
2678 can put the right values in place. */
2680 void
2681 pe_dll_build_sections (bfd *abfd, struct bfd_link_info *info)
2683 pe_dll_id_target (bfd_get_target (abfd));
2684 process_def_file (abfd, info);
2686 if (pe_def_file->num_exports == 0 && !info->shared)
2687 return;
2689 generate_edata (abfd, info);
2690 build_filler_bfd (1);
2693 void
2694 pe_exe_build_sections (bfd *abfd, struct bfd_link_info *info ATTRIBUTE_UNUSED)
2696 pe_dll_id_target (bfd_get_target (abfd));
2697 build_filler_bfd (0);
2700 void
2701 pe_dll_fill_sections (bfd *abfd, struct bfd_link_info *info)
2703 pe_dll_id_target (bfd_get_target (abfd));
2704 image_base = pe_data (abfd)->pe_opthdr.ImageBase;
2706 generate_reloc (abfd, info);
2707 if (reloc_sz > 0)
2709 bfd_set_section_size (filler_bfd, reloc_s, reloc_sz);
2711 /* Resize the sections. */
2712 lang_reset_memory_regions ();
2713 lang_size_sections (NULL, TRUE);
2715 /* Redo special stuff. */
2716 ldemul_after_allocation ();
2718 /* Do the assignments again. */
2719 lang_do_assignments ();
2722 fill_edata (abfd, info);
2724 if (info->shared && !info->pie)
2725 pe_data (abfd)->dll = 1;
2727 edata_s->contents = edata_d;
2728 reloc_s->contents = reloc_d;
2731 void
2732 pe_exe_fill_sections (bfd *abfd, struct bfd_link_info *info)
2734 pe_dll_id_target (bfd_get_target (abfd));
2735 image_base = pe_data (abfd)->pe_opthdr.ImageBase;
2737 generate_reloc (abfd, info);
2738 if (reloc_sz > 0)
2740 bfd_set_section_size (filler_bfd, reloc_s, reloc_sz);
2742 /* Resize the sections. */
2743 lang_reset_memory_regions ();
2744 lang_size_sections (NULL, TRUE);
2746 /* Redo special stuff. */
2747 ldemul_after_allocation ();
2749 /* Do the assignments again. */
2750 lang_do_assignments ();
2752 reloc_s->contents = reloc_d;