gas:
[binutils/dougsmingw.git] / ld / pe-dll.c
blobf615b2d2bfccc209346fefbcef8d20e9f2856516
1 /* Routines to help build PEI-format DLLs (Win32 etc)
2 Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
3 2008, 2009 Free Software Foundation, Inc.
4 Written by DJ Delorie <dj@cygnus.com>
6 This file is part of the GNU Binutils.
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
21 MA 02110-1301, USA. */
23 #include "sysdep.h"
24 #include "bfd.h"
25 #include "bfdlink.h"
26 #include "libiberty.h"
27 #include "safe-ctype.h"
29 #include <time.h>
31 #include "ld.h"
32 #include "ldexp.h"
33 #include "ldlang.h"
34 #include "ldwrite.h"
35 #include "ldmisc.h"
36 #include <ldgram.h>
37 #include "ldmain.h"
38 #include "ldfile.h"
39 #include "ldemul.h"
40 #include "coff/internal.h"
41 #include "../bfd/libcoff.h"
42 #include "deffile.h"
44 #ifdef pe_use_x86_64
46 #define PE_IDATA4_SIZE 8
47 #define PE_IDATA5_SIZE 8
48 #include "pep-dll.h"
49 #undef AOUTSZ
50 #define AOUTSZ PEPAOUTSZ
51 #define PEAOUTHDR PEPAOUTHDR
53 #else
55 #include "pe-dll.h"
57 #endif
59 #ifndef PE_IDATA4_SIZE
60 #define PE_IDATA4_SIZE 4
61 #endif
63 #ifndef PE_IDATA5_SIZE
64 #define PE_IDATA5_SIZE 4
65 #endif
67 /* This file turns a regular Windows PE image into a DLL. Because of
68 the complexity of this operation, it has been broken down into a
69 number of separate modules which are all called by the main function
70 at the end of this file. This function is not re-entrant and is
71 normally only called once, so static variables are used to reduce
72 the number of parameters and return values required.
74 See also: ld/emultempl/pe.em and ld/emultempl/pep.em. */
76 /* Auto-import feature by Paul Sokolovsky
78 Quick facts:
80 1. With this feature on, DLL clients can import variables from DLL
81 without any concern from their side (for example, without any source
82 code modifications).
84 2. This is done completely in bounds of the PE specification (to be fair,
85 there's a place where it pokes nose out of, but in practice it works).
86 So, resulting module can be used with any other PE compiler/linker.
88 3. Auto-import is fully compatible with standard import method and they
89 can be mixed together.
91 4. Overheads: space: 8 bytes per imported symbol, plus 20 for each
92 reference to it; load time: negligible; virtual/physical memory: should be
93 less than effect of DLL relocation, and I sincerely hope it doesn't affect
94 DLL sharability (too much).
96 Idea
98 The obvious and only way to get rid of dllimport insanity is to make client
99 access variable directly in the DLL, bypassing extra dereference. I.e.,
100 whenever client contains something like
102 mov dll_var,%eax,
104 address of dll_var in the command should be relocated to point into loaded
105 DLL. The aim is to make OS loader do so, and than make ld help with that.
106 Import section of PE made following way: there's a vector of structures
107 each describing imports from particular DLL. Each such structure points
108 to two other parallel vectors: one holding imported names, and one which
109 will hold address of corresponding imported name. So, the solution is
110 de-vectorize these structures, making import locations be sparse and
111 pointing directly into code. Before continuing, it is worth a note that,
112 while authors strives to make PE act ELF-like, there're some other people
113 make ELF act PE-like: elfvector, ;-) .
115 Implementation
117 For each reference of data symbol to be imported from DLL (to set of which
118 belong symbols with name <sym>, if __imp_<sym> is found in implib), the
119 import fixup entry is generated. That entry is of type
120 IMAGE_IMPORT_DESCRIPTOR and stored in .idata$2 subsection. Each
121 fixup entry contains pointer to symbol's address within .text section
122 (marked with __fuN_<sym> symbol, where N is integer), pointer to DLL name
123 (so, DLL name is referenced by multiple entries), and pointer to symbol
124 name thunk. Symbol name thunk is singleton vector (__nm_th_<symbol>)
125 pointing to IMAGE_IMPORT_BY_NAME structure (__nm_<symbol>) directly
126 containing imported name. Here comes that "on the edge" problem mentioned
127 above: PE specification rambles that name vector (OriginalFirstThunk)
128 should run in parallel with addresses vector (FirstThunk), i.e. that they
129 should have same number of elements and terminated with zero. We violate
130 this, since FirstThunk points directly into machine code. But in practice,
131 OS loader implemented the sane way: it goes thru OriginalFirstThunk and
132 puts addresses to FirstThunk, not something else. It once again should be
133 noted that dll and symbol name structures are reused across fixup entries
134 and should be there anyway to support standard import stuff, so sustained
135 overhead is 20 bytes per reference. Other question is whether having several
136 IMAGE_IMPORT_DESCRIPTORS for the same DLL is possible. Answer is yes, it is
137 done even by native compiler/linker (libth32's functions are in fact reside
138 in windows9x kernel32.dll, so if you use it, you have two
139 IMAGE_IMPORT_DESCRIPTORS for kernel32.dll). Yet other question is whether
140 referencing the same PE structures several times is valid. The answer is why
141 not, prohibiting that (detecting violation) would require more work on
142 behalf of loader than not doing it.
144 See also: ld/emultempl/pe.em and ld/emultempl/pep.em. */
146 static void add_bfd_to_link (bfd *, const char *, struct bfd_link_info *);
148 /* For emultempl/pe.em. */
150 def_file * pe_def_file = 0;
151 int pe_dll_export_everything = 0;
152 int pe_dll_do_default_excludes = 1;
153 int pe_dll_kill_ats = 0;
154 int pe_dll_stdcall_aliases = 0;
155 int pe_dll_warn_dup_exports = 0;
156 int pe_dll_compat_implib = 0;
157 int pe_dll_extra_pe_debug = 0;
158 int pe_use_nul_prefixed_import_tables = 0;
159 int pe_use_coff_long_section_names = -1;
161 /* Static variables and types. */
163 static bfd_vma image_base;
164 static bfd *filler_bfd;
165 static struct bfd_section *edata_s, *reloc_s;
166 static unsigned char *edata_d, *reloc_d;
167 static size_t edata_sz, reloc_sz;
168 static int runtime_pseudo_relocs_created = 0;
169 static int runtime_pseudp_reloc_v2_init = 0;
171 typedef struct
173 const char *name;
174 int len;
176 autofilter_entry_type;
178 typedef struct
180 const char *target_name;
181 const char *object_target;
182 unsigned int imagebase_reloc;
183 int pe_arch;
184 int bfd_arch;
185 bfd_boolean underscored;
186 const autofilter_entry_type* autofilter_symbollist;
188 pe_details_type;
190 static const autofilter_entry_type autofilter_symbollist_generic[] =
192 { STRING_COMMA_LEN ("_NULL_IMPORT_DESCRIPTOR") },
193 /* Entry point symbols. */
194 { STRING_COMMA_LEN ("DllMain") },
195 { STRING_COMMA_LEN ("DllMainCRTStartup") },
196 { STRING_COMMA_LEN ("_DllMainCRTStartup") },
197 /* Runtime pseudo-reloc. */
198 { STRING_COMMA_LEN ("_pei386_runtime_relocator") },
199 { STRING_COMMA_LEN ("do_pseudo_reloc") },
200 { NULL, 0 }
203 static const autofilter_entry_type autofilter_symbollist_i386[] =
205 { STRING_COMMA_LEN ("_NULL_IMPORT_DESCRIPTOR") },
206 /* Entry point symbols, and entry hooks. */
207 { STRING_COMMA_LEN ("cygwin_crt0") },
208 #ifdef pe_use_x86_64
209 { STRING_COMMA_LEN ("DllMain") },
210 { STRING_COMMA_LEN ("DllEntryPoint") },
211 { STRING_COMMA_LEN ("DllMainCRTStartup") },
212 { STRING_COMMA_LEN ("_cygwin_dll_entry") },
213 { STRING_COMMA_LEN ("_cygwin_crt0_common") },
214 { STRING_COMMA_LEN ("_cygwin_noncygwin_dll_entry") },
215 #else
216 { STRING_COMMA_LEN ("DllMain@12") },
217 { STRING_COMMA_LEN ("DllEntryPoint@0") },
218 { STRING_COMMA_LEN ("DllMainCRTStartup@12") },
219 { STRING_COMMA_LEN ("_cygwin_dll_entry@12") },
220 { STRING_COMMA_LEN ("_cygwin_crt0_common@8") },
221 { STRING_COMMA_LEN ("_cygwin_noncygwin_dll_entry@12") },
222 { STRING_COMMA_LEN ("cygwin_attach_dll") },
223 #endif
224 { STRING_COMMA_LEN ("cygwin_premain0") },
225 { STRING_COMMA_LEN ("cygwin_premain1") },
226 { STRING_COMMA_LEN ("cygwin_premain2") },
227 { STRING_COMMA_LEN ("cygwin_premain3") },
228 /* Runtime pseudo-reloc. */
229 { STRING_COMMA_LEN ("_pei386_runtime_relocator") },
230 { STRING_COMMA_LEN ("do_pseudo_reloc") },
231 /* Global vars that should not be exported. */
232 { STRING_COMMA_LEN ("impure_ptr") },
233 { STRING_COMMA_LEN ("_impure_ptr") },
234 { STRING_COMMA_LEN ("_fmode") },
235 { STRING_COMMA_LEN ("environ") },
236 { NULL, 0 }
239 #define PE_ARCH_i386 1
240 #define PE_ARCH_sh 2
241 #define PE_ARCH_mips 3
242 #define PE_ARCH_arm 4
243 #define PE_ARCH_arm_epoc 5
244 #define PE_ARCH_arm_wince 6
246 static const pe_details_type pe_detail_list[] =
249 #ifdef pe_use_x86_64
250 "pei-x86-64",
251 "pe-x86-64",
252 3 /* R_IMAGEBASE */,
253 #else
254 "pei-i386",
255 "pe-i386",
256 7 /* R_IMAGEBASE */,
257 #endif
258 PE_ARCH_i386,
259 bfd_arch_i386,
260 TRUE,
261 autofilter_symbollist_i386
264 "pei-shl",
265 "pe-shl",
266 16 /* R_SH_IMAGEBASE */,
267 PE_ARCH_sh,
268 bfd_arch_sh,
269 TRUE,
270 autofilter_symbollist_generic
273 "pei-mips",
274 "pe-mips",
275 34 /* MIPS_R_RVA */,
276 PE_ARCH_mips,
277 bfd_arch_mips,
278 FALSE,
279 autofilter_symbollist_generic
282 "pei-arm-little",
283 "pe-arm-little",
284 11 /* ARM_RVA32 */,
285 PE_ARCH_arm,
286 bfd_arch_arm,
287 TRUE,
288 autofilter_symbollist_generic
291 "epoc-pei-arm-little",
292 "epoc-pe-arm-little",
293 11 /* ARM_RVA32 */,
294 PE_ARCH_arm_epoc,
295 bfd_arch_arm,
296 FALSE,
297 autofilter_symbollist_generic
300 "pei-arm-wince-little",
301 "pe-arm-wince-little",
302 2, /* ARM_RVA32 on Windows CE, see bfd/coff-arm.c. */
303 PE_ARCH_arm_wince,
304 bfd_arch_arm,
305 FALSE,
306 autofilter_symbollist_generic
308 { NULL, NULL, 0, 0, 0, FALSE, NULL }
311 static const pe_details_type *pe_details;
313 /* Do not specify library suffix explicitly, to allow for dllized versions. */
314 static const autofilter_entry_type autofilter_liblist[] =
316 { STRING_COMMA_LEN ("libcegcc") },
317 { STRING_COMMA_LEN ("libcygwin") },
318 { STRING_COMMA_LEN ("libgcc") },
319 { STRING_COMMA_LEN ("libgcc_s") },
320 { STRING_COMMA_LEN ("libstdc++") },
321 { STRING_COMMA_LEN ("libmingw32") },
322 { STRING_COMMA_LEN ("libmingwex") },
323 { STRING_COMMA_LEN ("libg2c") },
324 { STRING_COMMA_LEN ("libsupc++") },
325 { STRING_COMMA_LEN ("libobjc") },
326 { STRING_COMMA_LEN ("libgcj") },
327 { NULL, 0 }
330 /* Regardless of the suffix issue mentioned above, we must ensure that
331 we do not falsely match on a leading substring, such as when libtool
332 builds libstdc++ as a DLL using libsupc++convenience.a as an intermediate.
333 This routine ensures that the leading part of the name matches and that
334 it is followed by only an optional version suffix and a file extension,
335 returning zero if so or -1 if not. */
336 static int libnamencmp (const char *libname, const autofilter_entry_type *afptr)
338 if (strncmp (libname, afptr->name, afptr->len))
339 return -1;
341 libname += afptr->len;
343 /* Be liberal in interpreting what counts as a version suffix; we
344 accept anything that has a dash to separate it from the name and
345 begins with a digit. */
346 if (libname[0] == '-')
348 if (!ISDIGIT (*++libname))
349 return -1;
350 /* Ensure the filename has an extension. */
351 while (*++libname != '.')
352 if (!*libname)
353 return -1;
355 else if (libname[0] != '.')
356 return -1;
358 return 0;
361 static const autofilter_entry_type autofilter_objlist[] =
363 { STRING_COMMA_LEN ("crt0.o") },
364 { STRING_COMMA_LEN ("crt1.o") },
365 { STRING_COMMA_LEN ("crt2.o") },
366 { STRING_COMMA_LEN ("dllcrt1.o") },
367 { STRING_COMMA_LEN ("dllcrt2.o") },
368 { STRING_COMMA_LEN ("gcrt0.o") },
369 { STRING_COMMA_LEN ("gcrt1.o") },
370 { STRING_COMMA_LEN ("gcrt2.o") },
371 { STRING_COMMA_LEN ("crtbegin.o") },
372 { STRING_COMMA_LEN ("crtend.o") },
373 { NULL, 0 }
376 static const autofilter_entry_type autofilter_symbolprefixlist[] =
378 /* _imp_ is treated specially, as it is always underscored. */
379 /* { STRING_COMMA_LEN ("_imp_") }, */
380 /* Don't export some c++ symbols. */
381 { STRING_COMMA_LEN ("__rtti_") },
382 { STRING_COMMA_LEN ("__builtin_") },
383 /* Don't re-export auto-imported symbols. */
384 { STRING_COMMA_LEN ("_nm_") },
385 /* Don't export symbols specifying internal DLL layout. */
386 { STRING_COMMA_LEN ("_head_") },
387 { STRING_COMMA_LEN ("_IMPORT_DESCRIPTOR_") },
388 /* Don't export section labels or artificial symbols
389 (eg ".weak.foo". */
390 { STRING_COMMA_LEN (".") },
391 { NULL, 0 }
394 static const autofilter_entry_type autofilter_symbolsuffixlist[] =
396 { STRING_COMMA_LEN ("_iname") },
397 { STRING_COMMA_LEN ("_NULL_THUNK_DATA") },
398 { NULL, 0 }
401 #define U(str) (pe_details->underscored ? "_" str : str)
403 void
404 pe_dll_id_target (const char *target)
406 int i;
408 for (i = 0; pe_detail_list[i].target_name; i++)
409 if (strcmp (pe_detail_list[i].target_name, target) == 0
410 || strcmp (pe_detail_list[i].object_target, target) == 0)
412 pe_details = pe_detail_list + i;
413 return;
415 einfo (_("%XUnsupported PEI architecture: %s\n"), target);
416 exit (1);
419 /* Helper functions for qsort. Relocs must be sorted so that we can write
420 them out by pages. */
422 typedef struct
424 bfd_vma vma;
425 char type;
426 short extra;
428 reloc_data_type;
430 static int
431 reloc_sort (const void *va, const void *vb)
433 bfd_vma a = ((const reloc_data_type *) va)->vma;
434 bfd_vma b = ((const reloc_data_type *) vb)->vma;
436 return (a > b) ? 1 : ((a < b) ? -1 : 0);
439 static int
440 pe_export_sort (const void *va, const void *vb)
442 const def_file_export *a = va;
443 const def_file_export *b = vb;
445 return strcmp (a->name, b->name);
448 /* Read and process the .DEF file. */
450 /* These correspond to the entries in pe_def_file->exports[]. I use
451 exported_symbol_sections[i] to tag whether or not the symbol was
452 defined, since we can't export symbols we don't have. */
454 static bfd_vma *exported_symbol_offsets;
455 static struct bfd_section **exported_symbol_sections;
456 static int export_table_size;
457 static int count_exported;
458 static int count_exported_byname;
459 static int count_with_ordinals;
460 static const char *dll_name;
461 static int min_ordinal, max_ordinal;
462 static int *exported_symbols;
464 typedef struct exclude_list_struct
466 char *string;
467 struct exclude_list_struct *next;
468 exclude_type type;
470 exclude_list_struct;
472 static struct exclude_list_struct *excludes = 0;
474 void
475 pe_dll_add_excludes (const char *new_excludes, const exclude_type type)
477 char *local_copy;
478 char *exclude_string;
480 local_copy = xstrdup (new_excludes);
482 exclude_string = strtok (local_copy, ",:");
483 for (; exclude_string; exclude_string = strtok (NULL, ",:"))
485 struct exclude_list_struct *new_exclude;
487 new_exclude = xmalloc (sizeof (struct exclude_list_struct));
488 new_exclude->string = xmalloc (strlen (exclude_string) + 1);
489 strcpy (new_exclude->string, exclude_string);
490 new_exclude->type = type;
491 new_exclude->next = excludes;
492 excludes = new_exclude;
495 free (local_copy);
498 static bfd_boolean
499 is_import (const char* n)
501 return (CONST_STRNEQ (n, "__imp_"));
504 /* abfd is a bfd containing n (or NULL)
505 It can be used for contextual checks. */
507 static int
508 auto_export (bfd *abfd, def_file *d, const char *n)
510 int i;
511 struct exclude_list_struct *ex;
512 const autofilter_entry_type *afptr;
513 const char * libname = 0;
514 if (abfd && abfd->my_archive)
515 libname = lbasename (abfd->my_archive->filename);
517 for (i = 0; i < d->num_exports; i++)
518 if (strcmp (d->exports[i].name, n) == 0)
519 return 0;
521 if (pe_dll_do_default_excludes)
523 const char * p;
524 int len;
526 if (pe_dll_extra_pe_debug)
527 printf ("considering exporting: %s, abfd=%p, abfd->my_arc=%p\n",
528 n, abfd, abfd->my_archive);
530 /* First of all, make context checks:
531 Don't export anything from standard libs. */
532 if (libname)
534 afptr = autofilter_liblist;
536 while (afptr->name)
538 if (libnamencmp (libname, afptr) == 0 )
539 return 0;
540 afptr++;
544 /* Next, exclude symbols from certain startup objects. */
546 if (abfd && (p = lbasename (abfd->filename)))
548 afptr = autofilter_objlist;
549 while (afptr->name)
551 if (strcmp (p, afptr->name) == 0)
552 return 0;
553 afptr++;
557 /* Don't try to blindly exclude all symbols
558 that begin with '__'; this was tried and
559 it is too restrictive. Instead we have
560 a target specific list to use: */
561 afptr = pe_details->autofilter_symbollist;
563 while (afptr->name)
565 if (strcmp (n, afptr->name) == 0)
566 return 0;
568 afptr++;
571 /* Next, exclude symbols starting with ... */
572 afptr = autofilter_symbolprefixlist;
573 while (afptr->name)
575 if (strncmp (n, afptr->name, afptr->len) == 0)
576 return 0;
578 afptr++;
581 /* Finally, exclude symbols ending with ... */
582 len = strlen (n);
583 afptr = autofilter_symbolsuffixlist;
584 while (afptr->name)
586 if ((len >= afptr->len)
587 /* Add 1 to insure match with trailing '\0'. */
588 && strncmp (n + len - afptr->len, afptr->name,
589 afptr->len + 1) == 0)
590 return 0;
592 afptr++;
596 for (ex = excludes; ex; ex = ex->next)
598 if (ex->type == EXCLUDELIBS)
600 if (libname
601 && ((strcmp (libname, ex->string) == 0)
602 || (strcasecmp ("ALL", ex->string) == 0)))
603 return 0;
605 else if (ex->type == EXCLUDEFORIMPLIB)
607 if (strcmp (abfd->filename, ex->string) == 0)
608 return 0;
610 else if (strcmp (n, ex->string) == 0)
611 return 0;
614 return 1;
617 static void
618 process_def_file_and_drectve (bfd *abfd ATTRIBUTE_UNUSED, struct bfd_link_info *info)
620 int i, j;
621 struct bfd_link_hash_entry *blhe;
622 bfd *b;
623 struct bfd_section *s;
624 def_file_export *e = 0;
626 if (!pe_def_file)
627 pe_def_file = def_file_empty ();
629 /* First, run around to all the objects looking for the .drectve
630 sections, and push those into the def file too. */
631 for (b = info->input_bfds; b; b = b->link_next)
633 s = bfd_get_section_by_name (b, ".drectve");
634 if (s)
636 long size = s->size;
637 char *buf = xmalloc (size);
639 bfd_get_section_contents (b, s, buf, 0, size);
640 def_file_add_directive (pe_def_file, buf, size);
641 free (buf);
645 /* Process aligned common symbol information from the
646 .drectve sections now; common symbol allocation is
647 done before final link, so it will be too late to
648 process them in process_embedded_commands() called
649 from _bfd_coff_link_input_bfd(). */
650 if (pe_def_file->aligncomms)
652 def_file_aligncomm *ac = pe_def_file->aligncomms;
653 while (ac)
655 struct coff_link_hash_entry *sym_hash;
656 sym_hash = coff_link_hash_lookup (coff_hash_table (info),
657 ac->symbol_name, FALSE, FALSE, FALSE);
658 if (sym_hash && sym_hash->root.type == bfd_link_hash_common
659 && sym_hash->root.u.c.p->alignment_power < (unsigned) ac->alignment)
661 sym_hash->root.u.c.p->alignment_power = (unsigned) ac->alignment;
663 ac = ac->next;
667 /* If we are not building a DLL, when there are no exports
668 we do not build an export table at all. */
669 if (!pe_dll_export_everything && pe_def_file->num_exports == 0
670 && info->executable)
671 return;
673 /* Now, maybe export everything else the default way. */
674 if (pe_dll_export_everything || pe_def_file->num_exports == 0)
676 for (b = info->input_bfds; b; b = b->link_next)
678 asymbol **symbols;
679 int nsyms;
681 if (!bfd_generic_link_read_symbols (b))
683 einfo (_("%B%F: could not read symbols: %E\n"), b);
684 return;
687 symbols = bfd_get_outsymbols (b);
688 nsyms = bfd_get_symcount (b);
690 for (j = 0; j < nsyms; j++)
692 /* We should export symbols which are either global or not
693 anything at all. (.bss data is the latter)
694 We should not export undefined symbols. */
695 bfd_boolean would_export = symbols[j]->section != &bfd_und_section
696 && ((symbols[j]->flags & BSF_GLOBAL)
697 || (symbols[j]->flags == 0));
698 if (lang_elf_version_info && would_export)
700 bfd_boolean hide = 0;
701 char ofs = pe_details->underscored && symbols[j]->name[0] == '_';
702 (void) bfd_find_version_for_sym (lang_elf_version_info,
703 symbols[j]->name + ofs, &hide);
704 would_export = !hide;
706 if (would_export)
708 const char *sn = symbols[j]->name;
710 /* We should not re-export imported stuff. */
712 char *name;
713 if (is_import (sn))
714 continue;
716 name = xmalloc (strlen ("__imp_") + strlen (sn) + 1);
717 sprintf (name, "%s%s", "__imp_", sn);
719 blhe = bfd_link_hash_lookup (info->hash, name,
720 FALSE, FALSE, FALSE);
721 free (name);
723 if (blhe && blhe->type == bfd_link_hash_defined)
724 continue;
727 if (pe_details->underscored && *sn == '_')
728 sn++;
730 if (auto_export (b, pe_def_file, sn))
732 def_file_export *p;
733 p=def_file_add_export (pe_def_file, sn, 0, -1);
734 /* Fill data flag properly, from dlltool.c. */
735 p->flag_data = !(symbols[j]->flags & BSF_FUNCTION);
742 #undef NE
743 #define NE pe_def_file->num_exports
745 /* Don't create an empty export table. */
746 if (NE == 0)
747 return;
749 /* Canonicalize the export list. */
750 if (pe_dll_kill_ats)
752 for (i = 0; i < NE; i++)
754 if (strchr (pe_def_file->exports[i].name, '@'))
756 /* This will preserve internal_name, which may have been
757 pointing to the same memory as name, or might not
758 have. */
759 int lead_at = (*pe_def_file->exports[i].name == '@');
760 char *tmp = xstrdup (pe_def_file->exports[i].name + lead_at);
761 char *tmp_at = strchr (tmp, '@');
763 if (tmp_at)
764 *tmp_at = 0;
765 else
766 einfo (_("%XCannot export %s: invalid export name\n"),
767 pe_def_file->exports[i].name);
768 pe_def_file->exports[i].name = tmp;
773 if (pe_dll_stdcall_aliases)
775 for (i = 0; i < NE; i++)
777 if (is_import (pe_def_file->exports[i].name))
778 continue;
780 if (strchr (pe_def_file->exports[i].name, '@'))
782 int lead_at = (*pe_def_file->exports[i].name == '@');
783 char *tmp = xstrdup (pe_def_file->exports[i].name + lead_at);
785 *(strchr (tmp, '@')) = 0;
786 if (auto_export (NULL, pe_def_file, tmp))
787 def_file_add_export (pe_def_file, tmp,
788 pe_def_file->exports[i].internal_name,
789 -1);
790 else
791 free (tmp);
796 /* Convenience, but watch out for it changing. */
797 e = pe_def_file->exports;
799 exported_symbol_offsets = xmalloc (NE * sizeof (bfd_vma));
800 exported_symbol_sections = xmalloc (NE * sizeof (struct bfd_section *));
802 memset (exported_symbol_sections, 0, NE * sizeof (struct bfd_section *));
803 max_ordinal = 0;
804 min_ordinal = 65536;
805 count_exported = 0;
806 count_exported_byname = 0;
807 count_with_ordinals = 0;
809 qsort (pe_def_file->exports, NE, sizeof (pe_def_file->exports[0]),
810 pe_export_sort);
811 for (i = 0, j = 0; i < NE; i++)
813 if (i > 0 && strcmp (e[i].name, e[i - 1].name) == 0)
815 /* This is a duplicate. */
816 if (e[j - 1].ordinal != -1
817 && e[i].ordinal != -1
818 && e[j - 1].ordinal != e[i].ordinal)
820 if (pe_dll_warn_dup_exports)
821 /* xgettext:c-format */
822 einfo (_("%XError, duplicate EXPORT with ordinals: %s (%d vs %d)\n"),
823 e[j - 1].name, e[j - 1].ordinal, e[i].ordinal);
825 else
827 if (pe_dll_warn_dup_exports)
828 /* xgettext:c-format */
829 einfo (_("Warning, duplicate EXPORT: %s\n"),
830 e[j - 1].name);
833 if (e[i].ordinal != -1)
834 e[j - 1].ordinal = e[i].ordinal;
835 e[j - 1].flag_private |= e[i].flag_private;
836 e[j - 1].flag_constant |= e[i].flag_constant;
837 e[j - 1].flag_noname |= e[i].flag_noname;
838 e[j - 1].flag_data |= e[i].flag_data;
840 else
842 if (i != j)
843 e[j] = e[i];
844 j++;
847 pe_def_file->num_exports = j; /* == NE */
849 for (i = 0; i < NE; i++)
851 char *name;
853 /* Check for forward exports */
854 if (strchr (pe_def_file->exports[i].internal_name, '.'))
856 count_exported++;
857 if (!pe_def_file->exports[i].flag_noname)
858 count_exported_byname++;
860 pe_def_file->exports[i].flag_forward = 1;
862 if (pe_def_file->exports[i].ordinal != -1)
864 if (max_ordinal < pe_def_file->exports[i].ordinal)
865 max_ordinal = pe_def_file->exports[i].ordinal;
866 if (min_ordinal > pe_def_file->exports[i].ordinal)
867 min_ordinal = pe_def_file->exports[i].ordinal;
868 count_with_ordinals++;
871 continue;
874 name = xmalloc (strlen (pe_def_file->exports[i].internal_name) + 2);
875 if (pe_details->underscored
876 && (*pe_def_file->exports[i].internal_name != '@'))
878 *name = '_';
879 strcpy (name + 1, pe_def_file->exports[i].internal_name);
881 else
882 strcpy (name, pe_def_file->exports[i].internal_name);
884 blhe = bfd_link_hash_lookup (info->hash,
885 name,
886 FALSE, FALSE, TRUE);
888 if (blhe
889 && (blhe->type == bfd_link_hash_defined
890 || (blhe->type == bfd_link_hash_common)))
892 count_exported++;
893 if (!pe_def_file->exports[i].flag_noname)
894 count_exported_byname++;
896 /* Only fill in the sections. The actual offsets are computed
897 in fill_exported_offsets() after common symbols are laid
898 out. */
899 if (blhe->type == bfd_link_hash_defined)
900 exported_symbol_sections[i] = blhe->u.def.section;
901 else
902 exported_symbol_sections[i] = blhe->u.c.p->section;
904 if (pe_def_file->exports[i].ordinal != -1)
906 if (max_ordinal < pe_def_file->exports[i].ordinal)
907 max_ordinal = pe_def_file->exports[i].ordinal;
908 if (min_ordinal > pe_def_file->exports[i].ordinal)
909 min_ordinal = pe_def_file->exports[i].ordinal;
910 count_with_ordinals++;
913 else if (blhe && blhe->type == bfd_link_hash_undefined)
915 /* xgettext:c-format */
916 einfo (_("%XCannot export %s: symbol not defined\n"),
917 pe_def_file->exports[i].internal_name);
919 else if (blhe)
921 /* xgettext:c-format */
922 einfo (_("%XCannot export %s: symbol wrong type (%d vs %d)\n"),
923 pe_def_file->exports[i].internal_name,
924 blhe->type, bfd_link_hash_defined);
926 else
928 /* xgettext:c-format */
929 einfo (_("%XCannot export %s: symbol not found\n"),
930 pe_def_file->exports[i].internal_name);
932 free (name);
936 /* Build the bfd that will contain .edata and .reloc sections. */
938 static void
939 build_filler_bfd (int include_edata)
941 lang_input_statement_type *filler_file;
942 filler_file = lang_add_input_file ("dll stuff",
943 lang_input_file_is_fake_enum,
944 NULL);
945 filler_file->the_bfd = filler_bfd = bfd_create ("dll stuff",
946 link_info.output_bfd);
947 if (filler_bfd == NULL
948 || !bfd_set_arch_mach (filler_bfd,
949 bfd_get_arch (link_info.output_bfd),
950 bfd_get_mach (link_info.output_bfd)))
952 einfo ("%X%P: can not create BFD: %E\n");
953 return;
956 if (include_edata)
958 edata_s = bfd_make_section_old_way (filler_bfd, ".edata");
959 if (edata_s == NULL
960 || !bfd_set_section_flags (filler_bfd, edata_s,
961 (SEC_HAS_CONTENTS
962 | SEC_ALLOC
963 | SEC_LOAD
964 | SEC_KEEP
965 | SEC_IN_MEMORY)))
967 einfo ("%X%P: can not create .edata section: %E\n");
968 return;
970 bfd_set_section_size (filler_bfd, edata_s, edata_sz);
973 reloc_s = bfd_make_section_old_way (filler_bfd, ".reloc");
974 if (reloc_s == NULL
975 || !bfd_set_section_flags (filler_bfd, reloc_s,
976 (SEC_HAS_CONTENTS
977 | SEC_ALLOC
978 | SEC_LOAD
979 | SEC_KEEP
980 | SEC_IN_MEMORY)))
982 einfo ("%X%P: can not create .reloc section: %E\n");
983 return;
986 bfd_set_section_size (filler_bfd, reloc_s, 0);
988 ldlang_add_file (filler_file);
991 /* Gather all the exported symbols and build the .edata section. */
993 static void
994 generate_edata (bfd *abfd, struct bfd_link_info *info ATTRIBUTE_UNUSED)
996 int i, next_ordinal;
997 int name_table_size = 0;
998 const char *dlnp;
1000 /* First, we need to know how many exported symbols there are,
1001 and what the range of ordinals is. */
1002 if (pe_def_file->name)
1003 dll_name = pe_def_file->name;
1004 else
1006 dll_name = abfd->filename;
1008 for (dlnp = dll_name; *dlnp; dlnp++)
1009 if (*dlnp == '\\' || *dlnp == '/' || *dlnp == ':')
1010 dll_name = dlnp + 1;
1013 if (count_with_ordinals && max_ordinal > count_exported)
1015 if (min_ordinal > max_ordinal - count_exported + 1)
1016 min_ordinal = max_ordinal - count_exported + 1;
1018 else
1020 min_ordinal = 1;
1021 max_ordinal = count_exported;
1024 export_table_size = max_ordinal - min_ordinal + 1;
1025 exported_symbols = xmalloc (export_table_size * sizeof (int));
1026 for (i = 0; i < export_table_size; i++)
1027 exported_symbols[i] = -1;
1029 /* Now we need to assign ordinals to those that don't have them. */
1030 for (i = 0; i < NE; i++)
1032 if (exported_symbol_sections[i] ||
1033 pe_def_file->exports[i].flag_forward)
1035 if (pe_def_file->exports[i].ordinal != -1)
1037 int ei = pe_def_file->exports[i].ordinal - min_ordinal;
1038 int pi = exported_symbols[ei];
1040 if (pi != -1)
1042 /* xgettext:c-format */
1043 einfo (_("%XError, ordinal used twice: %d (%s vs %s)\n"),
1044 pe_def_file->exports[i].ordinal,
1045 pe_def_file->exports[i].name,
1046 pe_def_file->exports[pi].name);
1048 exported_symbols[ei] = i;
1050 name_table_size += strlen (pe_def_file->exports[i].name) + 1;
1053 /* Reserve space for the forward name. */
1054 if (pe_def_file->exports[i].flag_forward)
1056 name_table_size += strlen (pe_def_file->exports[i].internal_name) + 1;
1060 next_ordinal = min_ordinal;
1061 for (i = 0; i < NE; i++)
1062 if ((exported_symbol_sections[i] ||
1063 pe_def_file->exports[i].flag_forward) &&
1064 pe_def_file->exports[i].ordinal == -1)
1066 while (exported_symbols[next_ordinal - min_ordinal] != -1)
1067 next_ordinal++;
1069 exported_symbols[next_ordinal - min_ordinal] = i;
1070 pe_def_file->exports[i].ordinal = next_ordinal;
1073 /* OK, now we can allocate some memory. */
1074 edata_sz = (40 /* directory */
1075 + 4 * export_table_size /* addresses */
1076 + 4 * count_exported_byname /* name ptrs */
1077 + 2 * count_exported_byname /* ordinals */
1078 + name_table_size + strlen (dll_name) + 1);
1081 /* Fill the exported symbol offsets. The preliminary work has already
1082 been done in process_def_file_and_drectve(). */
1084 static void
1085 fill_exported_offsets (bfd *abfd ATTRIBUTE_UNUSED, struct bfd_link_info *info)
1087 int i;
1088 struct bfd_link_hash_entry *blhe;
1090 for (i = 0; i < pe_def_file->num_exports; i++)
1092 char *name;
1094 name = xmalloc (strlen (pe_def_file->exports[i].internal_name) + 2);
1095 if (pe_details->underscored
1096 && *pe_def_file->exports[i].internal_name != '@')
1098 *name = '_';
1099 strcpy (name + 1, pe_def_file->exports[i].internal_name);
1101 else
1102 strcpy (name, pe_def_file->exports[i].internal_name);
1104 blhe = bfd_link_hash_lookup (info->hash,
1105 name,
1106 FALSE, FALSE, TRUE);
1108 if (blhe && blhe->type == bfd_link_hash_defined)
1109 exported_symbol_offsets[i] = blhe->u.def.value;
1111 free (name);
1115 static void
1116 fill_edata (bfd *abfd, struct bfd_link_info *info ATTRIBUTE_UNUSED)
1118 int s, hint;
1119 unsigned char *edirectory;
1120 unsigned char *eaddresses;
1121 unsigned char *enameptrs;
1122 unsigned char *eordinals;
1123 char *enamestr;
1124 time_t now;
1126 time (&now);
1128 edata_d = xmalloc (edata_sz);
1130 /* Note use of array pointer math here. */
1131 edirectory = edata_d;
1132 eaddresses = edata_d + 40;
1133 enameptrs = eaddresses + 4 * export_table_size;
1134 eordinals = enameptrs + 4 * count_exported_byname;
1135 enamestr = (char *) eordinals + 2 * count_exported_byname;
1137 #define ERVA(ptr) (((unsigned char *)(ptr) - edata_d) \
1138 + edata_s->output_section->vma - image_base)
1140 memset (edata_d, 0, edata_sz);
1141 bfd_put_32 (abfd, now, edata_d + 4);
1142 if (pe_def_file->version_major != -1)
1144 bfd_put_16 (abfd, pe_def_file->version_major, edata_d + 8);
1145 bfd_put_16 (abfd, pe_def_file->version_minor, edata_d + 10);
1148 bfd_put_32 (abfd, ERVA (enamestr), edata_d + 12);
1149 strcpy (enamestr, dll_name);
1150 enamestr += strlen (enamestr) + 1;
1151 bfd_put_32 (abfd, min_ordinal, edata_d + 16);
1152 bfd_put_32 (abfd, export_table_size, edata_d + 20);
1153 bfd_put_32 (abfd, count_exported_byname, edata_d + 24);
1154 bfd_put_32 (abfd, ERVA (eaddresses), edata_d + 28);
1155 bfd_put_32 (abfd, ERVA (enameptrs), edata_d + 32);
1156 bfd_put_32 (abfd, ERVA (eordinals), edata_d + 36);
1158 fill_exported_offsets (abfd, info);
1160 /* Ok, now for the filling in part.
1161 Scan alphabetically - ie the ordering in the exports[] table,
1162 rather than by ordinal - the ordering in the exported_symbol[]
1163 table. See dlltool.c and:
1164 http://sources.redhat.com/ml/binutils/2003-04/msg00379.html
1165 for more information. */
1166 hint = 0;
1167 for (s = 0; s < NE; s++)
1169 struct bfd_section *ssec = exported_symbol_sections[s];
1170 if (pe_def_file->exports[s].ordinal != -1 &&
1171 (pe_def_file->exports[s].flag_forward || ssec != NULL))
1173 int ord = pe_def_file->exports[s].ordinal;
1175 if (pe_def_file->exports[s].flag_forward)
1177 bfd_put_32 (abfd, ERVA (enamestr),
1178 eaddresses + 4 * (ord - min_ordinal));
1180 strcpy (enamestr, pe_def_file->exports[s].internal_name);
1181 enamestr += strlen (pe_def_file->exports[s].internal_name) + 1;
1183 else
1185 bfd_vma srva = (exported_symbol_offsets[s]
1186 + ssec->output_section->vma
1187 + ssec->output_offset);
1189 bfd_put_32 (abfd, srva - image_base,
1190 eaddresses + 4 * (ord - min_ordinal));
1193 if (!pe_def_file->exports[s].flag_noname)
1195 char *ename = pe_def_file->exports[s].name;
1197 bfd_put_32 (abfd, ERVA (enamestr), enameptrs);
1198 enameptrs += 4;
1199 strcpy (enamestr, ename);
1200 enamestr += strlen (enamestr) + 1;
1201 bfd_put_16 (abfd, ord - min_ordinal, eordinals);
1202 eordinals += 2;
1203 pe_def_file->exports[s].hint = hint++;
1210 static struct bfd_section *current_sec;
1212 void
1213 pe_walk_relocs_of_symbol (struct bfd_link_info *info,
1214 const char *name,
1215 int (*cb) (arelent *, asection *))
1217 bfd *b;
1218 asection *s;
1220 for (b = info->input_bfds; b; b = b->link_next)
1222 asymbol **symbols;
1223 int nsyms;
1225 if (!bfd_generic_link_read_symbols (b))
1227 einfo (_("%B%F: could not read symbols: %E\n"), b);
1228 return;
1231 symbols = bfd_get_outsymbols (b);
1232 nsyms = bfd_get_symcount (b);
1234 for (s = b->sections; s; s = s->next)
1236 arelent **relocs;
1237 int relsize, nrelocs, i;
1238 int flags = bfd_get_section_flags (b, s);
1240 /* Skip discarded linkonce sections. */
1241 if (flags & SEC_LINK_ONCE
1242 && s->output_section == bfd_abs_section_ptr)
1243 continue;
1245 current_sec = s;
1247 relsize = bfd_get_reloc_upper_bound (b, s);
1248 relocs = xmalloc (relsize);
1249 nrelocs = bfd_canonicalize_reloc (b, s, relocs, symbols);
1251 for (i = 0; i < nrelocs; i++)
1253 struct bfd_symbol *sym = *relocs[i]->sym_ptr_ptr;
1255 if (!strcmp (name, sym->name))
1256 cb (relocs[i], s);
1259 free (relocs);
1261 /* Warning: the allocated symbols are remembered in BFD and reused
1262 later, so don't free them! */
1263 /* free (symbols); */
1268 /* Gather all the relocations and build the .reloc section. */
1270 static void
1271 generate_reloc (bfd *abfd, struct bfd_link_info *info)
1274 /* For .reloc stuff. */
1275 reloc_data_type *reloc_data;
1276 int total_relocs = 0;
1277 int i;
1278 bfd_vma sec_page = (bfd_vma) -1;
1279 bfd_vma page_ptr, page_count;
1280 int bi;
1281 bfd *b;
1282 struct bfd_section *s;
1284 total_relocs = 0;
1285 for (b = info->input_bfds; b; b = b->link_next)
1286 for (s = b->sections; s; s = s->next)
1287 total_relocs += s->reloc_count;
1289 reloc_data = xmalloc (total_relocs * sizeof (reloc_data_type));
1291 total_relocs = 0;
1292 bi = 0;
1293 for (bi = 0, b = info->input_bfds; b; bi++, b = b->link_next)
1295 arelent **relocs;
1296 int relsize, nrelocs, i;
1298 for (s = b->sections; s; s = s->next)
1300 bfd_vma sec_vma = s->output_section->vma + s->output_offset;
1301 asymbol **symbols;
1302 int nsyms;
1304 /* If it's not loaded, we don't need to relocate it this way. */
1305 if (!(s->output_section->flags & SEC_LOAD))
1306 continue;
1308 /* I don't know why there would be a reloc for these, but I've
1309 seen it happen - DJ */
1310 if (s->output_section == &bfd_abs_section)
1311 continue;
1313 if (s->output_section->vma == 0)
1315 /* Huh? Shouldn't happen, but punt if it does. */
1316 einfo ("DJ: zero vma section reloc detected: `%s' #%d f=%d\n",
1317 s->output_section->name, s->output_section->index,
1318 s->output_section->flags);
1319 continue;
1322 if (!bfd_generic_link_read_symbols (b))
1324 einfo (_("%B%F: could not read symbols: %E\n"), b);
1325 return;
1328 symbols = bfd_get_outsymbols (b);
1329 nsyms = bfd_get_symcount (b);
1330 relsize = bfd_get_reloc_upper_bound (b, s);
1331 relocs = xmalloc (relsize);
1332 nrelocs = bfd_canonicalize_reloc (b, s, relocs, symbols);
1334 for (i = 0; i < nrelocs; i++)
1336 if (pe_dll_extra_pe_debug)
1338 struct bfd_symbol *sym = *relocs[i]->sym_ptr_ptr;
1339 printf ("rel: %s\n", sym->name);
1341 if (!relocs[i]->howto->pc_relative
1342 && relocs[i]->howto->type != pe_details->imagebase_reloc)
1344 bfd_vma sym_vma;
1345 struct bfd_symbol *sym = *relocs[i]->sym_ptr_ptr;
1347 /* Don't create relocs for undefined weak symbols. */
1348 if (sym->flags == BSF_WEAK)
1350 struct bfd_link_hash_entry *blhe
1351 = bfd_link_hash_lookup (info->hash, sym->name,
1352 FALSE, FALSE, FALSE);
1353 if (!blhe || blhe->type != bfd_link_hash_defined)
1354 continue;
1357 sym_vma = (relocs[i]->addend
1358 + sym->value
1359 + sym->section->vma
1360 + sym->section->output_offset
1361 + sym->section->output_section->vma);
1362 reloc_data[total_relocs].vma = sec_vma + relocs[i]->address;
1364 #define BITS_AND_SHIFT(bits, shift) (bits * 1000 | shift)
1366 switch BITS_AND_SHIFT (relocs[i]->howto->bitsize,
1367 relocs[i]->howto->rightshift)
1369 #ifdef pe_use_x86_64
1370 case BITS_AND_SHIFT (64, 0):
1371 reloc_data[total_relocs].type = 10;
1372 total_relocs++;
1373 break;
1374 #endif
1375 case BITS_AND_SHIFT (32, 0):
1376 reloc_data[total_relocs].type = 3;
1377 total_relocs++;
1378 break;
1379 case BITS_AND_SHIFT (16, 0):
1380 reloc_data[total_relocs].type = 2;
1381 total_relocs++;
1382 break;
1383 case BITS_AND_SHIFT (16, 16):
1384 reloc_data[total_relocs].type = 4;
1385 /* FIXME: we can't know the symbol's right value
1386 yet, but we probably can safely assume that
1387 CE will relocate us in 64k blocks, so leaving
1388 it zero is safe. */
1389 reloc_data[total_relocs].extra = 0;
1390 total_relocs++;
1391 break;
1392 case BITS_AND_SHIFT (26, 2):
1393 reloc_data[total_relocs].type = 5;
1394 total_relocs++;
1395 break;
1396 case BITS_AND_SHIFT (24, 2):
1397 /* FIXME: 0 is ARM_26D, it is defined in bfd/coff-arm.c
1398 Those ARM_xxx definitions should go in proper
1399 header someday. */
1400 if (relocs[i]->howto->type == 0
1401 /* Older GNU linkers used 5 instead of 0 for this reloc. */
1402 || relocs[i]->howto->type == 5)
1403 /* This is an ARM_26D reloc, which is an ARM_26 reloc
1404 that has already been fully processed during a
1405 previous link stage, so ignore it here. */
1406 break;
1407 /* Fall through. */
1408 default:
1409 /* xgettext:c-format */
1410 einfo (_("%XError: %d-bit reloc in dll\n"),
1411 relocs[i]->howto->bitsize);
1412 break;
1416 free (relocs);
1417 /* Warning: the allocated symbols are remembered in BFD and
1418 reused later, so don't free them! */
1422 /* At this point, we have total_relocs relocation addresses in
1423 reloc_addresses, which are all suitable for the .reloc section.
1424 We must now create the new sections. */
1425 qsort (reloc_data, total_relocs, sizeof (*reloc_data), reloc_sort);
1427 for (i = 0; i < total_relocs; i++)
1429 bfd_vma this_page = (reloc_data[i].vma >> 12);
1431 if (this_page != sec_page)
1433 reloc_sz = (reloc_sz + 3) & ~3; /* 4-byte align. */
1434 reloc_sz += 8;
1435 sec_page = this_page;
1438 reloc_sz += 2;
1440 if (reloc_data[i].type == 4)
1441 reloc_sz += 2;
1444 reloc_sz = (reloc_sz + 3) & ~3; /* 4-byte align. */
1445 reloc_d = xmalloc (reloc_sz);
1446 sec_page = (bfd_vma) -1;
1447 reloc_sz = 0;
1448 page_ptr = (bfd_vma) -1;
1449 page_count = 0;
1451 for (i = 0; i < total_relocs; i++)
1453 bfd_vma rva = reloc_data[i].vma - image_base;
1454 bfd_vma this_page = (rva & ~0xfff);
1456 if (this_page != sec_page)
1458 while (reloc_sz & 3)
1459 reloc_d[reloc_sz++] = 0;
1461 if (page_ptr != (bfd_vma) -1)
1462 bfd_put_32 (abfd, reloc_sz - page_ptr, reloc_d + page_ptr + 4);
1464 bfd_put_32 (abfd, this_page, reloc_d + reloc_sz);
1465 page_ptr = reloc_sz;
1466 reloc_sz += 8;
1467 sec_page = this_page;
1468 page_count = 0;
1471 bfd_put_16 (abfd, (rva & 0xfff) + (reloc_data[i].type << 12),
1472 reloc_d + reloc_sz);
1473 reloc_sz += 2;
1475 if (reloc_data[i].type == 4)
1477 bfd_put_16 (abfd, reloc_data[i].extra, reloc_d + reloc_sz);
1478 reloc_sz += 2;
1481 page_count++;
1484 while (reloc_sz & 3)
1485 reloc_d[reloc_sz++] = 0;
1487 if (page_ptr != (bfd_vma) -1)
1488 bfd_put_32 (abfd, reloc_sz - page_ptr, reloc_d + page_ptr + 4);
1490 while (reloc_sz < reloc_s->size)
1491 reloc_d[reloc_sz++] = 0;
1494 /* Given the exiting def_file structure, print out a .DEF file that
1495 corresponds to it. */
1497 static void
1498 quoteput (char *s, FILE *f, int needs_quotes)
1500 char *cp;
1502 for (cp = s; *cp; cp++)
1503 if (*cp == '\''
1504 || *cp == '"'
1505 || *cp == '\\'
1506 || ISSPACE (*cp)
1507 || *cp == ','
1508 || *cp == ';')
1509 needs_quotes = 1;
1511 if (needs_quotes)
1513 putc ('"', f);
1515 while (*s)
1517 if (*s == '"' || *s == '\\')
1518 putc ('\\', f);
1520 putc (*s, f);
1521 s++;
1524 putc ('"', f);
1526 else
1527 fputs (s, f);
1530 void
1531 pe_dll_generate_def_file (const char *pe_out_def_filename)
1533 int i;
1534 FILE *out = fopen (pe_out_def_filename, "w");
1536 if (out == NULL)
1537 /* xgettext:c-format */
1538 einfo (_("%s: Can't open output def file %s\n"),
1539 program_name, pe_out_def_filename);
1541 if (pe_def_file)
1543 if (pe_def_file->name)
1545 if (pe_def_file->is_dll)
1546 fprintf (out, "LIBRARY ");
1547 else
1548 fprintf (out, "NAME ");
1550 quoteput (pe_def_file->name, out, 1);
1552 if (pe_data (link_info.output_bfd)->pe_opthdr.ImageBase)
1554 fprintf (out, " BASE=0x");
1555 fprintf_vma (out, ((bfd_vma) pe_data (link_info.output_bfd)->pe_opthdr.ImageBase));
1557 fprintf (out, "\n");
1560 if (pe_def_file->description)
1562 fprintf (out, "DESCRIPTION ");
1563 quoteput (pe_def_file->description, out, 1);
1564 fprintf (out, "\n");
1567 if (pe_def_file->version_minor != -1)
1568 fprintf (out, "VERSION %d.%d\n", pe_def_file->version_major,
1569 pe_def_file->version_minor);
1570 else if (pe_def_file->version_major != -1)
1571 fprintf (out, "VERSION %d\n", pe_def_file->version_major);
1573 if (pe_def_file->stack_reserve != -1 || pe_def_file->heap_reserve != -1)
1574 fprintf (out, "\n");
1576 if (pe_def_file->stack_commit != -1)
1577 fprintf (out, "STACKSIZE 0x%x,0x%x\n",
1578 pe_def_file->stack_reserve, pe_def_file->stack_commit);
1579 else if (pe_def_file->stack_reserve != -1)
1580 fprintf (out, "STACKSIZE 0x%x\n", pe_def_file->stack_reserve);
1582 if (pe_def_file->heap_commit != -1)
1583 fprintf (out, "HEAPSIZE 0x%x,0x%x\n",
1584 pe_def_file->heap_reserve, pe_def_file->heap_commit);
1585 else if (pe_def_file->heap_reserve != -1)
1586 fprintf (out, "HEAPSIZE 0x%x\n", pe_def_file->heap_reserve);
1588 if (pe_def_file->num_section_defs > 0)
1590 fprintf (out, "\nSECTIONS\n\n");
1592 for (i = 0; i < pe_def_file->num_section_defs; i++)
1594 fprintf (out, " ");
1595 quoteput (pe_def_file->section_defs[i].name, out, 0);
1597 if (pe_def_file->section_defs[i].class)
1599 fprintf (out, " CLASS ");
1600 quoteput (pe_def_file->section_defs[i].class, out, 0);
1603 if (pe_def_file->section_defs[i].flag_read)
1604 fprintf (out, " READ");
1606 if (pe_def_file->section_defs[i].flag_write)
1607 fprintf (out, " WRITE");
1609 if (pe_def_file->section_defs[i].flag_execute)
1610 fprintf (out, " EXECUTE");
1612 if (pe_def_file->section_defs[i].flag_shared)
1613 fprintf (out, " SHARED");
1615 fprintf (out, "\n");
1619 if (pe_def_file->num_exports > 0)
1621 fprintf (out, "EXPORTS\n");
1623 for (i = 0; i < pe_def_file->num_exports; i++)
1625 def_file_export *e = pe_def_file->exports + i;
1626 fprintf (out, " ");
1627 quoteput (e->name, out, 0);
1629 if (e->internal_name && strcmp (e->internal_name, e->name))
1631 fprintf (out, " = ");
1632 quoteput (e->internal_name, out, 0);
1635 if (e->ordinal != -1)
1636 fprintf (out, " @%d", e->ordinal);
1638 if (e->flag_private)
1639 fprintf (out, " PRIVATE");
1641 if (e->flag_constant)
1642 fprintf (out, " CONSTANT");
1644 if (e->flag_noname)
1645 fprintf (out, " NONAME");
1647 if (e->flag_data)
1648 fprintf (out, " DATA");
1650 fprintf (out, "\n");
1654 if (pe_def_file->num_imports > 0)
1656 fprintf (out, "\nIMPORTS\n\n");
1658 for (i = 0; i < pe_def_file->num_imports; i++)
1660 def_file_import *im = pe_def_file->imports + i;
1661 fprintf (out, " ");
1663 if (im->internal_name
1664 && (!im->name || strcmp (im->internal_name, im->name)))
1666 quoteput (im->internal_name, out, 0);
1667 fprintf (out, " = ");
1670 quoteput (im->module->name, out, 0);
1671 fprintf (out, ".");
1673 if (im->name)
1674 quoteput (im->name, out, 0);
1675 else
1676 fprintf (out, "%d", im->ordinal);
1678 fprintf (out, "\n");
1682 else
1683 fprintf (out, _("; no contents available\n"));
1685 if (fclose (out) == EOF)
1686 /* xgettext:c-format */
1687 einfo (_("%P: Error closing file `%s'\n"), pe_out_def_filename);
1690 /* Generate the import library. */
1692 static asymbol **symtab;
1693 static int symptr;
1694 static int tmp_seq;
1695 static int tmp_seq2;
1696 static const char *dll_filename;
1697 static char *dll_symname;
1699 #define UNDSEC (asection *) &bfd_und_section
1701 static asection *
1702 quick_section (bfd *abfd, const char *name, int flags, int align)
1704 asection *sec;
1705 asymbol *sym;
1707 sec = bfd_make_section_old_way (abfd, name);
1708 bfd_set_section_flags (abfd, sec, flags | SEC_ALLOC | SEC_LOAD | SEC_KEEP);
1709 bfd_set_section_alignment (abfd, sec, align);
1710 /* Remember to undo this before trying to link internally! */
1711 sec->output_section = sec;
1713 sym = bfd_make_empty_symbol (abfd);
1714 symtab[symptr++] = sym;
1715 sym->name = sec->name;
1716 sym->section = sec;
1717 sym->flags = BSF_LOCAL;
1718 sym->value = 0;
1720 return sec;
1723 static void
1724 quick_symbol (bfd *abfd,
1725 const char *n1,
1726 const char *n2,
1727 const char *n3,
1728 asection *sec,
1729 int flags,
1730 int addr)
1732 asymbol *sym;
1733 char *name = xmalloc (strlen (n1) + strlen (n2) + strlen (n3) + 1);
1735 strcpy (name, n1);
1736 strcat (name, n2);
1737 strcat (name, n3);
1738 sym = bfd_make_empty_symbol (abfd);
1739 sym->name = name;
1740 sym->section = sec;
1741 sym->flags = flags;
1742 sym->value = addr;
1743 symtab[symptr++] = sym;
1746 static arelent *reltab = 0;
1747 static int relcount = 0, relsize = 0;
1749 static void
1750 quick_reloc (bfd *abfd, bfd_size_type address, int which_howto, int symidx)
1752 if (relcount >= relsize - 1)
1754 relsize += 10;
1755 if (reltab)
1756 reltab = xrealloc (reltab, relsize * sizeof (arelent));
1757 else
1758 reltab = xmalloc (relsize * sizeof (arelent));
1760 reltab[relcount].address = address;
1761 reltab[relcount].addend = 0;
1762 reltab[relcount].howto = bfd_reloc_type_lookup (abfd, which_howto);
1763 reltab[relcount].sym_ptr_ptr = symtab + symidx;
1764 relcount++;
1767 static void
1768 save_relocs (asection *sec)
1770 int i;
1772 sec->relocation = reltab;
1773 sec->reloc_count = relcount;
1774 sec->orelocation = xmalloc ((relcount + 1) * sizeof (arelent *));
1775 for (i = 0; i < relcount; i++)
1776 sec->orelocation[i] = sec->relocation + i;
1777 sec->orelocation[relcount] = 0;
1778 sec->flags |= SEC_RELOC;
1779 reltab = 0;
1780 relcount = relsize = 0;
1783 /* .section .idata$2
1784 .global __head_my_dll
1785 __head_my_dll:
1786 .rva hname
1787 .long 0
1788 .long 0
1789 .rva __my_dll_iname
1790 .rva fthunk
1792 .section .idata$5
1793 .long 0
1794 fthunk:
1796 .section .idata$4
1797 .long 0
1798 hname: */
1800 static bfd *
1801 make_head (bfd *parent)
1803 asection *id2, *id5, *id4;
1804 unsigned char *d2, *d5, *d4;
1805 char *oname;
1806 bfd *abfd;
1808 oname = xmalloc (20);
1809 sprintf (oname, "d%06d.o", tmp_seq);
1810 tmp_seq++;
1812 abfd = bfd_create (oname, parent);
1813 bfd_find_target (pe_details->object_target, abfd);
1814 bfd_make_writable (abfd);
1816 bfd_set_format (abfd, bfd_object);
1817 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
1819 symptr = 0;
1820 symtab = xmalloc (6 * sizeof (asymbol *));
1821 id2 = quick_section (abfd, ".idata$2", 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 quick_symbol (abfd, U ("_head_"), dll_symname, "", id2, BSF_GLOBAL, 0);
1825 quick_symbol (abfd, U (""), dll_symname, "_iname", UNDSEC, BSF_GLOBAL, 0);
1827 /* OK, pay attention here. I got confused myself looking back at
1828 it. We create a four-byte section to mark the beginning of the
1829 list, and we include an offset of 4 in the section, so that the
1830 pointer to the list points to the *end* of this section, which is
1831 the start of the list of sections from other objects. */
1833 bfd_set_section_size (abfd, id2, 20);
1834 d2 = xmalloc (20);
1835 id2->contents = d2;
1836 memset (d2, 0, 20);
1837 if (pe_use_nul_prefixed_import_tables)
1838 d2[0] = d2[16] = PE_IDATA5_SIZE; /* Reloc addend. */
1839 quick_reloc (abfd, 0, BFD_RELOC_RVA, 2);
1840 quick_reloc (abfd, 12, BFD_RELOC_RVA, 4);
1841 quick_reloc (abfd, 16, BFD_RELOC_RVA, 1);
1842 save_relocs (id2);
1844 if (pe_use_nul_prefixed_import_tables)
1845 bfd_set_section_size (abfd, id5, PE_IDATA5_SIZE);
1846 else
1847 bfd_set_section_size (abfd, id5, 0);
1848 d5 = xmalloc (PE_IDATA5_SIZE);
1849 id5->contents = d5;
1850 memset (d5, 0, PE_IDATA5_SIZE);
1851 if (pe_use_nul_prefixed_import_tables)
1852 bfd_set_section_size (abfd, id4, PE_IDATA4_SIZE);
1853 else
1854 bfd_set_section_size (abfd, id4, 0);
1855 d4 = xmalloc (PE_IDATA4_SIZE);
1856 id4->contents = d4;
1857 memset (d4, 0, PE_IDATA4_SIZE);
1859 bfd_set_symtab (abfd, symtab, symptr);
1861 bfd_set_section_contents (abfd, id2, d2, 0, 20);
1862 if (pe_use_nul_prefixed_import_tables)
1864 bfd_set_section_contents (abfd, id5, d5, 0, PE_IDATA5_SIZE);
1865 bfd_set_section_contents (abfd, id4, d4, 0, PE_IDATA4_SIZE);
1867 else
1869 bfd_set_section_contents (abfd, id5, d5, 0, 0);
1870 bfd_set_section_contents (abfd, id4, d4, 0, 0);
1873 bfd_make_readable (abfd);
1874 return abfd;
1877 /* .section .idata$4
1878 .long 0
1879 [.long 0] for PE+
1880 .section .idata$5
1881 .long 0
1882 [.long 0] for PE+
1883 .section idata$7
1884 .global __my_dll_iname
1885 __my_dll_iname:
1886 .asciz "my.dll" */
1888 static bfd *
1889 make_tail (bfd *parent)
1891 asection *id4, *id5, *id7;
1892 unsigned char *d4, *d5, *d7;
1893 int len;
1894 char *oname;
1895 bfd *abfd;
1897 oname = xmalloc (20);
1898 sprintf (oname, "d%06d.o", tmp_seq);
1899 tmp_seq++;
1901 abfd = bfd_create (oname, parent);
1902 bfd_find_target (pe_details->object_target, abfd);
1903 bfd_make_writable (abfd);
1905 bfd_set_format (abfd, bfd_object);
1906 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
1908 symptr = 0;
1909 symtab = xmalloc (5 * sizeof (asymbol *));
1910 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
1911 id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
1912 id7 = quick_section (abfd, ".idata$7", SEC_HAS_CONTENTS, 2);
1913 quick_symbol (abfd, U (""), dll_symname, "_iname", id7, BSF_GLOBAL, 0);
1915 bfd_set_section_size (abfd, id4, PE_IDATA4_SIZE);
1916 d4 = xmalloc (PE_IDATA4_SIZE);
1917 id4->contents = d4;
1918 memset (d4, 0, PE_IDATA4_SIZE);
1920 bfd_set_section_size (abfd, id5, PE_IDATA5_SIZE);
1921 d5 = xmalloc (PE_IDATA5_SIZE);
1922 id5->contents = d5;
1923 memset (d5, 0, PE_IDATA5_SIZE);
1925 len = strlen (dll_filename) + 1;
1926 if (len & 1)
1927 len++;
1928 bfd_set_section_size (abfd, id7, len);
1929 d7 = xmalloc (len);
1930 id7->contents = d7;
1931 strcpy ((char *) d7, dll_filename);
1932 /* If len was odd, the above
1933 strcpy leaves behind an undefined byte. That is harmless,
1934 but we set it to 0 just so the binary dumps are pretty. */
1935 d7[len - 1] = 0;
1937 bfd_set_symtab (abfd, symtab, symptr);
1939 bfd_set_section_contents (abfd, id4, d4, 0, PE_IDATA4_SIZE);
1940 bfd_set_section_contents (abfd, id5, d5, 0, PE_IDATA5_SIZE);
1941 bfd_set_section_contents (abfd, id7, d7, 0, len);
1943 bfd_make_readable (abfd);
1944 return abfd;
1947 /* .text
1948 .global _function
1949 .global ___imp_function
1950 .global __imp__function
1951 _function:
1952 jmp *__imp__function:
1954 .section idata$7
1955 .long __head_my_dll
1957 .section .idata$5
1958 ___imp_function:
1959 __imp__function:
1960 iat?
1961 .section .idata$4
1962 iat?
1963 .section .idata$6
1964 ID<ordinal>:
1965 .short <hint>
1966 .asciz "function" xlate? (add underscore, kill at) */
1968 static const unsigned char jmp_ix86_bytes[] =
1970 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x90, 0x90
1973 /* _function:
1974 mov.l ip+8,r0
1975 mov.l @r0,r0
1976 jmp @r0
1978 .dw __imp_function */
1980 static const unsigned char jmp_sh_bytes[] =
1982 0x01, 0xd0, 0x02, 0x60, 0x2b, 0x40, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00
1985 /* _function:
1986 lui $t0,<high:__imp_function>
1987 lw $t0,<low:__imp_function>
1988 jr $t0
1989 nop */
1991 static const unsigned char jmp_mips_bytes[] =
1993 0x00, 0x00, 0x08, 0x3c, 0x00, 0x00, 0x08, 0x8d,
1994 0x08, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00
1997 static const unsigned char jmp_arm_bytes[] =
1999 0x00, 0xc0, 0x9f, 0xe5, /* ldr ip, [pc] */
2000 0x00, 0xf0, 0x9c, 0xe5, /* ldr pc, [ip] */
2001 0, 0, 0, 0
2005 static bfd *
2006 make_one (def_file_export *exp, bfd *parent, bfd_boolean include_jmp_stub)
2008 asection *tx, *id7, *id5, *id4, *id6;
2009 unsigned char *td = NULL, *d7, *d5, *d4, *d6 = NULL;
2010 int len;
2011 char *oname;
2012 bfd *abfd;
2013 const unsigned char *jmp_bytes = NULL;
2014 int jmp_byte_count = 0;
2016 /* Include the jump stub section only if it is needed. A jump
2017 stub is needed if the symbol being imported <sym> is a function
2018 symbol and there is at least one undefined reference to that
2019 symbol. In other words, if all the import references to <sym> are
2020 explicitly through _declspec(dllimport) then the jump stub is not
2021 needed. */
2022 if (include_jmp_stub)
2024 switch (pe_details->pe_arch)
2026 case PE_ARCH_i386:
2027 jmp_bytes = jmp_ix86_bytes;
2028 jmp_byte_count = sizeof (jmp_ix86_bytes);
2029 break;
2030 case PE_ARCH_sh:
2031 jmp_bytes = jmp_sh_bytes;
2032 jmp_byte_count = sizeof (jmp_sh_bytes);
2033 break;
2034 case PE_ARCH_mips:
2035 jmp_bytes = jmp_mips_bytes;
2036 jmp_byte_count = sizeof (jmp_mips_bytes);
2037 break;
2038 case PE_ARCH_arm:
2039 case PE_ARCH_arm_epoc:
2040 case PE_ARCH_arm_wince:
2041 jmp_bytes = jmp_arm_bytes;
2042 jmp_byte_count = sizeof (jmp_arm_bytes);
2043 break;
2044 default:
2045 abort ();
2049 oname = xmalloc (20);
2050 sprintf (oname, "d%06d.o", tmp_seq);
2051 tmp_seq++;
2053 abfd = bfd_create (oname, parent);
2054 bfd_find_target (pe_details->object_target, abfd);
2055 bfd_make_writable (abfd);
2057 bfd_set_format (abfd, bfd_object);
2058 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2060 symptr = 0;
2061 symtab = xmalloc (11 * sizeof (asymbol *));
2062 tx = quick_section (abfd, ".text", SEC_CODE|SEC_HAS_CONTENTS, 2);
2063 id7 = quick_section (abfd, ".idata$7", SEC_HAS_CONTENTS, 2);
2064 id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
2065 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
2066 id6 = quick_section (abfd, ".idata$6", SEC_HAS_CONTENTS, 2);
2068 if (*exp->internal_name == '@')
2070 quick_symbol (abfd, U ("_head_"), dll_symname, "", UNDSEC,
2071 BSF_GLOBAL, 0);
2072 if (include_jmp_stub)
2073 quick_symbol (abfd, "", exp->internal_name, "", tx, BSF_GLOBAL, 0);
2074 quick_symbol (abfd, "__imp_", exp->internal_name, "", id5,
2075 BSF_GLOBAL, 0);
2076 /* Fastcall applies only to functions,
2077 so no need for auto-import symbol. */
2079 else
2081 quick_symbol (abfd, U ("_head_"), dll_symname, "", UNDSEC,
2082 BSF_GLOBAL, 0);
2083 if (include_jmp_stub)
2084 quick_symbol (abfd, U (""), exp->internal_name, "", tx,
2085 BSF_GLOBAL, 0);
2086 quick_symbol (abfd, "__imp_", U (""), exp->internal_name, id5,
2087 BSF_GLOBAL, 0);
2088 /* Symbol to reference ord/name of imported
2089 data symbol, used to implement auto-import. */
2090 if (exp->flag_data)
2091 quick_symbol (abfd, U ("_nm_"), U (""), exp->internal_name, id6,
2092 BSF_GLOBAL,0);
2094 if (pe_dll_compat_implib)
2095 quick_symbol (abfd, U ("__imp_"), exp->internal_name, "", id5,
2096 BSF_GLOBAL, 0);
2098 if (include_jmp_stub)
2100 bfd_set_section_size (abfd, tx, jmp_byte_count);
2101 td = xmalloc (jmp_byte_count);
2102 tx->contents = td;
2103 memcpy (td, jmp_bytes, jmp_byte_count);
2105 switch (pe_details->pe_arch)
2107 case PE_ARCH_i386:
2108 #ifdef pe_use_x86_64
2109 quick_reloc (abfd, 2, BFD_RELOC_32_PCREL, 2);
2110 #else
2111 quick_reloc (abfd, 2, BFD_RELOC_32, 2);
2112 #endif
2113 break;
2114 case PE_ARCH_sh:
2115 quick_reloc (abfd, 8, BFD_RELOC_32, 2);
2116 break;
2117 case PE_ARCH_mips:
2118 quick_reloc (abfd, 0, BFD_RELOC_HI16_S, 2);
2119 quick_reloc (abfd, 0, BFD_RELOC_LO16, 0); /* MIPS_R_PAIR */
2120 quick_reloc (abfd, 4, BFD_RELOC_LO16, 2);
2121 break;
2122 case PE_ARCH_arm:
2123 case PE_ARCH_arm_epoc:
2124 case PE_ARCH_arm_wince:
2125 quick_reloc (abfd, 8, BFD_RELOC_32, 2);
2126 break;
2127 default:
2128 abort ();
2130 save_relocs (tx);
2132 else
2133 bfd_set_section_size (abfd, tx, 0);
2135 bfd_set_section_size (abfd, id7, 4);
2136 d7 = xmalloc (4);
2137 id7->contents = d7;
2138 memset (d7, 0, 4);
2139 quick_reloc (abfd, 0, BFD_RELOC_RVA, 5);
2140 save_relocs (id7);
2142 bfd_set_section_size (abfd, id5, PE_IDATA5_SIZE);
2143 d5 = xmalloc (PE_IDATA5_SIZE);
2144 id5->contents = d5;
2145 memset (d5, 0, PE_IDATA5_SIZE);
2147 if (exp->flag_noname)
2149 d5[0] = exp->ordinal;
2150 d5[1] = exp->ordinal >> 8;
2151 d5[PE_IDATA5_SIZE - 1] = 0x80;
2153 else
2155 quick_reloc (abfd, 0, BFD_RELOC_RVA, 4);
2156 save_relocs (id5);
2159 bfd_set_section_size (abfd, id4, PE_IDATA4_SIZE);
2160 d4 = xmalloc (PE_IDATA4_SIZE);
2161 id4->contents = d4;
2162 memset (d4, 0, PE_IDATA4_SIZE);
2164 if (exp->flag_noname)
2166 d4[0] = exp->ordinal;
2167 d4[1] = exp->ordinal >> 8;
2168 d4[PE_IDATA4_SIZE - 1] = 0x80;
2170 else
2172 quick_reloc (abfd, 0, BFD_RELOC_RVA, 4);
2173 save_relocs (id4);
2176 if (exp->flag_noname)
2178 len = 0;
2179 bfd_set_section_size (abfd, id6, 0);
2181 else
2183 /* { short, asciz } */
2184 len = 2 + strlen (exp->name) + 1;
2185 if (len & 1)
2186 len++;
2187 bfd_set_section_size (abfd, id6, len);
2188 d6 = xmalloc (len);
2189 id6->contents = d6;
2190 memset (d6, 0, len);
2191 d6[0] = exp->hint & 0xff;
2192 d6[1] = exp->hint >> 8;
2193 strcpy ((char *) d6 + 2, exp->name);
2196 bfd_set_symtab (abfd, symtab, symptr);
2198 if (include_jmp_stub)
2199 bfd_set_section_contents (abfd, tx, td, 0, jmp_byte_count);
2200 bfd_set_section_contents (abfd, id7, d7, 0, 4);
2201 bfd_set_section_contents (abfd, id5, d5, 0, PE_IDATA5_SIZE);
2202 bfd_set_section_contents (abfd, id4, d4, 0, PE_IDATA4_SIZE);
2203 if (!exp->flag_noname)
2204 bfd_set_section_contents (abfd, id6, d6, 0, len);
2206 bfd_make_readable (abfd);
2207 return abfd;
2210 static bfd *
2211 make_singleton_name_imp (const char *import, bfd *parent)
2213 /* Name thunks go to idata$4. */
2214 asection *id5;
2215 unsigned char *d5;
2216 char *oname;
2217 bfd *abfd;
2219 oname = xmalloc (20);
2220 sprintf (oname, "nmimp%06d.o", tmp_seq2);
2221 tmp_seq2++;
2223 abfd = bfd_create (oname, parent);
2224 bfd_find_target (pe_details->object_target, abfd);
2225 bfd_make_writable (abfd);
2227 bfd_set_format (abfd, bfd_object);
2228 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2230 symptr = 0;
2231 symtab = xmalloc (3 * sizeof (asymbol *));
2232 id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
2233 quick_symbol (abfd, U ("_imp_"), import, "", id5, BSF_GLOBAL, 0);
2235 /* We need space for the real thunk and for the null terminator. */
2236 bfd_set_section_size (abfd, id5, PE_IDATA5_SIZE * 2);
2237 d5 = xmalloc (PE_IDATA5_SIZE * 2);
2238 id5->contents = d5;
2239 memset (d5, 0, PE_IDATA5_SIZE * 2);
2240 quick_reloc (abfd, 0, BFD_RELOC_RVA, 2);
2241 save_relocs (id5);
2243 bfd_set_symtab (abfd, symtab, symptr);
2245 bfd_set_section_contents (abfd, id5, d5, 0, PE_IDATA4_SIZE * 2);
2247 bfd_make_readable (abfd);
2248 return abfd;
2251 static bfd *
2252 make_singleton_name_thunk (const char *import, bfd *parent)
2254 /* Name thunks go to idata$4. */
2255 asection *id4;
2256 unsigned char *d4;
2257 char *oname;
2258 bfd *abfd;
2260 oname = xmalloc (20);
2261 sprintf (oname, "nmth%06d.o", tmp_seq);
2262 tmp_seq++;
2264 abfd = bfd_create (oname, parent);
2265 bfd_find_target (pe_details->object_target, abfd);
2266 bfd_make_writable (abfd);
2268 bfd_set_format (abfd, bfd_object);
2269 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2271 symptr = 0;
2272 symtab = xmalloc (3 * sizeof (asymbol *));
2273 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
2274 quick_symbol (abfd, U ("_nm_thnk_"), import, "", id4, BSF_GLOBAL, 0);
2275 quick_symbol (abfd, U ("_nm_"), import, "", UNDSEC, BSF_GLOBAL, 0);
2277 /* We need space for the real thunk and for the null terminator. */
2278 bfd_set_section_size (abfd, id4, PE_IDATA4_SIZE * 2);
2279 d4 = xmalloc (PE_IDATA4_SIZE * 2);
2280 id4->contents = d4;
2281 memset (d4, 0, PE_IDATA4_SIZE * 2);
2282 quick_reloc (abfd, 0, BFD_RELOC_RVA, 2);
2283 save_relocs (id4);
2285 bfd_set_symtab (abfd, symtab, symptr);
2287 bfd_set_section_contents (abfd, id4, d4, 0, PE_IDATA4_SIZE * 2);
2289 bfd_make_readable (abfd);
2290 return abfd;
2293 static char *
2294 make_import_fixup_mark (arelent *rel)
2296 /* We convert reloc to symbol, for later reference. */
2297 static int counter;
2298 static char *fixup_name = NULL;
2299 static size_t buffer_len = 0;
2301 struct bfd_symbol *sym = *rel->sym_ptr_ptr;
2303 bfd *abfd = bfd_asymbol_bfd (sym);
2304 struct bfd_link_hash_entry *bh;
2306 if (!fixup_name)
2308 fixup_name = xmalloc (384);
2309 buffer_len = 384;
2312 if (strlen (sym->name) + 25 > buffer_len)
2313 /* Assume 25 chars for "__fu" + counter + "_". If counter is
2314 bigger than 20 digits long, we've got worse problems than
2315 overflowing this buffer... */
2317 free (fixup_name);
2318 /* New buffer size is length of symbol, plus 25, but
2319 then rounded up to the nearest multiple of 128. */
2320 buffer_len = ((strlen (sym->name) + 25) + 127) & ~127;
2321 fixup_name = xmalloc (buffer_len);
2324 sprintf (fixup_name, "__fu%d_%s", counter++, sym->name);
2326 bh = NULL;
2327 bfd_coff_link_add_one_symbol (&link_info, abfd, fixup_name, BSF_GLOBAL,
2328 current_sec, /* sym->section, */
2329 rel->address, NULL, TRUE, FALSE, &bh);
2331 return fixup_name;
2334 /* .section .idata$2
2335 .rva __nm_thnk_SYM (singleton thunk with name of func)
2336 .long 0
2337 .long 0
2338 .rva __my_dll_iname (name of dll)
2339 .rva __fuNN_SYM (pointer to reference (address) in text) */
2341 static bfd *
2342 make_import_fixup_entry (const char *name,
2343 const char *fixup_name,
2344 const char *dll_symname,
2345 bfd *parent)
2347 asection *id2;
2348 unsigned char *d2;
2349 char *oname;
2350 bfd *abfd;
2352 oname = xmalloc (20);
2353 sprintf (oname, "fu%06d.o", tmp_seq);
2354 tmp_seq++;
2356 abfd = bfd_create (oname, parent);
2357 bfd_find_target (pe_details->object_target, abfd);
2358 bfd_make_writable (abfd);
2360 bfd_set_format (abfd, bfd_object);
2361 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2363 symptr = 0;
2364 symtab = xmalloc (6 * sizeof (asymbol *));
2365 id2 = quick_section (abfd, ".idata$2", SEC_HAS_CONTENTS, 2);
2367 quick_symbol (abfd, U ("_nm_thnk_"), name, "", UNDSEC, BSF_GLOBAL, 0);
2368 quick_symbol (abfd, U (""), dll_symname, "_iname", UNDSEC, BSF_GLOBAL, 0);
2369 /* For relocator v2 we have to use the .idata$5 element and not
2370 fixup_name. */
2371 if (link_info.pei386_runtime_pseudo_reloc == 2)
2372 quick_symbol (abfd, U ("_imp_"), name, "", UNDSEC, BSF_GLOBAL, 0);
2373 else
2374 quick_symbol (abfd, "", fixup_name, "", UNDSEC, BSF_GLOBAL, 0);
2376 bfd_set_section_size (abfd, id2, 20);
2377 d2 = xmalloc (20);
2378 id2->contents = d2;
2379 memset (d2, 0, 20);
2381 quick_reloc (abfd, 0, BFD_RELOC_RVA, 1);
2382 quick_reloc (abfd, 12, BFD_RELOC_RVA, 2);
2383 quick_reloc (abfd, 16, BFD_RELOC_RVA, 3);
2384 save_relocs (id2);
2386 bfd_set_symtab (abfd, symtab, symptr);
2388 bfd_set_section_contents (abfd, id2, d2, 0, 20);
2390 bfd_make_readable (abfd);
2391 return abfd;
2394 /* .section .rdata_runtime_pseudo_reloc
2395 .long addend
2396 .rva __fuNN_SYM (pointer to reference (address) in text) */
2398 static bfd *
2399 make_runtime_pseudo_reloc (const char *name ATTRIBUTE_UNUSED,
2400 const char *fixup_name,
2401 bfd_vma addend ATTRIBUTE_UNUSED,
2402 bfd_vma bitsize,
2403 bfd *parent)
2405 asection *rt_rel;
2406 unsigned char *rt_rel_d;
2407 char *oname;
2408 bfd *abfd;
2409 oname = xmalloc (20);
2410 sprintf (oname, "rtr%06d.o", tmp_seq);
2411 tmp_seq++;
2413 abfd = bfd_create (oname, parent);
2414 bfd_find_target (pe_details->object_target, abfd);
2415 bfd_make_writable (abfd);
2417 bfd_set_format (abfd, bfd_object);
2418 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2420 symptr = 0;
2421 if (link_info.pei386_runtime_pseudo_reloc == 2)
2423 symtab = xmalloc ((runtime_pseudp_reloc_v2_init ? 3 : 6) * sizeof (asymbol *));
2425 else
2427 symtab = xmalloc (2 * sizeof (asymbol *));
2429 rt_rel = quick_section (abfd, ".rdata_runtime_pseudo_reloc",
2430 SEC_HAS_CONTENTS, 2);
2432 quick_symbol (abfd, "", fixup_name, "", UNDSEC, BSF_GLOBAL, 0);
2434 if (link_info.pei386_runtime_pseudo_reloc == 2)
2436 size_t size = 12;
2437 if (! runtime_pseudp_reloc_v2_init)
2439 size += 12;
2440 runtime_pseudp_reloc_v2_init = 1;
2442 quick_symbol (abfd, U ("_imp_"), name, "", UNDSEC, BSF_GLOBAL, 0);
2444 bfd_set_section_size (abfd, rt_rel, size);
2445 rt_rel_d = xmalloc (size);
2446 rt_rel->contents = rt_rel_d;
2447 memset (rt_rel_d, 0, size);
2448 quick_reloc (abfd, size - 8, BFD_RELOC_RVA, 1);
2449 quick_reloc (abfd, size - 12, BFD_RELOC_RVA, 2);
2450 bfd_put_32 (abfd, bitsize, rt_rel_d + (size - 4));
2451 if (size != 12)
2452 bfd_put_32 (abfd, 1, rt_rel_d + 8);
2453 save_relocs (rt_rel);
2455 bfd_set_symtab (abfd, symtab, symptr);
2457 bfd_set_section_contents (abfd, rt_rel, rt_rel_d, 0, size);
2459 else
2461 bfd_set_section_size (abfd, rt_rel, 8);
2462 rt_rel_d = xmalloc (8);
2463 rt_rel->contents = rt_rel_d;
2464 memset (rt_rel_d, 0, 8);
2466 bfd_put_32 (abfd, addend, rt_rel_d);
2467 quick_reloc (abfd, 4, BFD_RELOC_RVA, 1);
2469 save_relocs (rt_rel);
2471 bfd_set_symtab (abfd, symtab, symptr);
2473 bfd_set_section_contents (abfd, rt_rel, rt_rel_d, 0, 8);
2475 bfd_make_readable (abfd);
2476 return abfd;
2479 /* .section .rdata
2480 .rva __pei386_runtime_relocator */
2482 static bfd *
2483 pe_create_runtime_relocator_reference (bfd *parent)
2485 asection *extern_rt_rel;
2486 unsigned char *extern_rt_rel_d;
2487 char *oname;
2488 bfd *abfd;
2490 oname = xmalloc (20);
2491 sprintf (oname, "ertr%06d.o", tmp_seq);
2492 tmp_seq++;
2494 abfd = bfd_create (oname, parent);
2495 bfd_find_target (pe_details->object_target, abfd);
2496 bfd_make_writable (abfd);
2498 bfd_set_format (abfd, bfd_object);
2499 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2501 symptr = 0;
2502 symtab = xmalloc (2 * sizeof (asymbol *));
2503 extern_rt_rel = quick_section (abfd, ".rdata", SEC_HAS_CONTENTS, 2);
2505 quick_symbol (abfd, "", U ("_pei386_runtime_relocator"), "", UNDSEC,
2506 BSF_NO_FLAGS, 0);
2508 bfd_set_section_size (abfd, extern_rt_rel, PE_IDATA5_SIZE);
2509 extern_rt_rel_d = xmalloc (PE_IDATA5_SIZE);
2510 extern_rt_rel->contents = extern_rt_rel_d;
2512 quick_reloc (abfd, 0, BFD_RELOC_RVA, 1);
2513 save_relocs (extern_rt_rel);
2515 bfd_set_symtab (abfd, symtab, symptr);
2517 bfd_set_section_contents (abfd, extern_rt_rel, extern_rt_rel_d, 0, PE_IDATA5_SIZE);
2519 bfd_make_readable (abfd);
2520 return abfd;
2523 void
2524 pe_create_import_fixup (arelent *rel, asection *s, bfd_vma addend)
2526 char buf[300];
2527 struct bfd_symbol *sym = *rel->sym_ptr_ptr;
2528 struct bfd_link_hash_entry *name_thunk_sym;
2529 struct bfd_link_hash_entry *name_imp_sym;
2530 const char *name = sym->name;
2531 char *fixup_name = make_import_fixup_mark (rel);
2532 bfd *b;
2533 int need_import_table = 1;
2535 sprintf (buf, U ("_imp_%s"), name);
2536 name_imp_sym = bfd_link_hash_lookup (link_info.hash, buf, 0, 0, 1);
2538 sprintf (buf, U ("_nm_thnk_%s"), name);
2540 name_thunk_sym = bfd_link_hash_lookup (link_info.hash, buf, 0, 0, 1);
2542 /* For version 2 pseudo relocation we don't need to add an import
2543 if the import symbol is already present. */
2544 if (link_info.pei386_runtime_pseudo_reloc == 2
2545 && name_imp_sym
2546 && name_imp_sym->type == bfd_link_hash_defined)
2547 need_import_table = 0;
2549 if (need_import_table == 1
2550 && (!name_thunk_sym || name_thunk_sym->type != bfd_link_hash_defined))
2552 bfd *b = make_singleton_name_thunk (name, link_info.output_bfd);
2553 add_bfd_to_link (b, b->filename, &link_info);
2555 /* If we ever use autoimport, we have to cast text section writable.
2556 But not for version 2. */
2557 if (link_info.pei386_runtime_pseudo_reloc != 2)
2559 config.text_read_only = FALSE;
2560 link_info.output_bfd->flags &= ~WP_TEXT;
2562 if (link_info.pei386_runtime_pseudo_reloc == 2)
2564 b = make_singleton_name_imp (name, link_info.output_bfd);
2565 add_bfd_to_link (b, b->filename, &link_info);
2569 if ((addend == 0 || link_info.pei386_runtime_pseudo_reloc)
2570 && need_import_table == 1)
2572 extern char * pe_data_import_dll;
2573 char * dll_symname = pe_data_import_dll ? pe_data_import_dll : "unknown";
2575 b = make_import_fixup_entry (name, fixup_name, dll_symname,
2576 link_info.output_bfd);
2577 add_bfd_to_link (b, b->filename, &link_info);
2580 if ((link_info.pei386_runtime_pseudo_reloc != 0 && addend != 0)
2581 || link_info.pei386_runtime_pseudo_reloc == 2)
2583 if (pe_dll_extra_pe_debug)
2584 printf ("creating runtime pseudo-reloc entry for %s (addend=%d)\n",
2585 fixup_name, (int) addend);
2587 b = make_runtime_pseudo_reloc (name, fixup_name, addend, rel->howto->bitsize,
2588 link_info.output_bfd);
2589 add_bfd_to_link (b, b->filename, &link_info);
2591 if (runtime_pseudo_relocs_created == 0)
2593 b = pe_create_runtime_relocator_reference (link_info.output_bfd);
2594 add_bfd_to_link (b, b->filename, &link_info);
2596 runtime_pseudo_relocs_created++;
2598 else if (addend != 0)
2600 einfo (_("%C: variable '%T' can't be auto-imported. Please read the documentation for ld's --enable-auto-import for details.\n"),
2601 s->owner, s, rel->address, sym->name);
2602 einfo ("%X");
2607 void
2608 pe_dll_generate_implib (def_file *def, const char *impfilename, struct bfd_link_info *info)
2610 int i;
2611 bfd *ar_head;
2612 bfd *ar_tail;
2613 bfd *outarch;
2614 bfd *ibfd;
2615 bfd *head = 0;
2617 dll_filename = (def->name) ? def->name : dll_name;
2618 dll_symname = xstrdup (dll_filename);
2619 for (i = 0; dll_symname[i]; i++)
2620 if (!ISALNUM (dll_symname[i]))
2621 dll_symname[i] = '_';
2623 unlink_if_ordinary (impfilename);
2625 outarch = bfd_openw (impfilename, 0);
2627 if (!outarch)
2629 /* xgettext:c-format */
2630 einfo (_("%XCan't open .lib file: %s\n"), impfilename);
2631 return;
2634 /* xgettext:c-format */
2635 info_msg (_("Creating library file: %s\n"), impfilename);
2637 bfd_set_format (outarch, bfd_archive);
2638 outarch->has_armap = 1;
2640 /* Work out a reasonable size of things to put onto one line. */
2641 ar_head = make_head (outarch);
2643 /* Iterate the input BFDs, looking for exclude-modules-for-implib. */
2644 for (ibfd = info->input_bfds; ibfd; ibfd = ibfd->link_next)
2646 /* Iterate the exclude list. */
2647 struct exclude_list_struct *ex;
2648 char found;
2649 for (ex = excludes, found = 0; ex && !found; ex = ex->next)
2651 if (ex->type != EXCLUDEFORIMPLIB)
2652 continue;
2653 found = (strcmp (ex->string, ibfd->filename) == 0);
2655 /* If it matched, we must open a fresh BFD for it (the original
2656 input BFD is still needed for the DLL's final link) and add
2657 it into the archive member chain. */
2658 if (found)
2660 bfd *newbfd = bfd_openr (ibfd->my_archive
2661 ? ibfd->my_archive->filename : ibfd->filename, NULL);
2662 if (!newbfd)
2664 einfo (_("%Xbfd_openr %s: %E\n"), ibfd->filename);
2665 return;
2667 if (ibfd->my_archive)
2669 /* Must now iterate through archive until we find the
2670 required member. A minor shame that we'll open the
2671 archive once per member that we require from it, and
2672 leak those archive bfds rather than reuse them. */
2673 bfd *arbfd = newbfd;
2674 if (!bfd_check_format_matches (arbfd, bfd_archive, NULL))
2676 einfo (_("%X%s(%s): can't find member in non-archive file"),
2677 ibfd->my_archive->filename, ibfd->filename);
2678 return;
2680 newbfd = NULL;
2681 while ((newbfd = bfd_openr_next_archived_file (arbfd, newbfd)) != 0)
2683 if (strcmp (newbfd->filename, ibfd->filename) == 0)
2684 break;
2686 if (!newbfd)
2688 einfo (_("%X%s(%s): can't find member in archive"),
2689 ibfd->my_archive->filename, ibfd->filename);
2690 return;
2693 newbfd->archive_next = head;
2694 head = newbfd;
2698 for (i = 0; i < def->num_exports; i++)
2700 /* The import library doesn't know about the internal name. */
2701 char *internal = def->exports[i].internal_name;
2702 bfd *n;
2704 /* Don't add PRIVATE entries to import lib. */
2705 if (pe_def_file->exports[i].flag_private)
2706 continue;
2707 def->exports[i].internal_name = def->exports[i].name;
2708 n = make_one (def->exports + i, outarch,
2709 ! (def->exports + i)->flag_data);
2710 n->archive_next = head;
2711 head = n;
2712 def->exports[i].internal_name = internal;
2715 ar_tail = make_tail (outarch);
2717 if (ar_head == NULL || ar_tail == NULL)
2718 return;
2720 /* Now stick them all into the archive. */
2721 ar_head->archive_next = head;
2722 ar_tail->archive_next = ar_head;
2723 head = ar_tail;
2725 if (! bfd_set_archive_head (outarch, head))
2726 einfo ("%Xbfd_set_archive_head: %E\n");
2728 if (! bfd_close (outarch))
2729 einfo ("%Xbfd_close %s: %E\n", impfilename);
2731 while (head != NULL)
2733 bfd *n = head->archive_next;
2734 bfd_close (head);
2735 head = n;
2739 static void
2740 add_bfd_to_link (bfd *abfd, const char *name, struct bfd_link_info *link_info)
2742 lang_input_statement_type *fake_file;
2744 fake_file = lang_add_input_file (name,
2745 lang_input_file_is_fake_enum,
2746 NULL);
2747 fake_file->the_bfd = abfd;
2748 ldlang_add_file (fake_file);
2750 if (!bfd_link_add_symbols (abfd, link_info))
2751 einfo ("%Xaddsym %s: %E\n", name);
2754 void
2755 pe_process_import_defs (bfd *output_bfd, struct bfd_link_info *link_info)
2757 def_file_module *module;
2759 pe_dll_id_target (bfd_get_target (output_bfd));
2761 if (!pe_def_file)
2762 return;
2764 for (module = pe_def_file->modules; module; module = module->next)
2766 int i, do_this_dll;
2768 dll_filename = module->name;
2769 dll_symname = xstrdup (module->name);
2770 for (i = 0; dll_symname[i]; i++)
2771 if (!ISALNUM (dll_symname[i]))
2772 dll_symname[i] = '_';
2774 do_this_dll = 0;
2776 for (i = 0; i < pe_def_file->num_imports; i++)
2777 if (pe_def_file->imports[i].module == module)
2779 def_file_export exp;
2780 struct bfd_link_hash_entry *blhe;
2781 int lead_at = (*pe_def_file->imports[i].internal_name == '@');
2782 /* See if we need this import. */
2783 size_t len = strlen (pe_def_file->imports[i].internal_name);
2784 char *name = xmalloc (len + 2 + 6);
2785 bfd_boolean include_jmp_stub = FALSE;
2787 if (lead_at)
2788 sprintf (name, "%s",
2789 pe_def_file->imports[i].internal_name);
2790 else
2791 sprintf (name, "%s%s",U (""),
2792 pe_def_file->imports[i].internal_name);
2794 blhe = bfd_link_hash_lookup (link_info->hash, name,
2795 FALSE, FALSE, FALSE);
2797 /* Include the jump stub for <sym> only if the <sym>
2798 is undefined. */
2799 if (!blhe || (blhe && blhe->type != bfd_link_hash_undefined))
2801 if (lead_at)
2802 sprintf (name, "%s%s", "__imp_",
2803 pe_def_file->imports[i].internal_name);
2804 else
2805 sprintf (name, "%s%s%s", "__imp_", U (""),
2806 pe_def_file->imports[i].internal_name);
2808 blhe = bfd_link_hash_lookup (link_info->hash, name,
2809 FALSE, FALSE, FALSE);
2811 else
2812 include_jmp_stub = TRUE;
2814 free (name);
2816 if (blhe && blhe->type == bfd_link_hash_undefined)
2818 bfd *one;
2819 /* We do. */
2820 if (!do_this_dll)
2822 bfd *ar_head = make_head (output_bfd);
2823 add_bfd_to_link (ar_head, ar_head->filename, link_info);
2824 do_this_dll = 1;
2826 exp.internal_name = pe_def_file->imports[i].internal_name;
2827 exp.name = pe_def_file->imports[i].name;
2828 exp.ordinal = pe_def_file->imports[i].ordinal;
2829 exp.hint = exp.ordinal >= 0 ? exp.ordinal : 0;
2830 exp.flag_private = 0;
2831 exp.flag_constant = 0;
2832 exp.flag_data = pe_def_file->imports[i].data;
2833 exp.flag_noname = exp.name ? 0 : 1;
2834 one = make_one (&exp, output_bfd, (! exp.flag_data) && include_jmp_stub);
2835 add_bfd_to_link (one, one->filename, link_info);
2838 if (do_this_dll)
2840 bfd *ar_tail = make_tail (output_bfd);
2841 add_bfd_to_link (ar_tail, ar_tail->filename, link_info);
2844 free (dll_symname);
2848 /* We were handed a *.DLL file. Parse it and turn it into a set of
2849 IMPORTS directives in the def file. Return TRUE if the file was
2850 handled, FALSE if not. */
2852 static unsigned int
2853 pe_get16 (bfd *abfd, int where)
2855 unsigned char b[2];
2857 bfd_seek (abfd, (file_ptr) where, SEEK_SET);
2858 bfd_bread (b, (bfd_size_type) 2, abfd);
2859 return b[0] + (b[1] << 8);
2862 static unsigned int
2863 pe_get32 (bfd *abfd, int where)
2865 unsigned char b[4];
2867 bfd_seek (abfd, (file_ptr) where, SEEK_SET);
2868 bfd_bread (b, (bfd_size_type) 4, abfd);
2869 return b[0] + (b[1] << 8) + (b[2] << 16) + (b[3] << 24);
2872 static unsigned int
2873 pe_as32 (void *ptr)
2875 unsigned char *b = ptr;
2877 return b[0] + (b[1] << 8) + (b[2] << 16) + (b[3] << 24);
2880 bfd_boolean
2881 pe_implied_import_dll (const char *filename)
2883 bfd *dll;
2884 bfd_vma pe_header_offset, opthdr_ofs, num_entries, i;
2885 bfd_vma export_rva, export_size, nsections, secptr, expptr;
2886 bfd_vma exp_funcbase;
2887 unsigned char *expdata;
2888 char *erva;
2889 bfd_vma name_rvas, ordinals, nexp, ordbase;
2890 const char *dll_name;
2891 /* Initialization with start > end guarantees that is_data
2892 will not be set by mistake, and avoids compiler warning. */
2893 bfd_vma data_start = 1;
2894 bfd_vma data_end = 0;
2895 bfd_vma rdata_start = 1;
2896 bfd_vma rdata_end = 0;
2897 bfd_vma bss_start = 1;
2898 bfd_vma bss_end = 0;
2900 /* No, I can't use bfd here. kernel32.dll puts its export table in
2901 the middle of the .rdata section. */
2902 dll = bfd_openr (filename, pe_details->target_name);
2903 if (!dll)
2905 einfo ("%Xopen %s: %E\n", filename);
2906 return FALSE;
2909 /* PEI dlls seem to be bfd_objects. */
2910 if (!bfd_check_format (dll, bfd_object))
2912 einfo ("%X%s: this doesn't appear to be a DLL\n", filename);
2913 return FALSE;
2916 /* Get pe_header, optional header and numbers of export entries. */
2917 pe_header_offset = pe_get32 (dll, 0x3c);
2918 opthdr_ofs = pe_header_offset + 4 + 20;
2919 #ifdef pe_use_x86_64
2920 num_entries = pe_get32 (dll, opthdr_ofs + 92 + 4 * 4); /* & NumberOfRvaAndSizes. */
2921 #else
2922 num_entries = pe_get32 (dll, opthdr_ofs + 92);
2923 #endif
2925 if (num_entries < 1) /* No exports. */
2926 return FALSE;
2928 #ifdef pe_use_x86_64
2929 export_rva = pe_get32 (dll, opthdr_ofs + 96 + 4 * 4);
2930 export_size = pe_get32 (dll, opthdr_ofs + 100 + 4 * 4);
2931 #else
2932 export_rva = pe_get32 (dll, opthdr_ofs + 96);
2933 export_size = pe_get32 (dll, opthdr_ofs + 100);
2934 #endif
2936 nsections = pe_get16 (dll, pe_header_offset + 4 + 2);
2937 secptr = (pe_header_offset + 4 + 20 +
2938 pe_get16 (dll, pe_header_offset + 4 + 16));
2939 expptr = 0;
2941 /* Get the rva and size of the export section. */
2942 for (i = 0; i < nsections; i++)
2944 char sname[8];
2945 bfd_vma secptr1 = secptr + 40 * i;
2946 bfd_vma vaddr = pe_get32 (dll, secptr1 + 12);
2947 bfd_vma vsize = pe_get32 (dll, secptr1 + 16);
2948 bfd_vma fptr = pe_get32 (dll, secptr1 + 20);
2950 bfd_seek (dll, (file_ptr) secptr1, SEEK_SET);
2951 bfd_bread (sname, (bfd_size_type) 8, dll);
2953 if (vaddr <= export_rva && vaddr + vsize > export_rva)
2955 expptr = fptr + (export_rva - vaddr);
2956 if (export_rva + export_size > vaddr + vsize)
2957 export_size = vsize - (export_rva - vaddr);
2958 break;
2962 /* Scan sections and store the base and size of the
2963 data and bss segments in data/base_start/end. */
2964 for (i = 0; i < nsections; i++)
2966 bfd_vma secptr1 = secptr + 40 * i;
2967 bfd_vma vsize = pe_get32 (dll, secptr1 + 8);
2968 bfd_vma vaddr = pe_get32 (dll, secptr1 + 12);
2969 bfd_vma flags = pe_get32 (dll, secptr1 + 36);
2970 char sec_name[9];
2972 sec_name[8] = '\0';
2973 bfd_seek (dll, (file_ptr) secptr1 + 0, SEEK_SET);
2974 bfd_bread (sec_name, (bfd_size_type) 8, dll);
2976 if (strcmp(sec_name,".data") == 0)
2978 data_start = vaddr;
2979 data_end = vaddr + vsize;
2981 if (pe_dll_extra_pe_debug)
2982 printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n",
2983 __FUNCTION__, sec_name, (unsigned long) vaddr,
2984 (unsigned long) (vaddr + vsize), (unsigned long) flags);
2986 else if (strcmp(sec_name,".rdata") == 0)
2988 rdata_start = vaddr;
2989 rdata_end = vaddr + vsize;
2991 if (pe_dll_extra_pe_debug)
2992 printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n",
2993 __FUNCTION__, sec_name, (unsigned long) vaddr,
2994 (unsigned long) (vaddr + vsize), (unsigned long) flags);
2996 else if (strcmp (sec_name,".bss") == 0)
2998 bss_start = vaddr;
2999 bss_end = vaddr + vsize;
3001 if (pe_dll_extra_pe_debug)
3002 printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n",
3003 __FUNCTION__, sec_name, (unsigned long) vaddr,
3004 (unsigned long) (vaddr + vsize), (unsigned long) flags);
3008 expdata = xmalloc (export_size);
3009 bfd_seek (dll, (file_ptr) expptr, SEEK_SET);
3010 bfd_bread (expdata, (bfd_size_type) export_size, dll);
3011 erva = (char *) expdata - export_rva;
3013 if (pe_def_file == 0)
3014 pe_def_file = def_file_empty ();
3016 nexp = pe_as32 (expdata + 24);
3017 name_rvas = pe_as32 (expdata + 32);
3018 ordinals = pe_as32 (expdata + 36);
3019 ordbase = pe_as32 (expdata + 16);
3020 exp_funcbase = pe_as32 (expdata + 28);
3022 /* Use internal dll name instead of filename
3023 to enable symbolic dll linking. */
3024 dll_name = erva + pe_as32 (expdata + 12);
3026 /* Check to see if the dll has already been added to
3027 the definition list and if so return without error.
3028 This avoids multiple symbol definitions. */
3029 if (def_get_module (pe_def_file, dll_name))
3031 if (pe_dll_extra_pe_debug)
3032 printf ("%s is already loaded\n", dll_name);
3033 return TRUE;
3036 /* Iterate through the list of symbols. */
3037 for (i = 0; i < nexp; i++)
3039 /* Pointer to the names vector. */
3040 bfd_vma name_rva = pe_as32 (erva + name_rvas + i * 4);
3041 def_file_import *imp;
3042 /* Pointer to the function address vector. */
3043 bfd_vma func_rva = pe_as32 (erva + exp_funcbase + i * 4);
3044 int is_data = 0;
3046 /* Skip unwanted symbols, which are
3047 exported in buggy auto-import releases. */
3048 if (! CONST_STRNEQ (erva + name_rva, "_nm_"))
3050 /* is_data is true if the address is in the data, rdata or bss
3051 segment. */
3052 is_data =
3053 (func_rva >= data_start && func_rva < data_end)
3054 || (func_rva >= rdata_start && func_rva < rdata_end)
3055 || (func_rva >= bss_start && func_rva < bss_end);
3057 imp = def_file_add_import (pe_def_file, erva + name_rva,
3058 dll_name, i, 0);
3059 /* Mark symbol type. */
3060 imp->data = is_data;
3062 if (pe_dll_extra_pe_debug)
3063 printf ("%s dll-name: %s sym: %s addr: 0x%lx %s\n",
3064 __FUNCTION__, dll_name, erva + name_rva,
3065 (unsigned long) func_rva, is_data ? "(data)" : "");
3069 return TRUE;
3072 void
3073 pe_output_file_set_long_section_names (bfd *abfd)
3075 if (pe_use_coff_long_section_names < 0)
3076 return;
3077 if (!bfd_coff_set_long_section_names (abfd, pe_use_coff_long_section_names))
3078 einfo (_("%XError: can't use long section names on this arch\n"));
3081 /* These are the main functions, called from the emulation. The first
3082 is called after the bfds are read, so we can guess at how much space
3083 we need. The second is called after everything is placed, so we
3084 can put the right values in place. */
3086 void
3087 pe_dll_build_sections (bfd *abfd, struct bfd_link_info *info)
3089 pe_dll_id_target (bfd_get_target (abfd));
3090 pe_output_file_set_long_section_names (abfd);
3091 process_def_file_and_drectve (abfd, info);
3093 if (pe_def_file->num_exports == 0 && !info->shared)
3094 return;
3096 generate_edata (abfd, info);
3097 build_filler_bfd (1);
3098 pe_output_file_set_long_section_names (filler_bfd);
3101 void
3102 pe_exe_build_sections (bfd *abfd, struct bfd_link_info *info ATTRIBUTE_UNUSED)
3104 pe_dll_id_target (bfd_get_target (abfd));
3105 pe_output_file_set_long_section_names (abfd);
3106 build_filler_bfd (0);
3107 pe_output_file_set_long_section_names (filler_bfd);
3110 void
3111 pe_dll_fill_sections (bfd *abfd, struct bfd_link_info *info)
3113 pe_dll_id_target (bfd_get_target (abfd));
3114 pe_output_file_set_long_section_names (abfd);
3115 image_base = pe_data (abfd)->pe_opthdr.ImageBase;
3117 generate_reloc (abfd, info);
3118 if (reloc_sz > 0)
3120 bfd_set_section_size (filler_bfd, reloc_s, reloc_sz);
3122 /* Resize the sections. */
3123 lang_reset_memory_regions ();
3124 lang_size_sections (NULL, TRUE);
3126 /* Redo special stuff. */
3127 ldemul_after_allocation ();
3129 /* Do the assignments again. */
3130 lang_do_assignments ();
3133 fill_edata (abfd, info);
3135 if (info->shared && !info->pie)
3136 pe_data (abfd)->dll = 1;
3138 edata_s->contents = edata_d;
3139 reloc_s->contents = reloc_d;
3142 void
3143 pe_exe_fill_sections (bfd *abfd, struct bfd_link_info *info)
3145 pe_dll_id_target (bfd_get_target (abfd));
3146 pe_output_file_set_long_section_names (abfd);
3147 image_base = pe_data (abfd)->pe_opthdr.ImageBase;
3149 generate_reloc (abfd, info);
3150 if (reloc_sz > 0)
3152 bfd_set_section_size (filler_bfd, reloc_s, reloc_sz);
3154 /* Resize the sections. */
3155 lang_reset_memory_regions ();
3156 lang_size_sections (NULL, TRUE);
3158 /* Redo special stuff. */
3159 ldemul_after_allocation ();
3161 /* Do the assignments again. */
3162 lang_do_assignments ();
3164 reloc_s->contents = reloc_d;
3167 bfd_boolean
3168 pe_bfd_is_dll (bfd *abfd)
3170 return (bfd_get_format (abfd) == bfd_object
3171 && obj_pe (abfd)
3172 && pe_data (abfd)->dll);