* NEWS: Mention addition of elfedit.
[binutils.git] / ld / pe-dll.c
blob2ddbdc16c4dfacde5406cb7ca3a9af08737a76fc
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;
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_wrapped_link_hash_lookup (abfd, info, sym->name,
1365 FALSE, FALSE, FALSE);
1366 if (blhe && blhe->type == bfd_link_hash_undefweak)
1368 /* Check aux sym and see if it is defined or not. */
1369 struct coff_link_hash_entry *h, *h2;
1370 h = (struct coff_link_hash_entry *)blhe;
1371 if (h->symbol_class != C_NT_WEAK || h->numaux != 1)
1372 continue;
1373 h2 = h->auxbfd->tdata.coff_obj_data->sym_hashes
1374 [h->aux->x_sym.x_tagndx.l];
1375 /* We don't want a base reloc if the aux sym is not
1376 found, undefined, or if it is the constant ABS
1377 zero default value. (We broaden that slightly by
1378 not testing the value, just the section; there's
1379 no reason we'd want a reference to any absolute
1380 address to get relocated during rebasing). */
1381 if (!h2 || h2->root.type == bfd_link_hash_undefined
1382 || h2->root.u.def.section == &bfd_abs_section)
1383 continue;
1385 else if (!blhe || blhe->type != bfd_link_hash_defined)
1386 continue;
1389 sym_vma = (relocs[i]->addend
1390 + sym->value
1391 + sym->section->vma
1392 + sym->section->output_offset
1393 + sym->section->output_section->vma);
1394 reloc_data[total_relocs].vma = sec_vma + relocs[i]->address;
1396 #define BITS_AND_SHIFT(bits, shift) (bits * 1000 | shift)
1398 switch BITS_AND_SHIFT (relocs[i]->howto->bitsize,
1399 relocs[i]->howto->rightshift)
1401 #ifdef pe_use_x86_64
1402 case BITS_AND_SHIFT (64, 0):
1403 reloc_data[total_relocs].type = 10;
1404 total_relocs++;
1405 break;
1406 #endif
1407 case BITS_AND_SHIFT (32, 0):
1408 reloc_data[total_relocs].type = 3;
1409 total_relocs++;
1410 break;
1411 case BITS_AND_SHIFT (16, 0):
1412 reloc_data[total_relocs].type = 2;
1413 total_relocs++;
1414 break;
1415 case BITS_AND_SHIFT (16, 16):
1416 reloc_data[total_relocs].type = 4;
1417 /* FIXME: we can't know the symbol's right value
1418 yet, but we probably can safely assume that
1419 CE will relocate us in 64k blocks, so leaving
1420 it zero is safe. */
1421 reloc_data[total_relocs].extra = 0;
1422 total_relocs++;
1423 break;
1424 case BITS_AND_SHIFT (26, 2):
1425 reloc_data[total_relocs].type = 5;
1426 total_relocs++;
1427 break;
1428 case BITS_AND_SHIFT (24, 2):
1429 /* FIXME: 0 is ARM_26D, it is defined in bfd/coff-arm.c
1430 Those ARM_xxx definitions should go in proper
1431 header someday. */
1432 if (relocs[i]->howto->type == 0
1433 /* Older GNU linkers used 5 instead of 0 for this reloc. */
1434 || relocs[i]->howto->type == 5)
1435 /* This is an ARM_26D reloc, which is an ARM_26 reloc
1436 that has already been fully processed during a
1437 previous link stage, so ignore it here. */
1438 break;
1439 /* Fall through. */
1440 default:
1441 /* xgettext:c-format */
1442 einfo (_("%XError: %d-bit reloc in dll\n"),
1443 relocs[i]->howto->bitsize);
1444 break;
1448 free (relocs);
1449 /* Warning: the allocated symbols are remembered in BFD and
1450 reused later, so don't free them! */
1454 /* At this point, we have total_relocs relocation addresses in
1455 reloc_addresses, which are all suitable for the .reloc section.
1456 We must now create the new sections. */
1457 qsort (reloc_data, total_relocs, sizeof (*reloc_data), reloc_sort);
1459 for (i = 0; i < total_relocs; i++)
1461 bfd_vma this_page = (reloc_data[i].vma >> 12);
1463 if (this_page != sec_page)
1465 reloc_sz = (reloc_sz + 3) & ~3; /* 4-byte align. */
1466 reloc_sz += 8;
1467 sec_page = this_page;
1470 reloc_sz += 2;
1472 if (reloc_data[i].type == 4)
1473 reloc_sz += 2;
1476 reloc_sz = (reloc_sz + 3) & ~3; /* 4-byte align. */
1477 reloc_d = xmalloc (reloc_sz);
1478 sec_page = (bfd_vma) -1;
1479 reloc_sz = 0;
1480 page_ptr = (bfd_vma) -1;
1481 page_count = 0;
1483 for (i = 0; i < total_relocs; i++)
1485 bfd_vma rva = reloc_data[i].vma - image_base;
1486 bfd_vma this_page = (rva & ~0xfff);
1488 if (this_page != sec_page)
1490 while (reloc_sz & 3)
1491 reloc_d[reloc_sz++] = 0;
1493 if (page_ptr != (bfd_vma) -1)
1494 bfd_put_32 (abfd, reloc_sz - page_ptr, reloc_d + page_ptr + 4);
1496 bfd_put_32 (abfd, this_page, reloc_d + reloc_sz);
1497 page_ptr = reloc_sz;
1498 reloc_sz += 8;
1499 sec_page = this_page;
1500 page_count = 0;
1503 bfd_put_16 (abfd, (rva & 0xfff) + (reloc_data[i].type << 12),
1504 reloc_d + reloc_sz);
1505 reloc_sz += 2;
1507 if (reloc_data[i].type == 4)
1509 bfd_put_16 (abfd, reloc_data[i].extra, reloc_d + reloc_sz);
1510 reloc_sz += 2;
1513 page_count++;
1516 while (reloc_sz & 3)
1517 reloc_d[reloc_sz++] = 0;
1519 if (page_ptr != (bfd_vma) -1)
1520 bfd_put_32 (abfd, reloc_sz - page_ptr, reloc_d + page_ptr + 4);
1522 while (reloc_sz < reloc_s->size)
1523 reloc_d[reloc_sz++] = 0;
1526 /* Given the exiting def_file structure, print out a .DEF file that
1527 corresponds to it. */
1529 static void
1530 quoteput (char *s, FILE *f, int needs_quotes)
1532 char *cp;
1534 for (cp = s; *cp; cp++)
1535 if (*cp == '\''
1536 || *cp == '"'
1537 || *cp == '\\'
1538 || ISSPACE (*cp)
1539 || *cp == ','
1540 || *cp == ';')
1541 needs_quotes = 1;
1543 if (needs_quotes)
1545 putc ('"', f);
1547 while (*s)
1549 if (*s == '"' || *s == '\\')
1550 putc ('\\', f);
1552 putc (*s, f);
1553 s++;
1556 putc ('"', f);
1558 else
1559 fputs (s, f);
1562 void
1563 pe_dll_generate_def_file (const char *pe_out_def_filename)
1565 int i;
1566 FILE *out = fopen (pe_out_def_filename, "w");
1568 if (out == NULL)
1569 /* xgettext:c-format */
1570 einfo (_("%s: Can't open output def file %s\n"),
1571 program_name, pe_out_def_filename);
1573 if (pe_def_file)
1575 if (pe_def_file->name)
1577 if (pe_def_file->is_dll)
1578 fprintf (out, "LIBRARY ");
1579 else
1580 fprintf (out, "NAME ");
1582 quoteput (pe_def_file->name, out, 1);
1584 if (pe_data (link_info.output_bfd)->pe_opthdr.ImageBase)
1586 fprintf (out, " BASE=0x");
1587 fprintf_vma (out, ((bfd_vma) pe_data (link_info.output_bfd)->pe_opthdr.ImageBase));
1589 fprintf (out, "\n");
1592 if (pe_def_file->description)
1594 fprintf (out, "DESCRIPTION ");
1595 quoteput (pe_def_file->description, out, 1);
1596 fprintf (out, "\n");
1599 if (pe_def_file->version_minor != -1)
1600 fprintf (out, "VERSION %d.%d\n", pe_def_file->version_major,
1601 pe_def_file->version_minor);
1602 else if (pe_def_file->version_major != -1)
1603 fprintf (out, "VERSION %d\n", pe_def_file->version_major);
1605 if (pe_def_file->stack_reserve != -1 || pe_def_file->heap_reserve != -1)
1606 fprintf (out, "\n");
1608 if (pe_def_file->stack_commit != -1)
1609 fprintf (out, "STACKSIZE 0x%x,0x%x\n",
1610 pe_def_file->stack_reserve, pe_def_file->stack_commit);
1611 else if (pe_def_file->stack_reserve != -1)
1612 fprintf (out, "STACKSIZE 0x%x\n", pe_def_file->stack_reserve);
1614 if (pe_def_file->heap_commit != -1)
1615 fprintf (out, "HEAPSIZE 0x%x,0x%x\n",
1616 pe_def_file->heap_reserve, pe_def_file->heap_commit);
1617 else if (pe_def_file->heap_reserve != -1)
1618 fprintf (out, "HEAPSIZE 0x%x\n", pe_def_file->heap_reserve);
1620 if (pe_def_file->num_section_defs > 0)
1622 fprintf (out, "\nSECTIONS\n\n");
1624 for (i = 0; i < pe_def_file->num_section_defs; i++)
1626 fprintf (out, " ");
1627 quoteput (pe_def_file->section_defs[i].name, out, 0);
1629 if (pe_def_file->section_defs[i].class)
1631 fprintf (out, " CLASS ");
1632 quoteput (pe_def_file->section_defs[i].class, out, 0);
1635 if (pe_def_file->section_defs[i].flag_read)
1636 fprintf (out, " READ");
1638 if (pe_def_file->section_defs[i].flag_write)
1639 fprintf (out, " WRITE");
1641 if (pe_def_file->section_defs[i].flag_execute)
1642 fprintf (out, " EXECUTE");
1644 if (pe_def_file->section_defs[i].flag_shared)
1645 fprintf (out, " SHARED");
1647 fprintf (out, "\n");
1651 if (pe_def_file->num_exports > 0)
1653 fprintf (out, "EXPORTS\n");
1655 for (i = 0; i < pe_def_file->num_exports; i++)
1657 def_file_export *e = pe_def_file->exports + i;
1658 fprintf (out, " ");
1659 quoteput (e->name, out, 0);
1661 if (e->internal_name && strcmp (e->internal_name, e->name))
1663 fprintf (out, " = ");
1664 quoteput (e->internal_name, out, 0);
1667 if (e->ordinal != -1)
1668 fprintf (out, " @%d", e->ordinal);
1670 if (e->flag_private)
1671 fprintf (out, " PRIVATE");
1673 if (e->flag_constant)
1674 fprintf (out, " CONSTANT");
1676 if (e->flag_noname)
1677 fprintf (out, " NONAME");
1679 if (e->flag_data)
1680 fprintf (out, " DATA");
1682 fprintf (out, "\n");
1686 if (pe_def_file->num_imports > 0)
1688 fprintf (out, "\nIMPORTS\n\n");
1690 for (i = 0; i < pe_def_file->num_imports; i++)
1692 def_file_import *im = pe_def_file->imports + i;
1693 fprintf (out, " ");
1695 if (im->internal_name
1696 && (!im->name || strcmp (im->internal_name, im->name)))
1698 quoteput (im->internal_name, out, 0);
1699 fprintf (out, " = ");
1702 quoteput (im->module->name, out, 0);
1703 fprintf (out, ".");
1705 if (im->name)
1706 quoteput (im->name, out, 0);
1707 else
1708 fprintf (out, "%d", im->ordinal);
1710 if (im->its_name)
1712 fprintf (out, " == ");
1713 quoteput (im->its_name, out, 0);
1716 fprintf (out, "\n");
1720 else
1721 fprintf (out, _("; no contents available\n"));
1723 if (fclose (out) == EOF)
1724 /* xgettext:c-format */
1725 einfo (_("%P: Error closing file `%s'\n"), pe_out_def_filename);
1728 /* Generate the import library. */
1730 static asymbol **symtab;
1731 static int symptr;
1732 static int tmp_seq;
1733 static int tmp_seq2;
1734 static const char *dll_filename;
1735 static char *dll_symname;
1737 #define UNDSEC (asection *) &bfd_und_section
1739 static asection *
1740 quick_section (bfd *abfd, const char *name, int flags, int align)
1742 asection *sec;
1743 asymbol *sym;
1745 sec = bfd_make_section_old_way (abfd, name);
1746 bfd_set_section_flags (abfd, sec, flags | SEC_ALLOC | SEC_LOAD | SEC_KEEP);
1747 bfd_set_section_alignment (abfd, sec, align);
1748 /* Remember to undo this before trying to link internally! */
1749 sec->output_section = sec;
1751 sym = bfd_make_empty_symbol (abfd);
1752 symtab[symptr++] = sym;
1753 sym->name = sec->name;
1754 sym->section = sec;
1755 sym->flags = BSF_LOCAL;
1756 sym->value = 0;
1758 return sec;
1761 static void
1762 quick_symbol (bfd *abfd,
1763 const char *n1,
1764 const char *n2,
1765 const char *n3,
1766 asection *sec,
1767 int flags,
1768 int addr)
1770 asymbol *sym;
1771 char *name = xmalloc (strlen (n1) + strlen (n2) + strlen (n3) + 1);
1773 strcpy (name, n1);
1774 strcat (name, n2);
1775 strcat (name, n3);
1776 sym = bfd_make_empty_symbol (abfd);
1777 sym->name = name;
1778 sym->section = sec;
1779 sym->flags = flags;
1780 sym->value = addr;
1781 symtab[symptr++] = sym;
1784 static arelent *reltab = 0;
1785 static int relcount = 0, relsize = 0;
1787 static void
1788 quick_reloc (bfd *abfd, bfd_size_type address, int which_howto, int symidx)
1790 if (relcount >= relsize - 1)
1792 relsize += 10;
1793 if (reltab)
1794 reltab = xrealloc (reltab, relsize * sizeof (arelent));
1795 else
1796 reltab = xmalloc (relsize * sizeof (arelent));
1798 reltab[relcount].address = address;
1799 reltab[relcount].addend = 0;
1800 reltab[relcount].howto = bfd_reloc_type_lookup (abfd, which_howto);
1801 reltab[relcount].sym_ptr_ptr = symtab + symidx;
1802 relcount++;
1805 static void
1806 save_relocs (asection *sec)
1808 int i;
1810 sec->relocation = reltab;
1811 sec->reloc_count = relcount;
1812 sec->orelocation = xmalloc ((relcount + 1) * sizeof (arelent *));
1813 for (i = 0; i < relcount; i++)
1814 sec->orelocation[i] = sec->relocation + i;
1815 sec->orelocation[relcount] = 0;
1816 sec->flags |= SEC_RELOC;
1817 reltab = 0;
1818 relcount = relsize = 0;
1821 /* .section .idata$2
1822 .global __head_my_dll
1823 __head_my_dll:
1824 .rva hname
1825 .long 0
1826 .long 0
1827 .rva __my_dll_iname
1828 .rva fthunk
1830 .section .idata$5
1831 .long 0
1832 fthunk:
1834 .section .idata$4
1835 .long 0
1836 hname: */
1838 static bfd *
1839 make_head (bfd *parent)
1841 asection *id2, *id5, *id4;
1842 unsigned char *d2, *d5, *d4;
1843 char *oname;
1844 bfd *abfd;
1846 oname = xmalloc (20);
1847 sprintf (oname, "d%06d.o", tmp_seq);
1848 tmp_seq++;
1850 abfd = bfd_create (oname, parent);
1851 bfd_find_target (pe_details->object_target, abfd);
1852 bfd_make_writable (abfd);
1854 bfd_set_format (abfd, bfd_object);
1855 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
1857 symptr = 0;
1858 symtab = xmalloc (6 * sizeof (asymbol *));
1859 id2 = quick_section (abfd, ".idata$2", SEC_HAS_CONTENTS, 2);
1860 id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
1861 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
1862 quick_symbol (abfd, U ("_head_"), dll_symname, "", id2, BSF_GLOBAL, 0);
1863 quick_symbol (abfd, U (""), dll_symname, "_iname", UNDSEC, BSF_GLOBAL, 0);
1865 /* OK, pay attention here. I got confused myself looking back at
1866 it. We create a four-byte section to mark the beginning of the
1867 list, and we include an offset of 4 in the section, so that the
1868 pointer to the list points to the *end* of this section, which is
1869 the start of the list of sections from other objects. */
1871 bfd_set_section_size (abfd, id2, 20);
1872 d2 = xmalloc (20);
1873 id2->contents = d2;
1874 memset (d2, 0, 20);
1875 if (pe_use_nul_prefixed_import_tables)
1876 d2[0] = d2[16] = PE_IDATA5_SIZE; /* Reloc addend. */
1877 quick_reloc (abfd, 0, BFD_RELOC_RVA, 2);
1878 quick_reloc (abfd, 12, BFD_RELOC_RVA, 4);
1879 quick_reloc (abfd, 16, BFD_RELOC_RVA, 1);
1880 save_relocs (id2);
1882 if (pe_use_nul_prefixed_import_tables)
1883 bfd_set_section_size (abfd, id5, PE_IDATA5_SIZE);
1884 else
1885 bfd_set_section_size (abfd, id5, 0);
1886 d5 = xmalloc (PE_IDATA5_SIZE);
1887 id5->contents = d5;
1888 memset (d5, 0, PE_IDATA5_SIZE);
1889 if (pe_use_nul_prefixed_import_tables)
1890 bfd_set_section_size (abfd, id4, PE_IDATA4_SIZE);
1891 else
1892 bfd_set_section_size (abfd, id4, 0);
1893 d4 = xmalloc (PE_IDATA4_SIZE);
1894 id4->contents = d4;
1895 memset (d4, 0, PE_IDATA4_SIZE);
1897 bfd_set_symtab (abfd, symtab, symptr);
1899 bfd_set_section_contents (abfd, id2, d2, 0, 20);
1900 if (pe_use_nul_prefixed_import_tables)
1902 bfd_set_section_contents (abfd, id5, d5, 0, PE_IDATA5_SIZE);
1903 bfd_set_section_contents (abfd, id4, d4, 0, PE_IDATA4_SIZE);
1905 else
1907 bfd_set_section_contents (abfd, id5, d5, 0, 0);
1908 bfd_set_section_contents (abfd, id4, d4, 0, 0);
1911 bfd_make_readable (abfd);
1912 return abfd;
1915 /* .section .idata$4
1916 .long 0
1917 [.long 0] for PE+
1918 .section .idata$5
1919 .long 0
1920 [.long 0] for PE+
1921 .section idata$7
1922 .global __my_dll_iname
1923 __my_dll_iname:
1924 .asciz "my.dll" */
1926 static bfd *
1927 make_tail (bfd *parent)
1929 asection *id4, *id5, *id7;
1930 unsigned char *d4, *d5, *d7;
1931 int len;
1932 char *oname;
1933 bfd *abfd;
1935 oname = xmalloc (20);
1936 sprintf (oname, "d%06d.o", tmp_seq);
1937 tmp_seq++;
1939 abfd = bfd_create (oname, parent);
1940 bfd_find_target (pe_details->object_target, abfd);
1941 bfd_make_writable (abfd);
1943 bfd_set_format (abfd, bfd_object);
1944 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
1946 symptr = 0;
1947 symtab = xmalloc (5 * sizeof (asymbol *));
1948 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
1949 id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
1950 id7 = quick_section (abfd, ".idata$7", SEC_HAS_CONTENTS, 2);
1951 quick_symbol (abfd, U (""), dll_symname, "_iname", id7, BSF_GLOBAL, 0);
1953 bfd_set_section_size (abfd, id4, PE_IDATA4_SIZE);
1954 d4 = xmalloc (PE_IDATA4_SIZE);
1955 id4->contents = d4;
1956 memset (d4, 0, PE_IDATA4_SIZE);
1958 bfd_set_section_size (abfd, id5, PE_IDATA5_SIZE);
1959 d5 = xmalloc (PE_IDATA5_SIZE);
1960 id5->contents = d5;
1961 memset (d5, 0, PE_IDATA5_SIZE);
1963 len = strlen (dll_filename) + 1;
1964 if (len & 1)
1965 len++;
1966 bfd_set_section_size (abfd, id7, len);
1967 d7 = xmalloc (len);
1968 id7->contents = d7;
1969 strcpy ((char *) d7, dll_filename);
1970 /* If len was odd, the above
1971 strcpy leaves behind an undefined byte. That is harmless,
1972 but we set it to 0 just so the binary dumps are pretty. */
1973 d7[len - 1] = 0;
1975 bfd_set_symtab (abfd, symtab, symptr);
1977 bfd_set_section_contents (abfd, id4, d4, 0, PE_IDATA4_SIZE);
1978 bfd_set_section_contents (abfd, id5, d5, 0, PE_IDATA5_SIZE);
1979 bfd_set_section_contents (abfd, id7, d7, 0, len);
1981 bfd_make_readable (abfd);
1982 return abfd;
1985 /* .text
1986 .global _function
1987 .global ___imp_function
1988 .global __imp__function
1989 _function:
1990 jmp *__imp__function:
1992 .section idata$7
1993 .long __head_my_dll
1995 .section .idata$5
1996 ___imp_function:
1997 __imp__function:
1998 iat?
1999 .section .idata$4
2000 iat?
2001 .section .idata$6
2002 ID<ordinal>:
2003 .short <hint>
2004 .asciz "function" xlate? (add underscore, kill at) */
2006 static const unsigned char jmp_ix86_bytes[] =
2008 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x90, 0x90
2011 /* _function:
2012 mov.l ip+8,r0
2013 mov.l @r0,r0
2014 jmp @r0
2016 .dw __imp_function */
2018 static const unsigned char jmp_sh_bytes[] =
2020 0x01, 0xd0, 0x02, 0x60, 0x2b, 0x40, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00
2023 /* _function:
2024 lui $t0,<high:__imp_function>
2025 lw $t0,<low:__imp_function>
2026 jr $t0
2027 nop */
2029 static const unsigned char jmp_mips_bytes[] =
2031 0x00, 0x00, 0x08, 0x3c, 0x00, 0x00, 0x08, 0x8d,
2032 0x08, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00
2035 static const unsigned char jmp_arm_bytes[] =
2037 0x00, 0xc0, 0x9f, 0xe5, /* ldr ip, [pc] */
2038 0x00, 0xf0, 0x9c, 0xe5, /* ldr pc, [ip] */
2039 0, 0, 0, 0
2043 static bfd *
2044 make_one (def_file_export *exp, bfd *parent, bfd_boolean include_jmp_stub)
2046 asection *tx, *id7, *id5, *id4, *id6;
2047 unsigned char *td = NULL, *d7, *d5, *d4, *d6 = NULL;
2048 int len;
2049 char *oname;
2050 bfd *abfd;
2051 const unsigned char *jmp_bytes = NULL;
2052 int jmp_byte_count = 0;
2054 /* Include the jump stub section only if it is needed. A jump
2055 stub is needed if the symbol being imported <sym> is a function
2056 symbol and there is at least one undefined reference to that
2057 symbol. In other words, if all the import references to <sym> are
2058 explicitly through _declspec(dllimport) then the jump stub is not
2059 needed. */
2060 if (include_jmp_stub)
2062 switch (pe_details->pe_arch)
2064 case PE_ARCH_i386:
2065 jmp_bytes = jmp_ix86_bytes;
2066 jmp_byte_count = sizeof (jmp_ix86_bytes);
2067 break;
2068 case PE_ARCH_sh:
2069 jmp_bytes = jmp_sh_bytes;
2070 jmp_byte_count = sizeof (jmp_sh_bytes);
2071 break;
2072 case PE_ARCH_mips:
2073 jmp_bytes = jmp_mips_bytes;
2074 jmp_byte_count = sizeof (jmp_mips_bytes);
2075 break;
2076 case PE_ARCH_arm:
2077 case PE_ARCH_arm_epoc:
2078 case PE_ARCH_arm_wince:
2079 jmp_bytes = jmp_arm_bytes;
2080 jmp_byte_count = sizeof (jmp_arm_bytes);
2081 break;
2082 default:
2083 abort ();
2087 oname = xmalloc (20);
2088 sprintf (oname, "d%06d.o", tmp_seq);
2089 tmp_seq++;
2091 abfd = bfd_create (oname, parent);
2092 bfd_find_target (pe_details->object_target, abfd);
2093 bfd_make_writable (abfd);
2095 bfd_set_format (abfd, bfd_object);
2096 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2098 symptr = 0;
2099 symtab = xmalloc (11 * sizeof (asymbol *));
2100 tx = quick_section (abfd, ".text", SEC_CODE|SEC_HAS_CONTENTS, 2);
2101 id7 = quick_section (abfd, ".idata$7", SEC_HAS_CONTENTS, 2);
2102 id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
2103 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
2104 id6 = quick_section (abfd, ".idata$6", SEC_HAS_CONTENTS, 2);
2106 if (*exp->internal_name == '@')
2108 quick_symbol (abfd, U ("_head_"), dll_symname, "", UNDSEC,
2109 BSF_GLOBAL, 0);
2110 if (include_jmp_stub)
2111 quick_symbol (abfd, "", exp->internal_name, "", tx, BSF_GLOBAL, 0);
2112 quick_symbol (abfd, "__imp_", exp->internal_name, "", id5,
2113 BSF_GLOBAL, 0);
2114 /* Fastcall applies only to functions,
2115 so no need for auto-import symbol. */
2117 else
2119 quick_symbol (abfd, U ("_head_"), dll_symname, "", UNDSEC,
2120 BSF_GLOBAL, 0);
2121 if (include_jmp_stub)
2122 quick_symbol (abfd, U (""), exp->internal_name, "", tx,
2123 BSF_GLOBAL, 0);
2124 quick_symbol (abfd, "__imp_", U (""), exp->internal_name, id5,
2125 BSF_GLOBAL, 0);
2126 /* Symbol to reference ord/name of imported
2127 data symbol, used to implement auto-import. */
2128 if (exp->flag_data)
2129 quick_symbol (abfd, U ("_nm_"), U (""), exp->internal_name, id6,
2130 BSF_GLOBAL,0);
2132 if (pe_dll_compat_implib)
2133 quick_symbol (abfd, U ("__imp_"), exp->internal_name, "", id5,
2134 BSF_GLOBAL, 0);
2136 if (include_jmp_stub)
2138 bfd_set_section_size (abfd, tx, jmp_byte_count);
2139 td = xmalloc (jmp_byte_count);
2140 tx->contents = td;
2141 memcpy (td, jmp_bytes, jmp_byte_count);
2143 switch (pe_details->pe_arch)
2145 case PE_ARCH_i386:
2146 #ifdef pe_use_x86_64
2147 quick_reloc (abfd, 2, BFD_RELOC_32_PCREL, 2);
2148 #else
2149 quick_reloc (abfd, 2, BFD_RELOC_32, 2);
2150 #endif
2151 break;
2152 case PE_ARCH_sh:
2153 quick_reloc (abfd, 8, BFD_RELOC_32, 2);
2154 break;
2155 case PE_ARCH_mips:
2156 quick_reloc (abfd, 0, BFD_RELOC_HI16_S, 2);
2157 quick_reloc (abfd, 0, BFD_RELOC_LO16, 0); /* MIPS_R_PAIR */
2158 quick_reloc (abfd, 4, BFD_RELOC_LO16, 2);
2159 break;
2160 case PE_ARCH_arm:
2161 case PE_ARCH_arm_epoc:
2162 case PE_ARCH_arm_wince:
2163 quick_reloc (abfd, 8, BFD_RELOC_32, 2);
2164 break;
2165 default:
2166 abort ();
2168 save_relocs (tx);
2170 else
2171 bfd_set_section_size (abfd, tx, 0);
2173 bfd_set_section_size (abfd, id7, 4);
2174 d7 = xmalloc (4);
2175 id7->contents = d7;
2176 memset (d7, 0, 4);
2177 quick_reloc (abfd, 0, BFD_RELOC_RVA, 5);
2178 save_relocs (id7);
2180 bfd_set_section_size (abfd, id5, PE_IDATA5_SIZE);
2181 d5 = xmalloc (PE_IDATA5_SIZE);
2182 id5->contents = d5;
2183 memset (d5, 0, PE_IDATA5_SIZE);
2185 if (exp->flag_noname)
2187 d5[0] = exp->ordinal;
2188 d5[1] = exp->ordinal >> 8;
2189 d5[PE_IDATA5_SIZE - 1] = 0x80;
2191 else
2193 quick_reloc (abfd, 0, BFD_RELOC_RVA, 4);
2194 save_relocs (id5);
2197 bfd_set_section_size (abfd, id4, PE_IDATA4_SIZE);
2198 d4 = xmalloc (PE_IDATA4_SIZE);
2199 id4->contents = d4;
2200 memset (d4, 0, PE_IDATA4_SIZE);
2202 if (exp->flag_noname)
2204 d4[0] = exp->ordinal;
2205 d4[1] = exp->ordinal >> 8;
2206 d4[PE_IDATA4_SIZE - 1] = 0x80;
2208 else
2210 quick_reloc (abfd, 0, BFD_RELOC_RVA, 4);
2211 save_relocs (id4);
2214 if (exp->flag_noname)
2216 len = 0;
2217 bfd_set_section_size (abfd, id6, 0);
2219 else
2221 /* { short, asciz } */
2222 if (exp->its_name)
2223 len = 2 + strlen (exp->its_name) + 1;
2224 else
2225 len = 2 + strlen (exp->name) + 1;
2226 if (len & 1)
2227 len++;
2228 bfd_set_section_size (abfd, id6, len);
2229 d6 = xmalloc (len);
2230 id6->contents = d6;
2231 memset (d6, 0, len);
2232 d6[0] = exp->hint & 0xff;
2233 d6[1] = exp->hint >> 8;
2234 if (exp->its_name)
2235 strcpy ((char*) d6 + 2, exp->its_name);
2236 else
2237 strcpy ((char *) d6 + 2, exp->name);
2240 bfd_set_symtab (abfd, symtab, symptr);
2242 if (include_jmp_stub)
2243 bfd_set_section_contents (abfd, tx, td, 0, jmp_byte_count);
2244 bfd_set_section_contents (abfd, id7, d7, 0, 4);
2245 bfd_set_section_contents (abfd, id5, d5, 0, PE_IDATA5_SIZE);
2246 bfd_set_section_contents (abfd, id4, d4, 0, PE_IDATA4_SIZE);
2247 if (!exp->flag_noname)
2248 bfd_set_section_contents (abfd, id6, d6, 0, len);
2250 bfd_make_readable (abfd);
2251 return abfd;
2254 static bfd *
2255 make_singleton_name_imp (const char *import, bfd *parent)
2257 /* Name thunks go to idata$4. */
2258 asection *id5;
2259 unsigned char *d5;
2260 char *oname;
2261 bfd *abfd;
2263 oname = xmalloc (20);
2264 sprintf (oname, "nmimp%06d.o", tmp_seq2);
2265 tmp_seq2++;
2267 abfd = bfd_create (oname, parent);
2268 bfd_find_target (pe_details->object_target, abfd);
2269 bfd_make_writable (abfd);
2271 bfd_set_format (abfd, bfd_object);
2272 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2274 symptr = 0;
2275 symtab = xmalloc (3 * sizeof (asymbol *));
2276 id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
2277 quick_symbol (abfd, U ("_imp_"), import, "", id5, BSF_GLOBAL, 0);
2279 /* We need space for the real thunk and for the null terminator. */
2280 bfd_set_section_size (abfd, id5, PE_IDATA5_SIZE * 2);
2281 d5 = xmalloc (PE_IDATA5_SIZE * 2);
2282 id5->contents = d5;
2283 memset (d5, 0, PE_IDATA5_SIZE * 2);
2284 quick_reloc (abfd, 0, BFD_RELOC_RVA, 2);
2285 save_relocs (id5);
2287 bfd_set_symtab (abfd, symtab, symptr);
2289 bfd_set_section_contents (abfd, id5, d5, 0, PE_IDATA4_SIZE * 2);
2291 bfd_make_readable (abfd);
2292 return abfd;
2295 static bfd *
2296 make_singleton_name_thunk (const char *import, bfd *parent)
2298 /* Name thunks go to idata$4. */
2299 asection *id4;
2300 unsigned char *d4;
2301 char *oname;
2302 bfd *abfd;
2304 oname = xmalloc (20);
2305 sprintf (oname, "nmth%06d.o", tmp_seq);
2306 tmp_seq++;
2308 abfd = bfd_create (oname, parent);
2309 bfd_find_target (pe_details->object_target, abfd);
2310 bfd_make_writable (abfd);
2312 bfd_set_format (abfd, bfd_object);
2313 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2315 symptr = 0;
2316 symtab = xmalloc (3 * sizeof (asymbol *));
2317 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
2318 quick_symbol (abfd, U ("_nm_thnk_"), import, "", id4, BSF_GLOBAL, 0);
2319 quick_symbol (abfd, U ("_nm_"), import, "", UNDSEC, BSF_GLOBAL, 0);
2321 /* We need space for the real thunk and for the null terminator. */
2322 bfd_set_section_size (abfd, id4, PE_IDATA4_SIZE * 2);
2323 d4 = xmalloc (PE_IDATA4_SIZE * 2);
2324 id4->contents = d4;
2325 memset (d4, 0, PE_IDATA4_SIZE * 2);
2326 quick_reloc (abfd, 0, BFD_RELOC_RVA, 2);
2327 save_relocs (id4);
2329 bfd_set_symtab (abfd, symtab, symptr);
2331 bfd_set_section_contents (abfd, id4, d4, 0, PE_IDATA4_SIZE * 2);
2333 bfd_make_readable (abfd);
2334 return abfd;
2337 static char *
2338 make_import_fixup_mark (arelent *rel)
2340 /* We convert reloc to symbol, for later reference. */
2341 static int counter;
2342 static char *fixup_name = NULL;
2343 static size_t buffer_len = 0;
2345 struct bfd_symbol *sym = *rel->sym_ptr_ptr;
2347 bfd *abfd = bfd_asymbol_bfd (sym);
2348 struct bfd_link_hash_entry *bh;
2350 if (!fixup_name)
2352 fixup_name = xmalloc (384);
2353 buffer_len = 384;
2356 if (strlen (sym->name) + 25 > buffer_len)
2357 /* Assume 25 chars for "__fu" + counter + "_". If counter is
2358 bigger than 20 digits long, we've got worse problems than
2359 overflowing this buffer... */
2361 free (fixup_name);
2362 /* New buffer size is length of symbol, plus 25, but
2363 then rounded up to the nearest multiple of 128. */
2364 buffer_len = ((strlen (sym->name) + 25) + 127) & ~127;
2365 fixup_name = xmalloc (buffer_len);
2368 sprintf (fixup_name, "__fu%d_%s", counter++, sym->name);
2370 bh = NULL;
2371 bfd_coff_link_add_one_symbol (&link_info, abfd, fixup_name, BSF_GLOBAL,
2372 current_sec, /* sym->section, */
2373 rel->address, NULL, TRUE, FALSE, &bh);
2375 return fixup_name;
2378 /* .section .idata$2
2379 .rva __nm_thnk_SYM (singleton thunk with name of func)
2380 .long 0
2381 .long 0
2382 .rva __my_dll_iname (name of dll)
2383 .rva __fuNN_SYM (pointer to reference (address) in text) */
2385 static bfd *
2386 make_import_fixup_entry (const char *name,
2387 const char *fixup_name,
2388 const char *symname,
2389 bfd *parent)
2391 asection *id2;
2392 unsigned char *d2;
2393 char *oname;
2394 bfd *abfd;
2396 oname = xmalloc (20);
2397 sprintf (oname, "fu%06d.o", tmp_seq);
2398 tmp_seq++;
2400 abfd = bfd_create (oname, parent);
2401 bfd_find_target (pe_details->object_target, abfd);
2402 bfd_make_writable (abfd);
2404 bfd_set_format (abfd, bfd_object);
2405 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2407 symptr = 0;
2408 symtab = xmalloc (6 * sizeof (asymbol *));
2409 id2 = quick_section (abfd, ".idata$2", SEC_HAS_CONTENTS, 2);
2411 quick_symbol (abfd, U ("_nm_thnk_"), name, "", UNDSEC, BSF_GLOBAL, 0);
2412 quick_symbol (abfd, U (""), symname, "_iname", UNDSEC, BSF_GLOBAL, 0);
2413 /* For relocator v2 we have to use the .idata$5 element and not
2414 fixup_name. */
2415 if (link_info.pei386_runtime_pseudo_reloc == 2)
2416 quick_symbol (abfd, U ("_imp_"), name, "", UNDSEC, BSF_GLOBAL, 0);
2417 else
2418 quick_symbol (abfd, "", fixup_name, "", UNDSEC, BSF_GLOBAL, 0);
2420 bfd_set_section_size (abfd, id2, 20);
2421 d2 = xmalloc (20);
2422 id2->contents = d2;
2423 memset (d2, 0, 20);
2425 quick_reloc (abfd, 0, BFD_RELOC_RVA, 1);
2426 quick_reloc (abfd, 12, BFD_RELOC_RVA, 2);
2427 quick_reloc (abfd, 16, BFD_RELOC_RVA, 3);
2428 save_relocs (id2);
2430 bfd_set_symtab (abfd, symtab, symptr);
2432 bfd_set_section_contents (abfd, id2, d2, 0, 20);
2434 bfd_make_readable (abfd);
2435 return abfd;
2438 /* .section .rdata_runtime_pseudo_reloc
2439 .long addend
2440 .rva __fuNN_SYM (pointer to reference (address) in text) */
2442 static bfd *
2443 make_runtime_pseudo_reloc (const char *name ATTRIBUTE_UNUSED,
2444 const char *fixup_name,
2445 bfd_vma addend ATTRIBUTE_UNUSED,
2446 bfd_vma bitsize,
2447 bfd *parent)
2449 asection *rt_rel;
2450 unsigned char *rt_rel_d;
2451 char *oname;
2452 bfd *abfd;
2453 oname = xmalloc (20);
2454 sprintf (oname, "rtr%06d.o", tmp_seq);
2455 tmp_seq++;
2457 abfd = bfd_create (oname, parent);
2458 bfd_find_target (pe_details->object_target, abfd);
2459 bfd_make_writable (abfd);
2461 bfd_set_format (abfd, bfd_object);
2462 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2464 symptr = 0;
2465 if (link_info.pei386_runtime_pseudo_reloc == 2)
2467 symtab = xmalloc ((runtime_pseudp_reloc_v2_init ? 3 : 6) * sizeof (asymbol *));
2469 else
2471 symtab = xmalloc (2 * sizeof (asymbol *));
2473 rt_rel = quick_section (abfd, ".rdata_runtime_pseudo_reloc",
2474 SEC_HAS_CONTENTS, 2);
2476 quick_symbol (abfd, "", fixup_name, "", UNDSEC, BSF_GLOBAL, 0);
2478 if (link_info.pei386_runtime_pseudo_reloc == 2)
2480 size_t size = 12;
2481 if (! runtime_pseudp_reloc_v2_init)
2483 size += 12;
2484 runtime_pseudp_reloc_v2_init = 1;
2486 quick_symbol (abfd, U ("_imp_"), name, "", UNDSEC, BSF_GLOBAL, 0);
2488 bfd_set_section_size (abfd, rt_rel, size);
2489 rt_rel_d = xmalloc (size);
2490 rt_rel->contents = rt_rel_d;
2491 memset (rt_rel_d, 0, size);
2492 quick_reloc (abfd, size - 8, BFD_RELOC_RVA, 1);
2493 quick_reloc (abfd, size - 12, BFD_RELOC_RVA, 2);
2494 bfd_put_32 (abfd, bitsize, rt_rel_d + (size - 4));
2495 if (size != 12)
2496 bfd_put_32 (abfd, 1, rt_rel_d + 8);
2497 save_relocs (rt_rel);
2499 bfd_set_symtab (abfd, symtab, symptr);
2501 bfd_set_section_contents (abfd, rt_rel, rt_rel_d, 0, size);
2503 else
2505 bfd_set_section_size (abfd, rt_rel, 8);
2506 rt_rel_d = xmalloc (8);
2507 rt_rel->contents = rt_rel_d;
2508 memset (rt_rel_d, 0, 8);
2510 bfd_put_32 (abfd, addend, rt_rel_d);
2511 quick_reloc (abfd, 4, BFD_RELOC_RVA, 1);
2513 save_relocs (rt_rel);
2515 bfd_set_symtab (abfd, symtab, symptr);
2517 bfd_set_section_contents (abfd, rt_rel, rt_rel_d, 0, 8);
2519 bfd_make_readable (abfd);
2520 return abfd;
2523 /* .section .rdata
2524 .rva __pei386_runtime_relocator */
2526 static bfd *
2527 pe_create_runtime_relocator_reference (bfd *parent)
2529 asection *extern_rt_rel;
2530 unsigned char *extern_rt_rel_d;
2531 char *oname;
2532 bfd *abfd;
2534 oname = xmalloc (20);
2535 sprintf (oname, "ertr%06d.o", tmp_seq);
2536 tmp_seq++;
2538 abfd = bfd_create (oname, parent);
2539 bfd_find_target (pe_details->object_target, abfd);
2540 bfd_make_writable (abfd);
2542 bfd_set_format (abfd, bfd_object);
2543 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2545 symptr = 0;
2546 symtab = xmalloc (2 * sizeof (asymbol *));
2547 extern_rt_rel = quick_section (abfd, ".rdata", SEC_HAS_CONTENTS, 2);
2549 quick_symbol (abfd, "", U ("_pei386_runtime_relocator"), "", UNDSEC,
2550 BSF_NO_FLAGS, 0);
2552 bfd_set_section_size (abfd, extern_rt_rel, PE_IDATA5_SIZE);
2553 extern_rt_rel_d = xmalloc (PE_IDATA5_SIZE);
2554 extern_rt_rel->contents = extern_rt_rel_d;
2556 quick_reloc (abfd, 0, BFD_RELOC_RVA, 1);
2557 save_relocs (extern_rt_rel);
2559 bfd_set_symtab (abfd, symtab, symptr);
2561 bfd_set_section_contents (abfd, extern_rt_rel, extern_rt_rel_d, 0, PE_IDATA5_SIZE);
2563 bfd_make_readable (abfd);
2564 return abfd;
2567 void
2568 pe_create_import_fixup (arelent *rel, asection *s, bfd_vma addend)
2570 char buf[300];
2571 struct bfd_symbol *sym = *rel->sym_ptr_ptr;
2572 struct bfd_link_hash_entry *name_thunk_sym;
2573 struct bfd_link_hash_entry *name_imp_sym;
2574 const char *name = sym->name;
2575 char *fixup_name = make_import_fixup_mark (rel);
2576 bfd *b;
2577 int need_import_table = 1;
2579 sprintf (buf, U ("_imp_%s"), name);
2580 name_imp_sym = bfd_link_hash_lookup (link_info.hash, buf, 0, 0, 1);
2582 sprintf (buf, U ("_nm_thnk_%s"), name);
2584 name_thunk_sym = bfd_link_hash_lookup (link_info.hash, buf, 0, 0, 1);
2586 /* For version 2 pseudo relocation we don't need to add an import
2587 if the import symbol is already present. */
2588 if (link_info.pei386_runtime_pseudo_reloc == 2
2589 && name_imp_sym
2590 && name_imp_sym->type == bfd_link_hash_defined)
2591 need_import_table = 0;
2593 if (need_import_table == 1
2594 && (!name_thunk_sym || name_thunk_sym->type != bfd_link_hash_defined))
2596 b = make_singleton_name_thunk (name, link_info.output_bfd);
2597 add_bfd_to_link (b, b->filename, &link_info);
2599 /* If we ever use autoimport, we have to cast text section writable.
2600 But not for version 2. */
2601 if (link_info.pei386_runtime_pseudo_reloc != 2)
2603 config.text_read_only = FALSE;
2604 link_info.output_bfd->flags &= ~WP_TEXT;
2606 if (link_info.pei386_runtime_pseudo_reloc == 2)
2608 b = make_singleton_name_imp (name, link_info.output_bfd);
2609 add_bfd_to_link (b, b->filename, &link_info);
2613 if ((addend == 0 || link_info.pei386_runtime_pseudo_reloc)
2614 && need_import_table == 1)
2616 extern char * pe_data_import_dll;
2617 char * symname = pe_data_import_dll ? pe_data_import_dll : "unknown";
2619 b = make_import_fixup_entry (name, fixup_name, symname,
2620 link_info.output_bfd);
2621 add_bfd_to_link (b, b->filename, &link_info);
2624 if ((link_info.pei386_runtime_pseudo_reloc != 0 && addend != 0)
2625 || link_info.pei386_runtime_pseudo_reloc == 2)
2627 if (pe_dll_extra_pe_debug)
2628 printf ("creating runtime pseudo-reloc entry for %s (addend=%d)\n",
2629 fixup_name, (int) addend);
2631 b = make_runtime_pseudo_reloc (name, fixup_name, addend, rel->howto->bitsize,
2632 link_info.output_bfd);
2633 add_bfd_to_link (b, b->filename, &link_info);
2635 if (runtime_pseudo_relocs_created == 0)
2637 b = pe_create_runtime_relocator_reference (link_info.output_bfd);
2638 add_bfd_to_link (b, b->filename, &link_info);
2640 runtime_pseudo_relocs_created++;
2642 else if (addend != 0)
2644 einfo (_("%C: variable '%T' can't be auto-imported. Please read the documentation for ld's --enable-auto-import for details.\n"),
2645 s->owner, s, rel->address, sym->name);
2646 einfo ("%X");
2651 void
2652 pe_dll_generate_implib (def_file *def, const char *impfilename, struct bfd_link_info *info)
2654 int i;
2655 bfd *ar_head;
2656 bfd *ar_tail;
2657 bfd *outarch;
2658 bfd *ibfd;
2659 bfd *head = 0;
2661 dll_filename = (def->name) ? def->name : dll_name;
2662 dll_symname = xstrdup (dll_filename);
2663 for (i = 0; dll_symname[i]; i++)
2664 if (!ISALNUM (dll_symname[i]))
2665 dll_symname[i] = '_';
2667 unlink_if_ordinary (impfilename);
2669 outarch = bfd_openw (impfilename, 0);
2671 if (!outarch)
2673 /* xgettext:c-format */
2674 einfo (_("%XCan't open .lib file: %s\n"), impfilename);
2675 return;
2678 /* xgettext:c-format */
2679 info_msg (_("Creating library file: %s\n"), impfilename);
2681 bfd_set_format (outarch, bfd_archive);
2682 outarch->has_armap = 1;
2684 /* Work out a reasonable size of things to put onto one line. */
2685 ar_head = make_head (outarch);
2687 /* Iterate the input BFDs, looking for exclude-modules-for-implib. */
2688 for (ibfd = info->input_bfds; ibfd; ibfd = ibfd->link_next)
2690 /* Iterate the exclude list. */
2691 struct exclude_list_struct *ex;
2692 char found;
2693 for (ex = excludes, found = 0; ex && !found; ex = ex->next)
2695 if (ex->type != EXCLUDEFORIMPLIB)
2696 continue;
2697 found = (strcmp (ex->string, ibfd->filename) == 0);
2699 /* If it matched, we must open a fresh BFD for it (the original
2700 input BFD is still needed for the DLL's final link) and add
2701 it into the archive member chain. */
2702 if (found)
2704 bfd *newbfd = bfd_openr (ibfd->my_archive
2705 ? ibfd->my_archive->filename : ibfd->filename, NULL);
2706 if (!newbfd)
2708 einfo (_("%Xbfd_openr %s: %E\n"), ibfd->filename);
2709 return;
2711 if (ibfd->my_archive)
2713 /* Must now iterate through archive until we find the
2714 required member. A minor shame that we'll open the
2715 archive once per member that we require from it, and
2716 leak those archive bfds rather than reuse them. */
2717 bfd *arbfd = newbfd;
2718 if (!bfd_check_format_matches (arbfd, bfd_archive, NULL))
2720 einfo (_("%X%s(%s): can't find member in non-archive file"),
2721 ibfd->my_archive->filename, ibfd->filename);
2722 return;
2724 newbfd = NULL;
2725 while ((newbfd = bfd_openr_next_archived_file (arbfd, newbfd)) != 0)
2727 if (strcmp (newbfd->filename, ibfd->filename) == 0)
2728 break;
2730 if (!newbfd)
2732 einfo (_("%X%s(%s): can't find member in archive"),
2733 ibfd->my_archive->filename, ibfd->filename);
2734 return;
2737 newbfd->archive_next = head;
2738 head = newbfd;
2742 for (i = 0; i < def->num_exports; i++)
2744 /* The import library doesn't know about the internal name. */
2745 char *internal = def->exports[i].internal_name;
2746 bfd *n;
2748 /* Don't add PRIVATE entries to import lib. */
2749 if (pe_def_file->exports[i].flag_private)
2750 continue;
2751 def->exports[i].internal_name = def->exports[i].name;
2752 n = make_one (def->exports + i, outarch,
2753 ! (def->exports + i)->flag_data);
2754 n->archive_next = head;
2755 head = n;
2756 def->exports[i].internal_name = internal;
2759 ar_tail = make_tail (outarch);
2761 if (ar_head == NULL || ar_tail == NULL)
2762 return;
2764 /* Now stick them all into the archive. */
2765 ar_head->archive_next = head;
2766 ar_tail->archive_next = ar_head;
2767 head = ar_tail;
2769 if (! bfd_set_archive_head (outarch, head))
2770 einfo ("%Xbfd_set_archive_head: %E\n");
2772 if (! bfd_close (outarch))
2773 einfo ("%Xbfd_close %s: %E\n", impfilename);
2775 while (head != NULL)
2777 bfd *n = head->archive_next;
2778 bfd_close (head);
2779 head = n;
2783 static struct bfd_link_hash_entry *found_sym;
2785 static bfd_boolean
2786 pe_undef_alias_cdecl_match (struct bfd_link_hash_entry *h, void *inf)
2788 int sl;
2789 char *string = inf;
2790 const char *hs = h->root.string;
2792 sl = strlen (string);
2793 if (h->type == bfd_link_hash_undefined
2794 && ((*hs == '@' && *string == '_'
2795 && strncmp (hs + 1, string + 1, sl - 1) == 0)
2796 || strncmp (hs, string, sl) == 0)
2797 && h->root.string[sl] == '@')
2799 found_sym = h;
2800 return FALSE;
2802 return TRUE;
2805 static struct bfd_link_hash_entry *
2806 pe_find_cdecl_alias_match (char *name)
2808 found_sym = 0;
2809 bfd_link_hash_traverse (link_info.hash, pe_undef_alias_cdecl_match,
2810 (char *) name);
2811 return found_sym;
2814 static void
2815 add_bfd_to_link (bfd *abfd, const char *name, struct bfd_link_info *linfo)
2817 lang_input_statement_type *fake_file;
2819 fake_file = lang_add_input_file (name,
2820 lang_input_file_is_fake_enum,
2821 NULL);
2822 fake_file->the_bfd = abfd;
2823 ldlang_add_file (fake_file);
2825 if (!bfd_link_add_symbols (abfd, linfo))
2826 einfo ("%Xaddsym %s: %E\n", name);
2829 void
2830 pe_process_import_defs (bfd *output_bfd, struct bfd_link_info *linfo)
2832 def_file_module *module;
2834 pe_dll_id_target (bfd_get_target (output_bfd));
2836 if (!pe_def_file)
2837 return;
2839 for (module = pe_def_file->modules; module; module = module->next)
2841 int i, do_this_dll;
2843 dll_filename = module->name;
2844 dll_symname = xstrdup (module->name);
2845 for (i = 0; dll_symname[i]; i++)
2846 if (!ISALNUM (dll_symname[i]))
2847 dll_symname[i] = '_';
2849 do_this_dll = 0;
2851 for (i = 0; i < pe_def_file->num_imports; i++)
2852 if (pe_def_file->imports[i].module == module)
2854 def_file_export exp;
2855 struct bfd_link_hash_entry *blhe;
2856 int lead_at = (*pe_def_file->imports[i].internal_name == '@');
2857 /* See if we need this import. */
2858 size_t len = strlen (pe_def_file->imports[i].internal_name);
2859 char *name = xmalloc (len + 2 + 6);
2860 bfd_boolean include_jmp_stub = FALSE;
2861 bfd_boolean is_cdecl = FALSE;
2862 if (!lead_at && strchr (pe_def_file->imports[i].internal_name, '@') == NULL)
2863 is_cdecl = TRUE;
2865 if (lead_at)
2866 sprintf (name, "%s",
2867 pe_def_file->imports[i].internal_name);
2868 else
2869 sprintf (name, "%s%s",U (""),
2870 pe_def_file->imports[i].internal_name);
2872 blhe = bfd_link_hash_lookup (linfo->hash, name,
2873 FALSE, FALSE, FALSE);
2875 /* Include the jump stub for <sym> only if the <sym>
2876 is undefined. */
2877 if (!blhe || (blhe && blhe->type != bfd_link_hash_undefined))
2879 if (lead_at)
2880 sprintf (name, "%s%s", "__imp_",
2881 pe_def_file->imports[i].internal_name);
2882 else
2883 sprintf (name, "%s%s%s", "__imp_", U (""),
2884 pe_def_file->imports[i].internal_name);
2886 blhe = bfd_link_hash_lookup (linfo->hash, name,
2887 FALSE, FALSE, FALSE);
2889 else
2890 include_jmp_stub = TRUE;
2892 if (is_cdecl && !blhe)
2894 sprintf (name, "%s%s",U (""),
2895 pe_def_file->imports[i].internal_name);
2896 blhe = pe_find_cdecl_alias_match (name);
2897 include_jmp_stub = TRUE;
2900 free (name);
2902 if (blhe && blhe->type == bfd_link_hash_undefined)
2904 bfd *one;
2905 /* We do. */
2906 if (!do_this_dll)
2908 bfd *ar_head = make_head (output_bfd);
2909 add_bfd_to_link (ar_head, ar_head->filename, linfo);
2910 do_this_dll = 1;
2912 exp.internal_name = pe_def_file->imports[i].internal_name;
2913 exp.name = pe_def_file->imports[i].name;
2914 exp.its_name = pe_def_file->imports[i].its_name;
2915 exp.ordinal = pe_def_file->imports[i].ordinal;
2916 exp.hint = exp.ordinal >= 0 ? exp.ordinal : 0;
2917 exp.flag_private = 0;
2918 exp.flag_constant = 0;
2919 exp.flag_data = pe_def_file->imports[i].data;
2920 exp.flag_noname = exp.name ? 0 : 1;
2921 one = make_one (&exp, output_bfd, (! exp.flag_data) && include_jmp_stub);
2922 add_bfd_to_link (one, one->filename, linfo);
2925 if (do_this_dll)
2927 bfd *ar_tail = make_tail (output_bfd);
2928 add_bfd_to_link (ar_tail, ar_tail->filename, linfo);
2931 free (dll_symname);
2935 /* We were handed a *.DLL file. Parse it and turn it into a set of
2936 IMPORTS directives in the def file. Return TRUE if the file was
2937 handled, FALSE if not. */
2939 static unsigned int
2940 pe_get16 (bfd *abfd, int where)
2942 unsigned char b[2];
2944 bfd_seek (abfd, (file_ptr) where, SEEK_SET);
2945 bfd_bread (b, (bfd_size_type) 2, abfd);
2946 return b[0] + (b[1] << 8);
2949 static unsigned int
2950 pe_get32 (bfd *abfd, int where)
2952 unsigned char b[4];
2954 bfd_seek (abfd, (file_ptr) where, SEEK_SET);
2955 bfd_bread (b, (bfd_size_type) 4, abfd);
2956 return b[0] + (b[1] << 8) + (b[2] << 16) + (b[3] << 24);
2959 static unsigned int
2960 pe_as32 (void *ptr)
2962 unsigned char *b = ptr;
2964 return b[0] + (b[1] << 8) + (b[2] << 16) + (b[3] << 24);
2967 bfd_boolean
2968 pe_implied_import_dll (const char *filename)
2970 bfd *dll;
2971 bfd_vma pe_header_offset, opthdr_ofs, num_entries, i;
2972 bfd_vma export_rva, export_size, nsections, secptr, expptr;
2973 bfd_vma exp_funcbase;
2974 unsigned char *expdata;
2975 char *erva;
2976 bfd_vma name_rvas, ordinals, nexp, ordbase;
2977 const char *dllname;
2978 /* Initialization with start > end guarantees that is_data
2979 will not be set by mistake, and avoids compiler warning. */
2980 bfd_vma data_start = 1;
2981 bfd_vma data_end = 0;
2982 bfd_vma rdata_start = 1;
2983 bfd_vma rdata_end = 0;
2984 bfd_vma bss_start = 1;
2985 bfd_vma bss_end = 0;
2987 /* No, I can't use bfd here. kernel32.dll puts its export table in
2988 the middle of the .rdata section. */
2989 dll = bfd_openr (filename, pe_details->target_name);
2990 if (!dll)
2992 einfo ("%Xopen %s: %E\n", filename);
2993 return FALSE;
2996 /* PEI dlls seem to be bfd_objects. */
2997 if (!bfd_check_format (dll, bfd_object))
2999 einfo ("%X%s: this doesn't appear to be a DLL\n", filename);
3000 return FALSE;
3003 /* Get pe_header, optional header and numbers of directory entries. */
3004 pe_header_offset = pe_get32 (dll, 0x3c);
3005 opthdr_ofs = pe_header_offset + 4 + 20;
3006 #ifdef pe_use_x86_64
3007 num_entries = pe_get32 (dll, opthdr_ofs + 92 + 4 * 4); /* & NumberOfRvaAndSizes. */
3008 #else
3009 num_entries = pe_get32 (dll, opthdr_ofs + 92);
3010 #endif
3012 /* No import or export directory entry. */
3013 if (num_entries < 1)
3014 return FALSE;
3016 #ifdef pe_use_x86_64
3017 export_rva = pe_get32 (dll, opthdr_ofs + 96 + 4 * 4);
3018 export_size = pe_get32 (dll, opthdr_ofs + 100 + 4 * 4);
3019 #else
3020 export_rva = pe_get32 (dll, opthdr_ofs + 96);
3021 export_size = pe_get32 (dll, opthdr_ofs + 100);
3022 #endif
3024 /* No export table - nothing to export. */
3025 if (export_size == 0)
3026 return FALSE;
3028 nsections = pe_get16 (dll, pe_header_offset + 4 + 2);
3029 secptr = (pe_header_offset + 4 + 20 +
3030 pe_get16 (dll, pe_header_offset + 4 + 16));
3031 expptr = 0;
3033 /* Get the rva and size of the export section. */
3034 for (i = 0; i < nsections; i++)
3036 char sname[8];
3037 bfd_vma secptr1 = secptr + 40 * i;
3038 bfd_vma vaddr = pe_get32 (dll, secptr1 + 12);
3039 bfd_vma vsize = pe_get32 (dll, secptr1 + 16);
3040 bfd_vma fptr = pe_get32 (dll, secptr1 + 20);
3042 bfd_seek (dll, (file_ptr) secptr1, SEEK_SET);
3043 bfd_bread (sname, (bfd_size_type) 8, dll);
3045 if (vaddr <= export_rva && vaddr + vsize > export_rva)
3047 expptr = fptr + (export_rva - vaddr);
3048 if (export_rva + export_size > vaddr + vsize)
3049 export_size = vsize - (export_rva - vaddr);
3050 break;
3054 /* Scan sections and store the base and size of the
3055 data and bss segments in data/base_start/end. */
3056 for (i = 0; i < nsections; i++)
3058 bfd_vma secptr1 = secptr + 40 * i;
3059 bfd_vma vsize = pe_get32 (dll, secptr1 + 8);
3060 bfd_vma vaddr = pe_get32 (dll, secptr1 + 12);
3061 bfd_vma flags = pe_get32 (dll, secptr1 + 36);
3062 char sec_name[9];
3064 sec_name[8] = '\0';
3065 bfd_seek (dll, (file_ptr) secptr1 + 0, SEEK_SET);
3066 bfd_bread (sec_name, (bfd_size_type) 8, dll);
3068 if (strcmp(sec_name,".data") == 0)
3070 data_start = vaddr;
3071 data_end = vaddr + vsize;
3073 if (pe_dll_extra_pe_debug)
3074 printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n",
3075 __FUNCTION__, sec_name, (unsigned long) vaddr,
3076 (unsigned long) (vaddr + vsize), (unsigned long) flags);
3078 else if (strcmp(sec_name,".rdata") == 0)
3080 rdata_start = vaddr;
3081 rdata_end = vaddr + vsize;
3083 if (pe_dll_extra_pe_debug)
3084 printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n",
3085 __FUNCTION__, sec_name, (unsigned long) vaddr,
3086 (unsigned long) (vaddr + vsize), (unsigned long) flags);
3088 else if (strcmp (sec_name,".bss") == 0)
3090 bss_start = vaddr;
3091 bss_end = vaddr + vsize;
3093 if (pe_dll_extra_pe_debug)
3094 printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n",
3095 __FUNCTION__, sec_name, (unsigned long) vaddr,
3096 (unsigned long) (vaddr + vsize), (unsigned long) flags);
3100 expdata = xmalloc (export_size);
3101 bfd_seek (dll, (file_ptr) expptr, SEEK_SET);
3102 bfd_bread (expdata, (bfd_size_type) export_size, dll);
3103 erva = (char *) expdata - export_rva;
3105 if (pe_def_file == 0)
3106 pe_def_file = def_file_empty ();
3108 nexp = pe_as32 (expdata + 24);
3109 name_rvas = pe_as32 (expdata + 32);
3110 ordinals = pe_as32 (expdata + 36);
3111 ordbase = pe_as32 (expdata + 16);
3112 exp_funcbase = pe_as32 (expdata + 28);
3114 /* Use internal dll name instead of filename
3115 to enable symbolic dll linking. */
3116 dllname = erva + pe_as32 (expdata + 12);
3118 /* Check to see if the dll has already been added to
3119 the definition list and if so return without error.
3120 This avoids multiple symbol definitions. */
3121 if (def_get_module (pe_def_file, dllname))
3123 if (pe_dll_extra_pe_debug)
3124 printf ("%s is already loaded\n", dllname);
3125 return TRUE;
3128 /* Iterate through the list of symbols. */
3129 for (i = 0; i < nexp; i++)
3131 /* Pointer to the names vector. */
3132 bfd_vma name_rva = pe_as32 (erva + name_rvas + i * 4);
3133 def_file_import *imp;
3134 /* Pointer to the function address vector. */
3135 bfd_vma func_rva = pe_as32 (erva + exp_funcbase + i * 4);
3136 int is_data = 0;
3138 /* Skip unwanted symbols, which are
3139 exported in buggy auto-import releases. */
3140 if (! CONST_STRNEQ (erva + name_rva, "_nm_"))
3142 /* is_data is true if the address is in the data, rdata or bss
3143 segment. */
3144 is_data =
3145 (func_rva >= data_start && func_rva < data_end)
3146 || (func_rva >= rdata_start && func_rva < rdata_end)
3147 || (func_rva >= bss_start && func_rva < bss_end);
3149 imp = def_file_add_import (pe_def_file, erva + name_rva,
3150 dllname, i, 0, NULL);
3151 /* Mark symbol type. */
3152 imp->data = is_data;
3154 if (pe_dll_extra_pe_debug)
3155 printf ("%s dll-name: %s sym: %s addr: 0x%lx %s\n",
3156 __FUNCTION__, dllname, erva + name_rva,
3157 (unsigned long) func_rva, is_data ? "(data)" : "");
3161 return TRUE;
3164 void
3165 pe_output_file_set_long_section_names (bfd *abfd)
3167 if (pe_use_coff_long_section_names < 0)
3168 return;
3169 if (!bfd_coff_set_long_section_names (abfd, pe_use_coff_long_section_names))
3170 einfo (_("%XError: can't use long section names on this arch\n"));
3173 /* These are the main functions, called from the emulation. The first
3174 is called after the bfds are read, so we can guess at how much space
3175 we need. The second is called after everything is placed, so we
3176 can put the right values in place. */
3178 void
3179 pe_dll_build_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 process_def_file_and_drectve (abfd, info);
3185 if (pe_def_file->num_exports == 0 && !info->shared)
3186 return;
3188 generate_edata (abfd, info);
3189 build_filler_bfd (1);
3190 pe_output_file_set_long_section_names (filler_bfd);
3193 void
3194 pe_exe_build_sections (bfd *abfd, struct bfd_link_info *info ATTRIBUTE_UNUSED)
3196 pe_dll_id_target (bfd_get_target (abfd));
3197 pe_output_file_set_long_section_names (abfd);
3198 build_filler_bfd (0);
3199 pe_output_file_set_long_section_names (filler_bfd);
3202 void
3203 pe_dll_fill_sections (bfd *abfd, struct bfd_link_info *info)
3205 pe_dll_id_target (bfd_get_target (abfd));
3206 pe_output_file_set_long_section_names (abfd);
3207 image_base = pe_data (abfd)->pe_opthdr.ImageBase;
3209 generate_reloc (abfd, info);
3210 if (reloc_sz > 0)
3212 bfd_set_section_size (filler_bfd, reloc_s, reloc_sz);
3214 /* Resize the sections. */
3215 lang_reset_memory_regions ();
3216 lang_size_sections (NULL, TRUE);
3218 /* Redo special stuff. */
3219 ldemul_after_allocation ();
3221 /* Do the assignments again. */
3222 lang_do_assignments ();
3225 fill_edata (abfd, info);
3227 if (info->shared && !info->pie)
3228 pe_data (abfd)->dll = 1;
3230 edata_s->contents = edata_d;
3231 reloc_s->contents = reloc_d;
3234 void
3235 pe_exe_fill_sections (bfd *abfd, struct bfd_link_info *info)
3237 pe_dll_id_target (bfd_get_target (abfd));
3238 pe_output_file_set_long_section_names (abfd);
3239 image_base = pe_data (abfd)->pe_opthdr.ImageBase;
3241 generate_reloc (abfd, info);
3242 if (reloc_sz > 0)
3244 bfd_set_section_size (filler_bfd, reloc_s, reloc_sz);
3246 /* Resize the sections. */
3247 lang_reset_memory_regions ();
3248 lang_size_sections (NULL, TRUE);
3250 /* Redo special stuff. */
3251 ldemul_after_allocation ();
3253 /* Do the assignments again. */
3254 lang_do_assignments ();
3256 reloc_s->contents = reloc_d;
3259 bfd_boolean
3260 pe_bfd_is_dll (bfd *abfd)
3262 return (bfd_get_format (abfd) == bfd_object
3263 && obj_pe (abfd)
3264 && pe_data (abfd)->dll);