2009-11-15 Kai Tietz <kai.tietz@onevision.com>
[binutils.git] / ld / pe-dll.c
blobbeeb580f20380087e19a5e815741fc3bd98743ee
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_exclude_all_symbols = 0;
153 int pe_dll_do_default_excludes = 1;
154 int pe_dll_kill_ats = 0;
155 int pe_dll_stdcall_aliases = 0;
156 int pe_dll_warn_dup_exports = 0;
157 int pe_dll_compat_implib = 0;
158 int pe_dll_extra_pe_debug = 0;
159 int pe_use_nul_prefixed_import_tables = 0;
160 int pe_use_coff_long_section_names = -1;
162 /* Static variables and types. */
164 static bfd_vma image_base;
165 static bfd *filler_bfd;
166 static struct bfd_section *edata_s, *reloc_s;
167 static unsigned char *edata_d, *reloc_d;
168 static size_t edata_sz, reloc_sz;
169 static int runtime_pseudo_relocs_created = 0;
170 static int runtime_pseudp_reloc_v2_init = 0;
172 typedef struct
174 const char *name;
175 int len;
177 autofilter_entry_type;
179 typedef struct
181 const char *target_name;
182 const char *object_target;
183 unsigned int imagebase_reloc;
184 int pe_arch;
185 int bfd_arch;
186 bfd_boolean underscored;
187 const autofilter_entry_type* autofilter_symbollist;
189 pe_details_type;
191 static const autofilter_entry_type autofilter_symbollist_generic[] =
193 { STRING_COMMA_LEN ("_NULL_IMPORT_DESCRIPTOR") },
194 /* Entry point symbols. */
195 { STRING_COMMA_LEN ("DllMain") },
196 { STRING_COMMA_LEN ("DllMainCRTStartup") },
197 { STRING_COMMA_LEN ("_DllMainCRTStartup") },
198 /* Runtime pseudo-reloc. */
199 { STRING_COMMA_LEN ("_pei386_runtime_relocator") },
200 { STRING_COMMA_LEN ("do_pseudo_reloc") },
201 { NULL, 0 }
204 static const autofilter_entry_type autofilter_symbollist_i386[] =
206 { STRING_COMMA_LEN ("_NULL_IMPORT_DESCRIPTOR") },
207 /* Entry point symbols, and entry hooks. */
208 { STRING_COMMA_LEN ("cygwin_crt0") },
209 #ifdef pe_use_x86_64
210 { STRING_COMMA_LEN ("DllMain") },
211 { STRING_COMMA_LEN ("DllEntryPoint") },
212 { STRING_COMMA_LEN ("DllMainCRTStartup") },
213 { STRING_COMMA_LEN ("_cygwin_dll_entry") },
214 { STRING_COMMA_LEN ("_cygwin_crt0_common") },
215 { STRING_COMMA_LEN ("_cygwin_noncygwin_dll_entry") },
216 #else
217 { STRING_COMMA_LEN ("DllMain@12") },
218 { STRING_COMMA_LEN ("DllEntryPoint@0") },
219 { STRING_COMMA_LEN ("DllMainCRTStartup@12") },
220 { STRING_COMMA_LEN ("_cygwin_dll_entry@12") },
221 { STRING_COMMA_LEN ("_cygwin_crt0_common@8") },
222 { STRING_COMMA_LEN ("_cygwin_noncygwin_dll_entry@12") },
223 { STRING_COMMA_LEN ("cygwin_attach_dll") },
224 #endif
225 { STRING_COMMA_LEN ("cygwin_premain0") },
226 { STRING_COMMA_LEN ("cygwin_premain1") },
227 { STRING_COMMA_LEN ("cygwin_premain2") },
228 { STRING_COMMA_LEN ("cygwin_premain3") },
229 /* Runtime pseudo-reloc. */
230 { STRING_COMMA_LEN ("_pei386_runtime_relocator") },
231 { STRING_COMMA_LEN ("do_pseudo_reloc") },
232 /* Global vars that should not be exported. */
233 { STRING_COMMA_LEN ("impure_ptr") },
234 { STRING_COMMA_LEN ("_impure_ptr") },
235 { STRING_COMMA_LEN ("_fmode") },
236 { STRING_COMMA_LEN ("environ") },
237 { NULL, 0 }
240 #define PE_ARCH_i386 1
241 #define PE_ARCH_sh 2
242 #define PE_ARCH_mips 3
243 #define PE_ARCH_arm 4
244 #define PE_ARCH_arm_epoc 5
245 #define PE_ARCH_arm_wince 6
247 static const pe_details_type pe_detail_list[] =
250 #ifdef pe_use_x86_64
251 "pei-x86-64",
252 "pe-x86-64",
253 3 /* R_IMAGEBASE */,
254 #else
255 "pei-i386",
256 "pe-i386",
257 7 /* R_IMAGEBASE */,
258 #endif
259 PE_ARCH_i386,
260 bfd_arch_i386,
261 TRUE,
262 autofilter_symbollist_i386
265 "pei-shl",
266 "pe-shl",
267 16 /* R_SH_IMAGEBASE */,
268 PE_ARCH_sh,
269 bfd_arch_sh,
270 TRUE,
271 autofilter_symbollist_generic
274 "pei-mips",
275 "pe-mips",
276 34 /* MIPS_R_RVA */,
277 PE_ARCH_mips,
278 bfd_arch_mips,
279 FALSE,
280 autofilter_symbollist_generic
283 "pei-arm-little",
284 "pe-arm-little",
285 11 /* ARM_RVA32 */,
286 PE_ARCH_arm,
287 bfd_arch_arm,
288 TRUE,
289 autofilter_symbollist_generic
292 "epoc-pei-arm-little",
293 "epoc-pe-arm-little",
294 11 /* ARM_RVA32 */,
295 PE_ARCH_arm_epoc,
296 bfd_arch_arm,
297 FALSE,
298 autofilter_symbollist_generic
301 "pei-arm-wince-little",
302 "pe-arm-wince-little",
303 2, /* ARM_RVA32 on Windows CE, see bfd/coff-arm.c. */
304 PE_ARCH_arm_wince,
305 bfd_arch_arm,
306 FALSE,
307 autofilter_symbollist_generic
309 { NULL, NULL, 0, 0, 0, FALSE, NULL }
312 static const pe_details_type *pe_details;
314 /* Do not specify library suffix explicitly, to allow for dllized versions. */
315 static const autofilter_entry_type autofilter_liblist[] =
317 { STRING_COMMA_LEN ("libcegcc") },
318 { STRING_COMMA_LEN ("libcygwin") },
319 { STRING_COMMA_LEN ("libgcc") },
320 { STRING_COMMA_LEN ("libgcc_s") },
321 { STRING_COMMA_LEN ("libstdc++") },
322 { STRING_COMMA_LEN ("libmingw32") },
323 { STRING_COMMA_LEN ("libmingwex") },
324 { STRING_COMMA_LEN ("libg2c") },
325 { STRING_COMMA_LEN ("libsupc++") },
326 { STRING_COMMA_LEN ("libobjc") },
327 { STRING_COMMA_LEN ("libgcj") },
328 { NULL, 0 }
331 /* Regardless of the suffix issue mentioned above, we must ensure that
332 we do not falsely match on a leading substring, such as when libtool
333 builds libstdc++ as a DLL using libsupc++convenience.a as an intermediate.
334 This routine ensures that the leading part of the name matches and that
335 it is followed by only an optional version suffix and a file extension,
336 returning zero if so or -1 if not. */
337 static int libnamencmp (const char *libname, const autofilter_entry_type *afptr)
339 if (strncmp (libname, afptr->name, afptr->len))
340 return -1;
342 libname += afptr->len;
344 /* Be liberal in interpreting what counts as a version suffix; we
345 accept anything that has a dash to separate it from the name and
346 begins with a digit. */
347 if (libname[0] == '-')
349 if (!ISDIGIT (*++libname))
350 return -1;
351 /* Ensure the filename has an extension. */
352 while (*++libname != '.')
353 if (!*libname)
354 return -1;
356 else if (libname[0] != '.')
357 return -1;
359 return 0;
362 static const autofilter_entry_type autofilter_objlist[] =
364 { STRING_COMMA_LEN ("crt0.o") },
365 { STRING_COMMA_LEN ("crt1.o") },
366 { STRING_COMMA_LEN ("crt2.o") },
367 { STRING_COMMA_LEN ("dllcrt1.o") },
368 { STRING_COMMA_LEN ("dllcrt2.o") },
369 { STRING_COMMA_LEN ("gcrt0.o") },
370 { STRING_COMMA_LEN ("gcrt1.o") },
371 { STRING_COMMA_LEN ("gcrt2.o") },
372 { STRING_COMMA_LEN ("crtbegin.o") },
373 { STRING_COMMA_LEN ("crtend.o") },
374 { NULL, 0 }
377 static const autofilter_entry_type autofilter_symbolprefixlist[] =
379 /* _imp_ is treated specially, as it is always underscored. */
380 /* { STRING_COMMA_LEN ("_imp_") }, */
381 /* Don't export some c++ symbols. */
382 { STRING_COMMA_LEN ("__rtti_") },
383 { STRING_COMMA_LEN ("__builtin_") },
384 /* Don't re-export auto-imported symbols. */
385 { STRING_COMMA_LEN ("_nm_") },
386 /* Don't export symbols specifying internal DLL layout. */
387 { STRING_COMMA_LEN ("_head_") },
388 { STRING_COMMA_LEN ("_IMPORT_DESCRIPTOR_") },
389 /* Don't export section labels or artificial symbols
390 (eg ".weak.foo". */
391 { STRING_COMMA_LEN (".") },
392 { NULL, 0 }
395 static const autofilter_entry_type autofilter_symbolsuffixlist[] =
397 { STRING_COMMA_LEN ("_iname") },
398 { STRING_COMMA_LEN ("_NULL_THUNK_DATA") },
399 { NULL, 0 }
402 #define U(str) (pe_details->underscored ? "_" str : str)
404 void
405 pe_dll_id_target (const char *target)
407 int i;
409 for (i = 0; pe_detail_list[i].target_name; i++)
410 if (strcmp (pe_detail_list[i].target_name, target) == 0
411 || strcmp (pe_detail_list[i].object_target, target) == 0)
413 pe_details = pe_detail_list + i;
414 return;
416 einfo (_("%XUnsupported PEI architecture: %s\n"), target);
417 exit (1);
420 /* Helper functions for qsort. Relocs must be sorted so that we can write
421 them out by pages. */
423 typedef struct
425 bfd_vma vma;
426 char type;
427 short extra;
429 reloc_data_type;
431 static int
432 reloc_sort (const void *va, const void *vb)
434 bfd_vma a = ((const reloc_data_type *) va)->vma;
435 bfd_vma b = ((const reloc_data_type *) vb)->vma;
437 return (a > b) ? 1 : ((a < b) ? -1 : 0);
440 static int
441 pe_export_sort (const void *va, const void *vb)
443 const def_file_export *a = va;
444 const def_file_export *b = vb;
445 char *an = a->name;
446 char *bn = b->name;
447 if (a->its_name)
448 an = a->its_name;
449 if (b->its_name)
450 bn = b->its_name;
452 return strcmp (an, bn);
455 /* Read and process the .DEF file. */
457 /* These correspond to the entries in pe_def_file->exports[]. I use
458 exported_symbol_sections[i] to tag whether or not the symbol was
459 defined, since we can't export symbols we don't have. */
461 static bfd_vma *exported_symbol_offsets;
462 static struct bfd_section **exported_symbol_sections;
463 static int export_table_size;
464 static int count_exported;
465 static int count_exported_byname;
466 static int count_with_ordinals;
467 static const char *dll_name;
468 static int min_ordinal, max_ordinal;
469 static int *exported_symbols;
471 typedef struct exclude_list_struct
473 char *string;
474 struct exclude_list_struct *next;
475 exclude_type type;
477 exclude_list_struct;
479 static struct exclude_list_struct *excludes = 0;
481 void
482 pe_dll_add_excludes (const char *new_excludes, const exclude_type type)
484 char *local_copy;
485 char *exclude_string;
487 local_copy = xstrdup (new_excludes);
489 exclude_string = strtok (local_copy, ",:");
490 for (; exclude_string; exclude_string = strtok (NULL, ",:"))
492 struct exclude_list_struct *new_exclude;
494 new_exclude = xmalloc (sizeof (struct exclude_list_struct));
495 new_exclude->string = xmalloc (strlen (exclude_string) + 1);
496 strcpy (new_exclude->string, exclude_string);
497 new_exclude->type = type;
498 new_exclude->next = excludes;
499 excludes = new_exclude;
502 free (local_copy);
505 static bfd_boolean
506 is_import (const char* n)
508 return (CONST_STRNEQ (n, "__imp_"));
511 /* abfd is a bfd containing n (or NULL)
512 It can be used for contextual checks. */
514 static int
515 auto_export (bfd *abfd, def_file *d, const char *n)
517 int i;
518 struct exclude_list_struct *ex;
519 const autofilter_entry_type *afptr;
520 const char * libname = 0;
521 if (abfd && abfd->my_archive)
522 libname = lbasename (abfd->my_archive->filename);
524 for (i = 0; i < d->num_exports; i++)
525 if (strcmp (d->exports[i].name, n) == 0)
526 return 0;
528 if (pe_dll_do_default_excludes)
530 const char * p;
531 int len;
533 if (pe_dll_extra_pe_debug)
534 printf ("considering exporting: %s, abfd=%p, abfd->my_arc=%p\n",
535 n, abfd, abfd->my_archive);
537 /* First of all, make context checks:
538 Don't export anything from standard libs. */
539 if (libname)
541 afptr = autofilter_liblist;
543 while (afptr->name)
545 if (libnamencmp (libname, afptr) == 0 )
546 return 0;
547 afptr++;
551 /* Next, exclude symbols from certain startup objects. */
553 if (abfd && (p = lbasename (abfd->filename)))
555 afptr = autofilter_objlist;
556 while (afptr->name)
558 if (strcmp (p, afptr->name) == 0)
559 return 0;
560 afptr++;
564 /* Don't try to blindly exclude all symbols
565 that begin with '__'; this was tried and
566 it is too restrictive. Instead we have
567 a target specific list to use: */
568 afptr = pe_details->autofilter_symbollist;
570 while (afptr->name)
572 if (strcmp (n, afptr->name) == 0)
573 return 0;
575 afptr++;
578 /* Next, exclude symbols starting with ... */
579 afptr = autofilter_symbolprefixlist;
580 while (afptr->name)
582 if (strncmp (n, afptr->name, afptr->len) == 0)
583 return 0;
585 afptr++;
588 /* Finally, exclude symbols ending with ... */
589 len = strlen (n);
590 afptr = autofilter_symbolsuffixlist;
591 while (afptr->name)
593 if ((len >= afptr->len)
594 /* Add 1 to insure match with trailing '\0'. */
595 && strncmp (n + len - afptr->len, afptr->name,
596 afptr->len + 1) == 0)
597 return 0;
599 afptr++;
603 for (ex = excludes; ex; ex = ex->next)
605 if (ex->type == EXCLUDELIBS)
607 if (libname
608 && ((strcmp (libname, ex->string) == 0)
609 || (strcasecmp ("ALL", ex->string) == 0)))
610 return 0;
612 else if (ex->type == EXCLUDEFORIMPLIB)
614 if (strcmp (abfd->filename, ex->string) == 0)
615 return 0;
617 else if (strcmp (n, ex->string) == 0)
618 return 0;
621 return 1;
624 static void
625 process_def_file_and_drectve (bfd *abfd ATTRIBUTE_UNUSED, struct bfd_link_info *info)
627 int i, j;
628 struct bfd_link_hash_entry *blhe;
629 bfd *b;
630 struct bfd_section *s;
631 def_file_export *e = 0;
633 if (!pe_def_file)
634 pe_def_file = def_file_empty ();
636 /* First, run around to all the objects looking for the .drectve
637 sections, and push those into the def file too. */
638 for (b = info->input_bfds; b; b = b->link_next)
640 s = bfd_get_section_by_name (b, ".drectve");
641 if (s)
643 long size = s->size;
644 char *buf = xmalloc (size);
646 bfd_get_section_contents (b, s, buf, 0, size);
647 def_file_add_directive (pe_def_file, buf, size);
648 free (buf);
652 /* Process aligned common symbol information from the
653 .drectve sections now; common symbol allocation is
654 done before final link, so it will be too late to
655 process them in process_embedded_commands() called
656 from _bfd_coff_link_input_bfd(). */
657 if (pe_def_file->aligncomms)
659 def_file_aligncomm *ac = pe_def_file->aligncomms;
660 while (ac)
662 struct coff_link_hash_entry *sym_hash;
663 sym_hash = coff_link_hash_lookup (coff_hash_table (info),
664 ac->symbol_name, FALSE, FALSE, FALSE);
665 if (sym_hash && sym_hash->root.type == bfd_link_hash_common
666 && sym_hash->root.u.c.p->alignment_power < (unsigned) ac->alignment)
668 sym_hash->root.u.c.p->alignment_power = (unsigned) ac->alignment;
670 ac = ac->next;
674 /* If we are building an executable and there is nothing
675 to export, we do not build an export table at all. */
676 if (info->executable && pe_def_file->num_exports == 0
677 && (!pe_dll_export_everything || pe_dll_exclude_all_symbols))
678 return;
680 /* Now, maybe export everything else the default way. */
681 if ((pe_dll_export_everything || pe_def_file->num_exports == 0)
682 && !pe_dll_exclude_all_symbols)
684 for (b = info->input_bfds; b; b = b->link_next)
686 asymbol **symbols;
687 int nsyms;
689 if (!bfd_generic_link_read_symbols (b))
691 einfo (_("%B%F: could not read symbols: %E\n"), b);
692 return;
695 symbols = bfd_get_outsymbols (b);
696 nsyms = bfd_get_symcount (b);
698 for (j = 0; j < nsyms; j++)
700 /* We should export symbols which are either global or not
701 anything at all. (.bss data is the latter)
702 We should not export undefined symbols. */
703 bfd_boolean would_export = symbols[j]->section != &bfd_und_section
704 && ((symbols[j]->flags & BSF_GLOBAL)
705 || (symbols[j]->flags == 0));
706 if (lang_elf_version_info && would_export)
708 bfd_boolean hide = 0;
709 char ofs = pe_details->underscored && symbols[j]->name[0] == '_';
710 (void) bfd_find_version_for_sym (lang_elf_version_info,
711 symbols[j]->name + ofs, &hide);
712 would_export = !hide;
714 if (would_export)
716 const char *sn = symbols[j]->name;
718 /* We should not re-export imported stuff. */
720 char *name;
721 if (is_import (sn))
722 continue;
724 name = xmalloc (strlen ("__imp_") + strlen (sn) + 1);
725 sprintf (name, "%s%s", "__imp_", sn);
727 blhe = bfd_link_hash_lookup (info->hash, name,
728 FALSE, FALSE, FALSE);
729 free (name);
731 if (blhe && blhe->type == bfd_link_hash_defined)
732 continue;
735 if (pe_details->underscored && *sn == '_')
736 sn++;
738 if (auto_export (b, pe_def_file, sn))
740 def_file_export *p;
741 p=def_file_add_export (pe_def_file, sn, 0, -1, NULL);
742 /* Fill data flag properly, from dlltool.c. */
743 p->flag_data = !(symbols[j]->flags & BSF_FUNCTION);
750 #undef NE
751 #define NE pe_def_file->num_exports
753 /* Don't create an empty export table. */
754 if (NE == 0)
755 return;
757 /* Canonicalize the export list. */
758 if (pe_dll_kill_ats)
760 for (i = 0; i < NE; i++)
762 if (strchr (pe_def_file->exports[i].name, '@'))
764 /* This will preserve internal_name, which may have been
765 pointing to the same memory as name, or might not
766 have. */
767 int lead_at = (*pe_def_file->exports[i].name == '@');
768 char *tmp = xstrdup (pe_def_file->exports[i].name + lead_at);
769 char *tmp_at = strchr (tmp, '@');
771 if (tmp_at)
772 *tmp_at = 0;
773 else
774 einfo (_("%XCannot export %s: invalid export name\n"),
775 pe_def_file->exports[i].name);
776 pe_def_file->exports[i].name = tmp;
781 if (pe_dll_stdcall_aliases)
783 for (i = 0; i < NE; i++)
785 if (is_import (pe_def_file->exports[i].name))
786 continue;
788 if (strchr (pe_def_file->exports[i].name, '@'))
790 int lead_at = (*pe_def_file->exports[i].name == '@');
791 char *tmp = xstrdup (pe_def_file->exports[i].name + lead_at);
793 *(strchr (tmp, '@')) = 0;
794 if (auto_export (NULL, pe_def_file, tmp))
795 def_file_add_export (pe_def_file, tmp,
796 pe_def_file->exports[i].internal_name,
797 -1, NULL);
798 else
799 free (tmp);
804 /* Convenience, but watch out for it changing. */
805 e = pe_def_file->exports;
807 exported_symbol_offsets = xmalloc (NE * sizeof (bfd_vma));
808 exported_symbol_sections = xmalloc (NE * sizeof (struct bfd_section *));
810 memset (exported_symbol_sections, 0, NE * sizeof (struct bfd_section *));
811 max_ordinal = 0;
812 min_ordinal = 65536;
813 count_exported = 0;
814 count_exported_byname = 0;
815 count_with_ordinals = 0;
817 qsort (pe_def_file->exports, NE, sizeof (pe_def_file->exports[0]),
818 pe_export_sort);
819 for (i = 0, j = 0; i < NE; i++)
821 if (i > 0 && strcmp (e[i].name, e[i - 1].name) == 0)
823 /* This is a duplicate. */
824 if (e[j - 1].ordinal != -1
825 && e[i].ordinal != -1
826 && e[j - 1].ordinal != e[i].ordinal)
828 if (pe_dll_warn_dup_exports)
829 /* xgettext:c-format */
830 einfo (_("%XError, duplicate EXPORT with ordinals: %s (%d vs %d)\n"),
831 e[j - 1].name, e[j - 1].ordinal, e[i].ordinal);
833 else
835 if (pe_dll_warn_dup_exports)
836 /* xgettext:c-format */
837 einfo (_("Warning, duplicate EXPORT: %s\n"),
838 e[j - 1].name);
841 if (e[i].ordinal != -1)
842 e[j - 1].ordinal = e[i].ordinal;
843 e[j - 1].flag_private |= e[i].flag_private;
844 e[j - 1].flag_constant |= e[i].flag_constant;
845 e[j - 1].flag_noname |= e[i].flag_noname;
846 e[j - 1].flag_data |= e[i].flag_data;
848 else
850 if (i != j)
851 e[j] = e[i];
852 j++;
855 pe_def_file->num_exports = j; /* == NE */
857 for (i = 0; i < NE; i++)
859 char *name;
861 /* Check for forward exports */
862 if (strchr (pe_def_file->exports[i].internal_name, '.'))
864 count_exported++;
865 if (!pe_def_file->exports[i].flag_noname)
866 count_exported_byname++;
868 pe_def_file->exports[i].flag_forward = 1;
870 if (pe_def_file->exports[i].ordinal != -1)
872 if (max_ordinal < pe_def_file->exports[i].ordinal)
873 max_ordinal = pe_def_file->exports[i].ordinal;
874 if (min_ordinal > pe_def_file->exports[i].ordinal)
875 min_ordinal = pe_def_file->exports[i].ordinal;
876 count_with_ordinals++;
879 continue;
882 name = xmalloc (strlen (pe_def_file->exports[i].internal_name) + 2);
883 if (pe_details->underscored
884 && (*pe_def_file->exports[i].internal_name != '@'))
886 *name = '_';
887 strcpy (name + 1, pe_def_file->exports[i].internal_name);
889 else
890 strcpy (name, pe_def_file->exports[i].internal_name);
892 blhe = bfd_link_hash_lookup (info->hash,
893 name,
894 FALSE, FALSE, TRUE);
896 if (blhe
897 && (blhe->type == bfd_link_hash_defined
898 || (blhe->type == bfd_link_hash_common)))
900 count_exported++;
901 if (!pe_def_file->exports[i].flag_noname)
902 count_exported_byname++;
904 /* Only fill in the sections. The actual offsets are computed
905 in fill_exported_offsets() after common symbols are laid
906 out. */
907 if (blhe->type == bfd_link_hash_defined)
908 exported_symbol_sections[i] = blhe->u.def.section;
909 else
910 exported_symbol_sections[i] = blhe->u.c.p->section;
912 if (pe_def_file->exports[i].ordinal != -1)
914 if (max_ordinal < pe_def_file->exports[i].ordinal)
915 max_ordinal = pe_def_file->exports[i].ordinal;
916 if (min_ordinal > pe_def_file->exports[i].ordinal)
917 min_ordinal = pe_def_file->exports[i].ordinal;
918 count_with_ordinals++;
921 else if (blhe && blhe->type == bfd_link_hash_undefined)
923 /* xgettext:c-format */
924 einfo (_("%XCannot export %s: symbol not defined\n"),
925 pe_def_file->exports[i].internal_name);
927 else if (blhe)
929 /* xgettext:c-format */
930 einfo (_("%XCannot export %s: symbol wrong type (%d vs %d)\n"),
931 pe_def_file->exports[i].internal_name,
932 blhe->type, bfd_link_hash_defined);
934 else
936 /* xgettext:c-format */
937 einfo (_("%XCannot export %s: symbol not found\n"),
938 pe_def_file->exports[i].internal_name);
940 free (name);
944 /* Build the bfd that will contain .edata and .reloc sections. */
946 static void
947 build_filler_bfd (int include_edata)
949 lang_input_statement_type *filler_file;
950 filler_file = lang_add_input_file ("dll stuff",
951 lang_input_file_is_fake_enum,
952 NULL);
953 filler_file->the_bfd = filler_bfd = bfd_create ("dll stuff",
954 link_info.output_bfd);
955 if (filler_bfd == NULL
956 || !bfd_set_arch_mach (filler_bfd,
957 bfd_get_arch (link_info.output_bfd),
958 bfd_get_mach (link_info.output_bfd)))
960 einfo ("%X%P: can not create BFD: %E\n");
961 return;
964 if (include_edata)
966 edata_s = bfd_make_section_old_way (filler_bfd, ".edata");
967 if (edata_s == NULL
968 || !bfd_set_section_flags (filler_bfd, edata_s,
969 (SEC_HAS_CONTENTS
970 | SEC_ALLOC
971 | SEC_LOAD
972 | SEC_KEEP
973 | SEC_IN_MEMORY)))
975 einfo ("%X%P: can not create .edata section: %E\n");
976 return;
978 bfd_set_section_size (filler_bfd, edata_s, edata_sz);
981 reloc_s = bfd_make_section_old_way (filler_bfd, ".reloc");
982 if (reloc_s == NULL
983 || !bfd_set_section_flags (filler_bfd, reloc_s,
984 (SEC_HAS_CONTENTS
985 | SEC_ALLOC
986 | SEC_LOAD
987 | SEC_KEEP
988 | SEC_IN_MEMORY)))
990 einfo ("%X%P: can not create .reloc section: %E\n");
991 return;
994 bfd_set_section_size (filler_bfd, reloc_s, 0);
996 ldlang_add_file (filler_file);
999 /* Gather all the exported symbols and build the .edata section. */
1001 static void
1002 generate_edata (bfd *abfd, struct bfd_link_info *info ATTRIBUTE_UNUSED)
1004 int i, next_ordinal;
1005 int name_table_size = 0;
1006 const char *dlnp;
1008 /* First, we need to know how many exported symbols there are,
1009 and what the range of ordinals is. */
1010 if (pe_def_file->name)
1011 dll_name = pe_def_file->name;
1012 else
1014 dll_name = abfd->filename;
1016 for (dlnp = dll_name; *dlnp; dlnp++)
1017 if (*dlnp == '\\' || *dlnp == '/' || *dlnp == ':')
1018 dll_name = dlnp + 1;
1021 if (count_with_ordinals && max_ordinal > count_exported)
1023 if (min_ordinal > max_ordinal - count_exported + 1)
1024 min_ordinal = max_ordinal - count_exported + 1;
1026 else
1028 min_ordinal = 1;
1029 max_ordinal = count_exported;
1032 export_table_size = max_ordinal - min_ordinal + 1;
1033 exported_symbols = xmalloc (export_table_size * sizeof (int));
1034 for (i = 0; i < export_table_size; i++)
1035 exported_symbols[i] = -1;
1037 /* Now we need to assign ordinals to those that don't have them. */
1038 for (i = 0; i < NE; i++)
1040 if (exported_symbol_sections[i] ||
1041 pe_def_file->exports[i].flag_forward)
1043 if (pe_def_file->exports[i].ordinal != -1)
1045 int ei = pe_def_file->exports[i].ordinal - min_ordinal;
1046 int pi = exported_symbols[ei];
1048 if (pi != -1)
1050 /* xgettext:c-format */
1051 einfo (_("%XError, ordinal used twice: %d (%s vs %s)\n"),
1052 pe_def_file->exports[i].ordinal,
1053 pe_def_file->exports[i].name,
1054 pe_def_file->exports[pi].name);
1056 exported_symbols[ei] = i;
1058 if (pe_def_file->exports[i].its_name)
1059 name_table_size += strlen (pe_def_file->exports[i].its_name) + 1;
1060 else
1061 name_table_size += strlen (pe_def_file->exports[i].name) + 1;
1064 /* Reserve space for the forward name. */
1065 if (pe_def_file->exports[i].flag_forward)
1067 name_table_size += strlen (pe_def_file->exports[i].internal_name) + 1;
1071 next_ordinal = min_ordinal;
1072 for (i = 0; i < NE; i++)
1073 if ((exported_symbol_sections[i] ||
1074 pe_def_file->exports[i].flag_forward) &&
1075 pe_def_file->exports[i].ordinal == -1)
1077 while (exported_symbols[next_ordinal - min_ordinal] != -1)
1078 next_ordinal++;
1080 exported_symbols[next_ordinal - min_ordinal] = i;
1081 pe_def_file->exports[i].ordinal = next_ordinal;
1084 /* OK, now we can allocate some memory. */
1085 edata_sz = (40 /* directory */
1086 + 4 * export_table_size /* addresses */
1087 + 4 * count_exported_byname /* name ptrs */
1088 + 2 * count_exported_byname /* ordinals */
1089 + name_table_size + strlen (dll_name) + 1);
1092 /* Fill the exported symbol offsets. The preliminary work has already
1093 been done in process_def_file_and_drectve(). */
1095 static void
1096 fill_exported_offsets (bfd *abfd ATTRIBUTE_UNUSED, struct bfd_link_info *info)
1098 int i;
1099 struct bfd_link_hash_entry *blhe;
1101 for (i = 0; i < pe_def_file->num_exports; i++)
1103 char *name;
1105 name = xmalloc (strlen (pe_def_file->exports[i].internal_name) + 2);
1106 if (pe_details->underscored
1107 && *pe_def_file->exports[i].internal_name != '@')
1109 *name = '_';
1110 strcpy (name + 1, pe_def_file->exports[i].internal_name);
1112 else
1113 strcpy (name, pe_def_file->exports[i].internal_name);
1115 blhe = bfd_link_hash_lookup (info->hash,
1116 name,
1117 FALSE, FALSE, TRUE);
1119 if (blhe && blhe->type == bfd_link_hash_defined)
1120 exported_symbol_offsets[i] = blhe->u.def.value;
1122 free (name);
1126 static void
1127 fill_edata (bfd *abfd, struct bfd_link_info *info ATTRIBUTE_UNUSED)
1129 int s, hint;
1130 unsigned char *edirectory;
1131 unsigned char *eaddresses;
1132 unsigned char *enameptrs;
1133 unsigned char *eordinals;
1134 char *enamestr;
1135 time_t now;
1137 time (&now);
1139 edata_d = xmalloc (edata_sz);
1141 /* Note use of array pointer math here. */
1142 edirectory = edata_d;
1143 eaddresses = edata_d + 40;
1144 enameptrs = eaddresses + 4 * export_table_size;
1145 eordinals = enameptrs + 4 * count_exported_byname;
1146 enamestr = (char *) eordinals + 2 * count_exported_byname;
1148 #define ERVA(ptr) (((unsigned char *)(ptr) - edata_d) \
1149 + edata_s->output_section->vma - image_base)
1151 memset (edata_d, 0, edata_sz);
1152 bfd_put_32 (abfd, now, edata_d + 4);
1153 if (pe_def_file->version_major != -1)
1155 bfd_put_16 (abfd, pe_def_file->version_major, edata_d + 8);
1156 bfd_put_16 (abfd, pe_def_file->version_minor, edata_d + 10);
1159 bfd_put_32 (abfd, ERVA (enamestr), edata_d + 12);
1160 strcpy (enamestr, dll_name);
1161 enamestr += strlen (enamestr) + 1;
1162 bfd_put_32 (abfd, min_ordinal, edata_d + 16);
1163 bfd_put_32 (abfd, export_table_size, edata_d + 20);
1164 bfd_put_32 (abfd, count_exported_byname, edata_d + 24);
1165 bfd_put_32 (abfd, ERVA (eaddresses), edata_d + 28);
1166 bfd_put_32 (abfd, ERVA (enameptrs), edata_d + 32);
1167 bfd_put_32 (abfd, ERVA (eordinals), edata_d + 36);
1169 fill_exported_offsets (abfd, info);
1171 /* Ok, now for the filling in part.
1172 Scan alphabetically - ie the ordering in the exports[] table,
1173 rather than by ordinal - the ordering in the exported_symbol[]
1174 table. See dlltool.c and:
1175 http://sources.redhat.com/ml/binutils/2003-04/msg00379.html
1176 for more information. */
1177 hint = 0;
1178 for (s = 0; s < NE; s++)
1180 struct bfd_section *ssec = exported_symbol_sections[s];
1181 if (pe_def_file->exports[s].ordinal != -1 &&
1182 (pe_def_file->exports[s].flag_forward || ssec != NULL))
1184 int ord = pe_def_file->exports[s].ordinal;
1186 if (pe_def_file->exports[s].flag_forward)
1188 bfd_put_32 (abfd, ERVA (enamestr),
1189 eaddresses + 4 * (ord - min_ordinal));
1191 strcpy (enamestr, pe_def_file->exports[s].internal_name);
1192 enamestr += strlen (pe_def_file->exports[s].internal_name) + 1;
1194 else
1196 bfd_vma srva = (exported_symbol_offsets[s]
1197 + ssec->output_section->vma
1198 + ssec->output_offset);
1200 bfd_put_32 (abfd, srva - image_base,
1201 eaddresses + 4 * (ord - min_ordinal));
1204 if (!pe_def_file->exports[s].flag_noname)
1206 char *ename = pe_def_file->exports[s].name;
1207 if (pe_def_file->exports[s].its_name)
1208 ename = pe_def_file->exports[s].its_name;
1210 bfd_put_32 (abfd, ERVA (enamestr), enameptrs);
1211 enameptrs += 4;
1212 strcpy (enamestr, ename);
1213 enamestr += strlen (enamestr) + 1;
1214 bfd_put_16 (abfd, ord - min_ordinal, eordinals);
1215 eordinals += 2;
1216 pe_def_file->exports[s].hint = hint++;
1223 static struct bfd_section *current_sec;
1225 void
1226 pe_walk_relocs_of_symbol (struct bfd_link_info *info,
1227 const char *name,
1228 int (*cb) (arelent *, asection *))
1230 bfd *b;
1231 asection *s;
1233 for (b = info->input_bfds; b; b = b->link_next)
1235 asymbol **symbols;
1236 int nsyms;
1238 if (!bfd_generic_link_read_symbols (b))
1240 einfo (_("%B%F: could not read symbols: %E\n"), b);
1241 return;
1244 symbols = bfd_get_outsymbols (b);
1245 nsyms = bfd_get_symcount (b);
1247 for (s = b->sections; s; s = s->next)
1249 arelent **relocs;
1250 int relsize, nrelocs, i;
1251 int flags = bfd_get_section_flags (b, s);
1253 /* Skip discarded linkonce sections. */
1254 if (flags & SEC_LINK_ONCE
1255 && s->output_section == bfd_abs_section_ptr)
1256 continue;
1258 current_sec = s;
1260 relsize = bfd_get_reloc_upper_bound (b, s);
1261 relocs = xmalloc (relsize);
1262 nrelocs = bfd_canonicalize_reloc (b, s, relocs, symbols);
1264 for (i = 0; i < nrelocs; i++)
1266 struct bfd_symbol *sym = *relocs[i]->sym_ptr_ptr;
1268 if (!strcmp (name, sym->name))
1269 cb (relocs[i], s);
1272 free (relocs);
1274 /* Warning: the allocated symbols are remembered in BFD and reused
1275 later, so don't free them! */
1276 /* free (symbols); */
1281 /* Gather all the relocations and build the .reloc section. */
1283 static void
1284 generate_reloc (bfd *abfd, struct bfd_link_info *info)
1287 /* For .reloc stuff. */
1288 reloc_data_type *reloc_data;
1289 int total_relocs = 0;
1290 int i;
1291 bfd_vma sec_page = (bfd_vma) -1;
1292 bfd_vma page_ptr, page_count;
1293 int bi;
1294 bfd *b;
1295 struct bfd_section *s;
1297 total_relocs = 0;
1298 for (b = info->input_bfds; b; b = b->link_next)
1299 for (s = b->sections; s; s = s->next)
1300 total_relocs += s->reloc_count;
1302 reloc_data = xmalloc (total_relocs * sizeof (reloc_data_type));
1304 total_relocs = 0;
1305 bi = 0;
1306 for (bi = 0, b = info->input_bfds; b; bi++, b = b->link_next)
1308 arelent **relocs;
1309 int relsize, nrelocs, i;
1311 for (s = b->sections; s; s = s->next)
1313 bfd_vma sec_vma = s->output_section->vma + s->output_offset;
1314 asymbol **symbols;
1315 int nsyms;
1317 /* If it's not loaded, we don't need to relocate it this way. */
1318 if (!(s->output_section->flags & SEC_LOAD))
1319 continue;
1321 /* I don't know why there would be a reloc for these, but I've
1322 seen it happen - DJ */
1323 if (s->output_section == &bfd_abs_section)
1324 continue;
1326 if (s->output_section->vma == 0)
1328 /* Huh? Shouldn't happen, but punt if it does. */
1329 einfo ("DJ: zero vma section reloc detected: `%s' #%d f=%d\n",
1330 s->output_section->name, s->output_section->index,
1331 s->output_section->flags);
1332 continue;
1335 if (!bfd_generic_link_read_symbols (b))
1337 einfo (_("%B%F: could not read symbols: %E\n"), b);
1338 return;
1341 symbols = bfd_get_outsymbols (b);
1342 nsyms = bfd_get_symcount (b);
1343 relsize = bfd_get_reloc_upper_bound (b, s);
1344 relocs = xmalloc (relsize);
1345 nrelocs = bfd_canonicalize_reloc (b, s, relocs, symbols);
1347 for (i = 0; i < nrelocs; i++)
1349 if (pe_dll_extra_pe_debug)
1351 struct bfd_symbol *sym = *relocs[i]->sym_ptr_ptr;
1352 printf ("rel: %s\n", sym->name);
1354 if (!relocs[i]->howto->pc_relative
1355 && relocs[i]->howto->type != pe_details->imagebase_reloc)
1357 bfd_vma sym_vma;
1358 struct bfd_symbol *sym = *relocs[i]->sym_ptr_ptr;
1360 /* Don't create relocs for undefined weak symbols. */
1361 if (sym->flags == BSF_WEAK)
1363 struct bfd_link_hash_entry *blhe
1364 = bfd_link_hash_lookup (info->hash, sym->name,
1365 FALSE, FALSE, FALSE);
1366 if (!blhe || blhe->type != bfd_link_hash_defined)
1367 continue;
1370 sym_vma = (relocs[i]->addend
1371 + sym->value
1372 + sym->section->vma
1373 + sym->section->output_offset
1374 + sym->section->output_section->vma);
1375 reloc_data[total_relocs].vma = sec_vma + relocs[i]->address;
1377 #define BITS_AND_SHIFT(bits, shift) (bits * 1000 | shift)
1379 switch BITS_AND_SHIFT (relocs[i]->howto->bitsize,
1380 relocs[i]->howto->rightshift)
1382 #ifdef pe_use_x86_64
1383 case BITS_AND_SHIFT (64, 0):
1384 reloc_data[total_relocs].type = 10;
1385 total_relocs++;
1386 break;
1387 #endif
1388 case BITS_AND_SHIFT (32, 0):
1389 reloc_data[total_relocs].type = 3;
1390 total_relocs++;
1391 break;
1392 case BITS_AND_SHIFT (16, 0):
1393 reloc_data[total_relocs].type = 2;
1394 total_relocs++;
1395 break;
1396 case BITS_AND_SHIFT (16, 16):
1397 reloc_data[total_relocs].type = 4;
1398 /* FIXME: we can't know the symbol's right value
1399 yet, but we probably can safely assume that
1400 CE will relocate us in 64k blocks, so leaving
1401 it zero is safe. */
1402 reloc_data[total_relocs].extra = 0;
1403 total_relocs++;
1404 break;
1405 case BITS_AND_SHIFT (26, 2):
1406 reloc_data[total_relocs].type = 5;
1407 total_relocs++;
1408 break;
1409 case BITS_AND_SHIFT (24, 2):
1410 /* FIXME: 0 is ARM_26D, it is defined in bfd/coff-arm.c
1411 Those ARM_xxx definitions should go in proper
1412 header someday. */
1413 if (relocs[i]->howto->type == 0
1414 /* Older GNU linkers used 5 instead of 0 for this reloc. */
1415 || relocs[i]->howto->type == 5)
1416 /* This is an ARM_26D reloc, which is an ARM_26 reloc
1417 that has already been fully processed during a
1418 previous link stage, so ignore it here. */
1419 break;
1420 /* Fall through. */
1421 default:
1422 /* xgettext:c-format */
1423 einfo (_("%XError: %d-bit reloc in dll\n"),
1424 relocs[i]->howto->bitsize);
1425 break;
1429 free (relocs);
1430 /* Warning: the allocated symbols are remembered in BFD and
1431 reused later, so don't free them! */
1435 /* At this point, we have total_relocs relocation addresses in
1436 reloc_addresses, which are all suitable for the .reloc section.
1437 We must now create the new sections. */
1438 qsort (reloc_data, total_relocs, sizeof (*reloc_data), reloc_sort);
1440 for (i = 0; i < total_relocs; i++)
1442 bfd_vma this_page = (reloc_data[i].vma >> 12);
1444 if (this_page != sec_page)
1446 reloc_sz = (reloc_sz + 3) & ~3; /* 4-byte align. */
1447 reloc_sz += 8;
1448 sec_page = this_page;
1451 reloc_sz += 2;
1453 if (reloc_data[i].type == 4)
1454 reloc_sz += 2;
1457 reloc_sz = (reloc_sz + 3) & ~3; /* 4-byte align. */
1458 reloc_d = xmalloc (reloc_sz);
1459 sec_page = (bfd_vma) -1;
1460 reloc_sz = 0;
1461 page_ptr = (bfd_vma) -1;
1462 page_count = 0;
1464 for (i = 0; i < total_relocs; i++)
1466 bfd_vma rva = reloc_data[i].vma - image_base;
1467 bfd_vma this_page = (rva & ~0xfff);
1469 if (this_page != sec_page)
1471 while (reloc_sz & 3)
1472 reloc_d[reloc_sz++] = 0;
1474 if (page_ptr != (bfd_vma) -1)
1475 bfd_put_32 (abfd, reloc_sz - page_ptr, reloc_d + page_ptr + 4);
1477 bfd_put_32 (abfd, this_page, reloc_d + reloc_sz);
1478 page_ptr = reloc_sz;
1479 reloc_sz += 8;
1480 sec_page = this_page;
1481 page_count = 0;
1484 bfd_put_16 (abfd, (rva & 0xfff) + (reloc_data[i].type << 12),
1485 reloc_d + reloc_sz);
1486 reloc_sz += 2;
1488 if (reloc_data[i].type == 4)
1490 bfd_put_16 (abfd, reloc_data[i].extra, reloc_d + reloc_sz);
1491 reloc_sz += 2;
1494 page_count++;
1497 while (reloc_sz & 3)
1498 reloc_d[reloc_sz++] = 0;
1500 if (page_ptr != (bfd_vma) -1)
1501 bfd_put_32 (abfd, reloc_sz - page_ptr, reloc_d + page_ptr + 4);
1503 while (reloc_sz < reloc_s->size)
1504 reloc_d[reloc_sz++] = 0;
1507 /* Given the exiting def_file structure, print out a .DEF file that
1508 corresponds to it. */
1510 static void
1511 quoteput (char *s, FILE *f, int needs_quotes)
1513 char *cp;
1515 for (cp = s; *cp; cp++)
1516 if (*cp == '\''
1517 || *cp == '"'
1518 || *cp == '\\'
1519 || ISSPACE (*cp)
1520 || *cp == ','
1521 || *cp == ';')
1522 needs_quotes = 1;
1524 if (needs_quotes)
1526 putc ('"', f);
1528 while (*s)
1530 if (*s == '"' || *s == '\\')
1531 putc ('\\', f);
1533 putc (*s, f);
1534 s++;
1537 putc ('"', f);
1539 else
1540 fputs (s, f);
1543 void
1544 pe_dll_generate_def_file (const char *pe_out_def_filename)
1546 int i;
1547 FILE *out = fopen (pe_out_def_filename, "w");
1549 if (out == NULL)
1550 /* xgettext:c-format */
1551 einfo (_("%s: Can't open output def file %s\n"),
1552 program_name, pe_out_def_filename);
1554 if (pe_def_file)
1556 if (pe_def_file->name)
1558 if (pe_def_file->is_dll)
1559 fprintf (out, "LIBRARY ");
1560 else
1561 fprintf (out, "NAME ");
1563 quoteput (pe_def_file->name, out, 1);
1565 if (pe_data (link_info.output_bfd)->pe_opthdr.ImageBase)
1567 fprintf (out, " BASE=0x");
1568 fprintf_vma (out, ((bfd_vma) pe_data (link_info.output_bfd)->pe_opthdr.ImageBase));
1570 fprintf (out, "\n");
1573 if (pe_def_file->description)
1575 fprintf (out, "DESCRIPTION ");
1576 quoteput (pe_def_file->description, out, 1);
1577 fprintf (out, "\n");
1580 if (pe_def_file->version_minor != -1)
1581 fprintf (out, "VERSION %d.%d\n", pe_def_file->version_major,
1582 pe_def_file->version_minor);
1583 else if (pe_def_file->version_major != -1)
1584 fprintf (out, "VERSION %d\n", pe_def_file->version_major);
1586 if (pe_def_file->stack_reserve != -1 || pe_def_file->heap_reserve != -1)
1587 fprintf (out, "\n");
1589 if (pe_def_file->stack_commit != -1)
1590 fprintf (out, "STACKSIZE 0x%x,0x%x\n",
1591 pe_def_file->stack_reserve, pe_def_file->stack_commit);
1592 else if (pe_def_file->stack_reserve != -1)
1593 fprintf (out, "STACKSIZE 0x%x\n", pe_def_file->stack_reserve);
1595 if (pe_def_file->heap_commit != -1)
1596 fprintf (out, "HEAPSIZE 0x%x,0x%x\n",
1597 pe_def_file->heap_reserve, pe_def_file->heap_commit);
1598 else if (pe_def_file->heap_reserve != -1)
1599 fprintf (out, "HEAPSIZE 0x%x\n", pe_def_file->heap_reserve);
1601 if (pe_def_file->num_section_defs > 0)
1603 fprintf (out, "\nSECTIONS\n\n");
1605 for (i = 0; i < pe_def_file->num_section_defs; i++)
1607 fprintf (out, " ");
1608 quoteput (pe_def_file->section_defs[i].name, out, 0);
1610 if (pe_def_file->section_defs[i].class)
1612 fprintf (out, " CLASS ");
1613 quoteput (pe_def_file->section_defs[i].class, out, 0);
1616 if (pe_def_file->section_defs[i].flag_read)
1617 fprintf (out, " READ");
1619 if (pe_def_file->section_defs[i].flag_write)
1620 fprintf (out, " WRITE");
1622 if (pe_def_file->section_defs[i].flag_execute)
1623 fprintf (out, " EXECUTE");
1625 if (pe_def_file->section_defs[i].flag_shared)
1626 fprintf (out, " SHARED");
1628 fprintf (out, "\n");
1632 if (pe_def_file->num_exports > 0)
1634 fprintf (out, "EXPORTS\n");
1636 for (i = 0; i < pe_def_file->num_exports; i++)
1638 def_file_export *e = pe_def_file->exports + i;
1639 fprintf (out, " ");
1640 quoteput (e->name, out, 0);
1642 if (e->internal_name && strcmp (e->internal_name, e->name))
1644 fprintf (out, " = ");
1645 quoteput (e->internal_name, out, 0);
1648 if (e->ordinal != -1)
1649 fprintf (out, " @%d", e->ordinal);
1651 if (e->flag_private)
1652 fprintf (out, " PRIVATE");
1654 if (e->flag_constant)
1655 fprintf (out, " CONSTANT");
1657 if (e->flag_noname)
1658 fprintf (out, " NONAME");
1660 if (e->flag_data)
1661 fprintf (out, " DATA");
1663 fprintf (out, "\n");
1667 if (pe_def_file->num_imports > 0)
1669 fprintf (out, "\nIMPORTS\n\n");
1671 for (i = 0; i < pe_def_file->num_imports; i++)
1673 def_file_import *im = pe_def_file->imports + i;
1674 fprintf (out, " ");
1676 if (im->internal_name
1677 && (!im->name || strcmp (im->internal_name, im->name)))
1679 quoteput (im->internal_name, out, 0);
1680 fprintf (out, " = ");
1683 quoteput (im->module->name, out, 0);
1684 fprintf (out, ".");
1686 if (im->name)
1687 quoteput (im->name, out, 0);
1688 else
1689 fprintf (out, "%d", im->ordinal);
1691 if (im->its_name)
1693 fprintf (out, " == ");
1694 quoteput (im->its_name, out, 0);
1697 fprintf (out, "\n");
1701 else
1702 fprintf (out, _("; no contents available\n"));
1704 if (fclose (out) == EOF)
1705 /* xgettext:c-format */
1706 einfo (_("%P: Error closing file `%s'\n"), pe_out_def_filename);
1709 /* Generate the import library. */
1711 static asymbol **symtab;
1712 static int symptr;
1713 static int tmp_seq;
1714 static int tmp_seq2;
1715 static const char *dll_filename;
1716 static char *dll_symname;
1718 #define UNDSEC (asection *) &bfd_und_section
1720 static asection *
1721 quick_section (bfd *abfd, const char *name, int flags, int align)
1723 asection *sec;
1724 asymbol *sym;
1726 sec = bfd_make_section_old_way (abfd, name);
1727 bfd_set_section_flags (abfd, sec, flags | SEC_ALLOC | SEC_LOAD | SEC_KEEP);
1728 bfd_set_section_alignment (abfd, sec, align);
1729 /* Remember to undo this before trying to link internally! */
1730 sec->output_section = sec;
1732 sym = bfd_make_empty_symbol (abfd);
1733 symtab[symptr++] = sym;
1734 sym->name = sec->name;
1735 sym->section = sec;
1736 sym->flags = BSF_LOCAL;
1737 sym->value = 0;
1739 return sec;
1742 static void
1743 quick_symbol (bfd *abfd,
1744 const char *n1,
1745 const char *n2,
1746 const char *n3,
1747 asection *sec,
1748 int flags,
1749 int addr)
1751 asymbol *sym;
1752 char *name = xmalloc (strlen (n1) + strlen (n2) + strlen (n3) + 1);
1754 strcpy (name, n1);
1755 strcat (name, n2);
1756 strcat (name, n3);
1757 sym = bfd_make_empty_symbol (abfd);
1758 sym->name = name;
1759 sym->section = sec;
1760 sym->flags = flags;
1761 sym->value = addr;
1762 symtab[symptr++] = sym;
1765 static arelent *reltab = 0;
1766 static int relcount = 0, relsize = 0;
1768 static void
1769 quick_reloc (bfd *abfd, bfd_size_type address, int which_howto, int symidx)
1771 if (relcount >= relsize - 1)
1773 relsize += 10;
1774 if (reltab)
1775 reltab = xrealloc (reltab, relsize * sizeof (arelent));
1776 else
1777 reltab = xmalloc (relsize * sizeof (arelent));
1779 reltab[relcount].address = address;
1780 reltab[relcount].addend = 0;
1781 reltab[relcount].howto = bfd_reloc_type_lookup (abfd, which_howto);
1782 reltab[relcount].sym_ptr_ptr = symtab + symidx;
1783 relcount++;
1786 static void
1787 save_relocs (asection *sec)
1789 int i;
1791 sec->relocation = reltab;
1792 sec->reloc_count = relcount;
1793 sec->orelocation = xmalloc ((relcount + 1) * sizeof (arelent *));
1794 for (i = 0; i < relcount; i++)
1795 sec->orelocation[i] = sec->relocation + i;
1796 sec->orelocation[relcount] = 0;
1797 sec->flags |= SEC_RELOC;
1798 reltab = 0;
1799 relcount = relsize = 0;
1802 /* .section .idata$2
1803 .global __head_my_dll
1804 __head_my_dll:
1805 .rva hname
1806 .long 0
1807 .long 0
1808 .rva __my_dll_iname
1809 .rva fthunk
1811 .section .idata$5
1812 .long 0
1813 fthunk:
1815 .section .idata$4
1816 .long 0
1817 hname: */
1819 static bfd *
1820 make_head (bfd *parent)
1822 asection *id2, *id5, *id4;
1823 unsigned char *d2, *d5, *d4;
1824 char *oname;
1825 bfd *abfd;
1827 oname = xmalloc (20);
1828 sprintf (oname, "d%06d.o", tmp_seq);
1829 tmp_seq++;
1831 abfd = bfd_create (oname, parent);
1832 bfd_find_target (pe_details->object_target, abfd);
1833 bfd_make_writable (abfd);
1835 bfd_set_format (abfd, bfd_object);
1836 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
1838 symptr = 0;
1839 symtab = xmalloc (6 * sizeof (asymbol *));
1840 id2 = quick_section (abfd, ".idata$2", SEC_HAS_CONTENTS, 2);
1841 id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
1842 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
1843 quick_symbol (abfd, U ("_head_"), dll_symname, "", id2, BSF_GLOBAL, 0);
1844 quick_symbol (abfd, U (""), dll_symname, "_iname", UNDSEC, BSF_GLOBAL, 0);
1846 /* OK, pay attention here. I got confused myself looking back at
1847 it. We create a four-byte section to mark the beginning of the
1848 list, and we include an offset of 4 in the section, so that the
1849 pointer to the list points to the *end* of this section, which is
1850 the start of the list of sections from other objects. */
1852 bfd_set_section_size (abfd, id2, 20);
1853 d2 = xmalloc (20);
1854 id2->contents = d2;
1855 memset (d2, 0, 20);
1856 if (pe_use_nul_prefixed_import_tables)
1857 d2[0] = d2[16] = PE_IDATA5_SIZE; /* Reloc addend. */
1858 quick_reloc (abfd, 0, BFD_RELOC_RVA, 2);
1859 quick_reloc (abfd, 12, BFD_RELOC_RVA, 4);
1860 quick_reloc (abfd, 16, BFD_RELOC_RVA, 1);
1861 save_relocs (id2);
1863 if (pe_use_nul_prefixed_import_tables)
1864 bfd_set_section_size (abfd, id5, PE_IDATA5_SIZE);
1865 else
1866 bfd_set_section_size (abfd, id5, 0);
1867 d5 = xmalloc (PE_IDATA5_SIZE);
1868 id5->contents = d5;
1869 memset (d5, 0, PE_IDATA5_SIZE);
1870 if (pe_use_nul_prefixed_import_tables)
1871 bfd_set_section_size (abfd, id4, PE_IDATA4_SIZE);
1872 else
1873 bfd_set_section_size (abfd, id4, 0);
1874 d4 = xmalloc (PE_IDATA4_SIZE);
1875 id4->contents = d4;
1876 memset (d4, 0, PE_IDATA4_SIZE);
1878 bfd_set_symtab (abfd, symtab, symptr);
1880 bfd_set_section_contents (abfd, id2, d2, 0, 20);
1881 if (pe_use_nul_prefixed_import_tables)
1883 bfd_set_section_contents (abfd, id5, d5, 0, PE_IDATA5_SIZE);
1884 bfd_set_section_contents (abfd, id4, d4, 0, PE_IDATA4_SIZE);
1886 else
1888 bfd_set_section_contents (abfd, id5, d5, 0, 0);
1889 bfd_set_section_contents (abfd, id4, d4, 0, 0);
1892 bfd_make_readable (abfd);
1893 return abfd;
1896 /* .section .idata$4
1897 .long 0
1898 [.long 0] for PE+
1899 .section .idata$5
1900 .long 0
1901 [.long 0] for PE+
1902 .section idata$7
1903 .global __my_dll_iname
1904 __my_dll_iname:
1905 .asciz "my.dll" */
1907 static bfd *
1908 make_tail (bfd *parent)
1910 asection *id4, *id5, *id7;
1911 unsigned char *d4, *d5, *d7;
1912 int len;
1913 char *oname;
1914 bfd *abfd;
1916 oname = xmalloc (20);
1917 sprintf (oname, "d%06d.o", tmp_seq);
1918 tmp_seq++;
1920 abfd = bfd_create (oname, parent);
1921 bfd_find_target (pe_details->object_target, abfd);
1922 bfd_make_writable (abfd);
1924 bfd_set_format (abfd, bfd_object);
1925 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
1927 symptr = 0;
1928 symtab = xmalloc (5 * sizeof (asymbol *));
1929 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
1930 id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
1931 id7 = quick_section (abfd, ".idata$7", SEC_HAS_CONTENTS, 2);
1932 quick_symbol (abfd, U (""), dll_symname, "_iname", id7, BSF_GLOBAL, 0);
1934 bfd_set_section_size (abfd, id4, PE_IDATA4_SIZE);
1935 d4 = xmalloc (PE_IDATA4_SIZE);
1936 id4->contents = d4;
1937 memset (d4, 0, PE_IDATA4_SIZE);
1939 bfd_set_section_size (abfd, id5, PE_IDATA5_SIZE);
1940 d5 = xmalloc (PE_IDATA5_SIZE);
1941 id5->contents = d5;
1942 memset (d5, 0, PE_IDATA5_SIZE);
1944 len = strlen (dll_filename) + 1;
1945 if (len & 1)
1946 len++;
1947 bfd_set_section_size (abfd, id7, len);
1948 d7 = xmalloc (len);
1949 id7->contents = d7;
1950 strcpy ((char *) d7, dll_filename);
1951 /* If len was odd, the above
1952 strcpy leaves behind an undefined byte. That is harmless,
1953 but we set it to 0 just so the binary dumps are pretty. */
1954 d7[len - 1] = 0;
1956 bfd_set_symtab (abfd, symtab, symptr);
1958 bfd_set_section_contents (abfd, id4, d4, 0, PE_IDATA4_SIZE);
1959 bfd_set_section_contents (abfd, id5, d5, 0, PE_IDATA5_SIZE);
1960 bfd_set_section_contents (abfd, id7, d7, 0, len);
1962 bfd_make_readable (abfd);
1963 return abfd;
1966 /* .text
1967 .global _function
1968 .global ___imp_function
1969 .global __imp__function
1970 _function:
1971 jmp *__imp__function:
1973 .section idata$7
1974 .long __head_my_dll
1976 .section .idata$5
1977 ___imp_function:
1978 __imp__function:
1979 iat?
1980 .section .idata$4
1981 iat?
1982 .section .idata$6
1983 ID<ordinal>:
1984 .short <hint>
1985 .asciz "function" xlate? (add underscore, kill at) */
1987 static const unsigned char jmp_ix86_bytes[] =
1989 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x90, 0x90
1992 /* _function:
1993 mov.l ip+8,r0
1994 mov.l @r0,r0
1995 jmp @r0
1997 .dw __imp_function */
1999 static const unsigned char jmp_sh_bytes[] =
2001 0x01, 0xd0, 0x02, 0x60, 0x2b, 0x40, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00
2004 /* _function:
2005 lui $t0,<high:__imp_function>
2006 lw $t0,<low:__imp_function>
2007 jr $t0
2008 nop */
2010 static const unsigned char jmp_mips_bytes[] =
2012 0x00, 0x00, 0x08, 0x3c, 0x00, 0x00, 0x08, 0x8d,
2013 0x08, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00
2016 static const unsigned char jmp_arm_bytes[] =
2018 0x00, 0xc0, 0x9f, 0xe5, /* ldr ip, [pc] */
2019 0x00, 0xf0, 0x9c, 0xe5, /* ldr pc, [ip] */
2020 0, 0, 0, 0
2024 static bfd *
2025 make_one (def_file_export *exp, bfd *parent, bfd_boolean include_jmp_stub)
2027 asection *tx, *id7, *id5, *id4, *id6;
2028 unsigned char *td = NULL, *d7, *d5, *d4, *d6 = NULL;
2029 int len;
2030 char *oname;
2031 bfd *abfd;
2032 const unsigned char *jmp_bytes = NULL;
2033 int jmp_byte_count = 0;
2035 /* Include the jump stub section only if it is needed. A jump
2036 stub is needed if the symbol being imported <sym> is a function
2037 symbol and there is at least one undefined reference to that
2038 symbol. In other words, if all the import references to <sym> are
2039 explicitly through _declspec(dllimport) then the jump stub is not
2040 needed. */
2041 if (include_jmp_stub)
2043 switch (pe_details->pe_arch)
2045 case PE_ARCH_i386:
2046 jmp_bytes = jmp_ix86_bytes;
2047 jmp_byte_count = sizeof (jmp_ix86_bytes);
2048 break;
2049 case PE_ARCH_sh:
2050 jmp_bytes = jmp_sh_bytes;
2051 jmp_byte_count = sizeof (jmp_sh_bytes);
2052 break;
2053 case PE_ARCH_mips:
2054 jmp_bytes = jmp_mips_bytes;
2055 jmp_byte_count = sizeof (jmp_mips_bytes);
2056 break;
2057 case PE_ARCH_arm:
2058 case PE_ARCH_arm_epoc:
2059 case PE_ARCH_arm_wince:
2060 jmp_bytes = jmp_arm_bytes;
2061 jmp_byte_count = sizeof (jmp_arm_bytes);
2062 break;
2063 default:
2064 abort ();
2068 oname = xmalloc (20);
2069 sprintf (oname, "d%06d.o", tmp_seq);
2070 tmp_seq++;
2072 abfd = bfd_create (oname, parent);
2073 bfd_find_target (pe_details->object_target, abfd);
2074 bfd_make_writable (abfd);
2076 bfd_set_format (abfd, bfd_object);
2077 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2079 symptr = 0;
2080 symtab = xmalloc (11 * sizeof (asymbol *));
2081 tx = quick_section (abfd, ".text", SEC_CODE|SEC_HAS_CONTENTS, 2);
2082 id7 = quick_section (abfd, ".idata$7", SEC_HAS_CONTENTS, 2);
2083 id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
2084 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
2085 id6 = quick_section (abfd, ".idata$6", SEC_HAS_CONTENTS, 2);
2087 if (*exp->internal_name == '@')
2089 quick_symbol (abfd, U ("_head_"), dll_symname, "", UNDSEC,
2090 BSF_GLOBAL, 0);
2091 if (include_jmp_stub)
2092 quick_symbol (abfd, "", exp->internal_name, "", tx, BSF_GLOBAL, 0);
2093 quick_symbol (abfd, "__imp_", exp->internal_name, "", id5,
2094 BSF_GLOBAL, 0);
2095 /* Fastcall applies only to functions,
2096 so no need for auto-import symbol. */
2098 else
2100 quick_symbol (abfd, U ("_head_"), dll_symname, "", UNDSEC,
2101 BSF_GLOBAL, 0);
2102 if (include_jmp_stub)
2103 quick_symbol (abfd, U (""), exp->internal_name, "", tx,
2104 BSF_GLOBAL, 0);
2105 quick_symbol (abfd, "__imp_", U (""), exp->internal_name, id5,
2106 BSF_GLOBAL, 0);
2107 /* Symbol to reference ord/name of imported
2108 data symbol, used to implement auto-import. */
2109 if (exp->flag_data)
2110 quick_symbol (abfd, U ("_nm_"), U (""), exp->internal_name, id6,
2111 BSF_GLOBAL,0);
2113 if (pe_dll_compat_implib)
2114 quick_symbol (abfd, U ("__imp_"), exp->internal_name, "", id5,
2115 BSF_GLOBAL, 0);
2117 if (include_jmp_stub)
2119 bfd_set_section_size (abfd, tx, jmp_byte_count);
2120 td = xmalloc (jmp_byte_count);
2121 tx->contents = td;
2122 memcpy (td, jmp_bytes, jmp_byte_count);
2124 switch (pe_details->pe_arch)
2126 case PE_ARCH_i386:
2127 #ifdef pe_use_x86_64
2128 quick_reloc (abfd, 2, BFD_RELOC_32_PCREL, 2);
2129 #else
2130 quick_reloc (abfd, 2, BFD_RELOC_32, 2);
2131 #endif
2132 break;
2133 case PE_ARCH_sh:
2134 quick_reloc (abfd, 8, BFD_RELOC_32, 2);
2135 break;
2136 case PE_ARCH_mips:
2137 quick_reloc (abfd, 0, BFD_RELOC_HI16_S, 2);
2138 quick_reloc (abfd, 0, BFD_RELOC_LO16, 0); /* MIPS_R_PAIR */
2139 quick_reloc (abfd, 4, BFD_RELOC_LO16, 2);
2140 break;
2141 case PE_ARCH_arm:
2142 case PE_ARCH_arm_epoc:
2143 case PE_ARCH_arm_wince:
2144 quick_reloc (abfd, 8, BFD_RELOC_32, 2);
2145 break;
2146 default:
2147 abort ();
2149 save_relocs (tx);
2151 else
2152 bfd_set_section_size (abfd, tx, 0);
2154 bfd_set_section_size (abfd, id7, 4);
2155 d7 = xmalloc (4);
2156 id7->contents = d7;
2157 memset (d7, 0, 4);
2158 quick_reloc (abfd, 0, BFD_RELOC_RVA, 5);
2159 save_relocs (id7);
2161 bfd_set_section_size (abfd, id5, PE_IDATA5_SIZE);
2162 d5 = xmalloc (PE_IDATA5_SIZE);
2163 id5->contents = d5;
2164 memset (d5, 0, PE_IDATA5_SIZE);
2166 if (exp->flag_noname)
2168 d5[0] = exp->ordinal;
2169 d5[1] = exp->ordinal >> 8;
2170 d5[PE_IDATA5_SIZE - 1] = 0x80;
2172 else
2174 quick_reloc (abfd, 0, BFD_RELOC_RVA, 4);
2175 save_relocs (id5);
2178 bfd_set_section_size (abfd, id4, PE_IDATA4_SIZE);
2179 d4 = xmalloc (PE_IDATA4_SIZE);
2180 id4->contents = d4;
2181 memset (d4, 0, PE_IDATA4_SIZE);
2183 if (exp->flag_noname)
2185 d4[0] = exp->ordinal;
2186 d4[1] = exp->ordinal >> 8;
2187 d4[PE_IDATA4_SIZE - 1] = 0x80;
2189 else
2191 quick_reloc (abfd, 0, BFD_RELOC_RVA, 4);
2192 save_relocs (id4);
2195 if (exp->flag_noname)
2197 len = 0;
2198 bfd_set_section_size (abfd, id6, 0);
2200 else
2202 /* { short, asciz } */
2203 if (exp->its_name)
2204 len = 2 + strlen (exp->its_name) + 1;
2205 else
2206 len = 2 + strlen (exp->name) + 1;
2207 if (len & 1)
2208 len++;
2209 bfd_set_section_size (abfd, id6, len);
2210 d6 = xmalloc (len);
2211 id6->contents = d6;
2212 memset (d6, 0, len);
2213 d6[0] = exp->hint & 0xff;
2214 d6[1] = exp->hint >> 8;
2215 if (exp->its_name)
2216 strcpy ((char*) d6 + 2, exp->its_name);
2217 else
2218 strcpy ((char *) d6 + 2, exp->name);
2221 bfd_set_symtab (abfd, symtab, symptr);
2223 if (include_jmp_stub)
2224 bfd_set_section_contents (abfd, tx, td, 0, jmp_byte_count);
2225 bfd_set_section_contents (abfd, id7, d7, 0, 4);
2226 bfd_set_section_contents (abfd, id5, d5, 0, PE_IDATA5_SIZE);
2227 bfd_set_section_contents (abfd, id4, d4, 0, PE_IDATA4_SIZE);
2228 if (!exp->flag_noname)
2229 bfd_set_section_contents (abfd, id6, d6, 0, len);
2231 bfd_make_readable (abfd);
2232 return abfd;
2235 static bfd *
2236 make_singleton_name_imp (const char *import, bfd *parent)
2238 /* Name thunks go to idata$4. */
2239 asection *id5;
2240 unsigned char *d5;
2241 char *oname;
2242 bfd *abfd;
2244 oname = xmalloc (20);
2245 sprintf (oname, "nmimp%06d.o", tmp_seq2);
2246 tmp_seq2++;
2248 abfd = bfd_create (oname, parent);
2249 bfd_find_target (pe_details->object_target, abfd);
2250 bfd_make_writable (abfd);
2252 bfd_set_format (abfd, bfd_object);
2253 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2255 symptr = 0;
2256 symtab = xmalloc (3 * sizeof (asymbol *));
2257 id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
2258 quick_symbol (abfd, U ("_imp_"), import, "", id5, BSF_GLOBAL, 0);
2260 /* We need space for the real thunk and for the null terminator. */
2261 bfd_set_section_size (abfd, id5, PE_IDATA5_SIZE * 2);
2262 d5 = xmalloc (PE_IDATA5_SIZE * 2);
2263 id5->contents = d5;
2264 memset (d5, 0, PE_IDATA5_SIZE * 2);
2265 quick_reloc (abfd, 0, BFD_RELOC_RVA, 2);
2266 save_relocs (id5);
2268 bfd_set_symtab (abfd, symtab, symptr);
2270 bfd_set_section_contents (abfd, id5, d5, 0, PE_IDATA4_SIZE * 2);
2272 bfd_make_readable (abfd);
2273 return abfd;
2276 static bfd *
2277 make_singleton_name_thunk (const char *import, bfd *parent)
2279 /* Name thunks go to idata$4. */
2280 asection *id4;
2281 unsigned char *d4;
2282 char *oname;
2283 bfd *abfd;
2285 oname = xmalloc (20);
2286 sprintf (oname, "nmth%06d.o", tmp_seq);
2287 tmp_seq++;
2289 abfd = bfd_create (oname, parent);
2290 bfd_find_target (pe_details->object_target, abfd);
2291 bfd_make_writable (abfd);
2293 bfd_set_format (abfd, bfd_object);
2294 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2296 symptr = 0;
2297 symtab = xmalloc (3 * sizeof (asymbol *));
2298 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
2299 quick_symbol (abfd, U ("_nm_thnk_"), import, "", id4, BSF_GLOBAL, 0);
2300 quick_symbol (abfd, U ("_nm_"), import, "", UNDSEC, BSF_GLOBAL, 0);
2302 /* We need space for the real thunk and for the null terminator. */
2303 bfd_set_section_size (abfd, id4, PE_IDATA4_SIZE * 2);
2304 d4 = xmalloc (PE_IDATA4_SIZE * 2);
2305 id4->contents = d4;
2306 memset (d4, 0, PE_IDATA4_SIZE * 2);
2307 quick_reloc (abfd, 0, BFD_RELOC_RVA, 2);
2308 save_relocs (id4);
2310 bfd_set_symtab (abfd, symtab, symptr);
2312 bfd_set_section_contents (abfd, id4, d4, 0, PE_IDATA4_SIZE * 2);
2314 bfd_make_readable (abfd);
2315 return abfd;
2318 static char *
2319 make_import_fixup_mark (arelent *rel)
2321 /* We convert reloc to symbol, for later reference. */
2322 static int counter;
2323 static char *fixup_name = NULL;
2324 static size_t buffer_len = 0;
2326 struct bfd_symbol *sym = *rel->sym_ptr_ptr;
2328 bfd *abfd = bfd_asymbol_bfd (sym);
2329 struct bfd_link_hash_entry *bh;
2331 if (!fixup_name)
2333 fixup_name = xmalloc (384);
2334 buffer_len = 384;
2337 if (strlen (sym->name) + 25 > buffer_len)
2338 /* Assume 25 chars for "__fu" + counter + "_". If counter is
2339 bigger than 20 digits long, we've got worse problems than
2340 overflowing this buffer... */
2342 free (fixup_name);
2343 /* New buffer size is length of symbol, plus 25, but
2344 then rounded up to the nearest multiple of 128. */
2345 buffer_len = ((strlen (sym->name) + 25) + 127) & ~127;
2346 fixup_name = xmalloc (buffer_len);
2349 sprintf (fixup_name, "__fu%d_%s", counter++, sym->name);
2351 bh = NULL;
2352 bfd_coff_link_add_one_symbol (&link_info, abfd, fixup_name, BSF_GLOBAL,
2353 current_sec, /* sym->section, */
2354 rel->address, NULL, TRUE, FALSE, &bh);
2356 return fixup_name;
2359 /* .section .idata$2
2360 .rva __nm_thnk_SYM (singleton thunk with name of func)
2361 .long 0
2362 .long 0
2363 .rva __my_dll_iname (name of dll)
2364 .rva __fuNN_SYM (pointer to reference (address) in text) */
2366 static bfd *
2367 make_import_fixup_entry (const char *name,
2368 const char *fixup_name,
2369 const char *dll_symname,
2370 bfd *parent)
2372 asection *id2;
2373 unsigned char *d2;
2374 char *oname;
2375 bfd *abfd;
2377 oname = xmalloc (20);
2378 sprintf (oname, "fu%06d.o", tmp_seq);
2379 tmp_seq++;
2381 abfd = bfd_create (oname, parent);
2382 bfd_find_target (pe_details->object_target, abfd);
2383 bfd_make_writable (abfd);
2385 bfd_set_format (abfd, bfd_object);
2386 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2388 symptr = 0;
2389 symtab = xmalloc (6 * sizeof (asymbol *));
2390 id2 = quick_section (abfd, ".idata$2", SEC_HAS_CONTENTS, 2);
2392 quick_symbol (abfd, U ("_nm_thnk_"), name, "", UNDSEC, BSF_GLOBAL, 0);
2393 quick_symbol (abfd, U (""), dll_symname, "_iname", UNDSEC, BSF_GLOBAL, 0);
2394 /* For relocator v2 we have to use the .idata$5 element and not
2395 fixup_name. */
2396 if (link_info.pei386_runtime_pseudo_reloc == 2)
2397 quick_symbol (abfd, U ("_imp_"), name, "", UNDSEC, BSF_GLOBAL, 0);
2398 else
2399 quick_symbol (abfd, "", fixup_name, "", UNDSEC, BSF_GLOBAL, 0);
2401 bfd_set_section_size (abfd, id2, 20);
2402 d2 = xmalloc (20);
2403 id2->contents = d2;
2404 memset (d2, 0, 20);
2406 quick_reloc (abfd, 0, BFD_RELOC_RVA, 1);
2407 quick_reloc (abfd, 12, BFD_RELOC_RVA, 2);
2408 quick_reloc (abfd, 16, BFD_RELOC_RVA, 3);
2409 save_relocs (id2);
2411 bfd_set_symtab (abfd, symtab, symptr);
2413 bfd_set_section_contents (abfd, id2, d2, 0, 20);
2415 bfd_make_readable (abfd);
2416 return abfd;
2419 /* .section .rdata_runtime_pseudo_reloc
2420 .long addend
2421 .rva __fuNN_SYM (pointer to reference (address) in text) */
2423 static bfd *
2424 make_runtime_pseudo_reloc (const char *name ATTRIBUTE_UNUSED,
2425 const char *fixup_name,
2426 bfd_vma addend ATTRIBUTE_UNUSED,
2427 bfd_vma bitsize,
2428 bfd *parent)
2430 asection *rt_rel;
2431 unsigned char *rt_rel_d;
2432 char *oname;
2433 bfd *abfd;
2434 oname = xmalloc (20);
2435 sprintf (oname, "rtr%06d.o", tmp_seq);
2436 tmp_seq++;
2438 abfd = bfd_create (oname, parent);
2439 bfd_find_target (pe_details->object_target, abfd);
2440 bfd_make_writable (abfd);
2442 bfd_set_format (abfd, bfd_object);
2443 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2445 symptr = 0;
2446 if (link_info.pei386_runtime_pseudo_reloc == 2)
2448 symtab = xmalloc ((runtime_pseudp_reloc_v2_init ? 3 : 6) * sizeof (asymbol *));
2450 else
2452 symtab = xmalloc (2 * sizeof (asymbol *));
2454 rt_rel = quick_section (abfd, ".rdata_runtime_pseudo_reloc",
2455 SEC_HAS_CONTENTS, 2);
2457 quick_symbol (abfd, "", fixup_name, "", UNDSEC, BSF_GLOBAL, 0);
2459 if (link_info.pei386_runtime_pseudo_reloc == 2)
2461 size_t size = 12;
2462 if (! runtime_pseudp_reloc_v2_init)
2464 size += 12;
2465 runtime_pseudp_reloc_v2_init = 1;
2467 quick_symbol (abfd, U ("_imp_"), name, "", UNDSEC, BSF_GLOBAL, 0);
2469 bfd_set_section_size (abfd, rt_rel, size);
2470 rt_rel_d = xmalloc (size);
2471 rt_rel->contents = rt_rel_d;
2472 memset (rt_rel_d, 0, size);
2473 quick_reloc (abfd, size - 8, BFD_RELOC_RVA, 1);
2474 quick_reloc (abfd, size - 12, BFD_RELOC_RVA, 2);
2475 bfd_put_32 (abfd, bitsize, rt_rel_d + (size - 4));
2476 if (size != 12)
2477 bfd_put_32 (abfd, 1, rt_rel_d + 8);
2478 save_relocs (rt_rel);
2480 bfd_set_symtab (abfd, symtab, symptr);
2482 bfd_set_section_contents (abfd, rt_rel, rt_rel_d, 0, size);
2484 else
2486 bfd_set_section_size (abfd, rt_rel, 8);
2487 rt_rel_d = xmalloc (8);
2488 rt_rel->contents = rt_rel_d;
2489 memset (rt_rel_d, 0, 8);
2491 bfd_put_32 (abfd, addend, rt_rel_d);
2492 quick_reloc (abfd, 4, BFD_RELOC_RVA, 1);
2494 save_relocs (rt_rel);
2496 bfd_set_symtab (abfd, symtab, symptr);
2498 bfd_set_section_contents (abfd, rt_rel, rt_rel_d, 0, 8);
2500 bfd_make_readable (abfd);
2501 return abfd;
2504 /* .section .rdata
2505 .rva __pei386_runtime_relocator */
2507 static bfd *
2508 pe_create_runtime_relocator_reference (bfd *parent)
2510 asection *extern_rt_rel;
2511 unsigned char *extern_rt_rel_d;
2512 char *oname;
2513 bfd *abfd;
2515 oname = xmalloc (20);
2516 sprintf (oname, "ertr%06d.o", tmp_seq);
2517 tmp_seq++;
2519 abfd = bfd_create (oname, parent);
2520 bfd_find_target (pe_details->object_target, abfd);
2521 bfd_make_writable (abfd);
2523 bfd_set_format (abfd, bfd_object);
2524 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2526 symptr = 0;
2527 symtab = xmalloc (2 * sizeof (asymbol *));
2528 extern_rt_rel = quick_section (abfd, ".rdata", SEC_HAS_CONTENTS, 2);
2530 quick_symbol (abfd, "", U ("_pei386_runtime_relocator"), "", UNDSEC,
2531 BSF_NO_FLAGS, 0);
2533 bfd_set_section_size (abfd, extern_rt_rel, PE_IDATA5_SIZE);
2534 extern_rt_rel_d = xmalloc (PE_IDATA5_SIZE);
2535 extern_rt_rel->contents = extern_rt_rel_d;
2537 quick_reloc (abfd, 0, BFD_RELOC_RVA, 1);
2538 save_relocs (extern_rt_rel);
2540 bfd_set_symtab (abfd, symtab, symptr);
2542 bfd_set_section_contents (abfd, extern_rt_rel, extern_rt_rel_d, 0, PE_IDATA5_SIZE);
2544 bfd_make_readable (abfd);
2545 return abfd;
2548 void
2549 pe_create_import_fixup (arelent *rel, asection *s, bfd_vma addend)
2551 char buf[300];
2552 struct bfd_symbol *sym = *rel->sym_ptr_ptr;
2553 struct bfd_link_hash_entry *name_thunk_sym;
2554 struct bfd_link_hash_entry *name_imp_sym;
2555 const char *name = sym->name;
2556 char *fixup_name = make_import_fixup_mark (rel);
2557 bfd *b;
2558 int need_import_table = 1;
2560 sprintf (buf, U ("_imp_%s"), name);
2561 name_imp_sym = bfd_link_hash_lookup (link_info.hash, buf, 0, 0, 1);
2563 sprintf (buf, U ("_nm_thnk_%s"), name);
2565 name_thunk_sym = bfd_link_hash_lookup (link_info.hash, buf, 0, 0, 1);
2567 /* For version 2 pseudo relocation we don't need to add an import
2568 if the import symbol is already present. */
2569 if (link_info.pei386_runtime_pseudo_reloc == 2
2570 && name_imp_sym
2571 && name_imp_sym->type == bfd_link_hash_defined)
2572 need_import_table = 0;
2574 if (need_import_table == 1
2575 && (!name_thunk_sym || name_thunk_sym->type != bfd_link_hash_defined))
2577 bfd *b = make_singleton_name_thunk (name, link_info.output_bfd);
2578 add_bfd_to_link (b, b->filename, &link_info);
2580 /* If we ever use autoimport, we have to cast text section writable.
2581 But not for version 2. */
2582 if (link_info.pei386_runtime_pseudo_reloc != 2)
2584 config.text_read_only = FALSE;
2585 link_info.output_bfd->flags &= ~WP_TEXT;
2587 if (link_info.pei386_runtime_pseudo_reloc == 2)
2589 b = make_singleton_name_imp (name, link_info.output_bfd);
2590 add_bfd_to_link (b, b->filename, &link_info);
2594 if ((addend == 0 || link_info.pei386_runtime_pseudo_reloc)
2595 && need_import_table == 1)
2597 extern char * pe_data_import_dll;
2598 char * dll_symname = pe_data_import_dll ? pe_data_import_dll : "unknown";
2600 b = make_import_fixup_entry (name, fixup_name, dll_symname,
2601 link_info.output_bfd);
2602 add_bfd_to_link (b, b->filename, &link_info);
2605 if ((link_info.pei386_runtime_pseudo_reloc != 0 && addend != 0)
2606 || link_info.pei386_runtime_pseudo_reloc == 2)
2608 if (pe_dll_extra_pe_debug)
2609 printf ("creating runtime pseudo-reloc entry for %s (addend=%d)\n",
2610 fixup_name, (int) addend);
2612 b = make_runtime_pseudo_reloc (name, fixup_name, addend, rel->howto->bitsize,
2613 link_info.output_bfd);
2614 add_bfd_to_link (b, b->filename, &link_info);
2616 if (runtime_pseudo_relocs_created == 0)
2618 b = pe_create_runtime_relocator_reference (link_info.output_bfd);
2619 add_bfd_to_link (b, b->filename, &link_info);
2621 runtime_pseudo_relocs_created++;
2623 else if (addend != 0)
2625 einfo (_("%C: variable '%T' can't be auto-imported. Please read the documentation for ld's --enable-auto-import for details.\n"),
2626 s->owner, s, rel->address, sym->name);
2627 einfo ("%X");
2632 void
2633 pe_dll_generate_implib (def_file *def, const char *impfilename, struct bfd_link_info *info)
2635 int i;
2636 bfd *ar_head;
2637 bfd *ar_tail;
2638 bfd *outarch;
2639 bfd *ibfd;
2640 bfd *head = 0;
2642 dll_filename = (def->name) ? def->name : dll_name;
2643 dll_symname = xstrdup (dll_filename);
2644 for (i = 0; dll_symname[i]; i++)
2645 if (!ISALNUM (dll_symname[i]))
2646 dll_symname[i] = '_';
2648 unlink_if_ordinary (impfilename);
2650 outarch = bfd_openw (impfilename, 0);
2652 if (!outarch)
2654 /* xgettext:c-format */
2655 einfo (_("%XCan't open .lib file: %s\n"), impfilename);
2656 return;
2659 /* xgettext:c-format */
2660 info_msg (_("Creating library file: %s\n"), impfilename);
2662 bfd_set_format (outarch, bfd_archive);
2663 outarch->has_armap = 1;
2665 /* Work out a reasonable size of things to put onto one line. */
2666 ar_head = make_head (outarch);
2668 /* Iterate the input BFDs, looking for exclude-modules-for-implib. */
2669 for (ibfd = info->input_bfds; ibfd; ibfd = ibfd->link_next)
2671 /* Iterate the exclude list. */
2672 struct exclude_list_struct *ex;
2673 char found;
2674 for (ex = excludes, found = 0; ex && !found; ex = ex->next)
2676 if (ex->type != EXCLUDEFORIMPLIB)
2677 continue;
2678 found = (strcmp (ex->string, ibfd->filename) == 0);
2680 /* If it matched, we must open a fresh BFD for it (the original
2681 input BFD is still needed for the DLL's final link) and add
2682 it into the archive member chain. */
2683 if (found)
2685 bfd *newbfd = bfd_openr (ibfd->my_archive
2686 ? ibfd->my_archive->filename : ibfd->filename, NULL);
2687 if (!newbfd)
2689 einfo (_("%Xbfd_openr %s: %E\n"), ibfd->filename);
2690 return;
2692 if (ibfd->my_archive)
2694 /* Must now iterate through archive until we find the
2695 required member. A minor shame that we'll open the
2696 archive once per member that we require from it, and
2697 leak those archive bfds rather than reuse them. */
2698 bfd *arbfd = newbfd;
2699 if (!bfd_check_format_matches (arbfd, bfd_archive, NULL))
2701 einfo (_("%X%s(%s): can't find member in non-archive file"),
2702 ibfd->my_archive->filename, ibfd->filename);
2703 return;
2705 newbfd = NULL;
2706 while ((newbfd = bfd_openr_next_archived_file (arbfd, newbfd)) != 0)
2708 if (strcmp (newbfd->filename, ibfd->filename) == 0)
2709 break;
2711 if (!newbfd)
2713 einfo (_("%X%s(%s): can't find member in archive"),
2714 ibfd->my_archive->filename, ibfd->filename);
2715 return;
2718 newbfd->archive_next = head;
2719 head = newbfd;
2723 for (i = 0; i < def->num_exports; i++)
2725 /* The import library doesn't know about the internal name. */
2726 char *internal = def->exports[i].internal_name;
2727 bfd *n;
2729 /* Don't add PRIVATE entries to import lib. */
2730 if (pe_def_file->exports[i].flag_private)
2731 continue;
2732 def->exports[i].internal_name = def->exports[i].name;
2733 n = make_one (def->exports + i, outarch,
2734 ! (def->exports + i)->flag_data);
2735 n->archive_next = head;
2736 head = n;
2737 def->exports[i].internal_name = internal;
2740 ar_tail = make_tail (outarch);
2742 if (ar_head == NULL || ar_tail == NULL)
2743 return;
2745 /* Now stick them all into the archive. */
2746 ar_head->archive_next = head;
2747 ar_tail->archive_next = ar_head;
2748 head = ar_tail;
2750 if (! bfd_set_archive_head (outarch, head))
2751 einfo ("%Xbfd_set_archive_head: %E\n");
2753 if (! bfd_close (outarch))
2754 einfo ("%Xbfd_close %s: %E\n", impfilename);
2756 while (head != NULL)
2758 bfd *n = head->archive_next;
2759 bfd_close (head);
2760 head = n;
2764 static struct bfd_link_hash_entry *found_sym;
2766 static bfd_boolean
2767 pe_undef_alias_cdecl_match (struct bfd_link_hash_entry *h, void *inf)
2769 int sl;
2770 char *string = inf;
2771 const char *hs = h->root.string;
2773 sl = strlen (string);
2774 if (h->type == bfd_link_hash_undefined
2775 && ((*hs == '@' && *string == '_'
2776 && strncmp (hs + 1, string + 1, sl - 1) == 0)
2777 || strncmp (hs, string, sl) == 0)
2778 && h->root.string[sl] == '@')
2780 found_sym = h;
2781 return FALSE;
2783 return TRUE;
2786 static struct bfd_link_hash_entry *
2787 pe_find_cdecl_alias_match (char *name)
2789 found_sym = 0;
2790 bfd_link_hash_traverse (link_info.hash, pe_undef_alias_cdecl_match,
2791 (char *) name);
2792 return found_sym;
2795 static void
2796 add_bfd_to_link (bfd *abfd, const char *name, struct bfd_link_info *link_info)
2798 lang_input_statement_type *fake_file;
2800 fake_file = lang_add_input_file (name,
2801 lang_input_file_is_fake_enum,
2802 NULL);
2803 fake_file->the_bfd = abfd;
2804 ldlang_add_file (fake_file);
2806 if (!bfd_link_add_symbols (abfd, link_info))
2807 einfo ("%Xaddsym %s: %E\n", name);
2810 void
2811 pe_process_import_defs (bfd *output_bfd, struct bfd_link_info *link_info)
2813 def_file_module *module;
2815 pe_dll_id_target (bfd_get_target (output_bfd));
2817 if (!pe_def_file)
2818 return;
2820 for (module = pe_def_file->modules; module; module = module->next)
2822 int i, do_this_dll;
2824 dll_filename = module->name;
2825 dll_symname = xstrdup (module->name);
2826 for (i = 0; dll_symname[i]; i++)
2827 if (!ISALNUM (dll_symname[i]))
2828 dll_symname[i] = '_';
2830 do_this_dll = 0;
2832 for (i = 0; i < pe_def_file->num_imports; i++)
2833 if (pe_def_file->imports[i].module == module)
2835 def_file_export exp;
2836 struct bfd_link_hash_entry *blhe;
2837 int lead_at = (*pe_def_file->imports[i].internal_name == '@');
2838 /* See if we need this import. */
2839 size_t len = strlen (pe_def_file->imports[i].internal_name);
2840 char *name = xmalloc (len + 2 + 6);
2841 bfd_boolean include_jmp_stub = FALSE;
2842 bfd_boolean is_cdecl = FALSE;
2843 if (!lead_at && strchr (pe_def_file->imports[i].internal_name, '@') == NULL)
2844 is_cdecl = TRUE;
2846 if (lead_at)
2847 sprintf (name, "%s",
2848 pe_def_file->imports[i].internal_name);
2849 else
2850 sprintf (name, "%s%s",U (""),
2851 pe_def_file->imports[i].internal_name);
2853 blhe = bfd_link_hash_lookup (link_info->hash, name,
2854 FALSE, FALSE, FALSE);
2856 /* Include the jump stub for <sym> only if the <sym>
2857 is undefined. */
2858 if (!blhe || (blhe && blhe->type != bfd_link_hash_undefined))
2860 if (lead_at)
2861 sprintf (name, "%s%s", "__imp_",
2862 pe_def_file->imports[i].internal_name);
2863 else
2864 sprintf (name, "%s%s%s", "__imp_", U (""),
2865 pe_def_file->imports[i].internal_name);
2867 blhe = bfd_link_hash_lookup (link_info->hash, name,
2868 FALSE, FALSE, FALSE);
2870 else
2871 include_jmp_stub = TRUE;
2873 if (is_cdecl && !blhe)
2875 sprintf (name, "%s%s",U (""),
2876 pe_def_file->imports[i].internal_name);
2877 blhe = pe_find_cdecl_alias_match (name);
2878 include_jmp_stub = TRUE;
2881 free (name);
2883 if (blhe && blhe->type == bfd_link_hash_undefined)
2885 bfd *one;
2886 /* We do. */
2887 if (!do_this_dll)
2889 bfd *ar_head = make_head (output_bfd);
2890 add_bfd_to_link (ar_head, ar_head->filename, link_info);
2891 do_this_dll = 1;
2893 exp.internal_name = pe_def_file->imports[i].internal_name;
2894 exp.name = pe_def_file->imports[i].name;
2895 exp.its_name = pe_def_file->imports[i].its_name;
2896 exp.ordinal = pe_def_file->imports[i].ordinal;
2897 exp.hint = exp.ordinal >= 0 ? exp.ordinal : 0;
2898 exp.flag_private = 0;
2899 exp.flag_constant = 0;
2900 exp.flag_data = pe_def_file->imports[i].data;
2901 exp.flag_noname = exp.name ? 0 : 1;
2902 one = make_one (&exp, output_bfd, (! exp.flag_data) && include_jmp_stub);
2903 add_bfd_to_link (one, one->filename, link_info);
2906 if (do_this_dll)
2908 bfd *ar_tail = make_tail (output_bfd);
2909 add_bfd_to_link (ar_tail, ar_tail->filename, link_info);
2912 free (dll_symname);
2916 /* We were handed a *.DLL file. Parse it and turn it into a set of
2917 IMPORTS directives in the def file. Return TRUE if the file was
2918 handled, FALSE if not. */
2920 static unsigned int
2921 pe_get16 (bfd *abfd, int where)
2923 unsigned char b[2];
2925 bfd_seek (abfd, (file_ptr) where, SEEK_SET);
2926 bfd_bread (b, (bfd_size_type) 2, abfd);
2927 return b[0] + (b[1] << 8);
2930 static unsigned int
2931 pe_get32 (bfd *abfd, int where)
2933 unsigned char b[4];
2935 bfd_seek (abfd, (file_ptr) where, SEEK_SET);
2936 bfd_bread (b, (bfd_size_type) 4, abfd);
2937 return b[0] + (b[1] << 8) + (b[2] << 16) + (b[3] << 24);
2940 static unsigned int
2941 pe_as32 (void *ptr)
2943 unsigned char *b = ptr;
2945 return b[0] + (b[1] << 8) + (b[2] << 16) + (b[3] << 24);
2948 bfd_boolean
2949 pe_implied_import_dll (const char *filename)
2951 bfd *dll;
2952 bfd_vma pe_header_offset, opthdr_ofs, num_entries, i;
2953 bfd_vma export_rva, export_size, nsections, secptr, expptr;
2954 bfd_vma exp_funcbase;
2955 unsigned char *expdata;
2956 char *erva;
2957 bfd_vma name_rvas, ordinals, nexp, ordbase;
2958 const char *dll_name;
2959 /* Initialization with start > end guarantees that is_data
2960 will not be set by mistake, and avoids compiler warning. */
2961 bfd_vma data_start = 1;
2962 bfd_vma data_end = 0;
2963 bfd_vma rdata_start = 1;
2964 bfd_vma rdata_end = 0;
2965 bfd_vma bss_start = 1;
2966 bfd_vma bss_end = 0;
2968 /* No, I can't use bfd here. kernel32.dll puts its export table in
2969 the middle of the .rdata section. */
2970 dll = bfd_openr (filename, pe_details->target_name);
2971 if (!dll)
2973 einfo ("%Xopen %s: %E\n", filename);
2974 return FALSE;
2977 /* PEI dlls seem to be bfd_objects. */
2978 if (!bfd_check_format (dll, bfd_object))
2980 einfo ("%X%s: this doesn't appear to be a DLL\n", filename);
2981 return FALSE;
2984 /* Get pe_header, optional header and numbers of export entries. */
2985 pe_header_offset = pe_get32 (dll, 0x3c);
2986 opthdr_ofs = pe_header_offset + 4 + 20;
2987 #ifdef pe_use_x86_64
2988 num_entries = pe_get32 (dll, opthdr_ofs + 92 + 4 * 4); /* & NumberOfRvaAndSizes. */
2989 #else
2990 num_entries = pe_get32 (dll, opthdr_ofs + 92);
2991 #endif
2993 if (num_entries < 1) /* No exports. */
2994 return FALSE;
2996 #ifdef pe_use_x86_64
2997 export_rva = pe_get32 (dll, opthdr_ofs + 96 + 4 * 4);
2998 export_size = pe_get32 (dll, opthdr_ofs + 100 + 4 * 4);
2999 #else
3000 export_rva = pe_get32 (dll, opthdr_ofs + 96);
3001 export_size = pe_get32 (dll, opthdr_ofs + 100);
3002 #endif
3004 nsections = pe_get16 (dll, pe_header_offset + 4 + 2);
3005 secptr = (pe_header_offset + 4 + 20 +
3006 pe_get16 (dll, pe_header_offset + 4 + 16));
3007 expptr = 0;
3009 /* Get the rva and size of the export section. */
3010 for (i = 0; i < nsections; i++)
3012 char sname[8];
3013 bfd_vma secptr1 = secptr + 40 * i;
3014 bfd_vma vaddr = pe_get32 (dll, secptr1 + 12);
3015 bfd_vma vsize = pe_get32 (dll, secptr1 + 16);
3016 bfd_vma fptr = pe_get32 (dll, secptr1 + 20);
3018 bfd_seek (dll, (file_ptr) secptr1, SEEK_SET);
3019 bfd_bread (sname, (bfd_size_type) 8, dll);
3021 if (vaddr <= export_rva && vaddr + vsize > export_rva)
3023 expptr = fptr + (export_rva - vaddr);
3024 if (export_rva + export_size > vaddr + vsize)
3025 export_size = vsize - (export_rva - vaddr);
3026 break;
3030 /* Scan sections and store the base and size of the
3031 data and bss segments in data/base_start/end. */
3032 for (i = 0; i < nsections; i++)
3034 bfd_vma secptr1 = secptr + 40 * i;
3035 bfd_vma vsize = pe_get32 (dll, secptr1 + 8);
3036 bfd_vma vaddr = pe_get32 (dll, secptr1 + 12);
3037 bfd_vma flags = pe_get32 (dll, secptr1 + 36);
3038 char sec_name[9];
3040 sec_name[8] = '\0';
3041 bfd_seek (dll, (file_ptr) secptr1 + 0, SEEK_SET);
3042 bfd_bread (sec_name, (bfd_size_type) 8, dll);
3044 if (strcmp(sec_name,".data") == 0)
3046 data_start = vaddr;
3047 data_end = vaddr + vsize;
3049 if (pe_dll_extra_pe_debug)
3050 printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n",
3051 __FUNCTION__, sec_name, (unsigned long) vaddr,
3052 (unsigned long) (vaddr + vsize), (unsigned long) flags);
3054 else if (strcmp(sec_name,".rdata") == 0)
3056 rdata_start = vaddr;
3057 rdata_end = vaddr + vsize;
3059 if (pe_dll_extra_pe_debug)
3060 printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n",
3061 __FUNCTION__, sec_name, (unsigned long) vaddr,
3062 (unsigned long) (vaddr + vsize), (unsigned long) flags);
3064 else if (strcmp (sec_name,".bss") == 0)
3066 bss_start = vaddr;
3067 bss_end = vaddr + vsize;
3069 if (pe_dll_extra_pe_debug)
3070 printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n",
3071 __FUNCTION__, sec_name, (unsigned long) vaddr,
3072 (unsigned long) (vaddr + vsize), (unsigned long) flags);
3076 expdata = xmalloc (export_size);
3077 bfd_seek (dll, (file_ptr) expptr, SEEK_SET);
3078 bfd_bread (expdata, (bfd_size_type) export_size, dll);
3079 erva = (char *) expdata - export_rva;
3081 if (pe_def_file == 0)
3082 pe_def_file = def_file_empty ();
3084 nexp = pe_as32 (expdata + 24);
3085 name_rvas = pe_as32 (expdata + 32);
3086 ordinals = pe_as32 (expdata + 36);
3087 ordbase = pe_as32 (expdata + 16);
3088 exp_funcbase = pe_as32 (expdata + 28);
3090 /* Use internal dll name instead of filename
3091 to enable symbolic dll linking. */
3092 dll_name = erva + pe_as32 (expdata + 12);
3094 /* Check to see if the dll has already been added to
3095 the definition list and if so return without error.
3096 This avoids multiple symbol definitions. */
3097 if (def_get_module (pe_def_file, dll_name))
3099 if (pe_dll_extra_pe_debug)
3100 printf ("%s is already loaded\n", dll_name);
3101 return TRUE;
3104 /* Iterate through the list of symbols. */
3105 for (i = 0; i < nexp; i++)
3107 /* Pointer to the names vector. */
3108 bfd_vma name_rva = pe_as32 (erva + name_rvas + i * 4);
3109 def_file_import *imp;
3110 /* Pointer to the function address vector. */
3111 bfd_vma func_rva = pe_as32 (erva + exp_funcbase + i * 4);
3112 int is_data = 0;
3114 /* Skip unwanted symbols, which are
3115 exported in buggy auto-import releases. */
3116 if (! CONST_STRNEQ (erva + name_rva, "_nm_"))
3118 /* is_data is true if the address is in the data, rdata or bss
3119 segment. */
3120 is_data =
3121 (func_rva >= data_start && func_rva < data_end)
3122 || (func_rva >= rdata_start && func_rva < rdata_end)
3123 || (func_rva >= bss_start && func_rva < bss_end);
3125 imp = def_file_add_import (pe_def_file, erva + name_rva,
3126 dll_name, i, 0, NULL);
3127 /* Mark symbol type. */
3128 imp->data = is_data;
3130 if (pe_dll_extra_pe_debug)
3131 printf ("%s dll-name: %s sym: %s addr: 0x%lx %s\n",
3132 __FUNCTION__, dll_name, erva + name_rva,
3133 (unsigned long) func_rva, is_data ? "(data)" : "");
3137 return TRUE;
3140 void
3141 pe_output_file_set_long_section_names (bfd *abfd)
3143 if (pe_use_coff_long_section_names < 0)
3144 return;
3145 if (!bfd_coff_set_long_section_names (abfd, pe_use_coff_long_section_names))
3146 einfo (_("%XError: can't use long section names on this arch\n"));
3149 /* These are the main functions, called from the emulation. The first
3150 is called after the bfds are read, so we can guess at how much space
3151 we need. The second is called after everything is placed, so we
3152 can put the right values in place. */
3154 void
3155 pe_dll_build_sections (bfd *abfd, struct bfd_link_info *info)
3157 pe_dll_id_target (bfd_get_target (abfd));
3158 pe_output_file_set_long_section_names (abfd);
3159 process_def_file_and_drectve (abfd, info);
3161 if (pe_def_file->num_exports == 0 && !info->shared)
3162 return;
3164 generate_edata (abfd, info);
3165 build_filler_bfd (1);
3166 pe_output_file_set_long_section_names (filler_bfd);
3169 void
3170 pe_exe_build_sections (bfd *abfd, struct bfd_link_info *info ATTRIBUTE_UNUSED)
3172 pe_dll_id_target (bfd_get_target (abfd));
3173 pe_output_file_set_long_section_names (abfd);
3174 build_filler_bfd (0);
3175 pe_output_file_set_long_section_names (filler_bfd);
3178 void
3179 pe_dll_fill_sections (bfd *abfd, struct bfd_link_info *info)
3181 pe_dll_id_target (bfd_get_target (abfd));
3182 pe_output_file_set_long_section_names (abfd);
3183 image_base = pe_data (abfd)->pe_opthdr.ImageBase;
3185 generate_reloc (abfd, info);
3186 if (reloc_sz > 0)
3188 bfd_set_section_size (filler_bfd, reloc_s, reloc_sz);
3190 /* Resize the sections. */
3191 lang_reset_memory_regions ();
3192 lang_size_sections (NULL, TRUE);
3194 /* Redo special stuff. */
3195 ldemul_after_allocation ();
3197 /* Do the assignments again. */
3198 lang_do_assignments ();
3201 fill_edata (abfd, info);
3203 if (info->shared && !info->pie)
3204 pe_data (abfd)->dll = 1;
3206 edata_s->contents = edata_d;
3207 reloc_s->contents = reloc_d;
3210 void
3211 pe_exe_fill_sections (bfd *abfd, struct bfd_link_info *info)
3213 pe_dll_id_target (bfd_get_target (abfd));
3214 pe_output_file_set_long_section_names (abfd);
3215 image_base = pe_data (abfd)->pe_opthdr.ImageBase;
3217 generate_reloc (abfd, info);
3218 if (reloc_sz > 0)
3220 bfd_set_section_size (filler_bfd, reloc_s, reloc_sz);
3222 /* Resize the sections. */
3223 lang_reset_memory_regions ();
3224 lang_size_sections (NULL, TRUE);
3226 /* Redo special stuff. */
3227 ldemul_after_allocation ();
3229 /* Do the assignments again. */
3230 lang_do_assignments ();
3232 reloc_s->contents = reloc_d;
3235 bfd_boolean
3236 pe_bfd_is_dll (bfd *abfd)
3238 return (bfd_get_format (abfd) == bfd_object
3239 && obj_pe (abfd)
3240 && pe_data (abfd)->dll);