Blackfin disassmbler: fix typo where M2.H was decoded as L2.H
[binutils.git] / ld / pe-dll.c
blobad5f82a4f047ff6d281e6aadcb382120a3dbf92a
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, 2010 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 (12 * sizeof (asymbol *));
2101 tx = quick_section (abfd, ".text", SEC_CODE | SEC_HAS_CONTENTS | SEC_READONLY, 2);
2102 id7 = quick_section (abfd, ".idata$7", SEC_HAS_CONTENTS, 2);
2103 id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
2104 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
2105 id6 = quick_section (abfd, ".idata$6", SEC_HAS_CONTENTS, 2);
2107 if (*exp->internal_name == '@')
2109 quick_symbol (abfd, U ("_head_"), dll_symname, "", UNDSEC,
2110 BSF_GLOBAL, 0);
2111 if (include_jmp_stub)
2112 quick_symbol (abfd, "", exp->internal_name, "", tx, BSF_GLOBAL, 0);
2113 quick_symbol (abfd, "__imp_", exp->internal_name, "", id5,
2114 BSF_GLOBAL, 0);
2115 /* Fastcall applies only to functions,
2116 so no need for auto-import symbol. */
2118 else
2120 quick_symbol (abfd, U ("_head_"), dll_symname, "", UNDSEC,
2121 BSF_GLOBAL, 0);
2122 if (include_jmp_stub)
2123 quick_symbol (abfd, U (""), exp->internal_name, "", tx,
2124 BSF_GLOBAL, 0);
2125 quick_symbol (abfd, "__imp_", U (""), exp->internal_name, id5,
2126 BSF_GLOBAL, 0);
2127 /* Symbol to reference ord/name of imported
2128 data symbol, used to implement auto-import. */
2129 if (exp->flag_data)
2130 quick_symbol (abfd, U ("_nm_"), U (""), exp->internal_name, id6,
2131 BSF_GLOBAL,0);
2133 if (pe_dll_compat_implib)
2134 quick_symbol (abfd, U ("__imp_"), exp->internal_name, "", id5,
2135 BSF_GLOBAL, 0);
2137 if (include_jmp_stub)
2139 bfd_set_section_size (abfd, tx, jmp_byte_count);
2140 td = xmalloc (jmp_byte_count);
2141 tx->contents = td;
2142 memcpy (td, jmp_bytes, jmp_byte_count);
2144 switch (pe_details->pe_arch)
2146 case PE_ARCH_i386:
2147 #ifdef pe_use_x86_64
2148 quick_reloc (abfd, 2, BFD_RELOC_32_PCREL, 2);
2149 #else
2150 /* Mark this object as SAFESEH compatible. */
2151 quick_symbol (abfd, "", "@feat.00", "", bfd_abs_section_ptr,
2152 BSF_LOCAL, 1);
2153 quick_reloc (abfd, 2, BFD_RELOC_32, 2);
2154 #endif
2155 break;
2156 case PE_ARCH_sh:
2157 quick_reloc (abfd, 8, BFD_RELOC_32, 2);
2158 break;
2159 case PE_ARCH_mips:
2160 quick_reloc (abfd, 0, BFD_RELOC_HI16_S, 2);
2161 quick_reloc (abfd, 0, BFD_RELOC_LO16, 0); /* MIPS_R_PAIR */
2162 quick_reloc (abfd, 4, BFD_RELOC_LO16, 2);
2163 break;
2164 case PE_ARCH_arm:
2165 case PE_ARCH_arm_epoc:
2166 case PE_ARCH_arm_wince:
2167 quick_reloc (abfd, 8, BFD_RELOC_32, 2);
2168 break;
2169 default:
2170 abort ();
2172 save_relocs (tx);
2174 else
2175 bfd_set_section_size (abfd, tx, 0);
2177 bfd_set_section_size (abfd, id7, 4);
2178 d7 = xmalloc (4);
2179 id7->contents = d7;
2180 memset (d7, 0, 4);
2181 quick_reloc (abfd, 0, BFD_RELOC_RVA, 5);
2182 save_relocs (id7);
2184 bfd_set_section_size (abfd, id5, PE_IDATA5_SIZE);
2185 d5 = xmalloc (PE_IDATA5_SIZE);
2186 id5->contents = d5;
2187 memset (d5, 0, PE_IDATA5_SIZE);
2189 if (exp->flag_noname)
2191 d5[0] = exp->ordinal;
2192 d5[1] = exp->ordinal >> 8;
2193 d5[PE_IDATA5_SIZE - 1] = 0x80;
2195 else
2197 quick_reloc (abfd, 0, BFD_RELOC_RVA, 4);
2198 save_relocs (id5);
2201 bfd_set_section_size (abfd, id4, PE_IDATA4_SIZE);
2202 d4 = xmalloc (PE_IDATA4_SIZE);
2203 id4->contents = d4;
2204 memset (d4, 0, PE_IDATA4_SIZE);
2206 if (exp->flag_noname)
2208 d4[0] = exp->ordinal;
2209 d4[1] = exp->ordinal >> 8;
2210 d4[PE_IDATA4_SIZE - 1] = 0x80;
2212 else
2214 quick_reloc (abfd, 0, BFD_RELOC_RVA, 4);
2215 save_relocs (id4);
2218 if (exp->flag_noname)
2220 len = 0;
2221 bfd_set_section_size (abfd, id6, 0);
2223 else
2225 /* { short, asciz } */
2226 if (exp->its_name)
2227 len = 2 + strlen (exp->its_name) + 1;
2228 else
2229 len = 2 + strlen (exp->name) + 1;
2230 if (len & 1)
2231 len++;
2232 bfd_set_section_size (abfd, id6, len);
2233 d6 = xmalloc (len);
2234 id6->contents = d6;
2235 memset (d6, 0, len);
2236 d6[0] = exp->hint & 0xff;
2237 d6[1] = exp->hint >> 8;
2238 if (exp->its_name)
2239 strcpy ((char*) d6 + 2, exp->its_name);
2240 else
2241 strcpy ((char *) d6 + 2, exp->name);
2244 bfd_set_symtab (abfd, symtab, symptr);
2246 if (include_jmp_stub)
2247 bfd_set_section_contents (abfd, tx, td, 0, jmp_byte_count);
2248 bfd_set_section_contents (abfd, id7, d7, 0, 4);
2249 bfd_set_section_contents (abfd, id5, d5, 0, PE_IDATA5_SIZE);
2250 bfd_set_section_contents (abfd, id4, d4, 0, PE_IDATA4_SIZE);
2251 if (!exp->flag_noname)
2252 bfd_set_section_contents (abfd, id6, d6, 0, len);
2254 bfd_make_readable (abfd);
2255 return abfd;
2258 static bfd *
2259 make_singleton_name_imp (const char *import, bfd *parent)
2261 /* Name thunks go to idata$4. */
2262 asection *id5;
2263 unsigned char *d5;
2264 char *oname;
2265 bfd *abfd;
2267 oname = xmalloc (20);
2268 sprintf (oname, "nmimp%06d.o", tmp_seq2);
2269 tmp_seq2++;
2271 abfd = bfd_create (oname, parent);
2272 bfd_find_target (pe_details->object_target, abfd);
2273 bfd_make_writable (abfd);
2275 bfd_set_format (abfd, bfd_object);
2276 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2278 symptr = 0;
2279 symtab = xmalloc (3 * sizeof (asymbol *));
2280 id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
2281 quick_symbol (abfd, U ("_imp_"), import, "", id5, BSF_GLOBAL, 0);
2283 /* We need space for the real thunk and for the null terminator. */
2284 bfd_set_section_size (abfd, id5, PE_IDATA5_SIZE * 2);
2285 d5 = xmalloc (PE_IDATA5_SIZE * 2);
2286 id5->contents = d5;
2287 memset (d5, 0, PE_IDATA5_SIZE * 2);
2288 quick_reloc (abfd, 0, BFD_RELOC_RVA, 2);
2289 save_relocs (id5);
2291 bfd_set_symtab (abfd, symtab, symptr);
2293 bfd_set_section_contents (abfd, id5, d5, 0, PE_IDATA4_SIZE * 2);
2295 bfd_make_readable (abfd);
2296 return abfd;
2299 static bfd *
2300 make_singleton_name_thunk (const char *import, bfd *parent)
2302 /* Name thunks go to idata$4. */
2303 asection *id4;
2304 unsigned char *d4;
2305 char *oname;
2306 bfd *abfd;
2308 oname = xmalloc (20);
2309 sprintf (oname, "nmth%06d.o", tmp_seq);
2310 tmp_seq++;
2312 abfd = bfd_create (oname, parent);
2313 bfd_find_target (pe_details->object_target, abfd);
2314 bfd_make_writable (abfd);
2316 bfd_set_format (abfd, bfd_object);
2317 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2319 symptr = 0;
2320 symtab = xmalloc (3 * sizeof (asymbol *));
2321 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
2322 quick_symbol (abfd, U ("_nm_thnk_"), import, "", id4, BSF_GLOBAL, 0);
2323 quick_symbol (abfd, U ("_nm_"), import, "", UNDSEC, BSF_GLOBAL, 0);
2325 /* We need space for the real thunk and for the null terminator. */
2326 bfd_set_section_size (abfd, id4, PE_IDATA4_SIZE * 2);
2327 d4 = xmalloc (PE_IDATA4_SIZE * 2);
2328 id4->contents = d4;
2329 memset (d4, 0, PE_IDATA4_SIZE * 2);
2330 quick_reloc (abfd, 0, BFD_RELOC_RVA, 2);
2331 save_relocs (id4);
2333 bfd_set_symtab (abfd, symtab, symptr);
2335 bfd_set_section_contents (abfd, id4, d4, 0, PE_IDATA4_SIZE * 2);
2337 bfd_make_readable (abfd);
2338 return abfd;
2341 static char *
2342 make_import_fixup_mark (arelent *rel)
2344 /* We convert reloc to symbol, for later reference. */
2345 static int counter;
2346 static char *fixup_name = NULL;
2347 static size_t buffer_len = 0;
2349 struct bfd_symbol *sym = *rel->sym_ptr_ptr;
2351 bfd *abfd = bfd_asymbol_bfd (sym);
2352 struct bfd_link_hash_entry *bh;
2354 if (!fixup_name)
2356 fixup_name = xmalloc (384);
2357 buffer_len = 384;
2360 if (strlen (sym->name) + 25 > buffer_len)
2361 /* Assume 25 chars for "__fu" + counter + "_". If counter is
2362 bigger than 20 digits long, we've got worse problems than
2363 overflowing this buffer... */
2365 free (fixup_name);
2366 /* New buffer size is length of symbol, plus 25, but
2367 then rounded up to the nearest multiple of 128. */
2368 buffer_len = ((strlen (sym->name) + 25) + 127) & ~127;
2369 fixup_name = xmalloc (buffer_len);
2372 sprintf (fixup_name, "__fu%d_%s", counter++, sym->name);
2374 bh = NULL;
2375 bfd_coff_link_add_one_symbol (&link_info, abfd, fixup_name, BSF_GLOBAL,
2376 current_sec, /* sym->section, */
2377 rel->address, NULL, TRUE, FALSE, &bh);
2379 return fixup_name;
2382 /* .section .idata$2
2383 .rva __nm_thnk_SYM (singleton thunk with name of func)
2384 .long 0
2385 .long 0
2386 .rva __my_dll_iname (name of dll)
2387 .rva __fuNN_SYM (pointer to reference (address) in text) */
2389 static bfd *
2390 make_import_fixup_entry (const char *name,
2391 const char *fixup_name,
2392 const char *symname,
2393 bfd *parent)
2395 asection *id2;
2396 unsigned char *d2;
2397 char *oname;
2398 bfd *abfd;
2400 oname = xmalloc (20);
2401 sprintf (oname, "fu%06d.o", tmp_seq);
2402 tmp_seq++;
2404 abfd = bfd_create (oname, parent);
2405 bfd_find_target (pe_details->object_target, abfd);
2406 bfd_make_writable (abfd);
2408 bfd_set_format (abfd, bfd_object);
2409 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2411 symptr = 0;
2412 symtab = xmalloc (6 * sizeof (asymbol *));
2413 id2 = quick_section (abfd, ".idata$2", SEC_HAS_CONTENTS, 2);
2415 quick_symbol (abfd, U ("_nm_thnk_"), name, "", UNDSEC, BSF_GLOBAL, 0);
2416 quick_symbol (abfd, U (""), symname, "_iname", UNDSEC, BSF_GLOBAL, 0);
2417 /* For relocator v2 we have to use the .idata$5 element and not
2418 fixup_name. */
2419 if (link_info.pei386_runtime_pseudo_reloc == 2)
2420 quick_symbol (abfd, U ("_imp_"), name, "", UNDSEC, BSF_GLOBAL, 0);
2421 else
2422 quick_symbol (abfd, "", fixup_name, "", UNDSEC, BSF_GLOBAL, 0);
2424 bfd_set_section_size (abfd, id2, 20);
2425 d2 = xmalloc (20);
2426 id2->contents = d2;
2427 memset (d2, 0, 20);
2429 quick_reloc (abfd, 0, BFD_RELOC_RVA, 1);
2430 quick_reloc (abfd, 12, BFD_RELOC_RVA, 2);
2431 quick_reloc (abfd, 16, BFD_RELOC_RVA, 3);
2432 save_relocs (id2);
2434 bfd_set_symtab (abfd, symtab, symptr);
2436 bfd_set_section_contents (abfd, id2, d2, 0, 20);
2438 bfd_make_readable (abfd);
2439 return abfd;
2442 /* .section .rdata_runtime_pseudo_reloc
2443 .long addend
2444 .rva __fuNN_SYM (pointer to reference (address) in text) */
2446 static bfd *
2447 make_runtime_pseudo_reloc (const char *name ATTRIBUTE_UNUSED,
2448 const char *fixup_name,
2449 bfd_vma addend ATTRIBUTE_UNUSED,
2450 bfd_vma bitsize,
2451 bfd *parent)
2453 asection *rt_rel;
2454 unsigned char *rt_rel_d;
2455 char *oname;
2456 bfd *abfd;
2457 oname = xmalloc (20);
2458 sprintf (oname, "rtr%06d.o", tmp_seq);
2459 tmp_seq++;
2461 abfd = bfd_create (oname, parent);
2462 bfd_find_target (pe_details->object_target, abfd);
2463 bfd_make_writable (abfd);
2465 bfd_set_format (abfd, bfd_object);
2466 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2468 symptr = 0;
2469 if (link_info.pei386_runtime_pseudo_reloc == 2)
2471 symtab = xmalloc ((runtime_pseudp_reloc_v2_init ? 3 : 6) * sizeof (asymbol *));
2473 else
2475 symtab = xmalloc (2 * sizeof (asymbol *));
2477 rt_rel = quick_section (abfd, ".rdata_runtime_pseudo_reloc",
2478 SEC_HAS_CONTENTS, 2);
2480 quick_symbol (abfd, "", fixup_name, "", UNDSEC, BSF_GLOBAL, 0);
2482 if (link_info.pei386_runtime_pseudo_reloc == 2)
2484 size_t size = 12;
2485 if (! runtime_pseudp_reloc_v2_init)
2487 size += 12;
2488 runtime_pseudp_reloc_v2_init = 1;
2490 quick_symbol (abfd, U ("_imp_"), name, "", UNDSEC, BSF_GLOBAL, 0);
2492 bfd_set_section_size (abfd, rt_rel, size);
2493 rt_rel_d = xmalloc (size);
2494 rt_rel->contents = rt_rel_d;
2495 memset (rt_rel_d, 0, size);
2496 quick_reloc (abfd, size - 8, BFD_RELOC_RVA, 1);
2497 quick_reloc (abfd, size - 12, BFD_RELOC_RVA, 2);
2498 bfd_put_32 (abfd, bitsize, rt_rel_d + (size - 4));
2499 if (size != 12)
2500 bfd_put_32 (abfd, 1, rt_rel_d + 8);
2501 save_relocs (rt_rel);
2503 bfd_set_symtab (abfd, symtab, symptr);
2505 bfd_set_section_contents (abfd, rt_rel, rt_rel_d, 0, size);
2507 else
2509 bfd_set_section_size (abfd, rt_rel, 8);
2510 rt_rel_d = xmalloc (8);
2511 rt_rel->contents = rt_rel_d;
2512 memset (rt_rel_d, 0, 8);
2514 bfd_put_32 (abfd, addend, rt_rel_d);
2515 quick_reloc (abfd, 4, BFD_RELOC_RVA, 1);
2517 save_relocs (rt_rel);
2519 bfd_set_symtab (abfd, symtab, symptr);
2521 bfd_set_section_contents (abfd, rt_rel, rt_rel_d, 0, 8);
2523 bfd_make_readable (abfd);
2524 return abfd;
2527 /* .section .rdata
2528 .rva __pei386_runtime_relocator */
2530 static bfd *
2531 pe_create_runtime_relocator_reference (bfd *parent)
2533 asection *extern_rt_rel;
2534 unsigned char *extern_rt_rel_d;
2535 char *oname;
2536 bfd *abfd;
2538 oname = xmalloc (20);
2539 sprintf (oname, "ertr%06d.o", tmp_seq);
2540 tmp_seq++;
2542 abfd = bfd_create (oname, parent);
2543 bfd_find_target (pe_details->object_target, abfd);
2544 bfd_make_writable (abfd);
2546 bfd_set_format (abfd, bfd_object);
2547 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2549 symptr = 0;
2550 symtab = xmalloc (2 * sizeof (asymbol *));
2551 extern_rt_rel = quick_section (abfd, ".rdata", SEC_HAS_CONTENTS, 2);
2553 quick_symbol (abfd, "", U ("_pei386_runtime_relocator"), "", UNDSEC,
2554 BSF_NO_FLAGS, 0);
2556 bfd_set_section_size (abfd, extern_rt_rel, PE_IDATA5_SIZE);
2557 extern_rt_rel_d = xmalloc (PE_IDATA5_SIZE);
2558 extern_rt_rel->contents = extern_rt_rel_d;
2560 quick_reloc (abfd, 0, BFD_RELOC_RVA, 1);
2561 save_relocs (extern_rt_rel);
2563 bfd_set_symtab (abfd, symtab, symptr);
2565 bfd_set_section_contents (abfd, extern_rt_rel, extern_rt_rel_d, 0, PE_IDATA5_SIZE);
2567 bfd_make_readable (abfd);
2568 return abfd;
2571 void
2572 pe_create_import_fixup (arelent *rel, asection *s, bfd_vma addend)
2574 char buf[300];
2575 struct bfd_symbol *sym = *rel->sym_ptr_ptr;
2576 struct bfd_link_hash_entry *name_thunk_sym;
2577 struct bfd_link_hash_entry *name_imp_sym;
2578 const char *name = sym->name;
2579 char *fixup_name = make_import_fixup_mark (rel);
2580 bfd *b;
2581 int need_import_table = 1;
2583 sprintf (buf, U ("_imp_%s"), name);
2584 name_imp_sym = bfd_link_hash_lookup (link_info.hash, buf, 0, 0, 1);
2586 sprintf (buf, U ("_nm_thnk_%s"), name);
2588 name_thunk_sym = bfd_link_hash_lookup (link_info.hash, buf, 0, 0, 1);
2590 /* For version 2 pseudo relocation we don't need to add an import
2591 if the import symbol is already present. */
2592 if (link_info.pei386_runtime_pseudo_reloc == 2
2593 && name_imp_sym
2594 && name_imp_sym->type == bfd_link_hash_defined)
2595 need_import_table = 0;
2597 if (need_import_table == 1
2598 && (!name_thunk_sym || name_thunk_sym->type != bfd_link_hash_defined))
2600 b = make_singleton_name_thunk (name, link_info.output_bfd);
2601 add_bfd_to_link (b, b->filename, &link_info);
2603 /* If we ever use autoimport, we have to cast text section writable.
2604 But not for version 2. */
2605 if (link_info.pei386_runtime_pseudo_reloc != 2)
2607 config.text_read_only = FALSE;
2608 link_info.output_bfd->flags &= ~WP_TEXT;
2610 if (link_info.pei386_runtime_pseudo_reloc == 2)
2612 b = make_singleton_name_imp (name, link_info.output_bfd);
2613 add_bfd_to_link (b, b->filename, &link_info);
2617 if ((addend == 0 || link_info.pei386_runtime_pseudo_reloc)
2618 && need_import_table == 1)
2620 extern char * pe_data_import_dll;
2621 char * symname = pe_data_import_dll ? pe_data_import_dll : "unknown";
2623 b = make_import_fixup_entry (name, fixup_name, symname,
2624 link_info.output_bfd);
2625 add_bfd_to_link (b, b->filename, &link_info);
2628 if ((link_info.pei386_runtime_pseudo_reloc != 0 && addend != 0)
2629 || link_info.pei386_runtime_pseudo_reloc == 2)
2631 if (pe_dll_extra_pe_debug)
2632 printf ("creating runtime pseudo-reloc entry for %s (addend=%d)\n",
2633 fixup_name, (int) addend);
2635 b = make_runtime_pseudo_reloc (name, fixup_name, addend, rel->howto->bitsize,
2636 link_info.output_bfd);
2637 add_bfd_to_link (b, b->filename, &link_info);
2639 if (runtime_pseudo_relocs_created == 0)
2641 b = pe_create_runtime_relocator_reference (link_info.output_bfd);
2642 add_bfd_to_link (b, b->filename, &link_info);
2644 runtime_pseudo_relocs_created++;
2646 else if (addend != 0)
2648 einfo (_("%C: variable '%T' can't be auto-imported. Please read the documentation for ld's --enable-auto-import for details.\n"),
2649 s->owner, s, rel->address, sym->name);
2650 einfo ("%X");
2655 void
2656 pe_dll_generate_implib (def_file *def, const char *impfilename, struct bfd_link_info *info)
2658 int i;
2659 bfd *ar_head;
2660 bfd *ar_tail;
2661 bfd *outarch;
2662 bfd *ibfd;
2663 bfd *head = 0;
2665 dll_filename = (def->name) ? def->name : dll_name;
2666 dll_symname = xstrdup (dll_filename);
2667 for (i = 0; dll_symname[i]; i++)
2668 if (!ISALNUM (dll_symname[i]))
2669 dll_symname[i] = '_';
2671 unlink_if_ordinary (impfilename);
2673 outarch = bfd_openw (impfilename, 0);
2675 if (!outarch)
2677 /* xgettext:c-format */
2678 einfo (_("%XCan't open .lib file: %s\n"), impfilename);
2679 return;
2682 /* xgettext:c-format */
2683 info_msg (_("Creating library file: %s\n"), impfilename);
2685 bfd_set_format (outarch, bfd_archive);
2686 outarch->has_armap = 1;
2688 /* Work out a reasonable size of things to put onto one line. */
2689 ar_head = make_head (outarch);
2691 /* Iterate the input BFDs, looking for exclude-modules-for-implib. */
2692 for (ibfd = info->input_bfds; ibfd; ibfd = ibfd->link_next)
2694 /* Iterate the exclude list. */
2695 struct exclude_list_struct *ex;
2696 char found;
2697 for (ex = excludes, found = 0; ex && !found; ex = ex->next)
2699 if (ex->type != EXCLUDEFORIMPLIB)
2700 continue;
2701 found = (strcmp (ex->string, ibfd->filename) == 0);
2703 /* If it matched, we must open a fresh BFD for it (the original
2704 input BFD is still needed for the DLL's final link) and add
2705 it into the archive member chain. */
2706 if (found)
2708 bfd *newbfd = bfd_openr (ibfd->my_archive
2709 ? ibfd->my_archive->filename : ibfd->filename, NULL);
2710 if (!newbfd)
2712 einfo (_("%Xbfd_openr %s: %E\n"), ibfd->filename);
2713 return;
2715 if (ibfd->my_archive)
2717 /* Must now iterate through archive until we find the
2718 required member. A minor shame that we'll open the
2719 archive once per member that we require from it, and
2720 leak those archive bfds rather than reuse them. */
2721 bfd *arbfd = newbfd;
2722 if (!bfd_check_format_matches (arbfd, bfd_archive, NULL))
2724 einfo (_("%X%s(%s): can't find member in non-archive file"),
2725 ibfd->my_archive->filename, ibfd->filename);
2726 return;
2728 newbfd = NULL;
2729 while ((newbfd = bfd_openr_next_archived_file (arbfd, newbfd)) != 0)
2731 if (strcmp (newbfd->filename, ibfd->filename) == 0)
2732 break;
2734 if (!newbfd)
2736 einfo (_("%X%s(%s): can't find member in archive"),
2737 ibfd->my_archive->filename, ibfd->filename);
2738 return;
2741 newbfd->archive_next = head;
2742 head = newbfd;
2746 for (i = 0; i < def->num_exports; i++)
2748 /* The import library doesn't know about the internal name. */
2749 char *internal = def->exports[i].internal_name;
2750 bfd *n;
2752 /* Don't add PRIVATE entries to import lib. */
2753 if (pe_def_file->exports[i].flag_private)
2754 continue;
2755 def->exports[i].internal_name = def->exports[i].name;
2756 n = make_one (def->exports + i, outarch,
2757 ! (def->exports + i)->flag_data);
2758 n->archive_next = head;
2759 head = n;
2760 def->exports[i].internal_name = internal;
2763 ar_tail = make_tail (outarch);
2765 if (ar_head == NULL || ar_tail == NULL)
2766 return;
2768 /* Now stick them all into the archive. */
2769 ar_head->archive_next = head;
2770 ar_tail->archive_next = ar_head;
2771 head = ar_tail;
2773 if (! bfd_set_archive_head (outarch, head))
2774 einfo ("%Xbfd_set_archive_head: %E\n");
2776 if (! bfd_close (outarch))
2777 einfo ("%Xbfd_close %s: %E\n", impfilename);
2779 while (head != NULL)
2781 bfd *n = head->archive_next;
2782 bfd_close (head);
2783 head = n;
2787 static struct bfd_link_hash_entry *found_sym;
2789 static bfd_boolean
2790 pe_undef_alias_cdecl_match (struct bfd_link_hash_entry *h, void *inf)
2792 int sl;
2793 char *string = inf;
2794 const char *hs = h->root.string;
2796 sl = strlen (string);
2797 if (h->type == bfd_link_hash_undefined
2798 && ((*hs == '@' && *string == '_'
2799 && strncmp (hs + 1, string + 1, sl - 1) == 0)
2800 || strncmp (hs, string, sl) == 0)
2801 && h->root.string[sl] == '@')
2803 found_sym = h;
2804 return FALSE;
2806 return TRUE;
2809 static struct bfd_link_hash_entry *
2810 pe_find_cdecl_alias_match (char *name)
2812 found_sym = 0;
2813 bfd_link_hash_traverse (link_info.hash, pe_undef_alias_cdecl_match,
2814 (char *) name);
2815 return found_sym;
2818 static void
2819 add_bfd_to_link (bfd *abfd, const char *name, struct bfd_link_info *linfo)
2821 lang_input_statement_type *fake_file;
2823 fake_file = lang_add_input_file (name,
2824 lang_input_file_is_fake_enum,
2825 NULL);
2826 fake_file->the_bfd = abfd;
2827 ldlang_add_file (fake_file);
2829 if (!bfd_link_add_symbols (abfd, linfo))
2830 einfo ("%Xaddsym %s: %E\n", name);
2833 void
2834 pe_process_import_defs (bfd *output_bfd, struct bfd_link_info *linfo)
2836 def_file_module *module;
2838 pe_dll_id_target (bfd_get_target (output_bfd));
2840 if (!pe_def_file)
2841 return;
2843 for (module = pe_def_file->modules; module; module = module->next)
2845 int i, do_this_dll;
2847 dll_filename = module->name;
2848 dll_symname = xstrdup (module->name);
2849 for (i = 0; dll_symname[i]; i++)
2850 if (!ISALNUM (dll_symname[i]))
2851 dll_symname[i] = '_';
2853 do_this_dll = 0;
2855 for (i = 0; i < pe_def_file->num_imports; i++)
2856 if (pe_def_file->imports[i].module == module)
2858 def_file_export exp;
2859 struct bfd_link_hash_entry *blhe;
2860 int lead_at = (*pe_def_file->imports[i].internal_name == '@');
2861 /* See if we need this import. */
2862 size_t len = strlen (pe_def_file->imports[i].internal_name);
2863 char *name = xmalloc (len + 2 + 6);
2864 bfd_boolean include_jmp_stub = FALSE;
2865 bfd_boolean is_cdecl = FALSE;
2866 if (!lead_at && strchr (pe_def_file->imports[i].internal_name, '@') == NULL)
2867 is_cdecl = TRUE;
2869 if (lead_at)
2870 sprintf (name, "%s",
2871 pe_def_file->imports[i].internal_name);
2872 else
2873 sprintf (name, "%s%s",U (""),
2874 pe_def_file->imports[i].internal_name);
2876 blhe = bfd_link_hash_lookup (linfo->hash, name,
2877 FALSE, FALSE, FALSE);
2879 /* Include the jump stub for <sym> only if the <sym>
2880 is undefined. */
2881 if (!blhe || (blhe && blhe->type != bfd_link_hash_undefined))
2883 if (lead_at)
2884 sprintf (name, "%s%s", "__imp_",
2885 pe_def_file->imports[i].internal_name);
2886 else
2887 sprintf (name, "%s%s%s", "__imp_", U (""),
2888 pe_def_file->imports[i].internal_name);
2890 blhe = bfd_link_hash_lookup (linfo->hash, name,
2891 FALSE, FALSE, FALSE);
2893 else
2894 include_jmp_stub = TRUE;
2896 if (is_cdecl && !blhe)
2898 sprintf (name, "%s%s",U (""),
2899 pe_def_file->imports[i].internal_name);
2900 blhe = pe_find_cdecl_alias_match (name);
2901 include_jmp_stub = TRUE;
2904 free (name);
2906 if (blhe && blhe->type == bfd_link_hash_undefined)
2908 bfd *one;
2909 /* We do. */
2910 if (!do_this_dll)
2912 bfd *ar_head = make_head (output_bfd);
2913 add_bfd_to_link (ar_head, ar_head->filename, linfo);
2914 do_this_dll = 1;
2916 exp.internal_name = pe_def_file->imports[i].internal_name;
2917 exp.name = pe_def_file->imports[i].name;
2918 exp.its_name = pe_def_file->imports[i].its_name;
2919 exp.ordinal = pe_def_file->imports[i].ordinal;
2920 exp.hint = exp.ordinal >= 0 ? exp.ordinal : 0;
2921 exp.flag_private = 0;
2922 exp.flag_constant = 0;
2923 exp.flag_data = pe_def_file->imports[i].data;
2924 exp.flag_noname = exp.name ? 0 : 1;
2925 one = make_one (&exp, output_bfd, (! exp.flag_data) && include_jmp_stub);
2926 add_bfd_to_link (one, one->filename, linfo);
2929 if (do_this_dll)
2931 bfd *ar_tail = make_tail (output_bfd);
2932 add_bfd_to_link (ar_tail, ar_tail->filename, linfo);
2935 free (dll_symname);
2939 /* We were handed a *.DLL file. Parse it and turn it into a set of
2940 IMPORTS directives in the def file. Return TRUE if the file was
2941 handled, FALSE if not. */
2943 static unsigned int
2944 pe_get16 (bfd *abfd, int where)
2946 unsigned char b[2];
2948 bfd_seek (abfd, (file_ptr) where, SEEK_SET);
2949 bfd_bread (b, (bfd_size_type) 2, abfd);
2950 return b[0] + (b[1] << 8);
2953 static unsigned int
2954 pe_get32 (bfd *abfd, int where)
2956 unsigned char b[4];
2958 bfd_seek (abfd, (file_ptr) where, SEEK_SET);
2959 bfd_bread (b, (bfd_size_type) 4, abfd);
2960 return b[0] + (b[1] << 8) + (b[2] << 16) + (b[3] << 24);
2963 static unsigned int
2964 pe_as32 (void *ptr)
2966 unsigned char *b = ptr;
2968 return b[0] + (b[1] << 8) + (b[2] << 16) + (b[3] << 24);
2971 bfd_boolean
2972 pe_implied_import_dll (const char *filename)
2974 bfd *dll;
2975 bfd_vma pe_header_offset, opthdr_ofs, num_entries, i;
2976 bfd_vma export_rva, export_size, nsections, secptr, expptr;
2977 bfd_vma exp_funcbase;
2978 unsigned char *expdata;
2979 char *erva;
2980 bfd_vma name_rvas, ordinals, nexp, ordbase;
2981 const char *dllname;
2982 /* Initialization with start > end guarantees that is_data
2983 will not be set by mistake, and avoids compiler warning. */
2984 bfd_vma data_start = 1;
2985 bfd_vma data_end = 0;
2986 bfd_vma rdata_start = 1;
2987 bfd_vma rdata_end = 0;
2988 bfd_vma bss_start = 1;
2989 bfd_vma bss_end = 0;
2991 /* No, I can't use bfd here. kernel32.dll puts its export table in
2992 the middle of the .rdata section. */
2993 dll = bfd_openr (filename, pe_details->target_name);
2994 if (!dll)
2996 einfo ("%Xopen %s: %E\n", filename);
2997 return FALSE;
3000 /* PEI dlls seem to be bfd_objects. */
3001 if (!bfd_check_format (dll, bfd_object))
3003 einfo ("%X%s: this doesn't appear to be a DLL\n", filename);
3004 return FALSE;
3007 /* Get pe_header, optional header and numbers of directory entries. */
3008 pe_header_offset = pe_get32 (dll, 0x3c);
3009 opthdr_ofs = pe_header_offset + 4 + 20;
3010 #ifdef pe_use_x86_64
3011 num_entries = pe_get32 (dll, opthdr_ofs + 92 + 4 * 4); /* & NumberOfRvaAndSizes. */
3012 #else
3013 num_entries = pe_get32 (dll, opthdr_ofs + 92);
3014 #endif
3016 /* No import or export directory entry. */
3017 if (num_entries < 1)
3018 return FALSE;
3020 #ifdef pe_use_x86_64
3021 export_rva = pe_get32 (dll, opthdr_ofs + 96 + 4 * 4);
3022 export_size = pe_get32 (dll, opthdr_ofs + 100 + 4 * 4);
3023 #else
3024 export_rva = pe_get32 (dll, opthdr_ofs + 96);
3025 export_size = pe_get32 (dll, opthdr_ofs + 100);
3026 #endif
3028 /* No export table - nothing to export. */
3029 if (export_size == 0)
3030 return FALSE;
3032 nsections = pe_get16 (dll, pe_header_offset + 4 + 2);
3033 secptr = (pe_header_offset + 4 + 20 +
3034 pe_get16 (dll, pe_header_offset + 4 + 16));
3035 expptr = 0;
3037 /* Get the rva and size of the export section. */
3038 for (i = 0; i < nsections; i++)
3040 char sname[8];
3041 bfd_vma secptr1 = secptr + 40 * i;
3042 bfd_vma vaddr = pe_get32 (dll, secptr1 + 12);
3043 bfd_vma vsize = pe_get32 (dll, secptr1 + 16);
3044 bfd_vma fptr = pe_get32 (dll, secptr1 + 20);
3046 bfd_seek (dll, (file_ptr) secptr1, SEEK_SET);
3047 bfd_bread (sname, (bfd_size_type) 8, dll);
3049 if (vaddr <= export_rva && vaddr + vsize > export_rva)
3051 expptr = fptr + (export_rva - vaddr);
3052 if (export_rva + export_size > vaddr + vsize)
3053 export_size = vsize - (export_rva - vaddr);
3054 break;
3058 /* Scan sections and store the base and size of the
3059 data and bss segments in data/base_start/end. */
3060 for (i = 0; i < nsections; i++)
3062 bfd_vma secptr1 = secptr + 40 * i;
3063 bfd_vma vsize = pe_get32 (dll, secptr1 + 8);
3064 bfd_vma vaddr = pe_get32 (dll, secptr1 + 12);
3065 bfd_vma flags = pe_get32 (dll, secptr1 + 36);
3066 char sec_name[9];
3068 sec_name[8] = '\0';
3069 bfd_seek (dll, (file_ptr) secptr1 + 0, SEEK_SET);
3070 bfd_bread (sec_name, (bfd_size_type) 8, dll);
3072 if (strcmp(sec_name,".data") == 0)
3074 data_start = vaddr;
3075 data_end = vaddr + vsize;
3077 if (pe_dll_extra_pe_debug)
3078 printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n",
3079 __FUNCTION__, sec_name, (unsigned long) vaddr,
3080 (unsigned long) (vaddr + vsize), (unsigned long) flags);
3082 else if (strcmp(sec_name,".rdata") == 0)
3084 rdata_start = vaddr;
3085 rdata_end = vaddr + vsize;
3087 if (pe_dll_extra_pe_debug)
3088 printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n",
3089 __FUNCTION__, sec_name, (unsigned long) vaddr,
3090 (unsigned long) (vaddr + vsize), (unsigned long) flags);
3092 else if (strcmp (sec_name,".bss") == 0)
3094 bss_start = vaddr;
3095 bss_end = vaddr + vsize;
3097 if (pe_dll_extra_pe_debug)
3098 printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n",
3099 __FUNCTION__, sec_name, (unsigned long) vaddr,
3100 (unsigned long) (vaddr + vsize), (unsigned long) flags);
3104 expdata = xmalloc (export_size);
3105 bfd_seek (dll, (file_ptr) expptr, SEEK_SET);
3106 bfd_bread (expdata, (bfd_size_type) export_size, dll);
3107 erva = (char *) expdata - export_rva;
3109 if (pe_def_file == 0)
3110 pe_def_file = def_file_empty ();
3112 nexp = pe_as32 (expdata + 24);
3113 name_rvas = pe_as32 (expdata + 32);
3114 ordinals = pe_as32 (expdata + 36);
3115 ordbase = pe_as32 (expdata + 16);
3116 exp_funcbase = pe_as32 (expdata + 28);
3118 /* Use internal dll name instead of filename
3119 to enable symbolic dll linking. */
3120 dllname = erva + pe_as32 (expdata + 12);
3122 /* Check to see if the dll has already been added to
3123 the definition list and if so return without error.
3124 This avoids multiple symbol definitions. */
3125 if (def_get_module (pe_def_file, dllname))
3127 if (pe_dll_extra_pe_debug)
3128 printf ("%s is already loaded\n", dllname);
3129 return TRUE;
3132 /* Iterate through the list of symbols. */
3133 for (i = 0; i < nexp; i++)
3135 /* Pointer to the names vector. */
3136 bfd_vma name_rva = pe_as32 (erva + name_rvas + i * 4);
3137 def_file_import *imp;
3138 /* Pointer to the function address vector. */
3139 bfd_vma func_rva = pe_as32 (erva + exp_funcbase + i * 4);
3140 int is_data = 0;
3142 /* Skip unwanted symbols, which are
3143 exported in buggy auto-import releases. */
3144 if (! CONST_STRNEQ (erva + name_rva, "_nm_"))
3146 /* is_data is true if the address is in the data, rdata or bss
3147 segment. */
3148 is_data =
3149 (func_rva >= data_start && func_rva < data_end)
3150 || (func_rva >= rdata_start && func_rva < rdata_end)
3151 || (func_rva >= bss_start && func_rva < bss_end);
3153 imp = def_file_add_import (pe_def_file, erva + name_rva,
3154 dllname, i, 0, NULL);
3155 /* Mark symbol type. */
3156 imp->data = is_data;
3158 if (pe_dll_extra_pe_debug)
3159 printf ("%s dll-name: %s sym: %s addr: 0x%lx %s\n",
3160 __FUNCTION__, dllname, erva + name_rva,
3161 (unsigned long) func_rva, is_data ? "(data)" : "");
3165 return TRUE;
3168 void
3169 pe_output_file_set_long_section_names (bfd *abfd)
3171 if (pe_use_coff_long_section_names < 0)
3172 return;
3173 if (!bfd_coff_set_long_section_names (abfd, pe_use_coff_long_section_names))
3174 einfo (_("%XError: can't use long section names on this arch\n"));
3177 /* These are the main functions, called from the emulation. The first
3178 is called after the bfds are read, so we can guess at how much space
3179 we need. The second is called after everything is placed, so we
3180 can put the right values in place. */
3182 void
3183 pe_dll_build_sections (bfd *abfd, struct bfd_link_info *info)
3185 pe_dll_id_target (bfd_get_target (abfd));
3186 pe_output_file_set_long_section_names (abfd);
3187 process_def_file_and_drectve (abfd, info);
3189 if (pe_def_file->num_exports == 0 && !info->shared)
3190 return;
3192 generate_edata (abfd, info);
3193 build_filler_bfd (1);
3194 pe_output_file_set_long_section_names (filler_bfd);
3197 void
3198 pe_exe_build_sections (bfd *abfd, struct bfd_link_info *info ATTRIBUTE_UNUSED)
3200 pe_dll_id_target (bfd_get_target (abfd));
3201 pe_output_file_set_long_section_names (abfd);
3202 build_filler_bfd (0);
3203 pe_output_file_set_long_section_names (filler_bfd);
3206 void
3207 pe_dll_fill_sections (bfd *abfd, struct bfd_link_info *info)
3209 pe_dll_id_target (bfd_get_target (abfd));
3210 pe_output_file_set_long_section_names (abfd);
3211 image_base = pe_data (abfd)->pe_opthdr.ImageBase;
3213 generate_reloc (abfd, info);
3214 if (reloc_sz > 0)
3216 bfd_set_section_size (filler_bfd, reloc_s, reloc_sz);
3218 /* Resize the sections. */
3219 lang_reset_memory_regions ();
3220 lang_size_sections (NULL, TRUE);
3222 /* Redo special stuff. */
3223 ldemul_after_allocation ();
3225 /* Do the assignments again. */
3226 lang_do_assignments ();
3229 fill_edata (abfd, info);
3231 if (info->shared && !info->pie)
3232 pe_data (abfd)->dll = 1;
3234 edata_s->contents = edata_d;
3235 reloc_s->contents = reloc_d;
3238 void
3239 pe_exe_fill_sections (bfd *abfd, struct bfd_link_info *info)
3241 pe_dll_id_target (bfd_get_target (abfd));
3242 pe_output_file_set_long_section_names (abfd);
3243 image_base = pe_data (abfd)->pe_opthdr.ImageBase;
3245 generate_reloc (abfd, info);
3246 if (reloc_sz > 0)
3248 bfd_set_section_size (filler_bfd, reloc_s, reloc_sz);
3250 /* Resize the sections. */
3251 lang_reset_memory_regions ();
3252 lang_size_sections (NULL, TRUE);
3254 /* Redo special stuff. */
3255 ldemul_after_allocation ();
3257 /* Do the assignments again. */
3258 lang_do_assignments ();
3260 reloc_s->contents = reloc_d;
3263 bfd_boolean
3264 pe_bfd_is_dll (bfd *abfd)
3266 return (bfd_get_format (abfd) == bfd_object
3267 && obj_pe (abfd)
3268 && pe_data (abfd)->dll);