daily update
[binutils.git] / ld / pe-dll.c
blobd9e40783e35588dfdf8ac9ad27746d4a3e98e113
1 /* Routines to help build PEI-format DLLs (Win32 etc)
2 Copyright 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
3 Written by DJ Delorie <dj@cygnus.com>
5 This file is part of GLD, the Gnu Linker.
7 GLD is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
10 any later version.
12 GLD is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GLD; see the file COPYING. If not, write to the Free
19 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
20 02111-1307, USA. */
22 #include "bfd.h"
23 #include "sysdep.h"
24 #include "bfdlink.h"
25 #include "libiberty.h"
26 #include "safe-ctype.h"
28 #include <time.h>
30 #include "ld.h"
31 #include "ldexp.h"
32 #include "ldlang.h"
33 #include "ldwrite.h"
34 #include "ldmisc.h"
35 #include <ldgram.h>
36 #include "ldmain.h"
37 #include "ldfile.h"
38 #include "ldemul.h"
39 #include "coff/internal.h"
40 #include "../bfd/libcoff.h"
41 #include "deffile.h"
42 #include "pe-dll.h"
44 /* This file turns a regular Windows PE image into a DLL. Because of
45 the complexity of this operation, it has been broken down into a
46 number of separate modules which are all called by the main function
47 at the end of this file. This function is not re-entrant and is
48 normally only called once, so static variables are used to reduce
49 the number of parameters and return values required.
51 See also: ld/emultempl/pe.em. */
53 /* Auto-import feature by Paul Sokolovsky
55 Quick facts:
57 1. With this feature on, DLL clients can import variables from DLL
58 without any concern from their side (for example, without any source
59 code modifications).
61 2. This is done completely in bounds of the PE specification (to be fair,
62 there's a place where it pokes nose out of, but in practise it works).
63 So, resulting module can be used with any other PE compiler/linker.
65 3. Auto-import is fully compatible with standard import method and they
66 can be mixed together.
68 4. Overheads: space: 8 bytes per imported symbol, plus 20 for each
69 reference to it; load time: negligible; virtual/physical memory: should be
70 less than effect of DLL relocation, and I sincerely hope it doesn't affect
71 DLL sharability (too much).
73 Idea
75 The obvious and only way to get rid of dllimport insanity is to make client
76 access variable directly in the DLL, bypassing extra dereference. I.e.,
77 whenever client contains someting like
79 mov dll_var,%eax,
81 address of dll_var in the command should be relocated to point into loaded
82 DLL. The aim is to make OS loader do so, and than make ld help with that.
83 Import section of PE made following way: there's a vector of structures
84 each describing imports from particular DLL. Each such structure points
85 to two other parellel vectors: one holding imported names, and one which
86 will hold address of corresponding imported name. So, the solution is
87 de-vectorize these structures, making import locations be sparse and
88 pointing directly into code. Before continuing, it is worth a note that,
89 while authors strives to make PE act ELF-like, there're some other people
90 make ELF act PE-like: elfvector, ;-) .
92 Implementation
94 For each reference of data symbol to be imported from DLL (to set of which
95 belong symbols with name <sym>, if __imp_<sym> is found in implib), the
96 import fixup entry is generated. That entry is of type
97 IMAGE_IMPORT_DESCRIPTOR and stored in .idata$3 subsection. Each
98 fixup entry contains pointer to symbol's address within .text section
99 (marked with __fuN_<sym> symbol, where N is integer), pointer to DLL name
100 (so, DLL name is referenced by multiple entries), and pointer to symbol
101 name thunk. Symbol name thunk is singleton vector (__nm_th_<symbol>)
102 pointing to IMAGE_IMPORT_BY_NAME structure (__nm_<symbol>) directly
103 containing imported name. Here comes that "om the edge" problem mentioned
104 above: PE specification rambles that name vector (OriginalFirstThunk)
105 should run in parallel with addresses vector (FirstThunk), i.e. that they
106 should have same number of elements and terminated with zero. We violate
107 this, since FirstThunk points directly into machine code. But in practise,
108 OS loader implemented the sane way: it goes thru OriginalFirstThunk and
109 puts addresses to FirstThunk, not something else. It once again should be
110 noted that dll and symbol name structures are reused across fixup entries
111 and should be there anyway to support standard import stuff, so sustained
112 overhead is 20 bytes per reference. Other question is whether having several
113 IMAGE_IMPORT_DESCRIPTORS for the same DLL is possible. Answer is yes, it is
114 done even by native compiler/linker (libth32's functions are in fact reside
115 in windows9x kernel32.dll, so if you use it, you have two
116 IMAGE_IMPORT_DESCRIPTORS for kernel32.dll). Yet other question is whether
117 referencing the same PE structures several times is valid. The answer is why
118 not, prohibitting that (detecting violation) would require more work on
119 behalf of loader than not doing it.
121 See also: ld/emultempl/pe.em. */
123 static void
124 add_bfd_to_link PARAMS ((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 sec *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@12", 10 },
220 { "DllEntryPoint@0", 15 },
221 { "DllMainCRTStartup@12", 20 },
222 { "_cygwin_dll_entry@12", 20 },
223 { "_cygwin_crt0_common@8", 21 },
224 { "_cygwin_noncygwin_dll_entry@12", 30 },
225 { "impure_ptr", 10 },
226 { NULL, 0 }
229 /* Do not specify library suffix explicitly, to allow for dllized versions. */
230 static autofilter_entry_type autofilter_liblist[] =
232 { "libgcc", 6 },
233 { "libstdc++", 9 },
234 { "libmingw32", 10 },
235 { "libmingwex", 10 },
236 { "libg2c", 6 },
237 { "libsupc++", 9 },
238 { "libobjc", 7 },
239 { "libgcj", 6 },
240 { NULL, 0 }
243 static autofilter_entry_type autofilter_objlist[] =
245 { "crt0.o", 6 },
246 { "crt1.o", 6 },
247 { "crt2.o", 6 },
248 { "dllcrt1.o", 9 },
249 { "dllcrt2.o", 9 },
250 { "gcrt0.o", 7 },
251 { "gcrt1.o", 7 },
252 { "gcrt2.o", 7 },
253 { "crtbegin.o", 10 },
254 { "crtend.o", 8 },
255 { NULL, 0 }
258 static autofilter_entry_type autofilter_symbolprefixlist[] =
260 /* { "__imp_", 6 }, */
261 /* Do __imp_ explicitly to save time. */
262 { "__rtti_", 7 },
263 /* Don't re-export auto-imported symbols. */
264 { "_nm_", 4 },
265 { "__builtin_", 10 },
266 /* Don't export symbols specifying internal DLL layout. */
267 { "_head_", 6 },
268 { "_fmode", 6 },
269 { "_impure_ptr", 11 },
270 { "cygwin_attach_dll", 17 },
271 { "cygwin_premain0", 15 },
272 { "cygwin_premain1", 15 },
273 { "cygwin_premain2", 15 },
274 { "cygwin_premain3", 15 },
275 { "environ", 7 },
276 { NULL, 0 }
279 static autofilter_entry_type autofilter_symbolsuffixlist[] =
281 { "_iname", 6 },
282 { NULL, 0 }
285 #define U(str) (pe_details->underscored ? "_" str : str)
287 static int reloc_sort PARAMS ((const void *, const void *));
288 static int pe_export_sort PARAMS ((const void *, const void *));
289 static int auto_export PARAMS ((bfd *, def_file *, const char *));
290 static void process_def_file PARAMS ((bfd *, struct bfd_link_info *));
291 static void build_filler_bfd PARAMS ((int));
292 static void generate_edata PARAMS ((bfd *, struct bfd_link_info *));
293 static void fill_exported_offsets PARAMS ((bfd *, struct bfd_link_info *));
294 static void fill_edata PARAMS ((bfd *, struct bfd_link_info *));
295 static void generate_reloc PARAMS ((bfd *, struct bfd_link_info *));
296 static void quoteput PARAMS ((char *, FILE *, int));
297 static asection *quick_section PARAMS ((bfd *, const char *, int, int));
298 static void quick_symbol
299 PARAMS ((bfd *, const char *, const char *, const char *,
300 asection *, int, int));
301 static void quick_reloc PARAMS ((bfd *, int, int, int));
302 static bfd *make_head PARAMS ((bfd *));
303 static bfd *make_tail PARAMS ((bfd *));
304 static bfd *make_one PARAMS ((def_file_export *, bfd *));
305 static bfd *make_singleton_name_thunk PARAMS ((const char *, bfd *));
306 static char *make_import_fixup_mark PARAMS ((arelent *));
307 static bfd *make_import_fixup_entry
308 PARAMS ((const char *, const char *, const char *, bfd *));
309 static bfd *make_runtime_pseudo_reloc
310 PARAMS ((const char *, const char *, int, bfd *));
311 static bfd *pe_create_runtime_relocator_reference
312 PARAMS ((bfd *));
313 static unsigned int pe_get16 PARAMS ((bfd *, int));
314 static unsigned int pe_get32 PARAMS ((bfd *, int));
315 static unsigned int pe_as32 PARAMS ((void *));
317 void
318 pe_dll_id_target (target)
319 const char *target;
321 int i;
323 for (i = 0; pe_detail_list[i].target_name; i++)
324 if (strcmp (pe_detail_list[i].target_name, target) == 0
325 || strcmp (pe_detail_list[i].object_target, target) == 0)
327 pe_details = pe_detail_list + i;
328 return;
330 einfo (_("%XUnsupported PEI architecture: %s\n"), target);
331 exit (1);
334 /* Helper functions for qsort. Relocs must be sorted so that we can write
335 them out by pages. */
337 typedef struct
339 bfd_vma vma;
340 char type;
341 short extra;
343 reloc_data_type;
345 static int
346 reloc_sort (va, vb)
347 const void *va, *vb;
349 bfd_vma a = ((reloc_data_type *) va)->vma;
350 bfd_vma b = ((reloc_data_type *) vb)->vma;
352 return (a > b) ? 1 : ((a < b) ? -1 : 0);
355 static int
356 pe_export_sort (va, vb)
357 const void *va, *vb;
359 def_file_export *a = (def_file_export *) va;
360 def_file_export *b = (def_file_export *) vb;
362 return strcmp (a->name, b->name);
365 /* Read and process the .DEF file. */
367 /* These correspond to the entries in pe_def_file->exports[]. I use
368 exported_symbol_sections[i] to tag whether or not the symbol was
369 defined, since we can't export symbols we don't have. */
371 static bfd_vma *exported_symbol_offsets;
372 static struct sec **exported_symbol_sections;
373 static int export_table_size;
374 static int count_exported;
375 static int count_exported_byname;
376 static int count_with_ordinals;
377 static const char *dll_name;
378 static int min_ordinal, max_ordinal;
379 static int *exported_symbols;
381 typedef struct exclude_list_struct
383 char *string;
384 struct exclude_list_struct *next;
385 int type;
387 exclude_list_struct;
389 static struct exclude_list_struct *excludes = 0;
391 void
392 pe_dll_add_excludes (new_excludes, type)
393 const char *new_excludes;
394 const int type;
396 char *local_copy;
397 char *exclude_string;
399 local_copy = xstrdup (new_excludes);
401 exclude_string = strtok (local_copy, ",:");
402 for (; exclude_string; exclude_string = strtok (NULL, ",:"))
404 struct exclude_list_struct *new_exclude;
406 new_exclude = ((struct exclude_list_struct *)
407 xmalloc (sizeof (struct exclude_list_struct)));
408 new_exclude->string = (char *) xmalloc (strlen (exclude_string) + 1);
409 strcpy (new_exclude->string, exclude_string);
410 new_exclude->type = type;
411 new_exclude->next = excludes;
412 excludes = new_exclude;
415 free (local_copy);
419 /* abfd is a bfd containing n (or NULL)
420 It can be used for contextual checks. */
422 static int
423 auto_export (abfd, d, n)
424 bfd *abfd;
425 def_file *d;
426 const char *n;
428 int i;
429 struct exclude_list_struct *ex;
430 autofilter_entry_type *afptr;
431 const char * libname = 0;
432 if (abfd && abfd->my_archive)
433 libname = lbasename (abfd->my_archive->filename);
435 /* We should not re-export imported stuff. */
436 if (strncmp (n, "_imp__", 6) == 0)
437 return 0;
439 for (i = 0; i < d->num_exports; i++)
440 if (strcmp (d->exports[i].name, n) == 0)
441 return 0;
443 if (pe_dll_do_default_excludes)
445 const char * p;
446 int len;
448 if (pe_dll_extra_pe_debug)
449 printf ("considering exporting: %s, abfd=%p, abfd->my_arc=%p\n",
450 n, abfd, abfd->my_archive);
452 /* First of all, make context checks:
453 Don't export anything from standard libs. */
454 if (libname)
456 afptr = autofilter_liblist;
458 while (afptr->name)
460 if (strncmp (libname, afptr->name, afptr->len) == 0 )
461 return 0;
462 afptr++;
466 /* Next, exclude symbols from certain startup objects. */
468 if (abfd && (p = lbasename (abfd->filename)))
470 afptr = autofilter_objlist;
471 while (afptr->name)
473 if (strcmp (p, afptr->name) == 0)
474 return 0;
475 afptr++;
479 /* Don't try to blindly exclude all symbols
480 that begin with '__'; this was tried and
481 it is too restrictive. */
483 /* Then, exclude specific symbols. */
484 afptr = autofilter_symbollist;
485 while (afptr->name)
487 if (strcmp (n, afptr->name) == 0)
488 return 0;
490 afptr++;
493 /* Next, exclude symbols starting with ... */
494 afptr = autofilter_symbolprefixlist;
495 while (afptr->name)
497 if (strncmp (n, afptr->name, afptr->len) == 0)
498 return 0;
500 afptr++;
503 /* Finally, exclude symbols ending with ... */
504 len = strlen (n);
505 afptr = autofilter_symbolsuffixlist;
506 while (afptr->name)
508 if ((len >= afptr->len)
509 /* Add 1 to insure match with trailing '\0'. */
510 && strncmp (n + len - afptr->len, afptr->name,
511 afptr->len + 1) == 0)
512 return 0;
514 afptr++;
518 for (ex = excludes; ex; ex = ex->next)
520 if (ex->type == 1) /* exclude-libs */
522 if (libname
523 && ((strcmp (libname, ex->string) == 0)
524 || (strcasecmp ("ALL", ex->string) == 0)))
525 return 0;
527 else if (strcmp (n, ex->string) == 0)
528 return 0;
531 return 1;
534 static void
535 process_def_file (abfd, info)
536 bfd *abfd ATTRIBUTE_UNUSED;
537 struct bfd_link_info *info;
539 int i, j;
540 struct bfd_link_hash_entry *blhe;
541 bfd *b;
542 struct sec *s;
543 def_file_export *e = 0;
545 if (!pe_def_file)
546 pe_def_file = def_file_empty ();
548 /* First, run around to all the objects looking for the .drectve
549 sections, and push those into the def file too. */
550 for (b = info->input_bfds; b; b = b->link_next)
552 s = bfd_get_section_by_name (b, ".drectve");
553 if (s)
555 int size = bfd_get_section_size_before_reloc (s);
556 char *buf = xmalloc (size);
558 bfd_get_section_contents (b, s, buf, 0, size);
559 def_file_add_directive (pe_def_file, buf, size);
560 free (buf);
564 /* Now, maybe export everything else the default way. */
565 if (pe_dll_export_everything || pe_def_file->num_exports == 0)
567 for (b = info->input_bfds; b; b = b->link_next)
569 asymbol **symbols;
570 int nsyms, symsize;
572 symsize = bfd_get_symtab_upper_bound (b);
573 symbols = (asymbol **) xmalloc (symsize);
574 nsyms = bfd_canonicalize_symtab (b, symbols);
576 for (j = 0; j < nsyms; j++)
578 /* We should export symbols which are either global or not
579 anything at all. (.bss data is the latter)
580 We should not export undefined symbols. */
581 if (symbols[j]->section != &bfd_und_section
582 && ((symbols[j]->flags & BSF_GLOBAL)
583 || (symbols[j]->flags == BFD_FORT_COMM_DEFAULT_VALUE)))
585 const char *sn = symbols[j]->name;
587 /* We should not re-export imported stuff. */
589 char *name = (char *) xmalloc (strlen (sn) + 2 + 6);
590 sprintf (name, "%s%s", U("_imp_"), sn);
592 blhe = bfd_link_hash_lookup (info->hash, name,
593 false, false, false);
594 free (name);
596 if (blhe && blhe->type == bfd_link_hash_defined)
597 continue;
600 if (*sn == '_')
601 sn++;
603 if (auto_export (b, pe_def_file, sn))
605 def_file_export *p;
606 p=def_file_add_export (pe_def_file, sn, 0, -1);
607 /* Fill data flag properly, from dlltool.c. */
608 p->flag_data = !(symbols[j]->flags & BSF_FUNCTION);
615 #undef NE
616 #define NE pe_def_file->num_exports
618 /* Canonicalize the export list. */
619 if (pe_dll_kill_ats)
621 for (i = 0; i < NE; i++)
623 if (strchr (pe_def_file->exports[i].name, '@'))
625 /* This will preserve internal_name, which may have been
626 pointing to the same memory as name, or might not
627 have. */
628 int lead_at = (*pe_def_file->exports[i].name =='@');
629 char *tmp = xstrdup (pe_def_file->exports[i].name + lead_at);
631 *(strchr (tmp, '@')) = 0;
632 pe_def_file->exports[i].name = tmp;
637 if (pe_dll_stdcall_aliases)
639 for (i = 0; i < NE; i++)
641 if (strchr (pe_def_file->exports[i].name, '@'))
643 int lead_at = (*pe_def_file->exports[i].name == '@' ) ;
644 char *tmp = xstrdup (pe_def_file->exports[i].name + lead_at);
646 *(strchr (tmp, '@')) = 0;
647 if (auto_export (NULL, pe_def_file, tmp))
648 def_file_add_export (pe_def_file, tmp,
649 pe_def_file->exports[i].internal_name,
650 -1);
651 else
652 free (tmp);
657 /* Convenience, but watch out for it changing. */
658 e = pe_def_file->exports;
660 exported_symbol_offsets = (bfd_vma *) xmalloc (NE * sizeof (bfd_vma));
661 exported_symbol_sections = (struct sec **) xmalloc (NE * sizeof (struct sec *));
663 memset (exported_symbol_sections, 0, NE * sizeof (struct sec *));
664 max_ordinal = 0;
665 min_ordinal = 65536;
666 count_exported = 0;
667 count_exported_byname = 0;
668 count_with_ordinals = 0;
670 qsort (pe_def_file->exports, NE, sizeof (pe_def_file->exports[0]), pe_export_sort);
671 for (i = 0, j = 0; i < NE; i++)
673 if (i > 0 && strcmp (e[i].name, e[i - 1].name) == 0)
675 /* This is a duplicate. */
676 if (e[j - 1].ordinal != -1
677 && e[i].ordinal != -1
678 && e[j - 1].ordinal != e[i].ordinal)
680 if (pe_dll_warn_dup_exports)
681 /* xgettext:c-format */
682 einfo (_("%XError, duplicate EXPORT with ordinals: %s (%d vs %d)\n"),
683 e[j - 1].name, e[j - 1].ordinal, e[i].ordinal);
685 else
687 if (pe_dll_warn_dup_exports)
688 /* xgettext:c-format */
689 einfo (_("Warning, duplicate EXPORT: %s\n"),
690 e[j - 1].name);
693 if (e[i].ordinal != -1)
694 e[j - 1].ordinal = e[i].ordinal;
695 e[j - 1].flag_private |= e[i].flag_private;
696 e[j - 1].flag_constant |= e[i].flag_constant;
697 e[j - 1].flag_noname |= e[i].flag_noname;
698 e[j - 1].flag_data |= e[i].flag_data;
700 else
702 if (i != j)
703 e[j] = e[i];
704 j++;
707 pe_def_file->num_exports = j; /* == NE */
709 for (i = 0; i < NE; i++)
711 char *name = (char *) xmalloc (strlen (pe_def_file->exports[i].internal_name) + 2);
713 if (pe_details->underscored
714 && (*pe_def_file->exports[i].internal_name != '@'))
716 *name = '_';
717 strcpy (name + 1, pe_def_file->exports[i].internal_name);
719 else
720 strcpy (name, pe_def_file->exports[i].internal_name);
722 blhe = bfd_link_hash_lookup (info->hash,
723 name,
724 false, false, true);
726 if (blhe
727 && (blhe->type == bfd_link_hash_defined
728 || (blhe->type == bfd_link_hash_common)))
730 count_exported++;
731 if (!pe_def_file->exports[i].flag_noname)
732 count_exported_byname++;
734 /* Only fill in the sections. The actual offsets are computed
735 in fill_exported_offsets() after common symbols are laid
736 out. */
737 if (blhe->type == bfd_link_hash_defined)
738 exported_symbol_sections[i] = blhe->u.def.section;
739 else
740 exported_symbol_sections[i] = blhe->u.c.p->section;
742 if (pe_def_file->exports[i].ordinal != -1)
744 if (max_ordinal < pe_def_file->exports[i].ordinal)
745 max_ordinal = pe_def_file->exports[i].ordinal;
746 if (min_ordinal > pe_def_file->exports[i].ordinal)
747 min_ordinal = pe_def_file->exports[i].ordinal;
748 count_with_ordinals++;
751 else if (blhe && blhe->type == bfd_link_hash_undefined)
753 /* xgettext:c-format */
754 einfo (_("%XCannot export %s: symbol not defined\n"),
755 pe_def_file->exports[i].internal_name);
757 else if (blhe)
759 /* xgettext:c-format */
760 einfo (_("%XCannot export %s: symbol wrong type (%d vs %d)\n"),
761 pe_def_file->exports[i].internal_name,
762 blhe->type, bfd_link_hash_defined);
764 else
766 /* xgettext:c-format */
767 einfo (_("%XCannot export %s: symbol not found\n"),
768 pe_def_file->exports[i].internal_name);
770 free (name);
774 /* Build the bfd that will contain .edata and .reloc sections. */
776 static void
777 build_filler_bfd (include_edata)
778 int include_edata;
780 lang_input_statement_type *filler_file;
781 filler_file = lang_add_input_file ("dll stuff",
782 lang_input_file_is_fake_enum,
783 NULL);
784 filler_file->the_bfd = filler_bfd = bfd_create ("dll stuff", output_bfd);
785 if (filler_bfd == NULL
786 || !bfd_set_arch_mach (filler_bfd,
787 bfd_get_arch (output_bfd),
788 bfd_get_mach (output_bfd)))
790 einfo ("%X%P: can not create BFD %E\n");
791 return;
794 if (include_edata)
796 edata_s = bfd_make_section_old_way (filler_bfd, ".edata");
797 if (edata_s == NULL
798 || !bfd_set_section_flags (filler_bfd, edata_s,
799 (SEC_HAS_CONTENTS
800 | SEC_ALLOC
801 | SEC_LOAD
802 | SEC_KEEP
803 | SEC_IN_MEMORY)))
805 einfo ("%X%P: can not create .edata section: %E\n");
806 return;
808 bfd_set_section_size (filler_bfd, edata_s, edata_sz);
811 reloc_s = bfd_make_section_old_way (filler_bfd, ".reloc");
812 if (reloc_s == NULL
813 || !bfd_set_section_flags (filler_bfd, reloc_s,
814 (SEC_HAS_CONTENTS
815 | SEC_ALLOC
816 | SEC_LOAD
817 | SEC_KEEP
818 | SEC_IN_MEMORY)))
820 einfo ("%X%P: can not create .reloc section: %E\n");
821 return;
824 bfd_set_section_size (filler_bfd, reloc_s, 0);
826 ldlang_add_file (filler_file);
829 /* Gather all the exported symbols and build the .edata section. */
831 static void
832 generate_edata (abfd, info)
833 bfd *abfd;
834 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 = (int *) 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])
874 if (pe_def_file->exports[i].ordinal != -1)
876 int ei = pe_def_file->exports[i].ordinal - min_ordinal;
877 int pi = exported_symbols[ei];
879 if (pi != -1)
881 /* xgettext:c-format */
882 einfo (_("%XError, ordinal used twice: %d (%s vs %s)\n"),
883 pe_def_file->exports[i].ordinal,
884 pe_def_file->exports[i].name,
885 pe_def_file->exports[pi].name);
887 exported_symbols[ei] = i;
889 name_table_size += strlen (pe_def_file->exports[i].name) + 1;
893 next_ordinal = min_ordinal;
894 for (i = 0; i < NE; i++)
895 if (exported_symbol_sections[i])
896 if (pe_def_file->exports[i].ordinal == -1)
898 while (exported_symbols[next_ordinal - min_ordinal] != -1)
899 next_ordinal++;
901 exported_symbols[next_ordinal - min_ordinal] = i;
902 pe_def_file->exports[i].ordinal = next_ordinal;
905 /* OK, now we can allocate some memory. */
906 edata_sz = (40 /* directory */
907 + 4 * export_table_size /* addresses */
908 + 4 * count_exported_byname /* name ptrs */
909 + 2 * count_exported_byname /* ordinals */
910 + name_table_size + strlen (dll_name) + 1);
913 /* Fill the exported symbol offsets. The preliminary work has already
914 been done in process_def_file(). */
916 static void
917 fill_exported_offsets (abfd, info)
918 bfd *abfd ATTRIBUTE_UNUSED;
919 struct bfd_link_info *info;
921 int i;
922 struct bfd_link_hash_entry *blhe;
924 for (i = 0; i < pe_def_file->num_exports; i++)
926 char *name = (char *) xmalloc (strlen (pe_def_file->exports[i].internal_name) + 2);
928 if (pe_details->underscored
929 && (*pe_def_file->exports[i].internal_name != '@'))
931 *name = '_';
932 strcpy (name + 1, pe_def_file->exports[i].internal_name);
934 else
935 strcpy (name, pe_def_file->exports[i].internal_name);
937 blhe = bfd_link_hash_lookup (info->hash,
938 name,
939 false, false, true);
941 if (blhe && (blhe->type == bfd_link_hash_defined))
942 exported_symbol_offsets[i] = blhe->u.def.value;
944 free (name);
948 static void
949 fill_edata (abfd, info)
950 bfd *abfd;
951 struct bfd_link_info *info ATTRIBUTE_UNUSED;
953 int i, hint;
954 unsigned char *edirectory;
955 unsigned long *eaddresses;
956 unsigned long *enameptrs;
957 unsigned short *eordinals;
958 unsigned char *enamestr;
959 time_t now;
961 time (&now);
963 edata_d = (unsigned char *) xmalloc (edata_sz);
965 /* Note use of array pointer math here. */
966 edirectory = edata_d;
967 eaddresses = (unsigned long *) (edata_d + 40);
968 enameptrs = eaddresses + export_table_size;
969 eordinals = (unsigned short *) (enameptrs + count_exported_byname);
970 enamestr = (char *) (eordinals + count_exported_byname);
972 #define ERVA(ptr) (((unsigned char *)(ptr) - edata_d) + edata_s->output_section->vma - image_base)
974 memset (edata_d, 0, edata_sz);
975 bfd_put_32 (abfd, now, edata_d + 4);
976 if (pe_def_file->version_major != -1)
978 bfd_put_16 (abfd, pe_def_file->version_major, edata_d + 8);
979 bfd_put_16 (abfd, pe_def_file->version_minor, edata_d + 10);
982 bfd_put_32 (abfd, ERVA (enamestr), edata_d + 12);
983 strcpy (enamestr, dll_name);
984 enamestr += strlen (enamestr) + 1;
985 bfd_put_32 (abfd, min_ordinal, edata_d + 16);
986 bfd_put_32 (abfd, export_table_size, edata_d + 20);
987 bfd_put_32 (abfd, count_exported_byname, edata_d + 24);
988 bfd_put_32 (abfd, ERVA (eaddresses), edata_d + 28);
989 bfd_put_32 (abfd, ERVA (enameptrs), edata_d + 32);
990 bfd_put_32 (abfd, ERVA (eordinals), edata_d + 36);
992 fill_exported_offsets (abfd, info);
994 /* Ok, now for the filling in part. */
995 hint = 0;
996 for (i = 0; i < export_table_size; i++)
998 int s = exported_symbols[i];
1000 if (s != -1)
1002 struct sec *ssec = exported_symbol_sections[s];
1003 unsigned long srva = (exported_symbol_offsets[s]
1004 + ssec->output_section->vma
1005 + ssec->output_offset);
1006 int ord = pe_def_file->exports[s].ordinal;
1008 bfd_put_32 (abfd, srva - image_base,
1009 (void *) (eaddresses + ord - min_ordinal));
1011 if (!pe_def_file->exports[s].flag_noname)
1013 char *ename = pe_def_file->exports[s].name;
1014 bfd_put_32 (abfd, ERVA (enamestr), (void *) enameptrs);
1015 enameptrs++;
1016 strcpy (enamestr, ename);
1017 enamestr += strlen (enamestr) + 1;
1018 bfd_put_16 (abfd, ord - min_ordinal, (void *) eordinals);
1019 eordinals++;
1020 pe_def_file->exports[s].hint = hint++;
1027 static struct sec *current_sec;
1029 void
1030 pe_walk_relocs_of_symbol (info, name, cb)
1031 struct bfd_link_info *info;
1032 const char *name;
1033 int (*cb) (arelent *, asection *);
1035 bfd *b;
1036 asection *s;
1038 for (b = info->input_bfds; b; b = b->link_next)
1040 asymbol **symbols;
1041 int nsyms, symsize;
1043 symsize = bfd_get_symtab_upper_bound (b);
1044 symbols = (asymbol **) xmalloc (symsize);
1045 nsyms = bfd_canonicalize_symtab (b, symbols);
1047 for (s = b->sections; s; s = s->next)
1049 arelent **relocs;
1050 int relsize, nrelocs, i;
1051 int flags = bfd_get_section_flags (b, s);
1053 /* Skip discarded linkonce sections. */
1054 if (flags & SEC_LINK_ONCE
1055 && s->output_section == bfd_abs_section_ptr)
1056 continue;
1058 current_sec = s;
1060 relsize = bfd_get_reloc_upper_bound (b, s);
1061 relocs = (arelent **) xmalloc ((size_t) relsize);
1062 nrelocs = bfd_canonicalize_reloc (b, s, relocs, symbols);
1064 for (i = 0; i < nrelocs; i++)
1066 struct symbol_cache_entry *sym = *relocs[i]->sym_ptr_ptr;
1068 if (!strcmp (name, sym->name))
1069 cb (relocs[i], s);
1072 free (relocs);
1074 /* Warning: the allocated symbols are remembered in BFD and reused
1075 later, so don't free them! */
1076 /* free (symbols); */
1081 /* Gather all the relocations and build the .reloc section. */
1083 static void
1084 generate_reloc (abfd, info)
1085 bfd *abfd;
1086 struct bfd_link_info *info;
1089 /* For .reloc stuff. */
1090 reloc_data_type *reloc_data;
1091 int total_relocs = 0;
1092 int i;
1093 unsigned long sec_page = (unsigned long) (-1);
1094 unsigned long page_ptr, page_count;
1095 int bi;
1096 bfd *b;
1097 struct sec *s;
1099 total_relocs = 0;
1100 for (b = info->input_bfds; b; b = b->link_next)
1101 for (s = b->sections; s; s = s->next)
1102 total_relocs += s->reloc_count;
1104 reloc_data =
1105 (reloc_data_type *) xmalloc (total_relocs * sizeof (reloc_data_type));
1107 total_relocs = 0;
1108 bi = 0;
1109 for (bi = 0, b = info->input_bfds; b; bi++, b = b->link_next)
1111 arelent **relocs;
1112 int relsize, nrelocs, i;
1114 for (s = b->sections; s; s = s->next)
1116 unsigned long sec_vma = s->output_section->vma + s->output_offset;
1117 asymbol **symbols;
1118 int nsyms, symsize;
1120 /* If it's not loaded, we don't need to relocate it this way. */
1121 if (!(s->output_section->flags & SEC_LOAD))
1122 continue;
1124 /* I don't know why there would be a reloc for these, but I've
1125 seen it happen - DJ */
1126 if (s->output_section == &bfd_abs_section)
1127 continue;
1129 if (s->output_section->vma == 0)
1131 /* Huh? Shouldn't happen, but punt if it does. */
1132 einfo ("DJ: zero vma section reloc detected: `%s' #%d f=%d\n",
1133 s->output_section->name, s->output_section->index,
1134 s->output_section->flags);
1135 continue;
1138 symsize = bfd_get_symtab_upper_bound (b);
1139 symbols = (asymbol **) xmalloc (symsize);
1140 nsyms = bfd_canonicalize_symtab (b, symbols);
1142 relsize = bfd_get_reloc_upper_bound (b, s);
1143 relocs = (arelent **) xmalloc ((size_t) relsize);
1144 nrelocs = bfd_canonicalize_reloc (b, s, relocs, symbols);
1146 for (i = 0; i < nrelocs; i++)
1148 if (pe_dll_extra_pe_debug)
1150 struct symbol_cache_entry *sym = *relocs[i]->sym_ptr_ptr;
1151 printf ("rel: %s\n", sym->name);
1153 if (!relocs[i]->howto->pc_relative
1154 && relocs[i]->howto->type != pe_details->imagebase_reloc)
1156 bfd_vma sym_vma;
1157 struct symbol_cache_entry *sym = *relocs[i]->sym_ptr_ptr;
1159 sym_vma = (relocs[i]->addend
1160 + sym->value
1161 + sym->section->vma
1162 + sym->section->output_offset
1163 + sym->section->output_section->vma);
1164 reloc_data[total_relocs].vma = sec_vma + relocs[i]->address;
1166 #define BITS_AND_SHIFT(bits, shift) (bits * 1000 | shift)
1168 switch BITS_AND_SHIFT (relocs[i]->howto->bitsize,
1169 relocs[i]->howto->rightshift)
1171 case BITS_AND_SHIFT (32, 0):
1172 reloc_data[total_relocs].type = 3;
1173 total_relocs++;
1174 break;
1175 case BITS_AND_SHIFT (16, 0):
1176 reloc_data[total_relocs].type = 2;
1177 total_relocs++;
1178 break;
1179 case BITS_AND_SHIFT (16, 16):
1180 reloc_data[total_relocs].type = 4;
1181 /* FIXME: we can't know the symbol's right value
1182 yet, but we probably can safely assume that
1183 CE will relocate us in 64k blocks, so leaving
1184 it zero is safe. */
1185 reloc_data[total_relocs].extra = 0;
1186 total_relocs++;
1187 break;
1188 case BITS_AND_SHIFT (26, 2):
1189 reloc_data[total_relocs].type = 5;
1190 total_relocs++;
1191 break;
1192 default:
1193 /* xgettext:c-format */
1194 einfo (_("%XError: %d-bit reloc in dll\n"),
1195 relocs[i]->howto->bitsize);
1196 break;
1200 free (relocs);
1201 /* Warning: the allocated symbols are remembered in BFD and
1202 reused later, so don't free them! */
1203 #if 0
1204 free (symbol);
1205 #endif
1209 /* At this point, we have total_relocs relocation addresses in
1210 reloc_addresses, which are all suitable for the .reloc section.
1211 We must now create the new sections. */
1212 qsort (reloc_data, total_relocs, sizeof (*reloc_data), reloc_sort);
1214 for (i = 0; i < total_relocs; i++)
1216 unsigned long this_page = (reloc_data[i].vma >> 12);
1218 if (this_page != sec_page)
1220 reloc_sz = (reloc_sz + 3) & ~3; /* 4-byte align. */
1221 reloc_sz += 8;
1222 sec_page = this_page;
1225 reloc_sz += 2;
1227 if (reloc_data[i].type == 4)
1228 reloc_sz += 2;
1231 reloc_sz = (reloc_sz + 3) & ~3; /* 4-byte align. */
1232 reloc_d = (unsigned char *) xmalloc (reloc_sz);
1233 sec_page = (unsigned long) (-1);
1234 reloc_sz = 0;
1235 page_ptr = (unsigned long) (-1);
1236 page_count = 0;
1238 for (i = 0; i < total_relocs; i++)
1240 unsigned long rva = reloc_data[i].vma - image_base;
1241 unsigned long this_page = (rva & ~0xfff);
1243 if (this_page != sec_page)
1245 while (reloc_sz & 3)
1246 reloc_d[reloc_sz++] = 0;
1248 if (page_ptr != (unsigned long) (-1))
1249 bfd_put_32 (abfd, reloc_sz - page_ptr, reloc_d + page_ptr + 4);
1251 bfd_put_32 (abfd, this_page, reloc_d + reloc_sz);
1252 page_ptr = reloc_sz;
1253 reloc_sz += 8;
1254 sec_page = this_page;
1255 page_count = 0;
1258 bfd_put_16 (abfd, (rva & 0xfff) + (reloc_data[i].type << 12),
1259 reloc_d + reloc_sz);
1260 reloc_sz += 2;
1262 if (reloc_data[i].type == 4)
1264 bfd_put_16 (abfd, reloc_data[i].extra, reloc_d + reloc_sz);
1265 reloc_sz += 2;
1268 page_count++;
1271 while (reloc_sz & 3)
1272 reloc_d[reloc_sz++] = 0;
1274 if (page_ptr != (unsigned long) (-1))
1275 bfd_put_32 (abfd, reloc_sz - page_ptr, reloc_d + page_ptr + 4);
1277 while (reloc_sz < reloc_s->_raw_size)
1278 reloc_d[reloc_sz++] = 0;
1281 /* Given the exiting def_file structure, print out a .DEF file that
1282 corresponds to it. */
1284 static void
1285 quoteput (s, f, needs_quotes)
1286 char *s;
1287 FILE *f;
1288 int needs_quotes;
1290 char *cp;
1292 for (cp = s; *cp; cp++)
1293 if (*cp == '\''
1294 || *cp == '"'
1295 || *cp == '\\'
1296 || ISSPACE (*cp)
1297 || *cp == ','
1298 || *cp == ';')
1299 needs_quotes = 1;
1301 if (needs_quotes)
1303 putc ('"', f);
1305 while (*s)
1307 if (*s == '"' || *s == '\\')
1308 putc ('\\', f);
1310 putc (*s, f);
1311 s++;
1314 putc ('"', f);
1316 else
1317 fputs (s, f);
1320 void
1321 pe_dll_generate_def_file (pe_out_def_filename)
1322 const char *pe_out_def_filename;
1324 int i;
1325 FILE *out = fopen (pe_out_def_filename, "w");
1327 if (out == NULL)
1328 /* xgettext:c-format */
1329 einfo (_("%s: Can't open output def file %s\n"),
1330 program_name, pe_out_def_filename);
1332 if (pe_def_file)
1334 if (pe_def_file->name)
1336 if (pe_def_file->is_dll)
1337 fprintf (out, "LIBRARY ");
1338 else
1339 fprintf (out, "NAME ");
1341 quoteput (pe_def_file->name, out, 1);
1343 if (pe_data (output_bfd)->pe_opthdr.ImageBase)
1344 fprintf (out, " BASE=0x%lx",
1345 (unsigned long) pe_data (output_bfd)->pe_opthdr.ImageBase);
1346 fprintf (out, "\n");
1349 if (pe_def_file->description)
1351 fprintf (out, "DESCRIPTION ");
1352 quoteput (pe_def_file->description, out, 1);
1353 fprintf (out, "\n");
1356 if (pe_def_file->version_minor != -1)
1357 fprintf (out, "VERSION %d.%d\n", pe_def_file->version_major,
1358 pe_def_file->version_minor);
1359 else if (pe_def_file->version_major != -1)
1360 fprintf (out, "VERSION %d\n", pe_def_file->version_major);
1362 if (pe_def_file->stack_reserve != -1 || pe_def_file->heap_reserve != -1)
1363 fprintf (out, "\n");
1365 if (pe_def_file->stack_commit != -1)
1366 fprintf (out, "STACKSIZE 0x%x,0x%x\n",
1367 pe_def_file->stack_reserve, pe_def_file->stack_commit);
1368 else if (pe_def_file->stack_reserve != -1)
1369 fprintf (out, "STACKSIZE 0x%x\n", pe_def_file->stack_reserve);
1371 if (pe_def_file->heap_commit != -1)
1372 fprintf (out, "HEAPSIZE 0x%x,0x%x\n",
1373 pe_def_file->heap_reserve, pe_def_file->heap_commit);
1374 else if (pe_def_file->heap_reserve != -1)
1375 fprintf (out, "HEAPSIZE 0x%x\n", pe_def_file->heap_reserve);
1377 if (pe_def_file->num_section_defs > 0)
1379 fprintf (out, "\nSECTIONS\n\n");
1381 for (i = 0; i < pe_def_file->num_section_defs; i++)
1383 fprintf (out, " ");
1384 quoteput (pe_def_file->section_defs[i].name, out, 0);
1386 if (pe_def_file->section_defs[i].class)
1388 fprintf (out, " CLASS ");
1389 quoteput (pe_def_file->section_defs[i].class, out, 0);
1392 if (pe_def_file->section_defs[i].flag_read)
1393 fprintf (out, " READ");
1395 if (pe_def_file->section_defs[i].flag_write)
1396 fprintf (out, " WRITE");
1398 if (pe_def_file->section_defs[i].flag_execute)
1399 fprintf (out, " EXECUTE");
1401 if (pe_def_file->section_defs[i].flag_shared)
1402 fprintf (out, " SHARED");
1404 fprintf (out, "\n");
1408 if (pe_def_file->num_exports > 0)
1410 fprintf (out, "EXPORTS\n");
1412 for (i = 0; i < pe_def_file->num_exports; i++)
1414 def_file_export *e = pe_def_file->exports + i;
1415 fprintf (out, " ");
1416 quoteput (e->name, out, 0);
1418 if (e->internal_name && strcmp (e->internal_name, e->name))
1420 fprintf (out, " = ");
1421 quoteput (e->internal_name, out, 0);
1424 if (e->ordinal != -1)
1425 fprintf (out, " @%d", e->ordinal);
1427 if (e->flag_private)
1428 fprintf (out, " PRIVATE");
1430 if (e->flag_constant)
1431 fprintf (out, " CONSTANT");
1433 if (e->flag_noname)
1434 fprintf (out, " NONAME");
1436 if (e->flag_data)
1437 fprintf (out, " DATA");
1439 fprintf (out, "\n");
1443 if (pe_def_file->num_imports > 0)
1445 fprintf (out, "\nIMPORTS\n\n");
1447 for (i = 0; i < pe_def_file->num_imports; i++)
1449 def_file_import *im = pe_def_file->imports + i;
1450 fprintf (out, " ");
1452 if (im->internal_name
1453 && (!im->name || strcmp (im->internal_name, im->name)))
1455 quoteput (im->internal_name, out, 0);
1456 fprintf (out, " = ");
1459 quoteput (im->module->name, out, 0);
1460 fprintf (out, ".");
1462 if (im->name)
1463 quoteput (im->name, out, 0);
1464 else
1465 fprintf (out, "%d", im->ordinal);
1467 fprintf (out, "\n");
1471 else
1472 fprintf (out, _("; no contents available\n"));
1474 if (fclose (out) == EOF)
1475 /* xgettext:c-format */
1476 einfo (_("%P: Error closing file `%s'\n"), pe_out_def_filename);
1479 /* Generate the import library. */
1481 static asymbol **symtab;
1482 static int symptr;
1483 static int tmp_seq;
1484 static const char *dll_filename;
1485 static char *dll_symname;
1487 #define UNDSEC (asection *) &bfd_und_section
1489 static asection *
1490 quick_section (abfd, name, flags, align)
1491 bfd *abfd;
1492 const char *name;
1493 int flags;
1494 int align;
1496 asection *sec;
1497 asymbol *sym;
1499 sec = bfd_make_section_old_way (abfd, name);
1500 bfd_set_section_flags (abfd, sec, flags | SEC_ALLOC | SEC_LOAD | SEC_KEEP);
1501 bfd_set_section_alignment (abfd, sec, align);
1502 /* Remember to undo this before trying to link internally! */
1503 sec->output_section = sec;
1505 sym = bfd_make_empty_symbol (abfd);
1506 symtab[symptr++] = sym;
1507 sym->name = sec->name;
1508 sym->section = sec;
1509 sym->flags = BSF_LOCAL;
1510 sym->value = 0;
1512 return sec;
1515 static void
1516 quick_symbol (abfd, n1, n2, n3, sec, flags, addr)
1517 bfd *abfd;
1518 const char *n1;
1519 const char *n2;
1520 const char *n3;
1521 asection *sec;
1522 int flags;
1523 int addr;
1525 asymbol *sym;
1526 char *name = (char *) xmalloc (strlen (n1) + strlen (n2) + strlen (n3) + 1);
1528 strcpy (name, n1);
1529 strcat (name, n2);
1530 strcat (name, n3);
1531 sym = bfd_make_empty_symbol (abfd);
1532 sym->name = name;
1533 sym->section = sec;
1534 sym->flags = flags;
1535 sym->value = addr;
1536 symtab[symptr++] = sym;
1539 static arelent *reltab = 0;
1540 static int relcount = 0, relsize = 0;
1542 static void
1543 quick_reloc (abfd, address, which_howto, symidx)
1544 bfd *abfd;
1545 int address;
1546 int which_howto;
1547 int symidx;
1549 if (relcount >= (relsize - 1))
1551 relsize += 10;
1552 if (reltab)
1553 reltab = (arelent *) xrealloc (reltab, relsize * sizeof (arelent));
1554 else
1555 reltab = (arelent *) xmalloc (relsize * sizeof (arelent));
1557 reltab[relcount].address = address;
1558 reltab[relcount].addend = 0;
1559 reltab[relcount].howto = bfd_reloc_type_lookup (abfd, which_howto);
1560 reltab[relcount].sym_ptr_ptr = symtab + symidx;
1561 relcount++;
1564 static void
1565 save_relocs (asection *sec)
1567 int i;
1569 sec->relocation = reltab;
1570 sec->reloc_count = relcount;
1571 sec->orelocation = (arelent **) xmalloc ((relcount + 1) * sizeof (arelent *));
1572 for (i = 0; i < relcount; i++)
1573 sec->orelocation[i] = sec->relocation + i;
1574 sec->orelocation[relcount] = 0;
1575 sec->flags |= SEC_RELOC;
1576 reltab = 0;
1577 relcount = relsize = 0;
1580 /* .section .idata$2
1581 .global __head_my_dll
1582 __head_my_dll:
1583 .rva hname
1584 .long 0
1585 .long 0
1586 .rva __my_dll_iname
1587 .rva fthunk
1589 .section .idata$5
1590 .long 0
1591 fthunk:
1593 .section .idata$4
1594 .long 0
1595 hname: */
1597 static bfd *
1598 make_head (parent)
1599 bfd *parent;
1601 asection *id2, *id5, *id4;
1602 unsigned char *d2, *d5, *d4;
1603 char *oname;
1604 bfd *abfd;
1606 oname = (char *) xmalloc (20);
1607 sprintf (oname, "d%06d.o", tmp_seq);
1608 tmp_seq++;
1610 abfd = bfd_create (oname, parent);
1611 bfd_find_target (pe_details->object_target, abfd);
1612 bfd_make_writable (abfd);
1614 bfd_set_format (abfd, bfd_object);
1615 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
1617 symptr = 0;
1618 symtab = (asymbol **) xmalloc (6 * sizeof (asymbol *));
1619 id2 = quick_section (abfd, ".idata$2", SEC_HAS_CONTENTS, 2);
1620 id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
1621 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
1622 quick_symbol (abfd, U ("_head_"), dll_symname, "", id2, BSF_GLOBAL, 0);
1623 quick_symbol (abfd, U (""), dll_symname, "_iname", UNDSEC, BSF_GLOBAL, 0);
1625 /* OK, pay attention here. I got confused myself looking back at
1626 it. We create a four-byte section to mark the beginning of the
1627 list, and we include an offset of 4 in the section, so that the
1628 pointer to the list points to the *end* of this section, which is
1629 the start of the list of sections from other objects. */
1631 bfd_set_section_size (abfd, id2, 20);
1632 d2 = (unsigned char *) xmalloc (20);
1633 id2->contents = d2;
1634 memset (d2, 0, 20);
1635 d2[0] = d2[16] = 4; /* Reloc addend. */
1636 quick_reloc (abfd, 0, BFD_RELOC_RVA, 2);
1637 quick_reloc (abfd, 12, BFD_RELOC_RVA, 4);
1638 quick_reloc (abfd, 16, BFD_RELOC_RVA, 1);
1639 save_relocs (id2);
1641 bfd_set_section_size (abfd, id5, 4);
1642 d5 = (unsigned char *) xmalloc (4);
1643 id5->contents = d5;
1644 memset (d5, 0, 4);
1646 bfd_set_section_size (abfd, id4, 4);
1647 d4 = (unsigned char *) xmalloc (4);
1648 id4->contents = d4;
1649 memset (d4, 0, 4);
1651 bfd_set_symtab (abfd, symtab, symptr);
1653 bfd_set_section_contents (abfd, id2, d2, 0, 20);
1654 bfd_set_section_contents (abfd, id5, d5, 0, 4);
1655 bfd_set_section_contents (abfd, id4, d4, 0, 4);
1657 bfd_make_readable (abfd);
1658 return abfd;
1661 /* .section .idata$4
1662 .long 0
1663 .section .idata$5
1664 .long 0
1665 .section idata$7
1666 .global __my_dll_iname
1667 __my_dll_iname:
1668 .asciz "my.dll" */
1670 static bfd *
1671 make_tail (parent)
1672 bfd *parent;
1674 asection *id4, *id5, *id7;
1675 unsigned char *d4, *d5, *d7;
1676 int len;
1677 char *oname;
1678 bfd *abfd;
1680 oname = (char *) xmalloc (20);
1681 sprintf (oname, "d%06d.o", tmp_seq);
1682 tmp_seq++;
1684 abfd = bfd_create (oname, parent);
1685 bfd_find_target (pe_details->object_target, abfd);
1686 bfd_make_writable (abfd);
1688 bfd_set_format (abfd, bfd_object);
1689 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
1691 symptr = 0;
1692 symtab = (asymbol **) xmalloc (5 * sizeof (asymbol *));
1693 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
1694 id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
1695 id7 = quick_section (abfd, ".idata$7", SEC_HAS_CONTENTS, 2);
1696 quick_symbol (abfd, U (""), dll_symname, "_iname", id7, BSF_GLOBAL, 0);
1698 bfd_set_section_size (abfd, id4, 4);
1699 d4 = (unsigned char *) xmalloc (4);
1700 id4->contents = d4;
1701 memset (d4, 0, 4);
1703 bfd_set_section_size (abfd, id5, 4);
1704 d5 = (unsigned char *) xmalloc (4);
1705 id5->contents = d5;
1706 memset (d5, 0, 4);
1708 len = strlen (dll_filename) + 1;
1709 if (len & 1)
1710 len++;
1711 bfd_set_section_size (abfd, id7, len);
1712 d7 = (unsigned char *) xmalloc (len);
1713 id7->contents = d7;
1714 strcpy (d7, dll_filename);
1716 bfd_set_symtab (abfd, symtab, symptr);
1718 bfd_set_section_contents (abfd, id4, d4, 0, 4);
1719 bfd_set_section_contents (abfd, id5, d5, 0, 4);
1720 bfd_set_section_contents (abfd, id7, d7, 0, len);
1722 bfd_make_readable (abfd);
1723 return abfd;
1726 /* .text
1727 .global _function
1728 .global ___imp_function
1729 .global __imp__function
1730 _function:
1731 jmp *__imp__function:
1733 .section idata$7
1734 .long __head_my_dll
1736 .section .idata$5
1737 ___imp_function:
1738 __imp__function:
1739 iat?
1740 .section .idata$4
1741 iat?
1742 .section .idata$6
1743 ID<ordinal>:
1744 .short <hint>
1745 .asciz "function" xlate? (add underscore, kill at) */
1747 static unsigned char jmp_ix86_bytes[] =
1749 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x90, 0x90
1752 /* _function:
1753 mov.l ip+8,r0
1754 mov.l @r0,r0
1755 jmp @r0
1757 .dw __imp_function */
1759 static unsigned char jmp_sh_bytes[] =
1761 0x01, 0xd0, 0x02, 0x60, 0x2b, 0x40, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00
1764 /* _function:
1765 lui $t0,<high:__imp_function>
1766 lw $t0,<low:__imp_function>
1767 jr $t0
1768 nop */
1770 static unsigned char jmp_mips_bytes[] =
1772 0x00, 0x00, 0x08, 0x3c, 0x00, 0x00, 0x08, 0x8d,
1773 0x08, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00
1776 static bfd *
1777 make_one (exp, parent)
1778 def_file_export *exp;
1779 bfd *parent;
1781 asection *tx, *id7, *id5, *id4, *id6;
1782 unsigned char *td = NULL, *d7, *d5, *d4, *d6 = NULL;
1783 int len;
1784 char *oname;
1785 bfd *abfd;
1786 unsigned char *jmp_bytes = NULL;
1787 int jmp_byte_count = 0;
1789 switch (pe_details->pe_arch)
1791 case PE_ARCH_i386:
1792 jmp_bytes = jmp_ix86_bytes;
1793 jmp_byte_count = sizeof (jmp_ix86_bytes);
1794 break;
1795 case PE_ARCH_sh:
1796 jmp_bytes = jmp_sh_bytes;
1797 jmp_byte_count = sizeof (jmp_sh_bytes);
1798 break;
1799 case PE_ARCH_mips:
1800 jmp_bytes = jmp_mips_bytes;
1801 jmp_byte_count = sizeof (jmp_mips_bytes);
1802 break;
1803 default:
1804 abort ();
1807 oname = (char *) xmalloc (20);
1808 sprintf (oname, "d%06d.o", tmp_seq);
1809 tmp_seq++;
1811 abfd = bfd_create (oname, parent);
1812 bfd_find_target (pe_details->object_target, abfd);
1813 bfd_make_writable (abfd);
1815 bfd_set_format (abfd, bfd_object);
1816 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
1818 symptr = 0;
1819 symtab = (asymbol **) xmalloc (11 * sizeof (asymbol *));
1820 tx = quick_section (abfd, ".text", SEC_CODE|SEC_HAS_CONTENTS, 2);
1821 id7 = quick_section (abfd, ".idata$7", SEC_HAS_CONTENTS, 2);
1822 id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
1823 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
1824 id6 = quick_section (abfd, ".idata$6", SEC_HAS_CONTENTS, 2);
1826 if (*exp->internal_name == '@')
1828 if (! exp->flag_data)
1829 quick_symbol (abfd, "", exp->internal_name, "", tx, BSF_GLOBAL, 0);
1830 quick_symbol (abfd, U ("_head_"), dll_symname, "", UNDSEC, BSF_GLOBAL, 0);
1831 quick_symbol (abfd, U ("_imp_"), exp->internal_name, "", id5, BSF_GLOBAL, 0);
1832 /* Fastcall applies only to functions,
1833 so no need for auto-import symbol. */
1835 else
1837 if (! exp->flag_data)
1838 quick_symbol (abfd, U (""), exp->internal_name, "", tx, BSF_GLOBAL, 0);
1839 quick_symbol (abfd, U ("_head_"), dll_symname, "", UNDSEC, BSF_GLOBAL, 0);
1840 quick_symbol (abfd, U ("_imp__"), exp->internal_name, "", id5, BSF_GLOBAL, 0);
1841 /* Symbol to reference ord/name of imported
1842 data symbol, used to implement auto-import. */
1843 if (exp->flag_data)
1844 quick_symbol (abfd, U("_nm__"), exp->internal_name, "", id6, BSF_GLOBAL,0);
1846 if (pe_dll_compat_implib)
1847 quick_symbol (abfd, U ("__imp_"), exp->internal_name, "",
1848 id5, BSF_GLOBAL, 0);
1850 if (! exp->flag_data)
1852 bfd_set_section_size (abfd, tx, jmp_byte_count);
1853 td = (unsigned char *) xmalloc (jmp_byte_count);
1854 tx->contents = td;
1855 memcpy (td, jmp_bytes, jmp_byte_count);
1857 switch (pe_details->pe_arch)
1859 case PE_ARCH_i386:
1860 quick_reloc (abfd, 2, BFD_RELOC_32, 2);
1861 break;
1862 case PE_ARCH_sh:
1863 quick_reloc (abfd, 8, BFD_RELOC_32, 2);
1864 break;
1865 case PE_ARCH_mips:
1866 quick_reloc (abfd, 0, BFD_RELOC_HI16_S, 2);
1867 quick_reloc (abfd, 0, BFD_RELOC_LO16, 0); /* MIPS_R_PAIR */
1868 quick_reloc (abfd, 4, BFD_RELOC_LO16, 2);
1869 break;
1870 default:
1871 abort ();
1873 save_relocs (tx);
1876 bfd_set_section_size (abfd, id7, 4);
1877 d7 = (unsigned char *) xmalloc (4);
1878 id7->contents = d7;
1879 memset (d7, 0, 4);
1880 quick_reloc (abfd, 0, BFD_RELOC_RVA, 6);
1881 save_relocs (id7);
1883 bfd_set_section_size (abfd, id5, 4);
1884 d5 = (unsigned char *) xmalloc (4);
1885 id5->contents = d5;
1886 memset (d5, 0, 4);
1888 if (exp->flag_noname)
1890 d5[0] = exp->ordinal;
1891 d5[1] = exp->ordinal >> 8;
1892 d5[3] = 0x80;
1894 else
1896 quick_reloc (abfd, 0, BFD_RELOC_RVA, 4);
1897 save_relocs (id5);
1900 bfd_set_section_size (abfd, id4, 4);
1901 d4 = (unsigned char *) xmalloc (4);
1902 id4->contents = d4;
1903 memset (d4, 0, 4);
1905 if (exp->flag_noname)
1907 d4[0] = exp->ordinal;
1908 d4[1] = exp->ordinal >> 8;
1909 d4[3] = 0x80;
1911 else
1913 quick_reloc (abfd, 0, BFD_RELOC_RVA, 4);
1914 save_relocs (id4);
1917 if (exp->flag_noname)
1919 len = 0;
1920 bfd_set_section_size (abfd, id6, 0);
1922 else
1924 len = strlen (exp->name) + 3;
1925 if (len & 1)
1926 len++;
1927 bfd_set_section_size (abfd, id6, len);
1928 d6 = (unsigned char *) xmalloc (len);
1929 id6->contents = d6;
1930 memset (d6, 0, len);
1931 d6[0] = exp->hint & 0xff;
1932 d6[1] = exp->hint >> 8;
1933 strcpy (d6 + 2, exp->name);
1936 bfd_set_symtab (abfd, symtab, symptr);
1938 bfd_set_section_contents (abfd, tx, td, 0, jmp_byte_count);
1939 bfd_set_section_contents (abfd, id7, d7, 0, 4);
1940 bfd_set_section_contents (abfd, id5, d5, 0, 4);
1941 bfd_set_section_contents (abfd, id4, d4, 0, 4);
1942 if (!exp->flag_noname)
1943 bfd_set_section_contents (abfd, id6, d6, 0, len);
1945 bfd_make_readable (abfd);
1946 return abfd;
1949 static bfd *
1950 make_singleton_name_thunk (import, parent)
1951 const char *import;
1952 bfd *parent;
1954 /* Name thunks go to idata$4. */
1955 asection *id4;
1956 unsigned char *d4;
1957 char *oname;
1958 bfd *abfd;
1960 oname = (char *) xmalloc (20);
1961 sprintf (oname, "nmth%06d.o", tmp_seq);
1962 tmp_seq++;
1964 abfd = bfd_create (oname, parent);
1965 bfd_find_target (pe_details->object_target, abfd);
1966 bfd_make_writable (abfd);
1968 bfd_set_format (abfd, bfd_object);
1969 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
1971 symptr = 0;
1972 symtab = (asymbol **) xmalloc (3 * sizeof (asymbol *));
1973 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
1974 quick_symbol (abfd, U ("_nm_thnk_"), import, "", id4, BSF_GLOBAL, 0);
1975 quick_symbol (abfd, U ("_nm_"), import, "", UNDSEC, BSF_GLOBAL, 0);
1977 bfd_set_section_size (abfd, id4, 8);
1978 d4 = (unsigned char *) xmalloc (4);
1979 id4->contents = d4;
1980 memset (d4, 0, 8);
1981 quick_reloc (abfd, 0, BFD_RELOC_RVA, 2);
1982 save_relocs (id4);
1984 bfd_set_symtab (abfd, symtab, symptr);
1986 bfd_set_section_contents (abfd, id4, d4, 0, 8);
1988 bfd_make_readable (abfd);
1989 return abfd;
1992 static char *
1993 make_import_fixup_mark (rel)
1994 arelent *rel;
1996 /* We convert reloc to symbol, for later reference. */
1997 static int counter;
1998 static char *fixup_name = NULL;
1999 static size_t buffer_len = 0;
2001 struct symbol_cache_entry *sym = *rel->sym_ptr_ptr;
2003 bfd *abfd = bfd_asymbol_bfd (sym);
2004 struct bfd_link_hash_entry *bh;
2006 if (!fixup_name)
2008 fixup_name = (char *) xmalloc (384);
2009 buffer_len = 384;
2012 if (strlen (sym->name) + 25 > buffer_len)
2013 /* Assume 25 chars for "__fu" + counter + "_". If counter is
2014 bigger than 20 digits long, we've got worse problems than
2015 overflowing this buffer... */
2017 free (fixup_name);
2018 /* New buffer size is length of symbol, plus 25, but then
2019 rounded up to the nearest multiple of 128. */
2020 buffer_len = ((strlen (sym->name) + 25) + 127) & ~127;
2021 fixup_name = (char *) xmalloc (buffer_len);
2024 sprintf (fixup_name, "__fu%d_%s", counter++, sym->name);
2026 bh = NULL;
2027 bfd_coff_link_add_one_symbol (&link_info, abfd, fixup_name, BSF_GLOBAL,
2028 current_sec, /* sym->section, */
2029 rel->address, NULL, true, false, &bh);
2031 if (0)
2033 struct coff_link_hash_entry *myh;
2035 myh = (struct coff_link_hash_entry *) bh;
2036 printf ("type:%d\n", myh->type);
2037 printf ("%s\n", myh->root.u.def.section->name);
2040 return fixup_name;
2043 /* .section .idata$3
2044 .rva __nm_thnk_SYM (singleton thunk with name of func)
2045 .long 0
2046 .long 0
2047 .rva __my_dll_iname (name of dll)
2048 .rva __fuNN_SYM (pointer to reference (address) in text) */
2050 static bfd *
2051 make_import_fixup_entry (name, fixup_name, dll_symname, parent)
2052 const char *name;
2053 const char *fixup_name;
2054 const char *dll_symname;
2055 bfd *parent;
2057 asection *id3;
2058 unsigned char *d3;
2059 char *oname;
2060 bfd *abfd;
2062 oname = (char *) xmalloc (20);
2063 sprintf (oname, "fu%06d.o", tmp_seq);
2064 tmp_seq++;
2066 abfd = bfd_create (oname, parent);
2067 bfd_find_target (pe_details->object_target, abfd);
2068 bfd_make_writable (abfd);
2070 bfd_set_format (abfd, bfd_object);
2071 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2073 symptr = 0;
2074 symtab = (asymbol **) xmalloc (6 * sizeof (asymbol *));
2075 id3 = quick_section (abfd, ".idata$3", SEC_HAS_CONTENTS, 2);
2077 #if 0
2078 quick_symbol (abfd, U ("_head_"), dll_symname, "", id2, BSF_GLOBAL, 0);
2079 #endif
2080 quick_symbol (abfd, U ("_nm_thnk_"), name, "", UNDSEC, BSF_GLOBAL, 0);
2081 quick_symbol (abfd, U (""), dll_symname, "_iname", UNDSEC, BSF_GLOBAL, 0);
2082 quick_symbol (abfd, "", fixup_name, "", UNDSEC, BSF_GLOBAL, 0);
2084 bfd_set_section_size (abfd, id3, 20);
2085 d3 = (unsigned char *) xmalloc (20);
2086 id3->contents = d3;
2087 memset (d3, 0, 20);
2089 quick_reloc (abfd, 0, BFD_RELOC_RVA, 1);
2090 quick_reloc (abfd, 12, BFD_RELOC_RVA, 2);
2091 quick_reloc (abfd, 16, BFD_RELOC_RVA, 3);
2092 save_relocs (id3);
2094 bfd_set_symtab (abfd, symtab, symptr);
2096 bfd_set_section_contents (abfd, id3, d3, 0, 20);
2098 bfd_make_readable (abfd);
2099 return abfd;
2102 /* .section .rdata_runtime_pseudo_reloc
2103 .long addend
2104 .rva __fuNN_SYM (pointer to reference (address) in text) */
2106 static bfd *
2107 make_runtime_pseudo_reloc (name, fixup_name, addend, parent)
2108 const char *name ATTRIBUTE_UNUSED;
2109 const char *fixup_name;
2110 int addend;
2111 bfd *parent;
2113 asection *rt_rel;
2114 unsigned char *rt_rel_d;
2115 char *oname;
2116 bfd *abfd;
2118 oname = (char *) xmalloc (20);
2119 sprintf (oname, "rtr%06d.o", tmp_seq);
2120 tmp_seq++;
2122 abfd = bfd_create (oname, parent);
2123 bfd_find_target (pe_details->object_target, abfd);
2124 bfd_make_writable (abfd);
2126 bfd_set_format (abfd, bfd_object);
2127 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2129 symptr = 0;
2130 symtab = (asymbol **) xmalloc (2 * sizeof (asymbol *));
2131 rt_rel = quick_section (abfd, ".rdata_runtime_pseudo_reloc", SEC_HAS_CONTENTS, 2);
2133 quick_symbol (abfd, "", fixup_name, "", UNDSEC, BSF_GLOBAL, 0);
2135 bfd_set_section_size (abfd, rt_rel, 8);
2136 rt_rel_d = (unsigned char *) xmalloc (8);
2137 rt_rel->contents = rt_rel_d;
2138 memset (rt_rel_d, 0, 8);
2139 bfd_put_32 (abfd, addend, rt_rel_d);
2141 quick_reloc (abfd, 4, BFD_RELOC_RVA, 1);
2142 save_relocs (rt_rel);
2144 bfd_set_symtab (abfd, symtab, symptr);
2146 bfd_set_section_contents (abfd, rt_rel, rt_rel_d, 0, 8);
2148 bfd_make_readable (abfd);
2149 return abfd;
2152 /* .section .rdata
2153 .rva __pei386_runtime_relocator */
2155 static bfd *
2156 pe_create_runtime_relocator_reference (parent)
2157 bfd *parent;
2159 asection *extern_rt_rel;
2160 unsigned char *extern_rt_rel_d;
2161 char *oname;
2162 bfd *abfd;
2164 oname = (char *) xmalloc (20);
2165 sprintf (oname, "ertr%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 = (asymbol **) xmalloc (2 * sizeof (asymbol *));
2177 extern_rt_rel = quick_section (abfd, ".rdata", SEC_HAS_CONTENTS, 2);
2179 quick_symbol (abfd, "", "__pei386_runtime_relocator", "", UNDSEC, BSF_NO_FLAGS, 0);
2181 bfd_set_section_size (abfd, extern_rt_rel, 4);
2182 extern_rt_rel_d = (unsigned char *) xmalloc (4);
2183 extern_rt_rel->contents = extern_rt_rel_d;
2185 quick_reloc (abfd, 0, BFD_RELOC_RVA, 1);
2186 save_relocs (extern_rt_rel);
2188 bfd_set_symtab (abfd, symtab, symptr);
2190 bfd_set_section_contents (abfd, extern_rt_rel, extern_rt_rel_d, 0, 4);
2192 bfd_make_readable (abfd);
2193 return abfd;
2196 void
2197 pe_create_import_fixup (rel, s, addend)
2198 arelent *rel;
2199 asection *s;
2200 int addend;
2202 char buf[300];
2203 struct symbol_cache_entry *sym = *rel->sym_ptr_ptr;
2204 struct bfd_link_hash_entry *name_thunk_sym;
2205 const char *name = sym->name;
2206 char *fixup_name = make_import_fixup_mark (rel);
2207 bfd *b;
2209 sprintf (buf, U ("_nm_thnk_%s"), name);
2211 name_thunk_sym = bfd_link_hash_lookup (link_info.hash, buf, 0, 0, 1);
2213 if (!name_thunk_sym || name_thunk_sym->type != bfd_link_hash_defined)
2215 bfd *b = make_singleton_name_thunk (name, output_bfd);
2216 add_bfd_to_link (b, b->filename, &link_info);
2218 /* If we ever use autoimport, we have to cast text section writable. */
2219 config.text_read_only = false;
2222 if (addend == 0 || link_info.pei386_runtime_pseudo_reloc)
2224 extern char * pe_data_import_dll;
2225 char * dll_symname = pe_data_import_dll ? pe_data_import_dll : "unknown";
2227 b = make_import_fixup_entry (name, fixup_name, dll_symname, output_bfd);
2228 add_bfd_to_link (b, b->filename, &link_info);
2231 if (addend != 0)
2233 if (link_info.pei386_runtime_pseudo_reloc)
2235 if (pe_dll_extra_pe_debug)
2236 printf ("creating runtime pseudo-reloc entry for %s (addend=%d)\n",
2237 fixup_name, addend);
2238 b = make_runtime_pseudo_reloc (name, fixup_name, addend, output_bfd);
2239 add_bfd_to_link (b, b->filename, &link_info);
2241 if (runtime_pseudo_relocs_created == 0)
2243 b = pe_create_runtime_relocator_reference (output_bfd);
2244 add_bfd_to_link (b, b->filename, &link_info);
2246 runtime_pseudo_relocs_created++;
2248 else
2250 einfo (_("%C: variable '%T' can't be auto-imported. Please read the documentation for ld's --enable-auto-import for details.\n"),
2251 s->owner, s, rel->address, sym->name);
2252 einfo ("%X");
2258 void
2259 pe_dll_generate_implib (def, impfilename)
2260 def_file *def;
2261 const char *impfilename;
2263 int i;
2264 bfd *ar_head;
2265 bfd *ar_tail;
2266 bfd *outarch;
2267 bfd *head = 0;
2269 dll_filename = (def->name) ? def->name : dll_name;
2270 dll_symname = xstrdup (dll_filename);
2271 for (i = 0; dll_symname[i]; i++)
2272 if (!ISALNUM (dll_symname[i]))
2273 dll_symname[i] = '_';
2275 unlink (impfilename);
2277 outarch = bfd_openw (impfilename, 0);
2279 if (!outarch)
2281 /* xgettext:c-format */
2282 einfo (_("%XCan't open .lib file: %s\n"), impfilename);
2283 return;
2286 /* xgettext:c-format */
2287 einfo (_("Creating library file: %s\n"), impfilename);
2289 bfd_set_format (outarch, bfd_archive);
2290 outarch->has_armap = 1;
2292 /* Work out a reasonable size of things to put onto one line. */
2293 ar_head = make_head (outarch);
2295 for (i = 0; i < def->num_exports; i++)
2297 /* The import library doesn't know about the internal name. */
2298 char *internal = def->exports[i].internal_name;
2299 bfd *n;
2301 def->exports[i].internal_name = def->exports[i].name;
2302 n = make_one (def->exports + i, outarch);
2303 n->next = head;
2304 head = n;
2305 def->exports[i].internal_name = internal;
2308 ar_tail = make_tail (outarch);
2310 if (ar_head == NULL || ar_tail == NULL)
2311 return;
2313 /* Now stick them all into the archive. */
2314 ar_head->next = head;
2315 ar_tail->next = ar_head;
2316 head = ar_tail;
2318 if (! bfd_set_archive_head (outarch, head))
2319 einfo ("%Xbfd_set_archive_head: %s\n", bfd_errmsg (bfd_get_error ()));
2321 if (! bfd_close (outarch))
2322 einfo ("%Xbfd_close %s: %s\n", impfilename, bfd_errmsg (bfd_get_error ()));
2324 while (head != NULL)
2326 bfd *n = head->next;
2327 bfd_close (head);
2328 head = n;
2332 static void
2333 add_bfd_to_link (abfd, name, link_info)
2334 bfd *abfd;
2335 const char *name;
2336 struct bfd_link_info *link_info;
2338 lang_input_statement_type *fake_file;
2340 fake_file = lang_add_input_file (name,
2341 lang_input_file_is_fake_enum,
2342 NULL);
2343 fake_file->the_bfd = abfd;
2344 ldlang_add_file (fake_file);
2346 if (!bfd_link_add_symbols (abfd, link_info))
2347 einfo ("%Xaddsym %s: %s\n", name, bfd_errmsg (bfd_get_error ()));
2350 void
2351 pe_process_import_defs (output_bfd, link_info)
2352 bfd *output_bfd;
2353 struct bfd_link_info *link_info;
2355 def_file_module *module;
2357 pe_dll_id_target (bfd_get_target (output_bfd));
2359 if (!pe_def_file)
2360 return;
2362 for (module = pe_def_file->modules; module; module = module->next)
2364 int i, do_this_dll;
2366 dll_filename = module->name;
2367 dll_symname = xstrdup (module->name);
2368 for (i = 0; dll_symname[i]; i++)
2369 if (!ISALNUM (dll_symname[i]))
2370 dll_symname[i] = '_';
2372 do_this_dll = 0;
2374 for (i = 0; i < pe_def_file->num_imports; i++)
2375 if (pe_def_file->imports[i].module == module)
2377 def_file_export exp;
2378 struct bfd_link_hash_entry *blhe;
2379 int lead_at = (*pe_def_file->imports[i].internal_name == '@');
2380 /* See if we need this import. */
2381 char *name = (char *) xmalloc (strlen (pe_def_file->imports[i].internal_name) + 2 + 6);
2383 if (lead_at)
2384 sprintf (name, "%s%s", "", pe_def_file->imports[i].internal_name);
2385 else
2386 sprintf (name, "%s%s",U (""), pe_def_file->imports[i].internal_name);
2388 blhe = bfd_link_hash_lookup (link_info->hash, name,
2389 false, false, false);
2391 if (!blhe || (blhe && blhe->type != bfd_link_hash_undefined))
2393 if (lead_at)
2394 sprintf (name, "%s%s", U ("_imp_"),
2395 pe_def_file->imports[i].internal_name);
2396 else
2397 sprintf (name, "%s%s", U ("_imp__"),
2398 pe_def_file->imports[i].internal_name);
2400 blhe = bfd_link_hash_lookup (link_info->hash, name,
2401 false, false, false);
2403 free (name);
2405 if (blhe && blhe->type == bfd_link_hash_undefined)
2407 bfd *one;
2408 /* We do. */
2409 if (!do_this_dll)
2411 bfd *ar_head = make_head (output_bfd);
2412 add_bfd_to_link (ar_head, ar_head->filename, link_info);
2413 do_this_dll = 1;
2415 exp.internal_name = pe_def_file->imports[i].internal_name;
2416 exp.name = pe_def_file->imports[i].name;
2417 exp.ordinal = pe_def_file->imports[i].ordinal;
2418 exp.hint = exp.ordinal >= 0 ? exp.ordinal : 0;
2419 exp.flag_private = 0;
2420 exp.flag_constant = 0;
2421 exp.flag_data = 0;
2422 exp.flag_noname = exp.name ? 0 : 1;
2423 one = make_one (&exp, output_bfd);
2424 add_bfd_to_link (one, one->filename, link_info);
2427 if (do_this_dll)
2429 bfd *ar_tail = make_tail (output_bfd);
2430 add_bfd_to_link (ar_tail, ar_tail->filename, link_info);
2433 free (dll_symname);
2437 /* We were handed a *.DLL file. Parse it and turn it into a set of
2438 IMPORTS directives in the def file. Return true if the file was
2439 handled, false if not. */
2441 static unsigned int
2442 pe_get16 (abfd, where)
2443 bfd *abfd;
2444 int where;
2446 unsigned char b[2];
2448 bfd_seek (abfd, (file_ptr) where, SEEK_SET);
2449 bfd_bread (b, (bfd_size_type) 2, abfd);
2450 return b[0] + (b[1] << 8);
2453 static unsigned int
2454 pe_get32 (abfd, where)
2455 bfd *abfd;
2456 int where;
2458 unsigned char b[4];
2460 bfd_seek (abfd, (file_ptr) where, SEEK_SET);
2461 bfd_bread (b, (bfd_size_type) 4, abfd);
2462 return b[0] + (b[1] << 8) + (b[2] << 16) + (b[3] << 24);
2465 #if 0 /* This is not currently used. */
2467 static unsigned int
2468 pe_as16 (ptr)
2469 void *ptr;
2471 unsigned char *b = ptr;
2473 return b[0] + (b[1] << 8);
2476 #endif
2478 static unsigned int
2479 pe_as32 (ptr)
2480 void *ptr;
2482 unsigned char *b = ptr;
2484 return b[0] + (b[1] << 8) + (b[2] << 16) + (b[3] << 24);
2487 boolean
2488 pe_implied_import_dll (filename)
2489 const char *filename;
2491 bfd *dll;
2492 unsigned long pe_header_offset, opthdr_ofs, num_entries, i;
2493 unsigned long export_rva, export_size, nsections, secptr, expptr;
2494 unsigned char *expdata, *erva;
2495 unsigned long name_rvas, ordinals, nexp, ordbase;
2496 const char *dll_name;
2498 /* No, I can't use bfd here. kernel32.dll puts its export table in
2499 the middle of the .rdata section. */
2500 dll = bfd_openr (filename, pe_details->target_name);
2501 if (!dll)
2503 einfo ("%Xopen %s: %s\n", filename, bfd_errmsg (bfd_get_error ()));
2504 return false;
2507 /* PEI dlls seem to be bfd_objects. */
2508 if (!bfd_check_format (dll, bfd_object))
2510 einfo ("%X%s: this doesn't appear to be a DLL\n", filename);
2511 return false;
2514 dll_name = filename;
2515 for (i = 0; filename[i]; i++)
2516 if (filename[i] == '/' || filename[i] == '\\' || filename[i] == ':')
2517 dll_name = filename + i + 1;
2519 pe_header_offset = pe_get32 (dll, 0x3c);
2520 opthdr_ofs = pe_header_offset + 4 + 20;
2521 num_entries = pe_get32 (dll, opthdr_ofs + 92);
2523 if (num_entries < 1) /* No exports. */
2524 return false;
2526 export_rva = pe_get32 (dll, opthdr_ofs + 96);
2527 export_size = pe_get32 (dll, opthdr_ofs + 100);
2528 nsections = pe_get16 (dll, pe_header_offset + 4 + 2);
2529 secptr = (pe_header_offset + 4 + 20 +
2530 pe_get16 (dll, pe_header_offset + 4 + 16));
2531 expptr = 0;
2533 for (i = 0; i < nsections; i++)
2535 char sname[8];
2536 unsigned long secptr1 = secptr + 40 * i;
2537 unsigned long vaddr = pe_get32 (dll, secptr1 + 12);
2538 unsigned long vsize = pe_get32 (dll, secptr1 + 16);
2539 unsigned long fptr = pe_get32 (dll, secptr1 + 20);
2541 bfd_seek (dll, (file_ptr) secptr1, SEEK_SET);
2542 bfd_bread (sname, (bfd_size_type) 8, dll);
2544 if (vaddr <= export_rva && vaddr + vsize > export_rva)
2546 expptr = fptr + (export_rva - vaddr);
2547 if (export_rva + export_size > vaddr + vsize)
2548 export_size = vsize - (export_rva - vaddr);
2549 break;
2553 expdata = (unsigned char *) xmalloc (export_size);
2554 bfd_seek (dll, (file_ptr) expptr, SEEK_SET);
2555 bfd_bread (expdata, (bfd_size_type) export_size, dll);
2556 erva = expdata - export_rva;
2558 if (pe_def_file == 0)
2559 pe_def_file = def_file_empty ();
2561 nexp = pe_as32 (expdata + 24);
2562 name_rvas = pe_as32 (expdata + 32);
2563 ordinals = pe_as32 (expdata + 36);
2564 ordbase = pe_as32 (expdata + 16);
2566 for (i = 0; i < nexp; i++)
2568 unsigned long name_rva = pe_as32 (erva + name_rvas + i * 4);
2569 def_file_import *imp;
2571 imp = def_file_add_import (pe_def_file, erva + name_rva, dll_name,
2572 i, 0);
2575 return true;
2578 /* These are the main functions, called from the emulation. The first
2579 is called after the bfds are read, so we can guess at how much space
2580 we need. The second is called after everything is placed, so we
2581 can put the right values in place. */
2583 void
2584 pe_dll_build_sections (abfd, info)
2585 bfd *abfd;
2586 struct bfd_link_info *info;
2588 pe_dll_id_target (bfd_get_target (abfd));
2589 process_def_file (abfd, info);
2591 generate_edata (abfd, info);
2592 build_filler_bfd (1);
2595 void
2596 pe_exe_build_sections (abfd, info)
2597 bfd *abfd;
2598 struct bfd_link_info *info ATTRIBUTE_UNUSED;
2600 pe_dll_id_target (bfd_get_target (abfd));
2601 build_filler_bfd (0);
2604 void
2605 pe_dll_fill_sections (abfd, info)
2606 bfd *abfd;
2607 struct bfd_link_info *info;
2609 pe_dll_id_target (bfd_get_target (abfd));
2610 image_base = pe_data (abfd)->pe_opthdr.ImageBase;
2612 generate_reloc (abfd, info);
2613 if (reloc_sz > 0)
2615 bfd_set_section_size (filler_bfd, reloc_s, reloc_sz);
2617 /* Resize the sections. */
2618 lang_size_sections (stat_ptr->head, abs_output_section,
2619 &stat_ptr->head, 0, (bfd_vma) 0, NULL);
2621 /* Redo special stuff. */
2622 ldemul_after_allocation ();
2624 /* Do the assignments again. */
2625 lang_do_assignments (stat_ptr->head,
2626 abs_output_section,
2627 (fill_type *) 0, (bfd_vma) 0);
2630 fill_edata (abfd, info);
2632 pe_data (abfd)->dll = 1;
2634 edata_s->contents = edata_d;
2635 reloc_s->contents = reloc_d;
2638 void
2639 pe_exe_fill_sections (abfd, info)
2640 bfd *abfd;
2641 struct bfd_link_info *info;
2643 pe_dll_id_target (bfd_get_target (abfd));
2644 image_base = pe_data (abfd)->pe_opthdr.ImageBase;
2646 generate_reloc (abfd, info);
2647 if (reloc_sz > 0)
2649 bfd_set_section_size (filler_bfd, reloc_s, reloc_sz);
2651 /* Resize the sections. */
2652 lang_size_sections (stat_ptr->head, abs_output_section,
2653 &stat_ptr->head, 0, (bfd_vma) 0, NULL);
2655 /* Redo special stuff. */
2656 ldemul_after_allocation ();
2658 /* Do the assignments again. */
2659 lang_do_assignments (stat_ptr->head,
2660 abs_output_section,
2661 (fill_type *) 0, (bfd_vma) 0);
2663 reloc_s->contents = reloc_d;