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. */
26 #include "libiberty.h"
27 #include "safe-ctype.h"
40 #include "coff/internal.h"
41 #include "../bfd/libcoff.h"
46 #define PE_IDATA4_SIZE 8
47 #define PE_IDATA5_SIZE 8
50 #define AOUTSZ PEPAOUTSZ
51 #define PEAOUTHDR PEPAOUTHDR
59 #ifndef PE_IDATA4_SIZE
60 #define PE_IDATA4_SIZE 4
63 #ifndef PE_IDATA5_SIZE
64 #define PE_IDATA5_SIZE 4
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
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
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).
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
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, ;-) .
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;
177 autofilter_entry_type
;
181 const char *target_name
;
182 const char *object_target
;
183 unsigned int imagebase_reloc
;
186 bfd_boolean underscored
;
187 const autofilter_entry_type
* autofilter_symbollist
;
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") },
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") },
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") },
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") },
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") },
240 #define PE_ARCH_i386 1
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
[] =
262 autofilter_symbollist_i386
267 16 /* R_SH_IMAGEBASE */,
271 autofilter_symbollist_generic
280 autofilter_symbollist_generic
289 autofilter_symbollist_generic
292 "epoc-pei-arm-little",
293 "epoc-pe-arm-little",
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. */
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") },
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
))
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
))
351 /* Ensure the filename has an extension. */
352 while (*++libname
!= '.')
356 else if (libname
[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") },
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
391 { STRING_COMMA_LEN (".") },
395 static const autofilter_entry_type autofilter_symbolsuffixlist
[] =
397 { STRING_COMMA_LEN ("_iname") },
398 { STRING_COMMA_LEN ("_NULL_THUNK_DATA") },
402 #define U(str) (pe_details->underscored ? "_" str : str)
405 pe_dll_id_target (const char *target
)
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
;
416 einfo (_("%XUnsupported PEI architecture: %s\n"), target
);
420 /* Helper functions for qsort. Relocs must be sorted so that we can write
421 them out by pages. */
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);
441 pe_export_sort (const void *va
, const void *vb
)
443 const def_file_export
*a
= va
;
444 const def_file_export
*b
= vb
;
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
474 struct exclude_list_struct
*next
;
479 static struct exclude_list_struct
*excludes
= 0;
482 pe_dll_add_excludes (const char *new_excludes
, const exclude_type type
)
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
;
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. */
515 auto_export (bfd
*abfd
, def_file
*d
, const char *n
)
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)
528 if (pe_dll_do_default_excludes
)
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. */
541 afptr
= autofilter_liblist
;
545 if (libnamencmp (libname
, afptr
) == 0 )
551 /* Next, exclude symbols from certain startup objects. */
553 if (abfd
&& (p
= lbasename (abfd
->filename
)))
555 afptr
= autofilter_objlist
;
558 if (strcmp (p
, afptr
->name
) == 0)
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
;
572 if (strcmp (n
, afptr
->name
) == 0)
578 /* Next, exclude symbols starting with ... */
579 afptr
= autofilter_symbolprefixlist
;
582 if (strncmp (n
, afptr
->name
, afptr
->len
) == 0)
588 /* Finally, exclude symbols ending with ... */
590 afptr
= autofilter_symbolsuffixlist
;
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)
603 for (ex
= excludes
; ex
; ex
= ex
->next
)
605 if (ex
->type
== EXCLUDELIBS
)
608 && ((strcmp (libname
, ex
->string
) == 0)
609 || (strcasecmp ("ALL", ex
->string
) == 0)))
612 else if (ex
->type
== EXCLUDEFORIMPLIB
)
614 if (strcmp (abfd
->filename
, ex
->string
) == 0)
617 else if (strcmp (n
, ex
->string
) == 0)
625 process_def_file_and_drectve (bfd
*abfd ATTRIBUTE_UNUSED
, struct bfd_link_info
*info
)
628 struct bfd_link_hash_entry
*blhe
;
630 struct bfd_section
*s
;
631 def_file_export
*e
= 0;
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");
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
);
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
;
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
;
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
))
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
)
689 if (!bfd_generic_link_read_symbols (b
))
691 einfo (_("%B%F: could not read symbols: %E\n"), b
);
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
;
716 const char *sn
= symbols
[j
]->name
;
718 /* We should not re-export imported stuff. */
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
);
731 if (blhe
&& blhe
->type
== bfd_link_hash_defined
)
735 if (pe_details
->underscored
&& *sn
== '_')
738 if (auto_export (b
, pe_def_file
, sn
))
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
);
751 #define NE pe_def_file->num_exports
753 /* Don't create an empty export table. */
757 /* Canonicalize the export list. */
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
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
, '@');
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
))
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
,
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
*));
814 count_exported_byname
= 0;
815 count_with_ordinals
= 0;
817 qsort (pe_def_file
->exports
, NE
, sizeof (pe_def_file
->exports
[0]),
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
);
835 if (pe_dll_warn_dup_exports
)
836 /* xgettext:c-format */
837 einfo (_("Warning, duplicate EXPORT: %s\n"),
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
;
855 pe_def_file
->num_exports
= j
; /* == NE */
857 for (i
= 0; i
< NE
; i
++)
861 /* Check for forward exports */
862 if (strchr (pe_def_file
->exports
[i
].internal_name
, '.'))
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
++;
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
!= '@'))
887 strcpy (name
+ 1, pe_def_file
->exports
[i
].internal_name
);
890 strcpy (name
, pe_def_file
->exports
[i
].internal_name
);
892 blhe
= bfd_link_hash_lookup (info
->hash
,
897 && (blhe
->type
== bfd_link_hash_defined
898 || (blhe
->type
== bfd_link_hash_common
)))
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
907 if (blhe
->type
== bfd_link_hash_defined
)
908 exported_symbol_sections
[i
] = blhe
->u
.def
.section
;
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
);
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
);
936 /* xgettext:c-format */
937 einfo (_("%XCannot export %s: symbol not found\n"),
938 pe_def_file
->exports
[i
].internal_name
);
944 /* Build the bfd that will contain .edata and .reloc sections. */
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
,
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");
966 edata_s
= bfd_make_section_old_way (filler_bfd
, ".edata");
968 || !bfd_set_section_flags (filler_bfd
, edata_s
,
975 einfo ("%X%P: can not create .edata section: %E\n");
978 bfd_set_section_size (filler_bfd
, edata_s
, edata_sz
);
981 reloc_s
= bfd_make_section_old_way (filler_bfd
, ".reloc");
983 || !bfd_set_section_flags (filler_bfd
, reloc_s
,
990 einfo ("%X%P: can not create .reloc section: %E\n");
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. */
1002 generate_edata (bfd
*abfd
, struct bfd_link_info
*info ATTRIBUTE_UNUSED
)
1004 int i
, next_ordinal
;
1005 int name_table_size
= 0;
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
;
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;
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
];
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;
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)
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(). */
1096 fill_exported_offsets (bfd
*abfd ATTRIBUTE_UNUSED
, struct bfd_link_info
*info
)
1099 struct bfd_link_hash_entry
*blhe
;
1101 for (i
= 0; i
< pe_def_file
->num_exports
; i
++)
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
!= '@')
1110 strcpy (name
+ 1, pe_def_file
->exports
[i
].internal_name
);
1113 strcpy (name
, pe_def_file
->exports
[i
].internal_name
);
1115 blhe
= bfd_link_hash_lookup (info
->hash
,
1117 FALSE
, FALSE
, TRUE
);
1119 if (blhe
&& blhe
->type
== bfd_link_hash_defined
)
1120 exported_symbol_offsets
[i
] = blhe
->u
.def
.value
;
1127 fill_edata (bfd
*abfd
, struct bfd_link_info
*info ATTRIBUTE_UNUSED
)
1130 unsigned char *edirectory
;
1131 unsigned char *eaddresses
;
1132 unsigned char *enameptrs
;
1133 unsigned char *eordinals
;
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. */
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;
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
);
1212 strcpy (enamestr
, ename
);
1213 enamestr
+= strlen (enamestr
) + 1;
1214 bfd_put_16 (abfd
, ord
- min_ordinal
, eordinals
);
1216 pe_def_file
->exports
[s
].hint
= hint
++;
1223 static struct bfd_section
*current_sec
;
1226 pe_walk_relocs_of_symbol (struct bfd_link_info
*info
,
1228 int (*cb
) (arelent
*, asection
*))
1233 for (b
= info
->input_bfds
; b
; b
= b
->link_next
)
1238 if (!bfd_generic_link_read_symbols (b
))
1240 einfo (_("%B%F: could not read symbols: %E\n"), b
);
1244 symbols
= bfd_get_outsymbols (b
);
1245 nsyms
= bfd_get_symcount (b
);
1247 for (s
= b
->sections
; s
; s
= s
->next
)
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
)
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
))
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. */
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;
1291 bfd_vma sec_page
= (bfd_vma
) -1;
1292 bfd_vma page_ptr
, page_count
;
1295 struct bfd_section
*s
;
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
));
1306 for (bi
= 0, b
= info
->input_bfds
; b
; bi
++, b
= b
->link_next
)
1309 int relsize
, nrelocs
, i
;
1311 for (s
= b
->sections
; s
; s
= s
->next
)
1313 bfd_vma sec_vma
= s
->output_section
->vma
+ s
->output_offset
;
1317 /* If it's not loaded, we don't need to relocate it this way. */
1318 if (!(s
->output_section
->flags
& SEC_LOAD
))
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
)
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
);
1335 if (!bfd_generic_link_read_symbols (b
))
1337 einfo (_("%B%F: could not read symbols: %E\n"), b
);
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
)
1358 struct bfd_symbol
*sym
= *relocs
[i
]->sym_ptr_ptr
;
1360 /* Don't create relocs for undefined weak symbols. */
1361 if (sym
->flags
== BSF_WEAK
)
1363 struct bfd_link_hash_entry
*blhe
1364 = bfd_link_hash_lookup (info
->hash
, sym
->name
,
1365 FALSE
, FALSE
, FALSE
);
1366 if (!blhe
|| blhe
->type
!= bfd_link_hash_defined
)
1370 sym_vma
= (relocs
[i
]->addend
1373 + sym
->section
->output_offset
1374 + sym
->section
->output_section
->vma
);
1375 reloc_data
[total_relocs
].vma
= sec_vma
+ relocs
[i
]->address
;
1377 #define BITS_AND_SHIFT(bits, shift) (bits * 1000 | shift)
1379 switch BITS_AND_SHIFT (relocs
[i
]->howto
->bitsize
,
1380 relocs
[i
]->howto
->rightshift
)
1382 #ifdef pe_use_x86_64
1383 case BITS_AND_SHIFT (64, 0):
1384 reloc_data
[total_relocs
].type
= 10;
1388 case BITS_AND_SHIFT (32, 0):
1389 reloc_data
[total_relocs
].type
= 3;
1392 case BITS_AND_SHIFT (16, 0):
1393 reloc_data
[total_relocs
].type
= 2;
1396 case BITS_AND_SHIFT (16, 16):
1397 reloc_data
[total_relocs
].type
= 4;
1398 /* FIXME: we can't know the symbol's right value
1399 yet, but we probably can safely assume that
1400 CE will relocate us in 64k blocks, so leaving
1402 reloc_data
[total_relocs
].extra
= 0;
1405 case BITS_AND_SHIFT (26, 2):
1406 reloc_data
[total_relocs
].type
= 5;
1409 case BITS_AND_SHIFT (24, 2):
1410 /* FIXME: 0 is ARM_26D, it is defined in bfd/coff-arm.c
1411 Those ARM_xxx definitions should go in proper
1413 if (relocs
[i
]->howto
->type
== 0
1414 /* Older GNU linkers used 5 instead of 0 for this reloc. */
1415 || relocs
[i
]->howto
->type
== 5)
1416 /* This is an ARM_26D reloc, which is an ARM_26 reloc
1417 that has already been fully processed during a
1418 previous link stage, so ignore it here. */
1422 /* xgettext:c-format */
1423 einfo (_("%XError: %d-bit reloc in dll\n"),
1424 relocs
[i
]->howto
->bitsize
);
1430 /* Warning: the allocated symbols are remembered in BFD and
1431 reused later, so don't free them! */
1435 /* At this point, we have total_relocs relocation addresses in
1436 reloc_addresses, which are all suitable for the .reloc section.
1437 We must now create the new sections. */
1438 qsort (reloc_data
, total_relocs
, sizeof (*reloc_data
), reloc_sort
);
1440 for (i
= 0; i
< total_relocs
; i
++)
1442 bfd_vma this_page
= (reloc_data
[i
].vma
>> 12);
1444 if (this_page
!= sec_page
)
1446 reloc_sz
= (reloc_sz
+ 3) & ~3; /* 4-byte align. */
1448 sec_page
= this_page
;
1453 if (reloc_data
[i
].type
== 4)
1457 reloc_sz
= (reloc_sz
+ 3) & ~3; /* 4-byte align. */
1458 reloc_d
= xmalloc (reloc_sz
);
1459 sec_page
= (bfd_vma
) -1;
1461 page_ptr
= (bfd_vma
) -1;
1464 for (i
= 0; i
< total_relocs
; i
++)
1466 bfd_vma rva
= reloc_data
[i
].vma
- image_base
;
1467 bfd_vma this_page
= (rva
& ~0xfff);
1469 if (this_page
!= sec_page
)
1471 while (reloc_sz
& 3)
1472 reloc_d
[reloc_sz
++] = 0;
1474 if (page_ptr
!= (bfd_vma
) -1)
1475 bfd_put_32 (abfd
, reloc_sz
- page_ptr
, reloc_d
+ page_ptr
+ 4);
1477 bfd_put_32 (abfd
, this_page
, reloc_d
+ reloc_sz
);
1478 page_ptr
= reloc_sz
;
1480 sec_page
= this_page
;
1484 bfd_put_16 (abfd
, (rva
& 0xfff) + (reloc_data
[i
].type
<< 12),
1485 reloc_d
+ reloc_sz
);
1488 if (reloc_data
[i
].type
== 4)
1490 bfd_put_16 (abfd
, reloc_data
[i
].extra
, reloc_d
+ reloc_sz
);
1497 while (reloc_sz
& 3)
1498 reloc_d
[reloc_sz
++] = 0;
1500 if (page_ptr
!= (bfd_vma
) -1)
1501 bfd_put_32 (abfd
, reloc_sz
- page_ptr
, reloc_d
+ page_ptr
+ 4);
1503 while (reloc_sz
< reloc_s
->size
)
1504 reloc_d
[reloc_sz
++] = 0;
1507 /* Given the exiting def_file structure, print out a .DEF file that
1508 corresponds to it. */
1511 quoteput (char *s
, FILE *f
, int needs_quotes
)
1515 for (cp
= s
; *cp
; cp
++)
1530 if (*s
== '"' || *s
== '\\')
1544 pe_dll_generate_def_file (const char *pe_out_def_filename
)
1547 FILE *out
= fopen (pe_out_def_filename
, "w");
1550 /* xgettext:c-format */
1551 einfo (_("%s: Can't open output def file %s\n"),
1552 program_name
, pe_out_def_filename
);
1556 if (pe_def_file
->name
)
1558 if (pe_def_file
->is_dll
)
1559 fprintf (out
, "LIBRARY ");
1561 fprintf (out
, "NAME ");
1563 quoteput (pe_def_file
->name
, out
, 1);
1565 if (pe_data (link_info
.output_bfd
)->pe_opthdr
.ImageBase
)
1567 fprintf (out
, " BASE=0x");
1568 fprintf_vma (out
, ((bfd_vma
) pe_data (link_info
.output_bfd
)->pe_opthdr
.ImageBase
));
1570 fprintf (out
, "\n");
1573 if (pe_def_file
->description
)
1575 fprintf (out
, "DESCRIPTION ");
1576 quoteput (pe_def_file
->description
, out
, 1);
1577 fprintf (out
, "\n");
1580 if (pe_def_file
->version_minor
!= -1)
1581 fprintf (out
, "VERSION %d.%d\n", pe_def_file
->version_major
,
1582 pe_def_file
->version_minor
);
1583 else if (pe_def_file
->version_major
!= -1)
1584 fprintf (out
, "VERSION %d\n", pe_def_file
->version_major
);
1586 if (pe_def_file
->stack_reserve
!= -1 || pe_def_file
->heap_reserve
!= -1)
1587 fprintf (out
, "\n");
1589 if (pe_def_file
->stack_commit
!= -1)
1590 fprintf (out
, "STACKSIZE 0x%x,0x%x\n",
1591 pe_def_file
->stack_reserve
, pe_def_file
->stack_commit
);
1592 else if (pe_def_file
->stack_reserve
!= -1)
1593 fprintf (out
, "STACKSIZE 0x%x\n", pe_def_file
->stack_reserve
);
1595 if (pe_def_file
->heap_commit
!= -1)
1596 fprintf (out
, "HEAPSIZE 0x%x,0x%x\n",
1597 pe_def_file
->heap_reserve
, pe_def_file
->heap_commit
);
1598 else if (pe_def_file
->heap_reserve
!= -1)
1599 fprintf (out
, "HEAPSIZE 0x%x\n", pe_def_file
->heap_reserve
);
1601 if (pe_def_file
->num_section_defs
> 0)
1603 fprintf (out
, "\nSECTIONS\n\n");
1605 for (i
= 0; i
< pe_def_file
->num_section_defs
; i
++)
1608 quoteput (pe_def_file
->section_defs
[i
].name
, out
, 0);
1610 if (pe_def_file
->section_defs
[i
].class)
1612 fprintf (out
, " CLASS ");
1613 quoteput (pe_def_file
->section_defs
[i
].class, out
, 0);
1616 if (pe_def_file
->section_defs
[i
].flag_read
)
1617 fprintf (out
, " READ");
1619 if (pe_def_file
->section_defs
[i
].flag_write
)
1620 fprintf (out
, " WRITE");
1622 if (pe_def_file
->section_defs
[i
].flag_execute
)
1623 fprintf (out
, " EXECUTE");
1625 if (pe_def_file
->section_defs
[i
].flag_shared
)
1626 fprintf (out
, " SHARED");
1628 fprintf (out
, "\n");
1632 if (pe_def_file
->num_exports
> 0)
1634 fprintf (out
, "EXPORTS\n");
1636 for (i
= 0; i
< pe_def_file
->num_exports
; i
++)
1638 def_file_export
*e
= pe_def_file
->exports
+ i
;
1640 quoteput (e
->name
, out
, 0);
1642 if (e
->internal_name
&& strcmp (e
->internal_name
, e
->name
))
1644 fprintf (out
, " = ");
1645 quoteput (e
->internal_name
, out
, 0);
1648 if (e
->ordinal
!= -1)
1649 fprintf (out
, " @%d", e
->ordinal
);
1651 if (e
->flag_private
)
1652 fprintf (out
, " PRIVATE");
1654 if (e
->flag_constant
)
1655 fprintf (out
, " CONSTANT");
1658 fprintf (out
, " NONAME");
1661 fprintf (out
, " DATA");
1663 fprintf (out
, "\n");
1667 if (pe_def_file
->num_imports
> 0)
1669 fprintf (out
, "\nIMPORTS\n\n");
1671 for (i
= 0; i
< pe_def_file
->num_imports
; i
++)
1673 def_file_import
*im
= pe_def_file
->imports
+ i
;
1676 if (im
->internal_name
1677 && (!im
->name
|| strcmp (im
->internal_name
, im
->name
)))
1679 quoteput (im
->internal_name
, out
, 0);
1680 fprintf (out
, " = ");
1683 quoteput (im
->module
->name
, out
, 0);
1687 quoteput (im
->name
, out
, 0);
1689 fprintf (out
, "%d", im
->ordinal
);
1693 fprintf (out
, " == ");
1694 quoteput (im
->its_name
, out
, 0);
1697 fprintf (out
, "\n");
1702 fprintf (out
, _("; no contents available\n"));
1704 if (fclose (out
) == EOF
)
1705 /* xgettext:c-format */
1706 einfo (_("%P: Error closing file `%s'\n"), pe_out_def_filename
);
1709 /* Generate the import library. */
1711 static asymbol
**symtab
;
1714 static int tmp_seq2
;
1715 static const char *dll_filename
;
1716 static char *dll_symname
;
1718 #define UNDSEC (asection *) &bfd_und_section
1721 quick_section (bfd
*abfd
, const char *name
, int flags
, int align
)
1726 sec
= bfd_make_section_old_way (abfd
, name
);
1727 bfd_set_section_flags (abfd
, sec
, flags
| SEC_ALLOC
| SEC_LOAD
| SEC_KEEP
);
1728 bfd_set_section_alignment (abfd
, sec
, align
);
1729 /* Remember to undo this before trying to link internally! */
1730 sec
->output_section
= sec
;
1732 sym
= bfd_make_empty_symbol (abfd
);
1733 symtab
[symptr
++] = sym
;
1734 sym
->name
= sec
->name
;
1736 sym
->flags
= BSF_LOCAL
;
1743 quick_symbol (bfd
*abfd
,
1752 char *name
= xmalloc (strlen (n1
) + strlen (n2
) + strlen (n3
) + 1);
1757 sym
= bfd_make_empty_symbol (abfd
);
1762 symtab
[symptr
++] = sym
;
1765 static arelent
*reltab
= 0;
1766 static int relcount
= 0, relsize
= 0;
1769 quick_reloc (bfd
*abfd
, bfd_size_type address
, int which_howto
, int symidx
)
1771 if (relcount
>= relsize
- 1)
1775 reltab
= xrealloc (reltab
, relsize
* sizeof (arelent
));
1777 reltab
= xmalloc (relsize
* sizeof (arelent
));
1779 reltab
[relcount
].address
= address
;
1780 reltab
[relcount
].addend
= 0;
1781 reltab
[relcount
].howto
= bfd_reloc_type_lookup (abfd
, which_howto
);
1782 reltab
[relcount
].sym_ptr_ptr
= symtab
+ symidx
;
1787 save_relocs (asection
*sec
)
1791 sec
->relocation
= reltab
;
1792 sec
->reloc_count
= relcount
;
1793 sec
->orelocation
= xmalloc ((relcount
+ 1) * sizeof (arelent
*));
1794 for (i
= 0; i
< relcount
; i
++)
1795 sec
->orelocation
[i
] = sec
->relocation
+ i
;
1796 sec
->orelocation
[relcount
] = 0;
1797 sec
->flags
|= SEC_RELOC
;
1799 relcount
= relsize
= 0;
1802 /* .section .idata$2
1803 .global __head_my_dll
1820 make_head (bfd
*parent
)
1822 asection
*id2
, *id5
, *id4
;
1823 unsigned char *d2
, *d5
, *d4
;
1827 oname
= xmalloc (20);
1828 sprintf (oname
, "d%06d.o", tmp_seq
);
1831 abfd
= bfd_create (oname
, parent
);
1832 bfd_find_target (pe_details
->object_target
, abfd
);
1833 bfd_make_writable (abfd
);
1835 bfd_set_format (abfd
, bfd_object
);
1836 bfd_set_arch_mach (abfd
, pe_details
->bfd_arch
, 0);
1839 symtab
= xmalloc (6 * sizeof (asymbol
*));
1840 id2
= quick_section (abfd
, ".idata$2", SEC_HAS_CONTENTS
, 2);
1841 id5
= quick_section (abfd
, ".idata$5", SEC_HAS_CONTENTS
, 2);
1842 id4
= quick_section (abfd
, ".idata$4", SEC_HAS_CONTENTS
, 2);
1843 quick_symbol (abfd
, U ("_head_"), dll_symname
, "", id2
, BSF_GLOBAL
, 0);
1844 quick_symbol (abfd
, U (""), dll_symname
, "_iname", UNDSEC
, BSF_GLOBAL
, 0);
1846 /* OK, pay attention here. I got confused myself looking back at
1847 it. We create a four-byte section to mark the beginning of the
1848 list, and we include an offset of 4 in the section, so that the
1849 pointer to the list points to the *end* of this section, which is
1850 the start of the list of sections from other objects. */
1852 bfd_set_section_size (abfd
, id2
, 20);
1856 if (pe_use_nul_prefixed_import_tables
)
1857 d2
[0] = d2
[16] = PE_IDATA5_SIZE
; /* Reloc addend. */
1858 quick_reloc (abfd
, 0, BFD_RELOC_RVA
, 2);
1859 quick_reloc (abfd
, 12, BFD_RELOC_RVA
, 4);
1860 quick_reloc (abfd
, 16, BFD_RELOC_RVA
, 1);
1863 if (pe_use_nul_prefixed_import_tables
)
1864 bfd_set_section_size (abfd
, id5
, PE_IDATA5_SIZE
);
1866 bfd_set_section_size (abfd
, id5
, 0);
1867 d5
= xmalloc (PE_IDATA5_SIZE
);
1869 memset (d5
, 0, PE_IDATA5_SIZE
);
1870 if (pe_use_nul_prefixed_import_tables
)
1871 bfd_set_section_size (abfd
, id4
, PE_IDATA4_SIZE
);
1873 bfd_set_section_size (abfd
, id4
, 0);
1874 d4
= xmalloc (PE_IDATA4_SIZE
);
1876 memset (d4
, 0, PE_IDATA4_SIZE
);
1878 bfd_set_symtab (abfd
, symtab
, symptr
);
1880 bfd_set_section_contents (abfd
, id2
, d2
, 0, 20);
1881 if (pe_use_nul_prefixed_import_tables
)
1883 bfd_set_section_contents (abfd
, id5
, d5
, 0, PE_IDATA5_SIZE
);
1884 bfd_set_section_contents (abfd
, id4
, d4
, 0, PE_IDATA4_SIZE
);
1888 bfd_set_section_contents (abfd
, id5
, d5
, 0, 0);
1889 bfd_set_section_contents (abfd
, id4
, d4
, 0, 0);
1892 bfd_make_readable (abfd
);
1896 /* .section .idata$4
1903 .global __my_dll_iname
1908 make_tail (bfd
*parent
)
1910 asection
*id4
, *id5
, *id7
;
1911 unsigned char *d4
, *d5
, *d7
;
1916 oname
= xmalloc (20);
1917 sprintf (oname
, "d%06d.o", tmp_seq
);
1920 abfd
= bfd_create (oname
, parent
);
1921 bfd_find_target (pe_details
->object_target
, abfd
);
1922 bfd_make_writable (abfd
);
1924 bfd_set_format (abfd
, bfd_object
);
1925 bfd_set_arch_mach (abfd
, pe_details
->bfd_arch
, 0);
1928 symtab
= xmalloc (5 * sizeof (asymbol
*));
1929 id4
= quick_section (abfd
, ".idata$4", SEC_HAS_CONTENTS
, 2);
1930 id5
= quick_section (abfd
, ".idata$5", SEC_HAS_CONTENTS
, 2);
1931 id7
= quick_section (abfd
, ".idata$7", SEC_HAS_CONTENTS
, 2);
1932 quick_symbol (abfd
, U (""), dll_symname
, "_iname", id7
, BSF_GLOBAL
, 0);
1934 bfd_set_section_size (abfd
, id4
, PE_IDATA4_SIZE
);
1935 d4
= xmalloc (PE_IDATA4_SIZE
);
1937 memset (d4
, 0, PE_IDATA4_SIZE
);
1939 bfd_set_section_size (abfd
, id5
, PE_IDATA5_SIZE
);
1940 d5
= xmalloc (PE_IDATA5_SIZE
);
1942 memset (d5
, 0, PE_IDATA5_SIZE
);
1944 len
= strlen (dll_filename
) + 1;
1947 bfd_set_section_size (abfd
, id7
, len
);
1950 strcpy ((char *) d7
, dll_filename
);
1951 /* If len was odd, the above
1952 strcpy leaves behind an undefined byte. That is harmless,
1953 but we set it to 0 just so the binary dumps are pretty. */
1956 bfd_set_symtab (abfd
, symtab
, symptr
);
1958 bfd_set_section_contents (abfd
, id4
, d4
, 0, PE_IDATA4_SIZE
);
1959 bfd_set_section_contents (abfd
, id5
, d5
, 0, PE_IDATA5_SIZE
);
1960 bfd_set_section_contents (abfd
, id7
, d7
, 0, len
);
1962 bfd_make_readable (abfd
);
1968 .global ___imp_function
1969 .global __imp__function
1971 jmp *__imp__function:
1985 .asciz "function" xlate? (add underscore, kill at) */
1987 static const unsigned char jmp_ix86_bytes
[] =
1989 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x90, 0x90
1997 .dw __imp_function */
1999 static const unsigned char jmp_sh_bytes
[] =
2001 0x01, 0xd0, 0x02, 0x60, 0x2b, 0x40, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00
2005 lui $t0,<high:__imp_function>
2006 lw $t0,<low:__imp_function>
2010 static const unsigned char jmp_mips_bytes
[] =
2012 0x00, 0x00, 0x08, 0x3c, 0x00, 0x00, 0x08, 0x8d,
2013 0x08, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00
2016 static const unsigned char jmp_arm_bytes
[] =
2018 0x00, 0xc0, 0x9f, 0xe5, /* ldr ip, [pc] */
2019 0x00, 0xf0, 0x9c, 0xe5, /* ldr pc, [ip] */
2025 make_one (def_file_export
*exp
, bfd
*parent
, bfd_boolean include_jmp_stub
)
2027 asection
*tx
, *id7
, *id5
, *id4
, *id6
;
2028 unsigned char *td
= NULL
, *d7
, *d5
, *d4
, *d6
= NULL
;
2032 const unsigned char *jmp_bytes
= NULL
;
2033 int jmp_byte_count
= 0;
2035 /* Include the jump stub section only if it is needed. A jump
2036 stub is needed if the symbol being imported <sym> is a function
2037 symbol and there is at least one undefined reference to that
2038 symbol. In other words, if all the import references to <sym> are
2039 explicitly through _declspec(dllimport) then the jump stub is not
2041 if (include_jmp_stub
)
2043 switch (pe_details
->pe_arch
)
2046 jmp_bytes
= jmp_ix86_bytes
;
2047 jmp_byte_count
= sizeof (jmp_ix86_bytes
);
2050 jmp_bytes
= jmp_sh_bytes
;
2051 jmp_byte_count
= sizeof (jmp_sh_bytes
);
2054 jmp_bytes
= jmp_mips_bytes
;
2055 jmp_byte_count
= sizeof (jmp_mips_bytes
);
2058 case PE_ARCH_arm_epoc
:
2059 case PE_ARCH_arm_wince
:
2060 jmp_bytes
= jmp_arm_bytes
;
2061 jmp_byte_count
= sizeof (jmp_arm_bytes
);
2068 oname
= xmalloc (20);
2069 sprintf (oname
, "d%06d.o", tmp_seq
);
2072 abfd
= bfd_create (oname
, parent
);
2073 bfd_find_target (pe_details
->object_target
, abfd
);
2074 bfd_make_writable (abfd
);
2076 bfd_set_format (abfd
, bfd_object
);
2077 bfd_set_arch_mach (abfd
, pe_details
->bfd_arch
, 0);
2080 symtab
= xmalloc (11 * sizeof (asymbol
*));
2081 tx
= quick_section (abfd
, ".text", SEC_CODE
|SEC_HAS_CONTENTS
, 2);
2082 id7
= quick_section (abfd
, ".idata$7", SEC_HAS_CONTENTS
, 2);
2083 id5
= quick_section (abfd
, ".idata$5", SEC_HAS_CONTENTS
, 2);
2084 id4
= quick_section (abfd
, ".idata$4", SEC_HAS_CONTENTS
, 2);
2085 id6
= quick_section (abfd
, ".idata$6", SEC_HAS_CONTENTS
, 2);
2087 if (*exp
->internal_name
== '@')
2089 quick_symbol (abfd
, U ("_head_"), dll_symname
, "", UNDSEC
,
2091 if (include_jmp_stub
)
2092 quick_symbol (abfd
, "", exp
->internal_name
, "", tx
, BSF_GLOBAL
, 0);
2093 quick_symbol (abfd
, "__imp_", exp
->internal_name
, "", id5
,
2095 /* Fastcall applies only to functions,
2096 so no need for auto-import symbol. */
2100 quick_symbol (abfd
, U ("_head_"), dll_symname
, "", UNDSEC
,
2102 if (include_jmp_stub
)
2103 quick_symbol (abfd
, U (""), exp
->internal_name
, "", tx
,
2105 quick_symbol (abfd
, "__imp_", U (""), exp
->internal_name
, id5
,
2107 /* Symbol to reference ord/name of imported
2108 data symbol, used to implement auto-import. */
2110 quick_symbol (abfd
, U ("_nm_"), U (""), exp
->internal_name
, id6
,
2113 if (pe_dll_compat_implib
)
2114 quick_symbol (abfd
, U ("__imp_"), exp
->internal_name
, "", id5
,
2117 if (include_jmp_stub
)
2119 bfd_set_section_size (abfd
, tx
, jmp_byte_count
);
2120 td
= xmalloc (jmp_byte_count
);
2122 memcpy (td
, jmp_bytes
, jmp_byte_count
);
2124 switch (pe_details
->pe_arch
)
2127 #ifdef pe_use_x86_64
2128 quick_reloc (abfd
, 2, BFD_RELOC_32_PCREL
, 2);
2130 quick_reloc (abfd
, 2, BFD_RELOC_32
, 2);
2134 quick_reloc (abfd
, 8, BFD_RELOC_32
, 2);
2137 quick_reloc (abfd
, 0, BFD_RELOC_HI16_S
, 2);
2138 quick_reloc (abfd
, 0, BFD_RELOC_LO16
, 0); /* MIPS_R_PAIR */
2139 quick_reloc (abfd
, 4, BFD_RELOC_LO16
, 2);
2142 case PE_ARCH_arm_epoc
:
2143 case PE_ARCH_arm_wince
:
2144 quick_reloc (abfd
, 8, BFD_RELOC_32
, 2);
2152 bfd_set_section_size (abfd
, tx
, 0);
2154 bfd_set_section_size (abfd
, id7
, 4);
2158 quick_reloc (abfd
, 0, BFD_RELOC_RVA
, 5);
2161 bfd_set_section_size (abfd
, id5
, PE_IDATA5_SIZE
);
2162 d5
= xmalloc (PE_IDATA5_SIZE
);
2164 memset (d5
, 0, PE_IDATA5_SIZE
);
2166 if (exp
->flag_noname
)
2168 d5
[0] = exp
->ordinal
;
2169 d5
[1] = exp
->ordinal
>> 8;
2170 d5
[PE_IDATA5_SIZE
- 1] = 0x80;
2174 quick_reloc (abfd
, 0, BFD_RELOC_RVA
, 4);
2178 bfd_set_section_size (abfd
, id4
, PE_IDATA4_SIZE
);
2179 d4
= xmalloc (PE_IDATA4_SIZE
);
2181 memset (d4
, 0, PE_IDATA4_SIZE
);
2183 if (exp
->flag_noname
)
2185 d4
[0] = exp
->ordinal
;
2186 d4
[1] = exp
->ordinal
>> 8;
2187 d4
[PE_IDATA4_SIZE
- 1] = 0x80;
2191 quick_reloc (abfd
, 0, BFD_RELOC_RVA
, 4);
2195 if (exp
->flag_noname
)
2198 bfd_set_section_size (abfd
, id6
, 0);
2202 /* { short, asciz } */
2204 len
= 2 + strlen (exp
->its_name
) + 1;
2206 len
= 2 + strlen (exp
->name
) + 1;
2209 bfd_set_section_size (abfd
, id6
, len
);
2212 memset (d6
, 0, len
);
2213 d6
[0] = exp
->hint
& 0xff;
2214 d6
[1] = exp
->hint
>> 8;
2216 strcpy ((char*) d6
+ 2, exp
->its_name
);
2218 strcpy ((char *) d6
+ 2, exp
->name
);
2221 bfd_set_symtab (abfd
, symtab
, symptr
);
2223 if (include_jmp_stub
)
2224 bfd_set_section_contents (abfd
, tx
, td
, 0, jmp_byte_count
);
2225 bfd_set_section_contents (abfd
, id7
, d7
, 0, 4);
2226 bfd_set_section_contents (abfd
, id5
, d5
, 0, PE_IDATA5_SIZE
);
2227 bfd_set_section_contents (abfd
, id4
, d4
, 0, PE_IDATA4_SIZE
);
2228 if (!exp
->flag_noname
)
2229 bfd_set_section_contents (abfd
, id6
, d6
, 0, len
);
2231 bfd_make_readable (abfd
);
2236 make_singleton_name_imp (const char *import
, bfd
*parent
)
2238 /* Name thunks go to idata$4. */
2244 oname
= xmalloc (20);
2245 sprintf (oname
, "nmimp%06d.o", tmp_seq2
);
2248 abfd
= bfd_create (oname
, parent
);
2249 bfd_find_target (pe_details
->object_target
, abfd
);
2250 bfd_make_writable (abfd
);
2252 bfd_set_format (abfd
, bfd_object
);
2253 bfd_set_arch_mach (abfd
, pe_details
->bfd_arch
, 0);
2256 symtab
= xmalloc (3 * sizeof (asymbol
*));
2257 id5
= quick_section (abfd
, ".idata$5", SEC_HAS_CONTENTS
, 2);
2258 quick_symbol (abfd
, U ("_imp_"), import
, "", id5
, BSF_GLOBAL
, 0);
2260 /* We need space for the real thunk and for the null terminator. */
2261 bfd_set_section_size (abfd
, id5
, PE_IDATA5_SIZE
* 2);
2262 d5
= xmalloc (PE_IDATA5_SIZE
* 2);
2264 memset (d5
, 0, PE_IDATA5_SIZE
* 2);
2265 quick_reloc (abfd
, 0, BFD_RELOC_RVA
, 2);
2268 bfd_set_symtab (abfd
, symtab
, symptr
);
2270 bfd_set_section_contents (abfd
, id5
, d5
, 0, PE_IDATA4_SIZE
* 2);
2272 bfd_make_readable (abfd
);
2277 make_singleton_name_thunk (const char *import
, bfd
*parent
)
2279 /* Name thunks go to idata$4. */
2285 oname
= xmalloc (20);
2286 sprintf (oname
, "nmth%06d.o", tmp_seq
);
2289 abfd
= bfd_create (oname
, parent
);
2290 bfd_find_target (pe_details
->object_target
, abfd
);
2291 bfd_make_writable (abfd
);
2293 bfd_set_format (abfd
, bfd_object
);
2294 bfd_set_arch_mach (abfd
, pe_details
->bfd_arch
, 0);
2297 symtab
= xmalloc (3 * sizeof (asymbol
*));
2298 id4
= quick_section (abfd
, ".idata$4", SEC_HAS_CONTENTS
, 2);
2299 quick_symbol (abfd
, U ("_nm_thnk_"), import
, "", id4
, BSF_GLOBAL
, 0);
2300 quick_symbol (abfd
, U ("_nm_"), import
, "", UNDSEC
, BSF_GLOBAL
, 0);
2302 /* We need space for the real thunk and for the null terminator. */
2303 bfd_set_section_size (abfd
, id4
, PE_IDATA4_SIZE
* 2);
2304 d4
= xmalloc (PE_IDATA4_SIZE
* 2);
2306 memset (d4
, 0, PE_IDATA4_SIZE
* 2);
2307 quick_reloc (abfd
, 0, BFD_RELOC_RVA
, 2);
2310 bfd_set_symtab (abfd
, symtab
, symptr
);
2312 bfd_set_section_contents (abfd
, id4
, d4
, 0, PE_IDATA4_SIZE
* 2);
2314 bfd_make_readable (abfd
);
2319 make_import_fixup_mark (arelent
*rel
)
2321 /* We convert reloc to symbol, for later reference. */
2323 static char *fixup_name
= NULL
;
2324 static size_t buffer_len
= 0;
2326 struct bfd_symbol
*sym
= *rel
->sym_ptr_ptr
;
2328 bfd
*abfd
= bfd_asymbol_bfd (sym
);
2329 struct bfd_link_hash_entry
*bh
;
2333 fixup_name
= xmalloc (384);
2337 if (strlen (sym
->name
) + 25 > buffer_len
)
2338 /* Assume 25 chars for "__fu" + counter + "_". If counter is
2339 bigger than 20 digits long, we've got worse problems than
2340 overflowing this buffer... */
2343 /* New buffer size is length of symbol, plus 25, but
2344 then rounded up to the nearest multiple of 128. */
2345 buffer_len
= ((strlen (sym
->name
) + 25) + 127) & ~127;
2346 fixup_name
= xmalloc (buffer_len
);
2349 sprintf (fixup_name
, "__fu%d_%s", counter
++, sym
->name
);
2352 bfd_coff_link_add_one_symbol (&link_info
, abfd
, fixup_name
, BSF_GLOBAL
,
2353 current_sec
, /* sym->section, */
2354 rel
->address
, NULL
, TRUE
, FALSE
, &bh
);
2359 /* .section .idata$2
2360 .rva __nm_thnk_SYM (singleton thunk with name of func)
2363 .rva __my_dll_iname (name of dll)
2364 .rva __fuNN_SYM (pointer to reference (address) in text) */
2367 make_import_fixup_entry (const char *name
,
2368 const char *fixup_name
,
2369 const char *dll_symname
,
2377 oname
= xmalloc (20);
2378 sprintf (oname
, "fu%06d.o", tmp_seq
);
2381 abfd
= bfd_create (oname
, parent
);
2382 bfd_find_target (pe_details
->object_target
, abfd
);
2383 bfd_make_writable (abfd
);
2385 bfd_set_format (abfd
, bfd_object
);
2386 bfd_set_arch_mach (abfd
, pe_details
->bfd_arch
, 0);
2389 symtab
= xmalloc (6 * sizeof (asymbol
*));
2390 id2
= quick_section (abfd
, ".idata$2", SEC_HAS_CONTENTS
, 2);
2392 quick_symbol (abfd
, U ("_nm_thnk_"), name
, "", UNDSEC
, BSF_GLOBAL
, 0);
2393 quick_symbol (abfd
, U (""), dll_symname
, "_iname", UNDSEC
, BSF_GLOBAL
, 0);
2394 /* For relocator v2 we have to use the .idata$5 element and not
2396 if (link_info
.pei386_runtime_pseudo_reloc
== 2)
2397 quick_symbol (abfd
, U ("_imp_"), name
, "", UNDSEC
, BSF_GLOBAL
, 0);
2399 quick_symbol (abfd
, "", fixup_name
, "", UNDSEC
, BSF_GLOBAL
, 0);
2401 bfd_set_section_size (abfd
, id2
, 20);
2406 quick_reloc (abfd
, 0, BFD_RELOC_RVA
, 1);
2407 quick_reloc (abfd
, 12, BFD_RELOC_RVA
, 2);
2408 quick_reloc (abfd
, 16, BFD_RELOC_RVA
, 3);
2411 bfd_set_symtab (abfd
, symtab
, symptr
);
2413 bfd_set_section_contents (abfd
, id2
, d2
, 0, 20);
2415 bfd_make_readable (abfd
);
2419 /* .section .rdata_runtime_pseudo_reloc
2421 .rva __fuNN_SYM (pointer to reference (address) in text) */
2424 make_runtime_pseudo_reloc (const char *name ATTRIBUTE_UNUSED
,
2425 const char *fixup_name
,
2426 bfd_vma addend ATTRIBUTE_UNUSED
,
2431 unsigned char *rt_rel_d
;
2434 oname
= xmalloc (20);
2435 sprintf (oname
, "rtr%06d.o", tmp_seq
);
2438 abfd
= bfd_create (oname
, parent
);
2439 bfd_find_target (pe_details
->object_target
, abfd
);
2440 bfd_make_writable (abfd
);
2442 bfd_set_format (abfd
, bfd_object
);
2443 bfd_set_arch_mach (abfd
, pe_details
->bfd_arch
, 0);
2446 if (link_info
.pei386_runtime_pseudo_reloc
== 2)
2448 symtab
= xmalloc ((runtime_pseudp_reloc_v2_init
? 3 : 6) * sizeof (asymbol
*));
2452 symtab
= xmalloc (2 * sizeof (asymbol
*));
2454 rt_rel
= quick_section (abfd
, ".rdata_runtime_pseudo_reloc",
2455 SEC_HAS_CONTENTS
, 2);
2457 quick_symbol (abfd
, "", fixup_name
, "", UNDSEC
, BSF_GLOBAL
, 0);
2459 if (link_info
.pei386_runtime_pseudo_reloc
== 2)
2462 if (! runtime_pseudp_reloc_v2_init
)
2465 runtime_pseudp_reloc_v2_init
= 1;
2467 quick_symbol (abfd
, U ("_imp_"), name
, "", UNDSEC
, BSF_GLOBAL
, 0);
2469 bfd_set_section_size (abfd
, rt_rel
, size
);
2470 rt_rel_d
= xmalloc (size
);
2471 rt_rel
->contents
= rt_rel_d
;
2472 memset (rt_rel_d
, 0, size
);
2473 quick_reloc (abfd
, size
- 8, BFD_RELOC_RVA
, 1);
2474 quick_reloc (abfd
, size
- 12, BFD_RELOC_RVA
, 2);
2475 bfd_put_32 (abfd
, bitsize
, rt_rel_d
+ (size
- 4));
2477 bfd_put_32 (abfd
, 1, rt_rel_d
+ 8);
2478 save_relocs (rt_rel
);
2480 bfd_set_symtab (abfd
, symtab
, symptr
);
2482 bfd_set_section_contents (abfd
, rt_rel
, rt_rel_d
, 0, size
);
2486 bfd_set_section_size (abfd
, rt_rel
, 8);
2487 rt_rel_d
= xmalloc (8);
2488 rt_rel
->contents
= rt_rel_d
;
2489 memset (rt_rel_d
, 0, 8);
2491 bfd_put_32 (abfd
, addend
, rt_rel_d
);
2492 quick_reloc (abfd
, 4, BFD_RELOC_RVA
, 1);
2494 save_relocs (rt_rel
);
2496 bfd_set_symtab (abfd
, symtab
, symptr
);
2498 bfd_set_section_contents (abfd
, rt_rel
, rt_rel_d
, 0, 8);
2500 bfd_make_readable (abfd
);
2505 .rva __pei386_runtime_relocator */
2508 pe_create_runtime_relocator_reference (bfd
*parent
)
2510 asection
*extern_rt_rel
;
2511 unsigned char *extern_rt_rel_d
;
2515 oname
= xmalloc (20);
2516 sprintf (oname
, "ertr%06d.o", tmp_seq
);
2519 abfd
= bfd_create (oname
, parent
);
2520 bfd_find_target (pe_details
->object_target
, abfd
);
2521 bfd_make_writable (abfd
);
2523 bfd_set_format (abfd
, bfd_object
);
2524 bfd_set_arch_mach (abfd
, pe_details
->bfd_arch
, 0);
2527 symtab
= xmalloc (2 * sizeof (asymbol
*));
2528 extern_rt_rel
= quick_section (abfd
, ".rdata", SEC_HAS_CONTENTS
, 2);
2530 quick_symbol (abfd
, "", U ("_pei386_runtime_relocator"), "", UNDSEC
,
2533 bfd_set_section_size (abfd
, extern_rt_rel
, PE_IDATA5_SIZE
);
2534 extern_rt_rel_d
= xmalloc (PE_IDATA5_SIZE
);
2535 extern_rt_rel
->contents
= extern_rt_rel_d
;
2537 quick_reloc (abfd
, 0, BFD_RELOC_RVA
, 1);
2538 save_relocs (extern_rt_rel
);
2540 bfd_set_symtab (abfd
, symtab
, symptr
);
2542 bfd_set_section_contents (abfd
, extern_rt_rel
, extern_rt_rel_d
, 0, PE_IDATA5_SIZE
);
2544 bfd_make_readable (abfd
);
2549 pe_create_import_fixup (arelent
*rel
, asection
*s
, bfd_vma addend
)
2552 struct bfd_symbol
*sym
= *rel
->sym_ptr_ptr
;
2553 struct bfd_link_hash_entry
*name_thunk_sym
;
2554 struct bfd_link_hash_entry
*name_imp_sym
;
2555 const char *name
= sym
->name
;
2556 char *fixup_name
= make_import_fixup_mark (rel
);
2558 int need_import_table
= 1;
2560 sprintf (buf
, U ("_imp_%s"), name
);
2561 name_imp_sym
= bfd_link_hash_lookup (link_info
.hash
, buf
, 0, 0, 1);
2563 sprintf (buf
, U ("_nm_thnk_%s"), name
);
2565 name_thunk_sym
= bfd_link_hash_lookup (link_info
.hash
, buf
, 0, 0, 1);
2567 /* For version 2 pseudo relocation we don't need to add an import
2568 if the import symbol is already present. */
2569 if (link_info
.pei386_runtime_pseudo_reloc
== 2
2571 && name_imp_sym
->type
== bfd_link_hash_defined
)
2572 need_import_table
= 0;
2574 if (need_import_table
== 1
2575 && (!name_thunk_sym
|| name_thunk_sym
->type
!= bfd_link_hash_defined
))
2577 bfd
*b
= make_singleton_name_thunk (name
, link_info
.output_bfd
);
2578 add_bfd_to_link (b
, b
->filename
, &link_info
);
2580 /* If we ever use autoimport, we have to cast text section writable.
2581 But not for version 2. */
2582 if (link_info
.pei386_runtime_pseudo_reloc
!= 2)
2584 config
.text_read_only
= FALSE
;
2585 link_info
.output_bfd
->flags
&= ~WP_TEXT
;
2587 if (link_info
.pei386_runtime_pseudo_reloc
== 2)
2589 b
= make_singleton_name_imp (name
, link_info
.output_bfd
);
2590 add_bfd_to_link (b
, b
->filename
, &link_info
);
2594 if ((addend
== 0 || link_info
.pei386_runtime_pseudo_reloc
)
2595 && need_import_table
== 1)
2597 extern char * pe_data_import_dll
;
2598 char * dll_symname
= pe_data_import_dll
? pe_data_import_dll
: "unknown";
2600 b
= make_import_fixup_entry (name
, fixup_name
, dll_symname
,
2601 link_info
.output_bfd
);
2602 add_bfd_to_link (b
, b
->filename
, &link_info
);
2605 if ((link_info
.pei386_runtime_pseudo_reloc
!= 0 && addend
!= 0)
2606 || link_info
.pei386_runtime_pseudo_reloc
== 2)
2608 if (pe_dll_extra_pe_debug
)
2609 printf ("creating runtime pseudo-reloc entry for %s (addend=%d)\n",
2610 fixup_name
, (int) addend
);
2612 b
= make_runtime_pseudo_reloc (name
, fixup_name
, addend
, rel
->howto
->bitsize
,
2613 link_info
.output_bfd
);
2614 add_bfd_to_link (b
, b
->filename
, &link_info
);
2616 if (runtime_pseudo_relocs_created
== 0)
2618 b
= pe_create_runtime_relocator_reference (link_info
.output_bfd
);
2619 add_bfd_to_link (b
, b
->filename
, &link_info
);
2621 runtime_pseudo_relocs_created
++;
2623 else if (addend
!= 0)
2625 einfo (_("%C: variable '%T' can't be auto-imported. Please read the documentation for ld's --enable-auto-import for details.\n"),
2626 s
->owner
, s
, rel
->address
, sym
->name
);
2633 pe_dll_generate_implib (def_file
*def
, const char *impfilename
, struct bfd_link_info
*info
)
2642 dll_filename
= (def
->name
) ? def
->name
: dll_name
;
2643 dll_symname
= xstrdup (dll_filename
);
2644 for (i
= 0; dll_symname
[i
]; i
++)
2645 if (!ISALNUM (dll_symname
[i
]))
2646 dll_symname
[i
] = '_';
2648 unlink_if_ordinary (impfilename
);
2650 outarch
= bfd_openw (impfilename
, 0);
2654 /* xgettext:c-format */
2655 einfo (_("%XCan't open .lib file: %s\n"), impfilename
);
2659 /* xgettext:c-format */
2660 info_msg (_("Creating library file: %s\n"), impfilename
);
2662 bfd_set_format (outarch
, bfd_archive
);
2663 outarch
->has_armap
= 1;
2665 /* Work out a reasonable size of things to put onto one line. */
2666 ar_head
= make_head (outarch
);
2668 /* Iterate the input BFDs, looking for exclude-modules-for-implib. */
2669 for (ibfd
= info
->input_bfds
; ibfd
; ibfd
= ibfd
->link_next
)
2671 /* Iterate the exclude list. */
2672 struct exclude_list_struct
*ex
;
2674 for (ex
= excludes
, found
= 0; ex
&& !found
; ex
= ex
->next
)
2676 if (ex
->type
!= EXCLUDEFORIMPLIB
)
2678 found
= (strcmp (ex
->string
, ibfd
->filename
) == 0);
2680 /* If it matched, we must open a fresh BFD for it (the original
2681 input BFD is still needed for the DLL's final link) and add
2682 it into the archive member chain. */
2685 bfd
*newbfd
= bfd_openr (ibfd
->my_archive
2686 ? ibfd
->my_archive
->filename
: ibfd
->filename
, NULL
);
2689 einfo (_("%Xbfd_openr %s: %E\n"), ibfd
->filename
);
2692 if (ibfd
->my_archive
)
2694 /* Must now iterate through archive until we find the
2695 required member. A minor shame that we'll open the
2696 archive once per member that we require from it, and
2697 leak those archive bfds rather than reuse them. */
2698 bfd
*arbfd
= newbfd
;
2699 if (!bfd_check_format_matches (arbfd
, bfd_archive
, NULL
))
2701 einfo (_("%X%s(%s): can't find member in non-archive file"),
2702 ibfd
->my_archive
->filename
, ibfd
->filename
);
2706 while ((newbfd
= bfd_openr_next_archived_file (arbfd
, newbfd
)) != 0)
2708 if (strcmp (newbfd
->filename
, ibfd
->filename
) == 0)
2713 einfo (_("%X%s(%s): can't find member in archive"),
2714 ibfd
->my_archive
->filename
, ibfd
->filename
);
2718 newbfd
->archive_next
= head
;
2723 for (i
= 0; i
< def
->num_exports
; i
++)
2725 /* The import library doesn't know about the internal name. */
2726 char *internal
= def
->exports
[i
].internal_name
;
2729 /* Don't add PRIVATE entries to import lib. */
2730 if (pe_def_file
->exports
[i
].flag_private
)
2732 def
->exports
[i
].internal_name
= def
->exports
[i
].name
;
2733 n
= make_one (def
->exports
+ i
, outarch
,
2734 ! (def
->exports
+ i
)->flag_data
);
2735 n
->archive_next
= head
;
2737 def
->exports
[i
].internal_name
= internal
;
2740 ar_tail
= make_tail (outarch
);
2742 if (ar_head
== NULL
|| ar_tail
== NULL
)
2745 /* Now stick them all into the archive. */
2746 ar_head
->archive_next
= head
;
2747 ar_tail
->archive_next
= ar_head
;
2750 if (! bfd_set_archive_head (outarch
, head
))
2751 einfo ("%Xbfd_set_archive_head: %E\n");
2753 if (! bfd_close (outarch
))
2754 einfo ("%Xbfd_close %s: %E\n", impfilename
);
2756 while (head
!= NULL
)
2758 bfd
*n
= head
->archive_next
;
2764 static struct bfd_link_hash_entry
*found_sym
;
2767 pe_undef_alias_cdecl_match (struct bfd_link_hash_entry
*h
, void *inf
)
2771 const char *hs
= h
->root
.string
;
2773 sl
= strlen (string
);
2774 if (h
->type
== bfd_link_hash_undefined
2775 && ((*hs
== '@' && *string
== '_'
2776 && strncmp (hs
+ 1, string
+ 1, sl
- 1) == 0)
2777 || strncmp (hs
, string
, sl
) == 0)
2778 && h
->root
.string
[sl
] == '@')
2786 static struct bfd_link_hash_entry
*
2787 pe_find_cdecl_alias_match (char *name
)
2790 bfd_link_hash_traverse (link_info
.hash
, pe_undef_alias_cdecl_match
,
2796 add_bfd_to_link (bfd
*abfd
, const char *name
, struct bfd_link_info
*link_info
)
2798 lang_input_statement_type
*fake_file
;
2800 fake_file
= lang_add_input_file (name
,
2801 lang_input_file_is_fake_enum
,
2803 fake_file
->the_bfd
= abfd
;
2804 ldlang_add_file (fake_file
);
2806 if (!bfd_link_add_symbols (abfd
, link_info
))
2807 einfo ("%Xaddsym %s: %E\n", name
);
2811 pe_process_import_defs (bfd
*output_bfd
, struct bfd_link_info
*link_info
)
2813 def_file_module
*module
;
2815 pe_dll_id_target (bfd_get_target (output_bfd
));
2820 for (module
= pe_def_file
->modules
; module
; module
= module
->next
)
2824 dll_filename
= module
->name
;
2825 dll_symname
= xstrdup (module
->name
);
2826 for (i
= 0; dll_symname
[i
]; i
++)
2827 if (!ISALNUM (dll_symname
[i
]))
2828 dll_symname
[i
] = '_';
2832 for (i
= 0; i
< pe_def_file
->num_imports
; i
++)
2833 if (pe_def_file
->imports
[i
].module
== module
)
2835 def_file_export exp
;
2836 struct bfd_link_hash_entry
*blhe
;
2837 int lead_at
= (*pe_def_file
->imports
[i
].internal_name
== '@');
2838 /* See if we need this import. */
2839 size_t len
= strlen (pe_def_file
->imports
[i
].internal_name
);
2840 char *name
= xmalloc (len
+ 2 + 6);
2841 bfd_boolean include_jmp_stub
= FALSE
;
2842 bfd_boolean is_cdecl
= FALSE
;
2843 if (!lead_at
&& strchr (pe_def_file
->imports
[i
].internal_name
, '@') == NULL
)
2847 sprintf (name
, "%s",
2848 pe_def_file
->imports
[i
].internal_name
);
2850 sprintf (name
, "%s%s",U (""),
2851 pe_def_file
->imports
[i
].internal_name
);
2853 blhe
= bfd_link_hash_lookup (link_info
->hash
, name
,
2854 FALSE
, FALSE
, FALSE
);
2856 /* Include the jump stub for <sym> only if the <sym>
2858 if (!blhe
|| (blhe
&& blhe
->type
!= bfd_link_hash_undefined
))
2861 sprintf (name
, "%s%s", "__imp_",
2862 pe_def_file
->imports
[i
].internal_name
);
2864 sprintf (name
, "%s%s%s", "__imp_", U (""),
2865 pe_def_file
->imports
[i
].internal_name
);
2867 blhe
= bfd_link_hash_lookup (link_info
->hash
, name
,
2868 FALSE
, FALSE
, FALSE
);
2871 include_jmp_stub
= TRUE
;
2873 if (is_cdecl
&& !blhe
)
2875 sprintf (name
, "%s%s",U (""),
2876 pe_def_file
->imports
[i
].internal_name
);
2877 blhe
= pe_find_cdecl_alias_match (name
);
2878 include_jmp_stub
= TRUE
;
2883 if (blhe
&& blhe
->type
== bfd_link_hash_undefined
)
2889 bfd
*ar_head
= make_head (output_bfd
);
2890 add_bfd_to_link (ar_head
, ar_head
->filename
, link_info
);
2893 exp
.internal_name
= pe_def_file
->imports
[i
].internal_name
;
2894 exp
.name
= pe_def_file
->imports
[i
].name
;
2895 exp
.its_name
= pe_def_file
->imports
[i
].its_name
;
2896 exp
.ordinal
= pe_def_file
->imports
[i
].ordinal
;
2897 exp
.hint
= exp
.ordinal
>= 0 ? exp
.ordinal
: 0;
2898 exp
.flag_private
= 0;
2899 exp
.flag_constant
= 0;
2900 exp
.flag_data
= pe_def_file
->imports
[i
].data
;
2901 exp
.flag_noname
= exp
.name
? 0 : 1;
2902 one
= make_one (&exp
, output_bfd
, (! exp
.flag_data
) && include_jmp_stub
);
2903 add_bfd_to_link (one
, one
->filename
, link_info
);
2908 bfd
*ar_tail
= make_tail (output_bfd
);
2909 add_bfd_to_link (ar_tail
, ar_tail
->filename
, link_info
);
2916 /* We were handed a *.DLL file. Parse it and turn it into a set of
2917 IMPORTS directives in the def file. Return TRUE if the file was
2918 handled, FALSE if not. */
2921 pe_get16 (bfd
*abfd
, int where
)
2925 bfd_seek (abfd
, (file_ptr
) where
, SEEK_SET
);
2926 bfd_bread (b
, (bfd_size_type
) 2, abfd
);
2927 return b
[0] + (b
[1] << 8);
2931 pe_get32 (bfd
*abfd
, int where
)
2935 bfd_seek (abfd
, (file_ptr
) where
, SEEK_SET
);
2936 bfd_bread (b
, (bfd_size_type
) 4, abfd
);
2937 return b
[0] + (b
[1] << 8) + (b
[2] << 16) + (b
[3] << 24);
2943 unsigned char *b
= ptr
;
2945 return b
[0] + (b
[1] << 8) + (b
[2] << 16) + (b
[3] << 24);
2949 pe_implied_import_dll (const char *filename
)
2952 bfd_vma pe_header_offset
, opthdr_ofs
, num_entries
, i
;
2953 bfd_vma export_rva
, export_size
, nsections
, secptr
, expptr
;
2954 bfd_vma exp_funcbase
;
2955 unsigned char *expdata
;
2957 bfd_vma name_rvas
, ordinals
, nexp
, ordbase
;
2958 const char *dll_name
;
2959 /* Initialization with start > end guarantees that is_data
2960 will not be set by mistake, and avoids compiler warning. */
2961 bfd_vma data_start
= 1;
2962 bfd_vma data_end
= 0;
2963 bfd_vma rdata_start
= 1;
2964 bfd_vma rdata_end
= 0;
2965 bfd_vma bss_start
= 1;
2966 bfd_vma bss_end
= 0;
2968 /* No, I can't use bfd here. kernel32.dll puts its export table in
2969 the middle of the .rdata section. */
2970 dll
= bfd_openr (filename
, pe_details
->target_name
);
2973 einfo ("%Xopen %s: %E\n", filename
);
2977 /* PEI dlls seem to be bfd_objects. */
2978 if (!bfd_check_format (dll
, bfd_object
))
2980 einfo ("%X%s: this doesn't appear to be a DLL\n", filename
);
2984 /* Get pe_header, optional header and numbers of export entries. */
2985 pe_header_offset
= pe_get32 (dll
, 0x3c);
2986 opthdr_ofs
= pe_header_offset
+ 4 + 20;
2987 #ifdef pe_use_x86_64
2988 num_entries
= pe_get32 (dll
, opthdr_ofs
+ 92 + 4 * 4); /* & NumberOfRvaAndSizes. */
2990 num_entries
= pe_get32 (dll
, opthdr_ofs
+ 92);
2993 if (num_entries
< 1) /* No exports. */
2996 #ifdef pe_use_x86_64
2997 export_rva
= pe_get32 (dll
, opthdr_ofs
+ 96 + 4 * 4);
2998 export_size
= pe_get32 (dll
, opthdr_ofs
+ 100 + 4 * 4);
3000 export_rva
= pe_get32 (dll
, opthdr_ofs
+ 96);
3001 export_size
= pe_get32 (dll
, opthdr_ofs
+ 100);
3004 nsections
= pe_get16 (dll
, pe_header_offset
+ 4 + 2);
3005 secptr
= (pe_header_offset
+ 4 + 20 +
3006 pe_get16 (dll
, pe_header_offset
+ 4 + 16));
3009 /* Get the rva and size of the export section. */
3010 for (i
= 0; i
< nsections
; i
++)
3013 bfd_vma secptr1
= secptr
+ 40 * i
;
3014 bfd_vma vaddr
= pe_get32 (dll
, secptr1
+ 12);
3015 bfd_vma vsize
= pe_get32 (dll
, secptr1
+ 16);
3016 bfd_vma fptr
= pe_get32 (dll
, secptr1
+ 20);
3018 bfd_seek (dll
, (file_ptr
) secptr1
, SEEK_SET
);
3019 bfd_bread (sname
, (bfd_size_type
) 8, dll
);
3021 if (vaddr
<= export_rva
&& vaddr
+ vsize
> export_rva
)
3023 expptr
= fptr
+ (export_rva
- vaddr
);
3024 if (export_rva
+ export_size
> vaddr
+ vsize
)
3025 export_size
= vsize
- (export_rva
- vaddr
);
3030 /* Scan sections and store the base and size of the
3031 data and bss segments in data/base_start/end. */
3032 for (i
= 0; i
< nsections
; i
++)
3034 bfd_vma secptr1
= secptr
+ 40 * i
;
3035 bfd_vma vsize
= pe_get32 (dll
, secptr1
+ 8);
3036 bfd_vma vaddr
= pe_get32 (dll
, secptr1
+ 12);
3037 bfd_vma flags
= pe_get32 (dll
, secptr1
+ 36);
3041 bfd_seek (dll
, (file_ptr
) secptr1
+ 0, SEEK_SET
);
3042 bfd_bread (sec_name
, (bfd_size_type
) 8, dll
);
3044 if (strcmp(sec_name
,".data") == 0)
3047 data_end
= vaddr
+ vsize
;
3049 if (pe_dll_extra_pe_debug
)
3050 printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n",
3051 __FUNCTION__
, sec_name
, (unsigned long) vaddr
,
3052 (unsigned long) (vaddr
+ vsize
), (unsigned long) flags
);
3054 else if (strcmp(sec_name
,".rdata") == 0)
3056 rdata_start
= vaddr
;
3057 rdata_end
= vaddr
+ vsize
;
3059 if (pe_dll_extra_pe_debug
)
3060 printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n",
3061 __FUNCTION__
, sec_name
, (unsigned long) vaddr
,
3062 (unsigned long) (vaddr
+ vsize
), (unsigned long) flags
);
3064 else if (strcmp (sec_name
,".bss") == 0)
3067 bss_end
= vaddr
+ vsize
;
3069 if (pe_dll_extra_pe_debug
)
3070 printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n",
3071 __FUNCTION__
, sec_name
, (unsigned long) vaddr
,
3072 (unsigned long) (vaddr
+ vsize
), (unsigned long) flags
);
3076 expdata
= xmalloc (export_size
);
3077 bfd_seek (dll
, (file_ptr
) expptr
, SEEK_SET
);
3078 bfd_bread (expdata
, (bfd_size_type
) export_size
, dll
);
3079 erva
= (char *) expdata
- export_rva
;
3081 if (pe_def_file
== 0)
3082 pe_def_file
= def_file_empty ();
3084 nexp
= pe_as32 (expdata
+ 24);
3085 name_rvas
= pe_as32 (expdata
+ 32);
3086 ordinals
= pe_as32 (expdata
+ 36);
3087 ordbase
= pe_as32 (expdata
+ 16);
3088 exp_funcbase
= pe_as32 (expdata
+ 28);
3090 /* Use internal dll name instead of filename
3091 to enable symbolic dll linking. */
3092 dll_name
= erva
+ pe_as32 (expdata
+ 12);
3094 /* Check to see if the dll has already been added to
3095 the definition list and if so return without error.
3096 This avoids multiple symbol definitions. */
3097 if (def_get_module (pe_def_file
, dll_name
))
3099 if (pe_dll_extra_pe_debug
)
3100 printf ("%s is already loaded\n", dll_name
);
3104 /* Iterate through the list of symbols. */
3105 for (i
= 0; i
< nexp
; i
++)
3107 /* Pointer to the names vector. */
3108 bfd_vma name_rva
= pe_as32 (erva
+ name_rvas
+ i
* 4);
3109 def_file_import
*imp
;
3110 /* Pointer to the function address vector. */
3111 bfd_vma func_rva
= pe_as32 (erva
+ exp_funcbase
+ i
* 4);
3114 /* Skip unwanted symbols, which are
3115 exported in buggy auto-import releases. */
3116 if (! CONST_STRNEQ (erva
+ name_rva
, "_nm_"))
3118 /* is_data is true if the address is in the data, rdata or bss
3121 (func_rva
>= data_start
&& func_rva
< data_end
)
3122 || (func_rva
>= rdata_start
&& func_rva
< rdata_end
)
3123 || (func_rva
>= bss_start
&& func_rva
< bss_end
);
3125 imp
= def_file_add_import (pe_def_file
, erva
+ name_rva
,
3126 dll_name
, i
, 0, NULL
);
3127 /* Mark symbol type. */
3128 imp
->data
= is_data
;
3130 if (pe_dll_extra_pe_debug
)
3131 printf ("%s dll-name: %s sym: %s addr: 0x%lx %s\n",
3132 __FUNCTION__
, dll_name
, erva
+ name_rva
,
3133 (unsigned long) func_rva
, is_data
? "(data)" : "");
3141 pe_output_file_set_long_section_names (bfd
*abfd
)
3143 if (pe_use_coff_long_section_names
< 0)
3145 if (!bfd_coff_set_long_section_names (abfd
, pe_use_coff_long_section_names
))
3146 einfo (_("%XError: can't use long section names on this arch\n"));
3149 /* These are the main functions, called from the emulation. The first
3150 is called after the bfds are read, so we can guess at how much space
3151 we need. The second is called after everything is placed, so we
3152 can put the right values in place. */
3155 pe_dll_build_sections (bfd
*abfd
, struct bfd_link_info
*info
)
3157 pe_dll_id_target (bfd_get_target (abfd
));
3158 pe_output_file_set_long_section_names (abfd
);
3159 process_def_file_and_drectve (abfd
, info
);
3161 if (pe_def_file
->num_exports
== 0 && !info
->shared
)
3164 generate_edata (abfd
, info
);
3165 build_filler_bfd (1);
3166 pe_output_file_set_long_section_names (filler_bfd
);
3170 pe_exe_build_sections (bfd
*abfd
, struct bfd_link_info
*info ATTRIBUTE_UNUSED
)
3172 pe_dll_id_target (bfd_get_target (abfd
));
3173 pe_output_file_set_long_section_names (abfd
);
3174 build_filler_bfd (0);
3175 pe_output_file_set_long_section_names (filler_bfd
);
3179 pe_dll_fill_sections (bfd
*abfd
, struct bfd_link_info
*info
)
3181 pe_dll_id_target (bfd_get_target (abfd
));
3182 pe_output_file_set_long_section_names (abfd
);
3183 image_base
= pe_data (abfd
)->pe_opthdr
.ImageBase
;
3185 generate_reloc (abfd
, info
);
3188 bfd_set_section_size (filler_bfd
, reloc_s
, reloc_sz
);
3190 /* Resize the sections. */
3191 lang_reset_memory_regions ();
3192 lang_size_sections (NULL
, TRUE
);
3194 /* Redo special stuff. */
3195 ldemul_after_allocation ();
3197 /* Do the assignments again. */
3198 lang_do_assignments ();
3201 fill_edata (abfd
, info
);
3203 if (info
->shared
&& !info
->pie
)
3204 pe_data (abfd
)->dll
= 1;
3206 edata_s
->contents
= edata_d
;
3207 reloc_s
->contents
= reloc_d
;
3211 pe_exe_fill_sections (bfd
*abfd
, struct bfd_link_info
*info
)
3213 pe_dll_id_target (bfd_get_target (abfd
));
3214 pe_output_file_set_long_section_names (abfd
);
3215 image_base
= pe_data (abfd
)->pe_opthdr
.ImageBase
;
3217 generate_reloc (abfd
, info
);
3220 bfd_set_section_size (filler_bfd
, reloc_s
, reloc_sz
);
3222 /* Resize the sections. */
3223 lang_reset_memory_regions ();
3224 lang_size_sections (NULL
, TRUE
);
3226 /* Redo special stuff. */
3227 ldemul_after_allocation ();
3229 /* Do the assignments again. */
3230 lang_do_assignments ();
3232 reloc_s
->contents
= reloc_d
;
3236 pe_bfd_is_dll (bfd
*abfd
)
3238 return (bfd_get_format (abfd
) == bfd_object
3240 && pe_data (abfd
)->dll
);