1 /* Routines to help build PEI-format DLLs (Win32 etc)
2 Copyright (C) 1998-2014 Free Software Foundation, Inc.
3 Written by DJ Delorie <dj@cygnus.com>
5 This file is part of the GNU Binutils.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
20 MA 02110-1301, USA. */
25 #include "libiberty.h"
26 #include "filenames.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;
161 int pe_leading_underscore
= -1;
163 /* Static variables and types. */
165 static bfd_vma image_base
;
166 static bfd
*filler_bfd
;
167 static struct bfd_section
*edata_s
, *reloc_s
;
168 static unsigned char *edata_d
, *reloc_d
;
169 static size_t edata_sz
, reloc_sz
;
170 static int runtime_pseudo_relocs_created
= 0;
171 static int runtime_pseudp_reloc_v2_init
= 0;
178 autofilter_entry_type
;
182 const char *target_name
;
183 const char *object_target
;
184 unsigned int imagebase_reloc
;
187 bfd_boolean underscored
;
188 const autofilter_entry_type
* autofilter_symbollist
;
192 static const autofilter_entry_type autofilter_symbollist_generic
[] =
194 { STRING_COMMA_LEN ("_NULL_IMPORT_DESCRIPTOR") },
195 /* Entry point symbols. */
196 { STRING_COMMA_LEN ("DllMain") },
197 { STRING_COMMA_LEN ("DllMainCRTStartup") },
198 { STRING_COMMA_LEN ("_DllMainCRTStartup") },
199 /* Runtime pseudo-reloc. */
200 { STRING_COMMA_LEN ("_pei386_runtime_relocator") },
201 { STRING_COMMA_LEN ("do_pseudo_reloc") },
205 static const autofilter_entry_type autofilter_symbollist_i386
[] =
207 { STRING_COMMA_LEN ("_NULL_IMPORT_DESCRIPTOR") },
208 /* Entry point symbols, and entry hooks. */
209 { STRING_COMMA_LEN ("cygwin_crt0") },
211 { STRING_COMMA_LEN ("DllMain") },
212 { STRING_COMMA_LEN ("DllEntryPoint") },
213 { STRING_COMMA_LEN ("DllMainCRTStartup") },
214 { STRING_COMMA_LEN ("_cygwin_dll_entry") },
215 { STRING_COMMA_LEN ("_cygwin_crt0_common") },
216 { STRING_COMMA_LEN ("_cygwin_noncygwin_dll_entry") },
218 { STRING_COMMA_LEN ("DllMain@12") },
219 { STRING_COMMA_LEN ("DllEntryPoint@0") },
220 { STRING_COMMA_LEN ("DllMainCRTStartup@12") },
221 { STRING_COMMA_LEN ("_cygwin_dll_entry@12") },
222 { STRING_COMMA_LEN ("_cygwin_crt0_common@8") },
223 { STRING_COMMA_LEN ("_cygwin_noncygwin_dll_entry@12") },
224 { STRING_COMMA_LEN ("cygwin_attach_dll") },
226 { STRING_COMMA_LEN ("cygwin_premain0") },
227 { STRING_COMMA_LEN ("cygwin_premain1") },
228 { STRING_COMMA_LEN ("cygwin_premain2") },
229 { STRING_COMMA_LEN ("cygwin_premain3") },
230 /* Runtime pseudo-reloc. */
231 { STRING_COMMA_LEN ("_pei386_runtime_relocator") },
232 { STRING_COMMA_LEN ("do_pseudo_reloc") },
233 /* Global vars that should not be exported. */
234 { STRING_COMMA_LEN ("impure_ptr") },
235 { STRING_COMMA_LEN ("_impure_ptr") },
236 { STRING_COMMA_LEN ("_fmode") },
237 { STRING_COMMA_LEN ("environ") },
241 #define PE_ARCH_i386 1
243 #define PE_ARCH_mips 3
244 #define PE_ARCH_arm 4
245 #define PE_ARCH_arm_epoc 5
246 #define PE_ARCH_arm_wince 6
248 /* Don't make it constant as underscore mode gets possibly overriden
249 by target or -(no-)leading-underscore option. */
250 static pe_details_type pe_detail_list
[] =
269 autofilter_symbollist_i386
274 16 /* R_SH_IMAGEBASE */,
278 autofilter_symbollist_generic
287 autofilter_symbollist_generic
296 autofilter_symbollist_generic
299 "epoc-pei-arm-little",
300 "epoc-pe-arm-little",
305 autofilter_symbollist_generic
308 "pei-arm-wince-little",
309 "pe-arm-wince-little",
310 2, /* ARM_RVA32 on Windows CE, see bfd/coff-arm.c. */
314 autofilter_symbollist_generic
316 { NULL
, NULL
, 0, 0, 0, FALSE
, NULL
}
319 static const pe_details_type
*pe_details
;
321 /* Do not specify library suffix explicitly, to allow for dllized versions. */
322 static const autofilter_entry_type autofilter_liblist
[] =
324 { STRING_COMMA_LEN ("libcegcc") },
325 { STRING_COMMA_LEN ("libcygwin") },
326 { STRING_COMMA_LEN ("libgcc") },
327 { STRING_COMMA_LEN ("libgcc_s") },
328 { STRING_COMMA_LEN ("libstdc++") },
329 { STRING_COMMA_LEN ("libmingw32") },
330 { STRING_COMMA_LEN ("libmingwex") },
331 { STRING_COMMA_LEN ("libg2c") },
332 { STRING_COMMA_LEN ("libsupc++") },
333 { STRING_COMMA_LEN ("libobjc") },
334 { STRING_COMMA_LEN ("libgcj") },
338 /* Regardless of the suffix issue mentioned above, we must ensure that
339 we do not falsely match on a leading substring, such as when libtool
340 builds libstdc++ as a DLL using libsupc++convenience.a as an intermediate.
341 This routine ensures that the leading part of the name matches and that
342 it is followed by only an optional version suffix and a file extension,
343 returning zero if so or -1 if not. */
344 static int libnamencmp (const char *libname
, const autofilter_entry_type
*afptr
)
346 if (filename_ncmp (libname
, afptr
->name
, afptr
->len
))
349 libname
+= afptr
->len
;
351 /* Be liberal in interpreting what counts as a version suffix; we
352 accept anything that has a dash to separate it from the name and
353 begins with a digit. */
354 if (libname
[0] == '-')
356 if (!ISDIGIT (*++libname
))
358 /* Ensure the filename has an extension. */
359 while (*++libname
!= '.')
363 else if (libname
[0] != '.')
369 static const autofilter_entry_type autofilter_objlist
[] =
371 { STRING_COMMA_LEN ("crt0.o") },
372 { STRING_COMMA_LEN ("crt1.o") },
373 { STRING_COMMA_LEN ("crt2.o") },
374 { STRING_COMMA_LEN ("dllcrt1.o") },
375 { STRING_COMMA_LEN ("dllcrt2.o") },
376 { STRING_COMMA_LEN ("gcrt0.o") },
377 { STRING_COMMA_LEN ("gcrt1.o") },
378 { STRING_COMMA_LEN ("gcrt2.o") },
379 { STRING_COMMA_LEN ("crtbegin.o") },
380 { STRING_COMMA_LEN ("crtend.o") },
384 static const autofilter_entry_type autofilter_symbolprefixlist
[] =
386 /* _imp_ is treated specially, as it is always underscored. */
387 /* { STRING_COMMA_LEN ("_imp_") }, */
388 /* Don't export some c++ symbols. */
389 { STRING_COMMA_LEN ("__rtti_") },
390 { STRING_COMMA_LEN ("__builtin_") },
391 /* Don't re-export auto-imported symbols. */
392 { STRING_COMMA_LEN ("__nm_") },
393 /* Don't export symbols specifying internal DLL layout. */
394 { STRING_COMMA_LEN ("_head_") },
395 { STRING_COMMA_LEN ("_IMPORT_DESCRIPTOR_") },
396 /* Don't export section labels or artificial symbols
398 { STRING_COMMA_LEN (".") },
402 static const autofilter_entry_type autofilter_symbolsuffixlist
[] =
404 { STRING_COMMA_LEN ("_iname") },
405 { STRING_COMMA_LEN ("_NULL_THUNK_DATA") },
409 #define U(str) (pe_details->underscored ? "_" str : str)
412 pe_dll_id_target (const char *target
)
416 for (i
= 0; pe_detail_list
[i
].target_name
; i
++)
417 if (strcmp (pe_detail_list
[i
].target_name
, target
) == 0
418 || strcmp (pe_detail_list
[i
].object_target
, target
) == 0)
420 int u
= pe_leading_underscore
; /* Underscoring mode. -1 for use default. */
422 bfd_get_target_info (target
, NULL
, NULL
, &u
, NULL
);
425 pe_detail_list
[i
].underscored
= (u
!= 0 ? TRUE
: FALSE
);
426 pe_details
= pe_detail_list
+ i
;
427 pe_leading_underscore
= (u
!= 0 ? 1 : 0);
430 einfo (_("%XUnsupported PEI architecture: %s\n"), target
);
434 /* Helper functions for qsort. Relocs must be sorted so that we can write
435 them out by pages. */
446 reloc_sort (const void *va
, const void *vb
)
448 bfd_vma a
= ((const reloc_data_type
*) va
)->vma
;
449 bfd_vma b
= ((const reloc_data_type
*) vb
)->vma
;
451 return (a
> b
) ? 1 : ((a
< b
) ? -1 : 0);
455 pe_export_sort (const void *va
, const void *vb
)
457 const def_file_export
*a
= va
;
458 const def_file_export
*b
= vb
;
466 return strcmp (an
, bn
);
469 /* Read and process the .DEF file. */
471 /* These correspond to the entries in pe_def_file->exports[]. I use
472 exported_symbol_sections[i] to tag whether or not the symbol was
473 defined, since we can't export symbols we don't have. */
475 static bfd_vma
*exported_symbol_offsets
;
476 static struct bfd_section
**exported_symbol_sections
;
477 static int export_table_size
;
478 static int count_exported
;
479 static int count_exported_byname
;
480 static int count_with_ordinals
;
481 static const char *dll_name
;
482 static int min_ordinal
, max_ordinal
;
483 static int *exported_symbols
;
485 typedef struct exclude_list_struct
488 struct exclude_list_struct
*next
;
493 static struct exclude_list_struct
*excludes
= 0;
496 pe_dll_add_excludes (const char *new_excludes
, const exclude_type type
)
499 char *exclude_string
;
501 local_copy
= xstrdup (new_excludes
);
503 exclude_string
= strtok (local_copy
, ",:");
504 for (; exclude_string
; exclude_string
= strtok (NULL
, ",:"))
506 struct exclude_list_struct
*new_exclude
;
508 new_exclude
= xmalloc (sizeof (struct exclude_list_struct
));
509 new_exclude
->string
= xmalloc (strlen (exclude_string
) + 1);
510 strcpy (new_exclude
->string
, exclude_string
);
511 new_exclude
->type
= type
;
512 new_exclude
->next
= excludes
;
513 excludes
= new_exclude
;
520 is_import (const char* n
)
522 return (CONST_STRNEQ (n
, "__imp_"));
525 /* abfd is a bfd containing n (or NULL)
526 It can be used for contextual checks. */
529 auto_export (bfd
*abfd
, def_file
*d
, const char *n
)
532 struct exclude_list_struct
*ex
;
533 const autofilter_entry_type
*afptr
;
534 const char * libname
= NULL
;
536 if (abfd
&& abfd
->my_archive
)
537 libname
= lbasename (abfd
->my_archive
->filename
);
539 key
.name
= key
.its_name
= (char *) n
;
541 /* Return false if n is in the d->exports table. */
542 if (bsearch (&key
, d
->exports
, d
->num_exports
,
543 sizeof (pe_def_file
->exports
[0]), pe_export_sort
))
546 if (pe_dll_do_default_excludes
)
551 if (pe_dll_extra_pe_debug
)
552 printf ("considering exporting: %s, abfd=%p, abfd->my_arc=%p\n",
553 n
, abfd
, abfd
->my_archive
);
555 /* First of all, make context checks:
556 Don't export anything from standard libs. */
559 afptr
= autofilter_liblist
;
563 if (libnamencmp (libname
, afptr
) == 0 )
569 /* Next, exclude symbols from certain startup objects. */
571 if (abfd
&& (p
= lbasename (abfd
->filename
)))
573 afptr
= autofilter_objlist
;
576 if (strcmp (p
, afptr
->name
) == 0)
582 /* Don't try to blindly exclude all symbols
583 that begin with '__'; this was tried and
584 it is too restrictive. Instead we have
585 a target specific list to use: */
586 afptr
= pe_details
->autofilter_symbollist
;
590 if (strcmp (n
, afptr
->name
) == 0)
596 /* Next, exclude symbols starting with ... */
597 afptr
= autofilter_symbolprefixlist
;
600 if (strncmp (n
, afptr
->name
, afptr
->len
) == 0)
606 /* Finally, exclude symbols ending with ... */
608 afptr
= autofilter_symbolsuffixlist
;
611 if ((len
>= afptr
->len
)
612 /* Add 1 to insure match with trailing '\0'. */
613 && strncmp (n
+ len
- afptr
->len
, afptr
->name
,
614 afptr
->len
+ 1) == 0)
621 for (ex
= excludes
; ex
; ex
= ex
->next
)
623 if (ex
->type
== EXCLUDELIBS
)
626 && ((filename_cmp (libname
, ex
->string
) == 0)
627 || (strcasecmp ("ALL", ex
->string
) == 0)))
630 else if (ex
->type
== EXCLUDEFORIMPLIB
)
632 if (filename_cmp (abfd
->filename
, ex
->string
) == 0)
635 else if (strcmp (n
, ex
->string
) == 0)
643 process_def_file_and_drectve (bfd
*abfd ATTRIBUTE_UNUSED
, struct bfd_link_info
*info
)
646 struct bfd_link_hash_entry
*blhe
;
648 struct bfd_section
*s
;
649 def_file_export
*e
= 0;
650 bfd_boolean resort_needed
;
653 pe_def_file
= def_file_empty ();
655 /* First, run around to all the objects looking for the .drectve
656 sections, and push those into the def file too. */
657 for (b
= info
->input_bfds
; b
; b
= b
->link_next
)
659 s
= bfd_get_section_by_name (b
, ".drectve");
663 char *buf
= xmalloc (size
);
665 bfd_get_section_contents (b
, s
, buf
, 0, size
);
666 def_file_add_directive (pe_def_file
, buf
, size
);
671 /* Process aligned common symbol information from the
672 .drectve sections now; common symbol allocation is
673 done before final link, so it will be too late to
674 process them in process_embedded_commands() called
675 from _bfd_coff_link_input_bfd(). */
676 if (pe_def_file
->aligncomms
)
678 def_file_aligncomm
*ac
= pe_def_file
->aligncomms
;
681 struct coff_link_hash_entry
*sym_hash
;
682 sym_hash
= coff_link_hash_lookup (coff_hash_table (info
),
683 ac
->symbol_name
, FALSE
, FALSE
, FALSE
);
684 if (sym_hash
&& sym_hash
->root
.type
== bfd_link_hash_common
685 && sym_hash
->root
.u
.c
.p
->alignment_power
< (unsigned) ac
->alignment
)
687 sym_hash
->root
.u
.c
.p
->alignment_power
= (unsigned) ac
->alignment
;
693 /* If we are building an executable and there is nothing
694 to export, we do not build an export table at all. */
695 if (info
->executable
&& pe_def_file
->num_exports
== 0
696 && (!pe_dll_export_everything
|| pe_dll_exclude_all_symbols
))
699 /* Now, maybe export everything else the default way. */
700 if ((pe_dll_export_everything
|| pe_def_file
->num_exports
== 0)
701 && !pe_dll_exclude_all_symbols
)
703 for (b
= info
->input_bfds
; b
; b
= b
->link_next
)
708 if (!bfd_generic_link_read_symbols (b
))
710 einfo (_("%B%F: could not read symbols: %E\n"), b
);
714 symbols
= bfd_get_outsymbols (b
);
715 nsyms
= bfd_get_symcount (b
);
717 for (j
= 0; j
< nsyms
; j
++)
719 /* We should export symbols which are either global or not
720 anything at all. (.bss data is the latter)
721 We should not export undefined symbols. */
722 bfd_boolean would_export
723 = (symbols
[j
]->section
!= bfd_und_section_ptr
724 && ((symbols
[j
]->flags
& BSF_GLOBAL
)
725 || (symbols
[j
]->flags
== 0)));
726 if (link_info
.version_info
&& would_export
)
728 = !bfd_hide_sym_by_version (link_info
.version_info
,
732 const char *sn
= symbols
[j
]->name
;
734 /* We should not re-export imported stuff. */
740 name
= xmalloc (strlen ("__imp_") + strlen (sn
) + 1);
741 sprintf (name
, "%s%s", "__imp_", sn
);
743 blhe
= bfd_link_hash_lookup (info
->hash
, name
,
744 FALSE
, FALSE
, FALSE
);
747 if (blhe
&& blhe
->type
== bfd_link_hash_defined
)
751 if (pe_details
->underscored
&& *sn
== '_')
754 if (auto_export (b
, pe_def_file
, sn
))
759 p
= def_file_add_export (pe_def_file
, sn
, 0, -1,
761 /* Fill data flag properly, from dlltool.c. */
763 p
->flag_data
= !(symbols
[j
]->flags
& BSF_FUNCTION
);
771 #define NE pe_def_file->num_exports
773 /* Don't create an empty export table. */
777 resort_needed
= FALSE
;
779 /* Canonicalize the export list. */
782 for (i
= 0; i
< NE
; i
++)
784 /* Check for fastcall/stdcall-decoration, but ignore
785 C++ mangled names. */
786 if (pe_def_file
->exports
[i
].name
[0] != '?'
787 && strchr (pe_def_file
->exports
[i
].name
, '@'))
789 /* This will preserve internal_name, which may have been
790 pointing to the same memory as name, or might not
792 int lead_at
= (*pe_def_file
->exports
[i
].name
== '@');
793 char *tmp
= xstrdup (pe_def_file
->exports
[i
].name
+ lead_at
);
794 char *tmp_at
= strrchr (tmp
, '@');
799 einfo (_("%XCannot export %s: invalid export name\n"),
800 pe_def_file
->exports
[i
].name
);
801 pe_def_file
->exports
[i
].name
= tmp
;
802 resort_needed
= TRUE
;
807 /* Re-sort the exports table as we have possibly changed the order
808 by removing leading @. */
810 qsort (pe_def_file
->exports
, NE
, sizeof (pe_def_file
->exports
[0]),
813 if (pe_dll_stdcall_aliases
)
815 for (i
= 0; i
< NE
; i
++)
817 if (is_import (pe_def_file
->exports
[i
].name
))
820 if (strchr (pe_def_file
->exports
[i
].name
, '@'))
823 int lead_at
= (*pe_def_file
->exports
[i
].name
== '@');
824 char *tmp
= xstrdup (pe_def_file
->exports
[i
].name
+ lead_at
);
826 *(strchr (tmp
, '@')) = 0;
827 if (auto_export (NULL
, pe_def_file
, tmp
))
828 def_file_add_export (pe_def_file
, tmp
,
829 pe_def_file
->exports
[i
].internal_name
,
837 /* Convenience, but watch out for it changing. */
838 e
= pe_def_file
->exports
;
840 for (i
= 0, j
= 0; i
< NE
; i
++)
842 if (i
> 0 && strcmp (e
[i
].name
, e
[i
- 1].name
) == 0)
844 /* This is a duplicate. */
845 if (e
[j
- 1].ordinal
!= -1
846 && e
[i
].ordinal
!= -1
847 && e
[j
- 1].ordinal
!= e
[i
].ordinal
)
849 if (pe_dll_warn_dup_exports
)
850 /* xgettext:c-format */
851 einfo (_("%XError, duplicate EXPORT with ordinals: %s (%d vs %d)\n"),
852 e
[j
- 1].name
, e
[j
- 1].ordinal
, e
[i
].ordinal
);
856 if (pe_dll_warn_dup_exports
)
857 /* xgettext:c-format */
858 einfo (_("Warning, duplicate EXPORT: %s\n"),
862 if (e
[i
].ordinal
!= -1)
863 e
[j
- 1].ordinal
= e
[i
].ordinal
;
864 e
[j
- 1].flag_private
|= e
[i
].flag_private
;
865 e
[j
- 1].flag_constant
|= e
[i
].flag_constant
;
866 e
[j
- 1].flag_noname
|= e
[i
].flag_noname
;
867 e
[j
- 1].flag_data
|= e
[i
].flag_data
;
870 if (e
[i
].internal_name
)
871 free (e
[i
].internal_name
);
873 free (e
[i
].its_name
);
882 pe_def_file
->num_exports
= j
; /* == NE */
884 exported_symbol_offsets
= xmalloc (NE
* sizeof (bfd_vma
));
885 exported_symbol_sections
= xmalloc (NE
* sizeof (struct bfd_section
*));
887 memset (exported_symbol_sections
, 0, NE
* sizeof (struct bfd_section
*));
891 count_exported_byname
= 0;
892 count_with_ordinals
= 0;
894 for (i
= 0; i
< NE
; i
++)
897 name
= xmalloc (strlen (pe_def_file
->exports
[i
].internal_name
) + 2);
898 if (pe_details
->underscored
899 && (*pe_def_file
->exports
[i
].internal_name
!= '@'))
902 strcpy (name
+ 1, pe_def_file
->exports
[i
].internal_name
);
905 strcpy (name
, pe_def_file
->exports
[i
].internal_name
);
907 blhe
= bfd_link_hash_lookup (info
->hash
,
912 && (blhe
->type
== bfd_link_hash_defined
913 || (blhe
->type
== bfd_link_hash_common
)))
916 if (!pe_def_file
->exports
[i
].flag_noname
)
917 count_exported_byname
++;
919 /* Only fill in the sections. The actual offsets are computed
920 in fill_exported_offsets() after common symbols are laid
922 if (blhe
->type
== bfd_link_hash_defined
)
923 exported_symbol_sections
[i
] = blhe
->u
.def
.section
;
925 exported_symbol_sections
[i
] = blhe
->u
.c
.p
->section
;
927 if (pe_def_file
->exports
[i
].ordinal
!= -1)
929 if (max_ordinal
< pe_def_file
->exports
[i
].ordinal
)
930 max_ordinal
= pe_def_file
->exports
[i
].ordinal
;
931 if (min_ordinal
> pe_def_file
->exports
[i
].ordinal
)
932 min_ordinal
= pe_def_file
->exports
[i
].ordinal
;
933 count_with_ordinals
++;
936 /* Check for forward exports. These are indicated in DEF files by an
937 export directive of the form NAME1 = MODULE-NAME.EXTERNAL-NAME
938 but we must take care not to be fooled when the user wants to export
939 a symbol that actually really has a dot in it, so we only check
940 for them here, after real defined symbols have already been matched. */
941 else if (strchr (pe_def_file
->exports
[i
].internal_name
, '.'))
944 if (!pe_def_file
->exports
[i
].flag_noname
)
945 count_exported_byname
++;
947 pe_def_file
->exports
[i
].flag_forward
= 1;
949 if (pe_def_file
->exports
[i
].ordinal
!= -1)
951 if (max_ordinal
< pe_def_file
->exports
[i
].ordinal
)
952 max_ordinal
= pe_def_file
->exports
[i
].ordinal
;
953 if (min_ordinal
> pe_def_file
->exports
[i
].ordinal
)
954 min_ordinal
= pe_def_file
->exports
[i
].ordinal
;
955 count_with_ordinals
++;
958 else if (blhe
&& blhe
->type
== bfd_link_hash_undefined
)
960 /* xgettext:c-format */
961 einfo (_("%XCannot export %s: symbol not defined\n"),
962 pe_def_file
->exports
[i
].internal_name
);
966 /* xgettext:c-format */
967 einfo (_("%XCannot export %s: symbol wrong type (%d vs %d)\n"),
968 pe_def_file
->exports
[i
].internal_name
,
969 blhe
->type
, bfd_link_hash_defined
);
973 /* xgettext:c-format */
974 einfo (_("%XCannot export %s: symbol not found\n"),
975 pe_def_file
->exports
[i
].internal_name
);
981 /* Build the bfd that will contain .edata and .reloc sections. */
984 build_filler_bfd (int include_edata
)
986 lang_input_statement_type
*filler_file
;
987 filler_file
= lang_add_input_file ("dll stuff",
988 lang_input_file_is_fake_enum
,
990 filler_file
->the_bfd
= filler_bfd
= bfd_create ("dll stuff",
991 link_info
.output_bfd
);
992 if (filler_bfd
== NULL
993 || !bfd_set_arch_mach (filler_bfd
,
994 bfd_get_arch (link_info
.output_bfd
),
995 bfd_get_mach (link_info
.output_bfd
)))
997 einfo ("%X%P: can not create BFD: %E\n");
1003 edata_s
= bfd_make_section_old_way (filler_bfd
, ".edata");
1005 || !bfd_set_section_flags (filler_bfd
, edata_s
,
1012 einfo ("%X%P: can not create .edata section: %E\n");
1015 bfd_set_section_size (filler_bfd
, edata_s
, edata_sz
);
1018 reloc_s
= bfd_make_section_old_way (filler_bfd
, ".reloc");
1020 || !bfd_set_section_flags (filler_bfd
, reloc_s
,
1027 einfo ("%X%P: can not create .reloc section: %E\n");
1031 bfd_set_section_size (filler_bfd
, reloc_s
, 0);
1033 ldlang_add_file (filler_file
);
1036 /* Gather all the exported symbols and build the .edata section. */
1039 generate_edata (bfd
*abfd
, struct bfd_link_info
*info ATTRIBUTE_UNUSED
)
1041 int i
, next_ordinal
;
1042 int name_table_size
= 0;
1045 /* First, we need to know how many exported symbols there are,
1046 and what the range of ordinals is. */
1047 if (pe_def_file
->name
)
1048 dll_name
= pe_def_file
->name
;
1051 dll_name
= abfd
->filename
;
1053 for (dlnp
= dll_name
; *dlnp
; dlnp
++)
1054 if (*dlnp
== '\\' || *dlnp
== '/' || *dlnp
== ':')
1055 dll_name
= dlnp
+ 1;
1058 if (count_with_ordinals
&& max_ordinal
> count_exported
)
1060 if (min_ordinal
> max_ordinal
- count_exported
+ 1)
1061 min_ordinal
= max_ordinal
- count_exported
+ 1;
1066 max_ordinal
= count_exported
;
1069 export_table_size
= max_ordinal
- min_ordinal
+ 1;
1070 exported_symbols
= xmalloc (export_table_size
* sizeof (int));
1071 for (i
= 0; i
< export_table_size
; i
++)
1072 exported_symbols
[i
] = -1;
1074 /* Now we need to assign ordinals to those that don't have them. */
1075 for (i
= 0; i
< NE
; i
++)
1077 if (exported_symbol_sections
[i
] ||
1078 pe_def_file
->exports
[i
].flag_forward
)
1080 if (pe_def_file
->exports
[i
].ordinal
!= -1)
1082 int ei
= pe_def_file
->exports
[i
].ordinal
- min_ordinal
;
1083 int pi
= exported_symbols
[ei
];
1087 /* xgettext:c-format */
1088 einfo (_("%XError, ordinal used twice: %d (%s vs %s)\n"),
1089 pe_def_file
->exports
[i
].ordinal
,
1090 pe_def_file
->exports
[i
].name
,
1091 pe_def_file
->exports
[pi
].name
);
1093 exported_symbols
[ei
] = i
;
1095 if (pe_def_file
->exports
[i
].its_name
)
1096 name_table_size
+= strlen (pe_def_file
->exports
[i
].its_name
) + 1;
1098 name_table_size
+= strlen (pe_def_file
->exports
[i
].name
) + 1;
1101 /* Reserve space for the forward name. */
1102 if (pe_def_file
->exports
[i
].flag_forward
)
1104 name_table_size
+= strlen (pe_def_file
->exports
[i
].internal_name
) + 1;
1108 next_ordinal
= min_ordinal
;
1109 for (i
= 0; i
< NE
; i
++)
1110 if ((exported_symbol_sections
[i
] ||
1111 pe_def_file
->exports
[i
].flag_forward
) &&
1112 pe_def_file
->exports
[i
].ordinal
== -1)
1114 while (exported_symbols
[next_ordinal
- min_ordinal
] != -1)
1117 exported_symbols
[next_ordinal
- min_ordinal
] = i
;
1118 pe_def_file
->exports
[i
].ordinal
= next_ordinal
;
1121 /* OK, now we can allocate some memory. */
1122 edata_sz
= (40 /* directory */
1123 + 4 * export_table_size
/* addresses */
1124 + 4 * count_exported_byname
/* name ptrs */
1125 + 2 * count_exported_byname
/* ordinals */
1126 + name_table_size
+ strlen (dll_name
) + 1);
1129 /* Fill the exported symbol offsets. The preliminary work has already
1130 been done in process_def_file_and_drectve(). */
1133 fill_exported_offsets (bfd
*abfd ATTRIBUTE_UNUSED
, struct bfd_link_info
*info
)
1136 struct bfd_link_hash_entry
*blhe
;
1138 for (i
= 0; i
< pe_def_file
->num_exports
; i
++)
1142 name
= xmalloc (strlen (pe_def_file
->exports
[i
].internal_name
) + 2);
1143 if (pe_details
->underscored
1144 && *pe_def_file
->exports
[i
].internal_name
!= '@')
1147 strcpy (name
+ 1, pe_def_file
->exports
[i
].internal_name
);
1150 strcpy (name
, pe_def_file
->exports
[i
].internal_name
);
1152 blhe
= bfd_link_hash_lookup (info
->hash
,
1154 FALSE
, FALSE
, TRUE
);
1156 if (blhe
&& blhe
->type
== bfd_link_hash_defined
)
1157 exported_symbol_offsets
[i
] = blhe
->u
.def
.value
;
1164 fill_edata (bfd
*abfd
, struct bfd_link_info
*info ATTRIBUTE_UNUSED
)
1167 unsigned char *edirectory
;
1168 unsigned char *eaddresses
;
1169 unsigned char *enameptrs
;
1170 unsigned char *eordinals
;
1173 edata_d
= xmalloc (edata_sz
);
1175 /* Note use of array pointer math here. */
1176 edirectory
= edata_d
;
1177 eaddresses
= edirectory
+ 40;
1178 enameptrs
= eaddresses
+ 4 * export_table_size
;
1179 eordinals
= enameptrs
+ 4 * count_exported_byname
;
1180 enamestr
= (char *) eordinals
+ 2 * count_exported_byname
;
1182 #define ERVA(ptr) (((unsigned char *)(ptr) - edata_d) \
1183 + edata_s->output_section->vma - image_base)
1185 memset (edata_d
, 0, edata_sz
);
1187 if (pe_data (abfd
)->insert_timestamp
)
1188 H_PUT_32 (abfd
, time (0), edata_d
+ 4);
1190 if (pe_def_file
->version_major
!= -1)
1192 bfd_put_16 (abfd
, pe_def_file
->version_major
, edata_d
+ 8);
1193 bfd_put_16 (abfd
, pe_def_file
->version_minor
, edata_d
+ 10);
1196 bfd_put_32 (abfd
, ERVA (enamestr
), edata_d
+ 12);
1197 strcpy (enamestr
, dll_name
);
1198 enamestr
+= strlen (enamestr
) + 1;
1199 bfd_put_32 (abfd
, min_ordinal
, edata_d
+ 16);
1200 bfd_put_32 (abfd
, export_table_size
, edata_d
+ 20);
1201 bfd_put_32 (abfd
, count_exported_byname
, edata_d
+ 24);
1202 bfd_put_32 (abfd
, ERVA (eaddresses
), edata_d
+ 28);
1203 bfd_put_32 (abfd
, ERVA (enameptrs
), edata_d
+ 32);
1204 bfd_put_32 (abfd
, ERVA (eordinals
), edata_d
+ 36);
1206 fill_exported_offsets (abfd
, info
);
1208 /* Ok, now for the filling in part.
1209 Scan alphabetically - ie the ordering in the exports[] table,
1210 rather than by ordinal - the ordering in the exported_symbol[]
1211 table. See dlltool.c and:
1212 http://sources.redhat.com/ml/binutils/2003-04/msg00379.html
1213 for more information. */
1215 for (s
= 0; s
< NE
; s
++)
1217 struct bfd_section
*ssec
= exported_symbol_sections
[s
];
1218 if (pe_def_file
->exports
[s
].ordinal
!= -1 &&
1219 (pe_def_file
->exports
[s
].flag_forward
|| ssec
!= NULL
))
1221 int ord
= pe_def_file
->exports
[s
].ordinal
;
1223 if (pe_def_file
->exports
[s
].flag_forward
)
1225 bfd_put_32 (abfd
, ERVA (enamestr
),
1226 eaddresses
+ 4 * (ord
- min_ordinal
));
1228 strcpy (enamestr
, pe_def_file
->exports
[s
].internal_name
);
1229 enamestr
+= strlen (pe_def_file
->exports
[s
].internal_name
) + 1;
1233 bfd_vma srva
= (exported_symbol_offsets
[s
]
1234 + ssec
->output_section
->vma
1235 + ssec
->output_offset
);
1237 bfd_put_32 (abfd
, srva
- image_base
,
1238 eaddresses
+ 4 * (ord
- min_ordinal
));
1241 if (!pe_def_file
->exports
[s
].flag_noname
)
1243 char *ename
= pe_def_file
->exports
[s
].name
;
1244 if (pe_def_file
->exports
[s
].its_name
)
1245 ename
= pe_def_file
->exports
[s
].its_name
;
1247 bfd_put_32 (abfd
, ERVA (enamestr
), enameptrs
);
1249 strcpy (enamestr
, ename
);
1250 enamestr
+= strlen (enamestr
) + 1;
1251 bfd_put_16 (abfd
, ord
- min_ordinal
, eordinals
);
1253 pe_def_file
->exports
[s
].hint
= hint
++;
1260 static struct bfd_section
*current_sec
;
1263 pe_walk_relocs_of_symbol (struct bfd_link_info
*info
,
1265 int (*cb
) (arelent
*, asection
*))
1270 for (b
= info
->input_bfds
; b
; b
= b
->link_next
)
1274 if (!bfd_generic_link_read_symbols (b
))
1276 einfo (_("%B%F: could not read symbols: %E\n"), b
);
1280 symbols
= bfd_get_outsymbols (b
);
1282 for (s
= b
->sections
; s
; s
= s
->next
)
1285 int relsize
, nrelocs
, i
;
1286 int flags
= bfd_get_section_flags (b
, s
);
1288 /* Skip discarded linkonce sections. */
1289 if (flags
& SEC_LINK_ONCE
1290 && s
->output_section
== bfd_abs_section_ptr
)
1295 relsize
= bfd_get_reloc_upper_bound (b
, s
);
1296 relocs
= xmalloc (relsize
);
1297 nrelocs
= bfd_canonicalize_reloc (b
, s
, relocs
, symbols
);
1299 for (i
= 0; i
< nrelocs
; i
++)
1301 struct bfd_symbol
*sym
= *relocs
[i
]->sym_ptr_ptr
;
1303 if (!strcmp (name
, sym
->name
))
1309 /* Warning: the allocated symbols are remembered in BFD and reused
1310 later, so don't free them! */
1311 /* free (symbols); */
1316 /* Gather all the relocations and build the .reloc section. */
1319 generate_reloc (bfd
*abfd
, struct bfd_link_info
*info
)
1322 /* For .reloc stuff. */
1323 reloc_data_type
*reloc_data
;
1324 int total_relocs
= 0;
1326 bfd_vma sec_page
= (bfd_vma
) -1;
1327 bfd_vma page_ptr
, page_count
;
1330 struct bfd_section
*s
;
1333 for (b
= info
->input_bfds
; b
; b
= b
->link_next
)
1334 for (s
= b
->sections
; s
; s
= s
->next
)
1335 total_relocs
+= s
->reloc_count
;
1337 reloc_data
= xmalloc (total_relocs
* sizeof (reloc_data_type
));
1341 for (bi
= 0, b
= info
->input_bfds
; b
; bi
++, b
= b
->link_next
)
1344 int relsize
, nrelocs
;
1346 for (s
= b
->sections
; s
; s
= s
->next
)
1348 bfd_vma sec_vma
= s
->output_section
->vma
+ s
->output_offset
;
1351 /* If it's not loaded, we don't need to relocate it this way. */
1352 if (!(s
->output_section
->flags
& SEC_LOAD
))
1355 /* I don't know why there would be a reloc for these, but I've
1356 seen it happen - DJ */
1357 if (s
->output_section
== bfd_abs_section_ptr
)
1360 if (s
->output_section
->vma
== 0)
1362 /* Huh? Shouldn't happen, but punt if it does. */
1363 einfo ("DJ: zero vma section reloc detected: `%s' #%d f=%d\n",
1364 s
->output_section
->name
, s
->output_section
->index
,
1365 s
->output_section
->flags
);
1369 if (!bfd_generic_link_read_symbols (b
))
1371 einfo (_("%B%F: could not read symbols: %E\n"), b
);
1375 symbols
= bfd_get_outsymbols (b
);
1376 relsize
= bfd_get_reloc_upper_bound (b
, s
);
1377 relocs
= xmalloc (relsize
);
1378 nrelocs
= bfd_canonicalize_reloc (b
, s
, relocs
, symbols
);
1380 for (i
= 0; i
< nrelocs
; i
++)
1382 if (pe_dll_extra_pe_debug
)
1384 struct bfd_symbol
*sym
= *relocs
[i
]->sym_ptr_ptr
;
1385 printf ("rel: %s\n", sym
->name
);
1387 if (!relocs
[i
]->howto
->pc_relative
1388 && relocs
[i
]->howto
->type
!= pe_details
->imagebase_reloc
)
1390 struct bfd_symbol
*sym
= *relocs
[i
]->sym_ptr_ptr
;
1392 /* Don't create relocs for undefined weak symbols. */
1393 if (sym
->flags
== BSF_WEAK
)
1395 struct bfd_link_hash_entry
*blhe
1396 = bfd_wrapped_link_hash_lookup (abfd
, info
, sym
->name
,
1397 FALSE
, FALSE
, FALSE
);
1398 if (blhe
&& blhe
->type
== bfd_link_hash_undefweak
)
1400 /* Check aux sym and see if it is defined or not. */
1401 struct coff_link_hash_entry
*h
, *h2
;
1402 h
= (struct coff_link_hash_entry
*)blhe
;
1403 if (h
->symbol_class
!= C_NT_WEAK
|| h
->numaux
!= 1)
1405 h2
= h
->auxbfd
->tdata
.coff_obj_data
->sym_hashes
1406 [h
->aux
->x_sym
.x_tagndx
.l
];
1407 /* We don't want a base reloc if the aux sym is not
1408 found, undefined, or if it is the constant ABS
1409 zero default value. (We broaden that slightly by
1410 not testing the value, just the section; there's
1411 no reason we'd want a reference to any absolute
1412 address to get relocated during rebasing). */
1413 if (!h2
|| h2
->root
.type
== bfd_link_hash_undefined
1414 || h2
->root
.u
.def
.section
== bfd_abs_section_ptr
)
1417 else if (!blhe
|| blhe
->type
!= bfd_link_hash_defined
)
1420 /* Nor for Dwarf FDE references to discarded sections. */
1421 else if (bfd_is_abs_section (sym
->section
->output_section
))
1423 /* We only ignore relocs from .eh_frame sections, as
1424 they are discarded by the final link rather than
1425 resolved against the kept section. */
1426 if (!strcmp (s
->name
, ".eh_frame"))
1430 reloc_data
[total_relocs
].vma
= sec_vma
+ relocs
[i
]->address
;
1432 #define BITS_AND_SHIFT(bits, shift) (bits * 1000 | shift)
1434 switch BITS_AND_SHIFT (relocs
[i
]->howto
->bitsize
,
1435 relocs
[i
]->howto
->rightshift
)
1437 #ifdef pe_use_x86_64
1438 case BITS_AND_SHIFT (64, 0):
1439 reloc_data
[total_relocs
].type
= 10;
1443 case BITS_AND_SHIFT (32, 0):
1444 reloc_data
[total_relocs
].type
= 3;
1447 case BITS_AND_SHIFT (16, 0):
1448 reloc_data
[total_relocs
].type
= 2;
1451 case BITS_AND_SHIFT (16, 16):
1452 reloc_data
[total_relocs
].type
= 4;
1453 /* FIXME: we can't know the symbol's right value
1454 yet, but we probably can safely assume that
1455 CE will relocate us in 64k blocks, so leaving
1457 reloc_data
[total_relocs
].extra
= 0;
1460 case BITS_AND_SHIFT (26, 2):
1461 reloc_data
[total_relocs
].type
= 5;
1464 case BITS_AND_SHIFT (24, 2):
1465 /* FIXME: 0 is ARM_26D, it is defined in bfd/coff-arm.c
1466 Those ARM_xxx definitions should go in proper
1468 if (relocs
[i
]->howto
->type
== 0
1469 /* Older GNU linkers used 5 instead of 0 for this reloc. */
1470 || relocs
[i
]->howto
->type
== 5)
1471 /* This is an ARM_26D reloc, which is an ARM_26 reloc
1472 that has already been fully processed during a
1473 previous link stage, so ignore it here. */
1477 /* xgettext:c-format */
1478 einfo (_("%XError: %d-bit reloc in dll\n"),
1479 relocs
[i
]->howto
->bitsize
);
1485 /* Warning: the allocated symbols are remembered in BFD and
1486 reused later, so don't free them! */
1490 /* At this point, we have total_relocs relocation addresses in
1491 reloc_addresses, which are all suitable for the .reloc section.
1492 We must now create the new sections. */
1493 qsort (reloc_data
, total_relocs
, sizeof (*reloc_data
), reloc_sort
);
1495 for (i
= 0; i
< total_relocs
; i
++)
1497 bfd_vma this_page
= (reloc_data
[i
].vma
>> 12);
1499 if (this_page
!= sec_page
)
1501 reloc_sz
= (reloc_sz
+ 3) & ~3; /* 4-byte align. */
1503 sec_page
= this_page
;
1508 if (reloc_data
[i
].type
== 4)
1512 reloc_sz
= (reloc_sz
+ 3) & ~3; /* 4-byte align. */
1513 reloc_d
= xmalloc (reloc_sz
);
1514 sec_page
= (bfd_vma
) -1;
1516 page_ptr
= (bfd_vma
) -1;
1519 for (i
= 0; i
< total_relocs
; i
++)
1521 bfd_vma rva
= reloc_data
[i
].vma
- image_base
;
1522 bfd_vma this_page
= (rva
& ~0xfff);
1524 if (this_page
!= sec_page
)
1526 while (reloc_sz
& 3)
1527 reloc_d
[reloc_sz
++] = 0;
1529 if (page_ptr
!= (bfd_vma
) -1)
1530 bfd_put_32 (abfd
, reloc_sz
- page_ptr
, reloc_d
+ page_ptr
+ 4);
1532 bfd_put_32 (abfd
, this_page
, reloc_d
+ reloc_sz
);
1533 page_ptr
= reloc_sz
;
1535 sec_page
= this_page
;
1539 bfd_put_16 (abfd
, (rva
& 0xfff) + (reloc_data
[i
].type
<< 12),
1540 reloc_d
+ reloc_sz
);
1543 if (reloc_data
[i
].type
== 4)
1545 bfd_put_16 (abfd
, reloc_data
[i
].extra
, reloc_d
+ reloc_sz
);
1552 while (reloc_sz
& 3)
1553 reloc_d
[reloc_sz
++] = 0;
1555 if (page_ptr
!= (bfd_vma
) -1)
1556 bfd_put_32 (abfd
, reloc_sz
- page_ptr
, reloc_d
+ page_ptr
+ 4);
1558 while (reloc_sz
< reloc_s
->size
)
1559 reloc_d
[reloc_sz
++] = 0;
1562 /* Given the exiting def_file structure, print out a .DEF file that
1563 corresponds to it. */
1566 quoteput (char *s
, FILE *f
, int needs_quotes
)
1570 for (cp
= s
; *cp
; cp
++)
1585 if (*s
== '"' || *s
== '\\')
1599 pe_dll_generate_def_file (const char *pe_out_def_filename
)
1602 FILE *out
= fopen (pe_out_def_filename
, "w");
1605 /* xgettext:c-format */
1606 einfo (_("%s: Can't open output def file %s\n"),
1607 program_name
, pe_out_def_filename
);
1611 if (pe_def_file
->name
)
1613 if (pe_def_file
->is_dll
)
1614 fprintf (out
, "LIBRARY ");
1616 fprintf (out
, "NAME ");
1618 quoteput (pe_def_file
->name
, out
, 1);
1620 if (pe_data (link_info
.output_bfd
)->pe_opthdr
.ImageBase
)
1622 fprintf (out
, " BASE=0x");
1623 fprintf_vma (out
, ((bfd_vma
) pe_data (link_info
.output_bfd
)->pe_opthdr
.ImageBase
));
1625 fprintf (out
, "\n");
1628 if (pe_def_file
->description
)
1630 fprintf (out
, "DESCRIPTION ");
1631 quoteput (pe_def_file
->description
, out
, 1);
1632 fprintf (out
, "\n");
1635 if (pe_def_file
->version_minor
!= -1)
1636 fprintf (out
, "VERSION %d.%d\n", pe_def_file
->version_major
,
1637 pe_def_file
->version_minor
);
1638 else if (pe_def_file
->version_major
!= -1)
1639 fprintf (out
, "VERSION %d\n", pe_def_file
->version_major
);
1641 if (pe_def_file
->stack_reserve
!= -1 || pe_def_file
->heap_reserve
!= -1)
1642 fprintf (out
, "\n");
1644 if (pe_def_file
->stack_commit
!= -1)
1645 fprintf (out
, "STACKSIZE 0x%x,0x%x\n",
1646 pe_def_file
->stack_reserve
, pe_def_file
->stack_commit
);
1647 else if (pe_def_file
->stack_reserve
!= -1)
1648 fprintf (out
, "STACKSIZE 0x%x\n", pe_def_file
->stack_reserve
);
1650 if (pe_def_file
->heap_commit
!= -1)
1651 fprintf (out
, "HEAPSIZE 0x%x,0x%x\n",
1652 pe_def_file
->heap_reserve
, pe_def_file
->heap_commit
);
1653 else if (pe_def_file
->heap_reserve
!= -1)
1654 fprintf (out
, "HEAPSIZE 0x%x\n", pe_def_file
->heap_reserve
);
1656 if (pe_def_file
->num_section_defs
> 0)
1658 fprintf (out
, "\nSECTIONS\n\n");
1660 for (i
= 0; i
< pe_def_file
->num_section_defs
; i
++)
1663 quoteput (pe_def_file
->section_defs
[i
].name
, out
, 0);
1665 if (pe_def_file
->section_defs
[i
].class)
1667 fprintf (out
, " CLASS ");
1668 quoteput (pe_def_file
->section_defs
[i
].class, out
, 0);
1671 if (pe_def_file
->section_defs
[i
].flag_read
)
1672 fprintf (out
, " READ");
1674 if (pe_def_file
->section_defs
[i
].flag_write
)
1675 fprintf (out
, " WRITE");
1677 if (pe_def_file
->section_defs
[i
].flag_execute
)
1678 fprintf (out
, " EXECUTE");
1680 if (pe_def_file
->section_defs
[i
].flag_shared
)
1681 fprintf (out
, " SHARED");
1683 fprintf (out
, "\n");
1687 if (pe_def_file
->num_exports
> 0)
1689 fprintf (out
, "EXPORTS\n");
1691 for (i
= 0; i
< pe_def_file
->num_exports
; i
++)
1693 def_file_export
*e
= pe_def_file
->exports
+ i
;
1695 quoteput (e
->name
, out
, 0);
1697 if (e
->internal_name
&& strcmp (e
->internal_name
, e
->name
))
1699 fprintf (out
, " = ");
1700 quoteput (e
->internal_name
, out
, 0);
1703 if (e
->ordinal
!= -1)
1704 fprintf (out
, " @%d", e
->ordinal
);
1706 if (e
->flag_private
)
1707 fprintf (out
, " PRIVATE");
1709 if (e
->flag_constant
)
1710 fprintf (out
, " CONSTANT");
1713 fprintf (out
, " NONAME");
1716 fprintf (out
, " DATA");
1718 fprintf (out
, "\n");
1722 if (pe_def_file
->num_imports
> 0)
1724 fprintf (out
, "\nIMPORTS\n\n");
1726 for (i
= 0; i
< pe_def_file
->num_imports
; i
++)
1728 def_file_import
*im
= pe_def_file
->imports
+ i
;
1731 if (im
->internal_name
1732 && (!im
->name
|| strcmp (im
->internal_name
, im
->name
)))
1734 quoteput (im
->internal_name
, out
, 0);
1735 fprintf (out
, " = ");
1738 quoteput (im
->module
->name
, out
, 0);
1742 quoteput (im
->name
, out
, 0);
1744 fprintf (out
, "%d", im
->ordinal
);
1748 fprintf (out
, " == ");
1749 quoteput (im
->its_name
, out
, 0);
1752 fprintf (out
, "\n");
1757 fprintf (out
, _("; no contents available\n"));
1759 if (fclose (out
) == EOF
)
1760 /* xgettext:c-format */
1761 einfo (_("%P: Error closing file `%s'\n"), pe_out_def_filename
);
1764 /* Generate the import library. */
1766 static asymbol
**symtab
;
1769 static int tmp_seq2
;
1770 static const char *dll_filename
;
1771 static char *dll_symname
;
1773 #define UNDSEC bfd_und_section_ptr
1776 quick_section (bfd
*abfd
, const char *name
, int flags
, int align
)
1781 sec
= bfd_make_section_old_way (abfd
, name
);
1782 bfd_set_section_flags (abfd
, sec
, flags
| SEC_ALLOC
| SEC_LOAD
| SEC_KEEP
);
1783 bfd_set_section_alignment (abfd
, sec
, align
);
1784 /* Remember to undo this before trying to link internally! */
1785 sec
->output_section
= sec
;
1787 sym
= bfd_make_empty_symbol (abfd
);
1788 symtab
[symptr
++] = sym
;
1789 sym
->name
= sec
->name
;
1791 sym
->flags
= BSF_LOCAL
;
1798 quick_symbol (bfd
*abfd
,
1807 char *name
= xmalloc (strlen (n1
) + strlen (n2
) + strlen (n3
) + 1);
1812 sym
= bfd_make_empty_symbol (abfd
);
1817 symtab
[symptr
++] = sym
;
1820 static arelent
*reltab
= 0;
1821 static int relcount
= 0, relsize
= 0;
1824 quick_reloc (bfd
*abfd
, bfd_size_type address
, int which_howto
, int symidx
)
1826 if (relcount
>= relsize
- 1)
1830 reltab
= xrealloc (reltab
, relsize
* sizeof (arelent
));
1832 reltab
= xmalloc (relsize
* sizeof (arelent
));
1834 reltab
[relcount
].address
= address
;
1835 reltab
[relcount
].addend
= 0;
1836 reltab
[relcount
].howto
= bfd_reloc_type_lookup (abfd
, which_howto
);
1837 reltab
[relcount
].sym_ptr_ptr
= symtab
+ symidx
;
1842 save_relocs (asection
*sec
)
1846 sec
->relocation
= reltab
;
1847 sec
->reloc_count
= relcount
;
1848 sec
->orelocation
= xmalloc ((relcount
+ 1) * sizeof (arelent
*));
1849 for (i
= 0; i
< relcount
; i
++)
1850 sec
->orelocation
[i
] = sec
->relocation
+ i
;
1851 sec
->orelocation
[relcount
] = 0;
1852 sec
->flags
|= SEC_RELOC
;
1854 relcount
= relsize
= 0;
1857 /* .section .idata$2
1858 .global __head_my_dll
1875 make_head (bfd
*parent
)
1877 asection
*id2
, *id5
, *id4
;
1878 unsigned char *d2
, *d5
, *d4
;
1882 oname
= xmalloc (20);
1883 sprintf (oname
, "d%06d.o", tmp_seq
);
1886 abfd
= bfd_create (oname
, parent
);
1887 bfd_find_target (pe_details
->object_target
, abfd
);
1888 bfd_make_writable (abfd
);
1890 bfd_set_format (abfd
, bfd_object
);
1891 bfd_set_arch_mach (abfd
, pe_details
->bfd_arch
, 0);
1894 symtab
= xmalloc (6 * sizeof (asymbol
*));
1895 id2
= quick_section (abfd
, ".idata$2", SEC_HAS_CONTENTS
, 2);
1896 id5
= quick_section (abfd
, ".idata$5", SEC_HAS_CONTENTS
, 2);
1897 id4
= quick_section (abfd
, ".idata$4", SEC_HAS_CONTENTS
, 2);
1898 quick_symbol (abfd
, U ("_head_"), dll_symname
, "", id2
, BSF_GLOBAL
, 0);
1899 quick_symbol (abfd
, U (""), dll_symname
, "_iname", UNDSEC
, BSF_GLOBAL
, 0);
1901 /* OK, pay attention here. I got confused myself looking back at
1902 it. We create a four-byte section to mark the beginning of the
1903 list, and we include an offset of 4 in the section, so that the
1904 pointer to the list points to the *end* of this section, which is
1905 the start of the list of sections from other objects. */
1907 bfd_set_section_size (abfd
, id2
, 20);
1911 if (pe_use_nul_prefixed_import_tables
)
1912 d2
[0] = d2
[16] = PE_IDATA5_SIZE
; /* Reloc addend. */
1913 quick_reloc (abfd
, 0, BFD_RELOC_RVA
, 2);
1914 quick_reloc (abfd
, 12, BFD_RELOC_RVA
, 4);
1915 quick_reloc (abfd
, 16, BFD_RELOC_RVA
, 1);
1918 if (pe_use_nul_prefixed_import_tables
)
1919 bfd_set_section_size (abfd
, id5
, PE_IDATA5_SIZE
);
1921 bfd_set_section_size (abfd
, id5
, 0);
1922 d5
= xmalloc (PE_IDATA5_SIZE
);
1924 memset (d5
, 0, PE_IDATA5_SIZE
);
1925 if (pe_use_nul_prefixed_import_tables
)
1926 bfd_set_section_size (abfd
, id4
, PE_IDATA4_SIZE
);
1928 bfd_set_section_size (abfd
, id4
, 0);
1929 d4
= xmalloc (PE_IDATA4_SIZE
);
1931 memset (d4
, 0, PE_IDATA4_SIZE
);
1933 bfd_set_symtab (abfd
, symtab
, symptr
);
1935 bfd_set_section_contents (abfd
, id2
, d2
, 0, 20);
1936 if (pe_use_nul_prefixed_import_tables
)
1938 bfd_set_section_contents (abfd
, id5
, d5
, 0, PE_IDATA5_SIZE
);
1939 bfd_set_section_contents (abfd
, id4
, d4
, 0, PE_IDATA4_SIZE
);
1943 bfd_set_section_contents (abfd
, id5
, d5
, 0, 0);
1944 bfd_set_section_contents (abfd
, id4
, d4
, 0, 0);
1947 bfd_make_readable (abfd
);
1951 /* .section .idata$4
1958 .global __my_dll_iname
1963 make_tail (bfd
*parent
)
1965 asection
*id4
, *id5
, *id7
;
1966 unsigned char *d4
, *d5
, *d7
;
1971 oname
= xmalloc (20);
1972 sprintf (oname
, "d%06d.o", tmp_seq
);
1975 abfd
= bfd_create (oname
, parent
);
1976 bfd_find_target (pe_details
->object_target
, abfd
);
1977 bfd_make_writable (abfd
);
1979 bfd_set_format (abfd
, bfd_object
);
1980 bfd_set_arch_mach (abfd
, pe_details
->bfd_arch
, 0);
1983 symtab
= xmalloc (5 * sizeof (asymbol
*));
1984 id4
= quick_section (abfd
, ".idata$4", SEC_HAS_CONTENTS
, 2);
1985 id5
= quick_section (abfd
, ".idata$5", SEC_HAS_CONTENTS
, 2);
1986 id7
= quick_section (abfd
, ".idata$7", SEC_HAS_CONTENTS
, 2);
1987 quick_symbol (abfd
, U (""), dll_symname
, "_iname", id7
, BSF_GLOBAL
, 0);
1989 bfd_set_section_size (abfd
, id4
, PE_IDATA4_SIZE
);
1990 d4
= xmalloc (PE_IDATA4_SIZE
);
1992 memset (d4
, 0, PE_IDATA4_SIZE
);
1994 bfd_set_section_size (abfd
, id5
, PE_IDATA5_SIZE
);
1995 d5
= xmalloc (PE_IDATA5_SIZE
);
1997 memset (d5
, 0, PE_IDATA5_SIZE
);
1999 len
= strlen (dll_filename
) + 1;
2002 bfd_set_section_size (abfd
, id7
, len
);
2005 strcpy ((char *) d7
, dll_filename
);
2006 /* If len was odd, the above
2007 strcpy leaves behind an undefined byte. That is harmless,
2008 but we set it to 0 just so the binary dumps are pretty. */
2011 bfd_set_symtab (abfd
, symtab
, symptr
);
2013 bfd_set_section_contents (abfd
, id4
, d4
, 0, PE_IDATA4_SIZE
);
2014 bfd_set_section_contents (abfd
, id5
, d5
, 0, PE_IDATA5_SIZE
);
2015 bfd_set_section_contents (abfd
, id7
, d7
, 0, len
);
2017 bfd_make_readable (abfd
);
2023 .global ___imp_function
2024 .global __imp__function
2026 jmp *__imp__function:
2040 .asciz "function" xlate? (add underscore, kill at) */
2042 static const unsigned char jmp_ix86_bytes
[] =
2044 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x90, 0x90
2052 .dw __imp_function */
2054 static const unsigned char jmp_sh_bytes
[] =
2056 0x01, 0xd0, 0x02, 0x60, 0x2b, 0x40, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00
2060 lui $t0,<high:__imp_function>
2061 lw $t0,<low:__imp_function>
2065 static const unsigned char jmp_mips_bytes
[] =
2067 0x00, 0x00, 0x08, 0x3c, 0x00, 0x00, 0x08, 0x8d,
2068 0x08, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00
2071 static const unsigned char jmp_arm_bytes
[] =
2073 0x00, 0xc0, 0x9f, 0xe5, /* ldr ip, [pc] */
2074 0x00, 0xf0, 0x9c, 0xe5, /* ldr pc, [ip] */
2080 make_one (def_file_export
*exp
, bfd
*parent
, bfd_boolean include_jmp_stub
)
2082 asection
*tx
, *id7
, *id5
, *id4
, *id6
;
2083 unsigned char *td
= NULL
, *d7
, *d5
, *d4
, *d6
= NULL
;
2087 const unsigned char *jmp_bytes
= NULL
;
2088 int jmp_byte_count
= 0;
2090 /* Include the jump stub section only if it is needed. A jump
2091 stub is needed if the symbol being imported <sym> is a function
2092 symbol and there is at least one undefined reference to that
2093 symbol. In other words, if all the import references to <sym> are
2094 explicitly through _declspec(dllimport) then the jump stub is not
2096 if (include_jmp_stub
)
2098 switch (pe_details
->pe_arch
)
2101 jmp_bytes
= jmp_ix86_bytes
;
2102 jmp_byte_count
= sizeof (jmp_ix86_bytes
);
2105 jmp_bytes
= jmp_sh_bytes
;
2106 jmp_byte_count
= sizeof (jmp_sh_bytes
);
2109 jmp_bytes
= jmp_mips_bytes
;
2110 jmp_byte_count
= sizeof (jmp_mips_bytes
);
2113 case PE_ARCH_arm_epoc
:
2114 case PE_ARCH_arm_wince
:
2115 jmp_bytes
= jmp_arm_bytes
;
2116 jmp_byte_count
= sizeof (jmp_arm_bytes
);
2123 oname
= xmalloc (20);
2124 sprintf (oname
, "d%06d.o", tmp_seq
);
2127 abfd
= bfd_create (oname
, parent
);
2128 bfd_find_target (pe_details
->object_target
, abfd
);
2129 bfd_make_writable (abfd
);
2131 bfd_set_format (abfd
, bfd_object
);
2132 bfd_set_arch_mach (abfd
, pe_details
->bfd_arch
, 0);
2135 symtab
= xmalloc (12 * sizeof (asymbol
*));
2137 tx
= quick_section (abfd
, ".text", SEC_CODE
| SEC_HAS_CONTENTS
| SEC_READONLY
, 2);
2138 id7
= quick_section (abfd
, ".idata$7", SEC_HAS_CONTENTS
, 2);
2139 id5
= quick_section (abfd
, ".idata$5", SEC_HAS_CONTENTS
, 2);
2140 id4
= quick_section (abfd
, ".idata$4", SEC_HAS_CONTENTS
, 2);
2141 id6
= quick_section (abfd
, ".idata$6", SEC_HAS_CONTENTS
, 2);
2143 if (*exp
->internal_name
== '@')
2145 quick_symbol (abfd
, U ("_head_"), dll_symname
, "", UNDSEC
,
2147 if (include_jmp_stub
)
2148 quick_symbol (abfd
, "", exp
->internal_name
, "", tx
, BSF_GLOBAL
, 0);
2149 quick_symbol (abfd
, "__imp_", exp
->internal_name
, "", id5
,
2151 /* Fastcall applies only to functions,
2152 so no need for auto-import symbol. */
2156 quick_symbol (abfd
, U ("_head_"), dll_symname
, "", UNDSEC
,
2158 if (include_jmp_stub
)
2159 quick_symbol (abfd
, U (""), exp
->internal_name
, "", tx
,
2161 quick_symbol (abfd
, "__imp_", U (""), exp
->internal_name
, id5
,
2163 /* Symbol to reference ord/name of imported
2164 data symbol, used to implement auto-import. */
2166 quick_symbol (abfd
, "__nm_", U (""), exp
->internal_name
, id6
,
2169 if (pe_dll_compat_implib
)
2170 quick_symbol (abfd
, "___imp_", exp
->internal_name
, "", id5
,
2173 if (include_jmp_stub
)
2175 bfd_set_section_size (abfd
, tx
, jmp_byte_count
);
2176 td
= xmalloc (jmp_byte_count
);
2178 memcpy (td
, jmp_bytes
, jmp_byte_count
);
2180 switch (pe_details
->pe_arch
)
2183 #ifdef pe_use_x86_64
2184 quick_reloc (abfd
, 2, BFD_RELOC_32_PCREL
, 2);
2186 /* Mark this object as SAFESEH compatible. */
2187 quick_symbol (abfd
, "", "@feat.00", "", bfd_abs_section_ptr
,
2189 quick_reloc (abfd
, 2, BFD_RELOC_32
, 2);
2193 quick_reloc (abfd
, 8, BFD_RELOC_32
, 2);
2196 quick_reloc (abfd
, 0, BFD_RELOC_HI16_S
, 2);
2197 quick_reloc (abfd
, 0, BFD_RELOC_LO16
, 0); /* MIPS_R_PAIR */
2198 quick_reloc (abfd
, 4, BFD_RELOC_LO16
, 2);
2201 case PE_ARCH_arm_epoc
:
2202 case PE_ARCH_arm_wince
:
2203 quick_reloc (abfd
, 8, BFD_RELOC_32
, 2);
2211 bfd_set_section_size (abfd
, tx
, 0);
2213 bfd_set_section_size (abfd
, id7
, 4);
2217 quick_reloc (abfd
, 0, BFD_RELOC_RVA
, 5);
2220 bfd_set_section_size (abfd
, id5
, PE_IDATA5_SIZE
);
2221 d5
= xmalloc (PE_IDATA5_SIZE
);
2223 memset (d5
, 0, PE_IDATA5_SIZE
);
2225 if (exp
->flag_noname
)
2227 d5
[0] = exp
->ordinal
;
2228 d5
[1] = exp
->ordinal
>> 8;
2229 d5
[PE_IDATA5_SIZE
- 1] = 0x80;
2233 quick_reloc (abfd
, 0, BFD_RELOC_RVA
, 4);
2237 bfd_set_section_size (abfd
, id4
, PE_IDATA4_SIZE
);
2238 d4
= xmalloc (PE_IDATA4_SIZE
);
2240 memset (d4
, 0, PE_IDATA4_SIZE
);
2242 if (exp
->flag_noname
)
2244 d4
[0] = exp
->ordinal
;
2245 d4
[1] = exp
->ordinal
>> 8;
2246 d4
[PE_IDATA4_SIZE
- 1] = 0x80;
2250 quick_reloc (abfd
, 0, BFD_RELOC_RVA
, 4);
2254 if (exp
->flag_noname
)
2257 bfd_set_section_size (abfd
, id6
, 0);
2261 /* { short, asciz } */
2263 len
= 2 + strlen (exp
->its_name
) + 1;
2265 len
= 2 + strlen (exp
->name
) + 1;
2268 bfd_set_section_size (abfd
, id6
, len
);
2271 memset (d6
, 0, len
);
2272 d6
[0] = exp
->hint
& 0xff;
2273 d6
[1] = exp
->hint
>> 8;
2275 strcpy ((char*) d6
+ 2, exp
->its_name
);
2277 strcpy ((char *) d6
+ 2, exp
->name
);
2280 bfd_set_symtab (abfd
, symtab
, symptr
);
2282 if (include_jmp_stub
)
2283 bfd_set_section_contents (abfd
, tx
, td
, 0, jmp_byte_count
);
2284 bfd_set_section_contents (abfd
, id7
, d7
, 0, 4);
2285 bfd_set_section_contents (abfd
, id5
, d5
, 0, PE_IDATA5_SIZE
);
2286 bfd_set_section_contents (abfd
, id4
, d4
, 0, PE_IDATA4_SIZE
);
2287 if (!exp
->flag_noname
)
2288 bfd_set_section_contents (abfd
, id6
, d6
, 0, len
);
2290 bfd_make_readable (abfd
);
2295 make_singleton_name_imp (const char *import
, bfd
*parent
)
2297 /* Name thunks go to idata$4. */
2303 oname
= xmalloc (20);
2304 sprintf (oname
, "nmimp%06d.o", tmp_seq2
);
2307 abfd
= bfd_create (oname
, parent
);
2308 bfd_find_target (pe_details
->object_target
, abfd
);
2309 bfd_make_writable (abfd
);
2311 bfd_set_format (abfd
, bfd_object
);
2312 bfd_set_arch_mach (abfd
, pe_details
->bfd_arch
, 0);
2315 symtab
= xmalloc (3 * sizeof (asymbol
*));
2316 id5
= quick_section (abfd
, ".idata$5", SEC_HAS_CONTENTS
, 2);
2317 quick_symbol (abfd
, "__imp_", import
, "", id5
, BSF_GLOBAL
, 0);
2319 /* We need space for the real thunk and for the null terminator. */
2320 bfd_set_section_size (abfd
, id5
, PE_IDATA5_SIZE
* 2);
2321 d5
= xmalloc (PE_IDATA5_SIZE
* 2);
2323 memset (d5
, 0, PE_IDATA5_SIZE
* 2);
2324 quick_reloc (abfd
, 0, BFD_RELOC_RVA
, 2);
2327 bfd_set_symtab (abfd
, symtab
, symptr
);
2329 bfd_set_section_contents (abfd
, id5
, d5
, 0, PE_IDATA4_SIZE
* 2);
2331 bfd_make_readable (abfd
);
2336 make_singleton_name_thunk (const char *import
, bfd
*parent
)
2338 /* Name thunks go to idata$4. */
2344 oname
= xmalloc (20);
2345 sprintf (oname
, "nmth%06d.o", tmp_seq
);
2348 abfd
= bfd_create (oname
, parent
);
2349 bfd_find_target (pe_details
->object_target
, abfd
);
2350 bfd_make_writable (abfd
);
2352 bfd_set_format (abfd
, bfd_object
);
2353 bfd_set_arch_mach (abfd
, pe_details
->bfd_arch
, 0);
2356 symtab
= xmalloc (3 * sizeof (asymbol
*));
2357 id4
= quick_section (abfd
, ".idata$4", SEC_HAS_CONTENTS
, 2);
2358 quick_symbol (abfd
, "__nm_thnk_", import
, "", id4
, BSF_GLOBAL
, 0);
2359 quick_symbol (abfd
, "__nm_", import
, "", UNDSEC
, BSF_GLOBAL
, 0);
2361 /* We need space for the real thunk and for the null terminator. */
2362 bfd_set_section_size (abfd
, id4
, PE_IDATA4_SIZE
* 2);
2363 d4
= xmalloc (PE_IDATA4_SIZE
* 2);
2365 memset (d4
, 0, PE_IDATA4_SIZE
* 2);
2366 quick_reloc (abfd
, 0, BFD_RELOC_RVA
, 2);
2369 bfd_set_symtab (abfd
, symtab
, symptr
);
2371 bfd_set_section_contents (abfd
, id4
, d4
, 0, PE_IDATA4_SIZE
* 2);
2373 bfd_make_readable (abfd
);
2378 make_import_fixup_mark (arelent
*rel
)
2380 /* We convert reloc to symbol, for later reference. */
2382 static char *fixup_name
= NULL
;
2383 static size_t buffer_len
= 0;
2385 struct bfd_symbol
*sym
= *rel
->sym_ptr_ptr
;
2387 bfd
*abfd
= bfd_asymbol_bfd (sym
);
2388 struct bfd_link_hash_entry
*bh
;
2392 fixup_name
= xmalloc (384);
2396 if (strlen (sym
->name
) + 25 > buffer_len
)
2397 /* Assume 25 chars for "__fu" + counter + "_". If counter is
2398 bigger than 20 digits long, we've got worse problems than
2399 overflowing this buffer... */
2402 /* New buffer size is length of symbol, plus 25, but
2403 then rounded up to the nearest multiple of 128. */
2404 buffer_len
= ((strlen (sym
->name
) + 25) + 127) & ~127;
2405 fixup_name
= xmalloc (buffer_len
);
2408 sprintf (fixup_name
, "__fu%d_%s", counter
++, sym
->name
);
2411 bfd_coff_link_add_one_symbol (&link_info
, abfd
, fixup_name
, BSF_GLOBAL
,
2412 current_sec
, /* sym->section, */
2413 rel
->address
, NULL
, TRUE
, FALSE
, &bh
);
2418 /* .section .idata$2
2419 .rva __nm_thnk_SYM (singleton thunk with name of func)
2422 .rva __my_dll_iname (name of dll)
2423 .rva __fuNN_SYM (pointer to reference (address) in text) */
2426 make_import_fixup_entry (const char *name
,
2427 const char *fixup_name
,
2428 const char *symname
,
2436 oname
= xmalloc (20);
2437 sprintf (oname
, "fu%06d.o", tmp_seq
);
2440 abfd
= bfd_create (oname
, parent
);
2441 bfd_find_target (pe_details
->object_target
, abfd
);
2442 bfd_make_writable (abfd
);
2444 bfd_set_format (abfd
, bfd_object
);
2445 bfd_set_arch_mach (abfd
, pe_details
->bfd_arch
, 0);
2448 symtab
= xmalloc (6 * sizeof (asymbol
*));
2449 id2
= quick_section (abfd
, ".idata$2", SEC_HAS_CONTENTS
, 2);
2451 quick_symbol (abfd
, "__nm_thnk_", name
, "", UNDSEC
, BSF_GLOBAL
, 0);
2452 quick_symbol (abfd
, U (""), symname
, "_iname", UNDSEC
, BSF_GLOBAL
, 0);
2453 /* For relocator v2 we have to use the .idata$5 element and not
2455 if (link_info
.pei386_runtime_pseudo_reloc
== 2)
2456 quick_symbol (abfd
, "__imp_", name
, "", UNDSEC
, BSF_GLOBAL
, 0);
2458 quick_symbol (abfd
, "", fixup_name
, "", UNDSEC
, BSF_GLOBAL
, 0);
2460 bfd_set_section_size (abfd
, id2
, 20);
2465 quick_reloc (abfd
, 0, BFD_RELOC_RVA
, 1);
2466 quick_reloc (abfd
, 12, BFD_RELOC_RVA
, 2);
2467 quick_reloc (abfd
, 16, BFD_RELOC_RVA
, 3);
2470 bfd_set_symtab (abfd
, symtab
, symptr
);
2472 bfd_set_section_contents (abfd
, id2
, d2
, 0, 20);
2474 bfd_make_readable (abfd
);
2478 /* .section .rdata_runtime_pseudo_reloc
2480 .rva __fuNN_SYM (pointer to reference (address) in text) */
2483 make_runtime_pseudo_reloc (const char *name ATTRIBUTE_UNUSED
,
2484 const char *fixup_name
,
2485 bfd_vma addend ATTRIBUTE_UNUSED
,
2490 unsigned char *rt_rel_d
;
2493 oname
= xmalloc (20);
2494 sprintf (oname
, "rtr%06d.o", tmp_seq
);
2497 abfd
= bfd_create (oname
, parent
);
2498 bfd_find_target (pe_details
->object_target
, abfd
);
2499 bfd_make_writable (abfd
);
2501 bfd_set_format (abfd
, bfd_object
);
2502 bfd_set_arch_mach (abfd
, pe_details
->bfd_arch
, 0);
2505 if (link_info
.pei386_runtime_pseudo_reloc
== 2)
2507 symtab
= xmalloc ((runtime_pseudp_reloc_v2_init
? 3 : 6) * sizeof (asymbol
*));
2511 symtab
= xmalloc (2 * sizeof (asymbol
*));
2513 rt_rel
= quick_section (abfd
, ".rdata_runtime_pseudo_reloc",
2514 SEC_HAS_CONTENTS
, 2);
2516 quick_symbol (abfd
, "", fixup_name
, "", UNDSEC
, BSF_GLOBAL
, 0);
2518 if (link_info
.pei386_runtime_pseudo_reloc
== 2)
2521 if (! runtime_pseudp_reloc_v2_init
)
2524 runtime_pseudp_reloc_v2_init
= 1;
2526 quick_symbol (abfd
, "__imp_", name
, "", UNDSEC
, BSF_GLOBAL
, 0);
2528 bfd_set_section_size (abfd
, rt_rel
, size
);
2529 rt_rel_d
= xmalloc (size
);
2530 rt_rel
->contents
= rt_rel_d
;
2531 memset (rt_rel_d
, 0, size
);
2532 quick_reloc (abfd
, size
- 8, BFD_RELOC_RVA
, 1);
2533 quick_reloc (abfd
, size
- 12, BFD_RELOC_RVA
, 2);
2534 bfd_put_32 (abfd
, bitsize
, rt_rel_d
+ (size
- 4));
2536 bfd_put_32 (abfd
, 1, rt_rel_d
+ 8);
2537 save_relocs (rt_rel
);
2539 bfd_set_symtab (abfd
, symtab
, symptr
);
2541 bfd_set_section_contents (abfd
, rt_rel
, rt_rel_d
, 0, size
);
2545 bfd_set_section_size (abfd
, rt_rel
, 8);
2546 rt_rel_d
= xmalloc (8);
2547 rt_rel
->contents
= rt_rel_d
;
2548 memset (rt_rel_d
, 0, 8);
2550 bfd_put_32 (abfd
, addend
, rt_rel_d
);
2551 quick_reloc (abfd
, 4, BFD_RELOC_RVA
, 1);
2553 save_relocs (rt_rel
);
2555 bfd_set_symtab (abfd
, symtab
, symptr
);
2557 bfd_set_section_contents (abfd
, rt_rel
, rt_rel_d
, 0, 8);
2559 bfd_make_readable (abfd
);
2564 .rva __pei386_runtime_relocator */
2567 pe_create_runtime_relocator_reference (bfd
*parent
)
2569 asection
*extern_rt_rel
;
2570 unsigned char *extern_rt_rel_d
;
2574 oname
= xmalloc (20);
2575 sprintf (oname
, "ertr%06d.o", tmp_seq
);
2578 abfd
= bfd_create (oname
, parent
);
2579 bfd_find_target (pe_details
->object_target
, abfd
);
2580 bfd_make_writable (abfd
);
2582 bfd_set_format (abfd
, bfd_object
);
2583 bfd_set_arch_mach (abfd
, pe_details
->bfd_arch
, 0);
2586 symtab
= xmalloc (2 * sizeof (asymbol
*));
2587 extern_rt_rel
= quick_section (abfd
, ".rdata", SEC_HAS_CONTENTS
, 2);
2589 quick_symbol (abfd
, "", U ("_pei386_runtime_relocator"), "", UNDSEC
,
2592 bfd_set_section_size (abfd
, extern_rt_rel
, PE_IDATA5_SIZE
);
2593 extern_rt_rel_d
= xcalloc (1, PE_IDATA5_SIZE
);
2594 extern_rt_rel
->contents
= extern_rt_rel_d
;
2596 quick_reloc (abfd
, 0, BFD_RELOC_RVA
, 1);
2597 save_relocs (extern_rt_rel
);
2599 bfd_set_symtab (abfd
, symtab
, symptr
);
2601 bfd_set_section_contents (abfd
, extern_rt_rel
, extern_rt_rel_d
, 0, PE_IDATA5_SIZE
);
2603 bfd_make_readable (abfd
);
2608 pe_create_import_fixup (arelent
*rel
, asection
*s
, bfd_vma addend
)
2611 struct bfd_symbol
*sym
= *rel
->sym_ptr_ptr
;
2612 struct bfd_link_hash_entry
*name_thunk_sym
;
2613 struct bfd_link_hash_entry
*name_imp_sym
;
2614 const char *name
= sym
->name
;
2615 char *fixup_name
= make_import_fixup_mark (rel
);
2617 int need_import_table
= 1;
2619 sprintf (buf
, "__imp_%s", name
);
2620 name_imp_sym
= bfd_link_hash_lookup (link_info
.hash
, buf
, 0, 0, 1);
2622 sprintf (buf
, "__nm_thnk_%s", name
);
2624 name_thunk_sym
= bfd_link_hash_lookup (link_info
.hash
, buf
, 0, 0, 1);
2626 /* For version 2 pseudo relocation we don't need to add an import
2627 if the import symbol is already present. */
2628 if (link_info
.pei386_runtime_pseudo_reloc
== 2
2630 && name_imp_sym
->type
== bfd_link_hash_defined
)
2631 need_import_table
= 0;
2633 if (need_import_table
== 1
2634 && (!name_thunk_sym
|| name_thunk_sym
->type
!= bfd_link_hash_defined
))
2636 b
= make_singleton_name_thunk (name
, link_info
.output_bfd
);
2637 add_bfd_to_link (b
, b
->filename
, &link_info
);
2639 /* If we ever use autoimport, we have to cast text section writable.
2640 But not for version 2. */
2641 if (link_info
.pei386_runtime_pseudo_reloc
!= 2)
2643 config
.text_read_only
= FALSE
;
2644 link_info
.output_bfd
->flags
&= ~WP_TEXT
;
2646 if (link_info
.pei386_runtime_pseudo_reloc
== 2)
2648 b
= make_singleton_name_imp (name
, link_info
.output_bfd
);
2649 add_bfd_to_link (b
, b
->filename
, &link_info
);
2653 if ((addend
== 0 || link_info
.pei386_runtime_pseudo_reloc
)
2654 && need_import_table
== 1)
2656 extern char * pe_data_import_dll
;
2657 char * symname
= pe_data_import_dll
? pe_data_import_dll
: "unknown";
2659 b
= make_import_fixup_entry (name
, fixup_name
, symname
,
2660 link_info
.output_bfd
);
2661 add_bfd_to_link (b
, b
->filename
, &link_info
);
2664 if ((link_info
.pei386_runtime_pseudo_reloc
!= 0 && addend
!= 0)
2665 || link_info
.pei386_runtime_pseudo_reloc
== 2)
2667 if (pe_dll_extra_pe_debug
)
2668 printf ("creating runtime pseudo-reloc entry for %s (addend=%d)\n",
2669 fixup_name
, (int) addend
);
2671 b
= make_runtime_pseudo_reloc (name
, fixup_name
, addend
, rel
->howto
->bitsize
,
2672 link_info
.output_bfd
);
2673 add_bfd_to_link (b
, b
->filename
, &link_info
);
2675 if (runtime_pseudo_relocs_created
== 0)
2677 b
= pe_create_runtime_relocator_reference (link_info
.output_bfd
);
2678 add_bfd_to_link (b
, b
->filename
, &link_info
);
2680 runtime_pseudo_relocs_created
++;
2682 else if (addend
!= 0)
2684 einfo (_("%C: variable '%T' can't be auto-imported. Please read the documentation for ld's --enable-auto-import for details.\n"),
2685 s
->owner
, s
, rel
->address
, sym
->name
);
2692 pe_dll_generate_implib (def_file
*def
, const char *impfilename
, struct bfd_link_info
*info
)
2701 dll_filename
= (def
->name
) ? def
->name
: dll_name
;
2702 dll_symname
= xstrdup (dll_filename
);
2703 for (i
= 0; dll_symname
[i
]; i
++)
2704 if (!ISALNUM (dll_symname
[i
]))
2705 dll_symname
[i
] = '_';
2707 unlink_if_ordinary (impfilename
);
2709 outarch
= bfd_openw (impfilename
, 0);
2713 /* xgettext:c-format */
2714 einfo (_("%XCan't open .lib file: %s\n"), impfilename
);
2719 /* xgettext:c-format */
2720 info_msg (_("Creating library file: %s\n"), impfilename
);
2722 bfd_set_format (outarch
, bfd_archive
);
2723 outarch
->has_armap
= 1;
2725 /* Work out a reasonable size of things to put onto one line. */
2726 ar_head
= make_head (outarch
);
2728 /* Iterate the input BFDs, looking for exclude-modules-for-implib. */
2729 for (ibfd
= info
->input_bfds
; ibfd
; ibfd
= ibfd
->link_next
)
2731 /* Iterate the exclude list. */
2732 struct exclude_list_struct
*ex
;
2734 for (ex
= excludes
, found
= 0; ex
&& !found
; ex
= ex
->next
)
2736 if (ex
->type
!= EXCLUDEFORIMPLIB
)
2738 found
= (filename_cmp (ex
->string
, ibfd
->filename
) == 0);
2740 /* If it matched, we must open a fresh BFD for it (the original
2741 input BFD is still needed for the DLL's final link) and add
2742 it into the archive member chain. */
2745 bfd
*newbfd
= bfd_openr (ibfd
->my_archive
2746 ? ibfd
->my_archive
->filename
: ibfd
->filename
, NULL
);
2749 einfo (_("%Xbfd_openr %s: %E\n"), ibfd
->filename
);
2752 if (ibfd
->my_archive
)
2754 /* Must now iterate through archive until we find the
2755 required member. A minor shame that we'll open the
2756 archive once per member that we require from it, and
2757 leak those archive bfds rather than reuse them. */
2758 bfd
*arbfd
= newbfd
;
2759 if (!bfd_check_format_matches (arbfd
, bfd_archive
, NULL
))
2761 einfo (_("%X%s(%s): can't find member in non-archive file"),
2762 ibfd
->my_archive
->filename
, ibfd
->filename
);
2766 while ((newbfd
= bfd_openr_next_archived_file (arbfd
, newbfd
)) != 0)
2768 if (filename_cmp (newbfd
->filename
, ibfd
->filename
) == 0)
2773 einfo (_("%X%s(%s): can't find member in archive"),
2774 ibfd
->my_archive
->filename
, ibfd
->filename
);
2778 newbfd
->archive_next
= head
;
2783 for (i
= 0; i
< def
->num_exports
; i
++)
2785 /* The import library doesn't know about the internal name. */
2786 char *internal
= def
->exports
[i
].internal_name
;
2789 /* Don't add PRIVATE entries to import lib. */
2790 if (pe_def_file
->exports
[i
].flag_private
)
2792 def
->exports
[i
].internal_name
= def
->exports
[i
].name
;
2793 n
= make_one (def
->exports
+ i
, outarch
,
2794 ! (def
->exports
+ i
)->flag_data
);
2795 n
->archive_next
= head
;
2797 def
->exports
[i
].internal_name
= internal
;
2800 ar_tail
= make_tail (outarch
);
2802 if (ar_head
== NULL
|| ar_tail
== NULL
)
2805 /* Now stick them all into the archive. */
2806 ar_head
->archive_next
= head
;
2807 ar_tail
->archive_next
= ar_head
;
2810 if (! bfd_set_archive_head (outarch
, head
))
2811 einfo ("%Xbfd_set_archive_head: %E\n");
2813 if (! bfd_close (outarch
))
2814 einfo ("%Xbfd_close %s: %E\n", impfilename
);
2816 while (head
!= NULL
)
2818 bfd
*n
= head
->archive_next
;
2824 static int undef_count
= 0;
2832 static struct key_value
*udef_table
;
2834 static int undef_sort_cmp (const void *l1
, const void *r1
)
2836 const struct key_value
*l
= l1
;
2837 const struct key_value
*r
= r1
;
2839 return strcmp (l
->key
, r
->key
);
2842 static struct bfd_link_hash_entry
*
2843 pe_find_cdecl_alias_match (struct bfd_link_info
*linfo
, char *name
)
2845 struct bfd_link_hash_entry
*h
= NULL
;
2846 struct key_value
*kv
;
2847 struct key_value key
;
2848 char *at
, *lname
= (char *) alloca (strlen (name
) + 3);
2850 strcpy (lname
, name
);
2852 at
= strchr (lname
+ (lname
[0] == '@'), '@');
2857 kv
= bsearch (&key
, udef_table
, undef_count
, sizeof (struct key_value
),
2862 h
= bfd_link_hash_lookup (linfo
->hash
, kv
->oname
, FALSE
, FALSE
, FALSE
);
2863 if (h
->type
== bfd_link_hash_undefined
)
2866 if (lname
[0] == '?')
2868 if (at
|| lname
[0] == '@')
2870 if (lname
[0] == '@')
2872 if (pe_details
->underscored
)
2875 strcpy (lname
, lname
+ 1);
2877 kv
= bsearch (&key
, udef_table
, undef_count
,
2878 sizeof (struct key_value
), undef_sort_cmp
);
2881 h
= bfd_link_hash_lookup (linfo
->hash
, kv
->oname
, FALSE
, FALSE
, FALSE
);
2882 if (h
->type
== bfd_link_hash_undefined
)
2887 *strchr (lname
, '@') = 0;
2889 kv
= bsearch (&key
, udef_table
, undef_count
,
2890 sizeof (struct key_value
), undef_sort_cmp
);
2893 h
= bfd_link_hash_lookup (linfo
->hash
, kv
->oname
, FALSE
, FALSE
, FALSE
);
2894 if (h
->type
== bfd_link_hash_undefined
)
2900 strcat (lname
, "@");
2902 kv
= bsearch (&key
, udef_table
, undef_count
,
2903 sizeof (struct key_value
), undef_sort_cmp
);
2907 h
= bfd_link_hash_lookup (linfo
->hash
, kv
->oname
, FALSE
, FALSE
, FALSE
);
2908 if (h
->type
== bfd_link_hash_undefined
)
2912 if (lname
[0] == '_' && pe_details
->underscored
)
2916 memmove (lname
+ 1, lname
, strlen (lname
) + 1);
2921 kv
= bsearch (&key
, udef_table
, undef_count
,
2922 sizeof (struct key_value
), undef_sort_cmp
);
2926 h
= bfd_link_hash_lookup (linfo
->hash
, kv
->oname
, FALSE
, FALSE
, FALSE
);
2927 if (h
->type
== bfd_link_hash_undefined
)
2935 pe_undef_count (struct bfd_link_hash_entry
*h ATTRIBUTE_UNUSED
,
2936 void *inf ATTRIBUTE_UNUSED
)
2938 if (h
->type
== bfd_link_hash_undefined
)
2944 pe_undef_fill (struct bfd_link_hash_entry
*h
, void *inf ATTRIBUTE_UNUSED
)
2946 if (h
->type
== bfd_link_hash_undefined
)
2950 udef_table
[undef_count
].key
= xstrdup (h
->root
.string
);
2951 at
= strchr (udef_table
[undef_count
].key
2952 + (udef_table
[undef_count
].key
[0] == '@'), '@');
2955 udef_table
[undef_count
].oname
= h
->root
.string
;
2962 pe_create_undef_table (void)
2966 /* count undefined symbols */
2968 bfd_link_hash_traverse (link_info
.hash
, pe_undef_count
, "");
2970 /* create and fill the corresponding table */
2971 udef_table
= xmalloc (undef_count
* sizeof (struct key_value
));
2974 bfd_link_hash_traverse (link_info
.hash
, pe_undef_fill
, "");
2977 qsort (udef_table
, undef_count
, sizeof (struct key_value
), undef_sort_cmp
);
2981 add_bfd_to_link (bfd
*abfd
, const char *name
, struct bfd_link_info
*linfo
)
2983 lang_input_statement_type
*fake_file
;
2985 fake_file
= lang_add_input_file (name
,
2986 lang_input_file_is_fake_enum
,
2988 fake_file
->the_bfd
= abfd
;
2989 ldlang_add_file (fake_file
);
2991 if (!bfd_link_add_symbols (abfd
, linfo
))
2992 einfo ("%Xaddsym %s: %E\n", name
);
2996 pe_process_import_defs (bfd
*output_bfd
, struct bfd_link_info
*linfo
)
2999 def_file_module
*module
;
3000 def_file_import
*imp
;
3002 pe_dll_id_target (bfd_get_target (output_bfd
));
3007 imp
= pe_def_file
->imports
;
3009 pe_create_undef_table ();
3011 for (module
= pe_def_file
->modules
; module
; module
= module
->next
)
3013 int do_this_dll
= 0;
3015 for (i
= 0; i
< pe_def_file
->num_imports
&& imp
[i
].module
!= module
; i
++)
3017 if (i
>= pe_def_file
->num_imports
)
3020 dll_filename
= module
->name
;
3021 dll_symname
= xstrdup (module
->name
);
3022 for (j
= 0; dll_symname
[j
]; j
++)
3023 if (!ISALNUM (dll_symname
[j
]))
3024 dll_symname
[j
] = '_';
3026 for (; i
< pe_def_file
->num_imports
&& imp
[i
].module
== module
; i
++)
3028 def_file_export exp
;
3029 struct bfd_link_hash_entry
*blhe
;
3030 int lead_at
= (*imp
[i
].internal_name
== '@');
3031 /* See if we need this import. */
3032 size_t len
= strlen (imp
[i
].internal_name
);
3033 char *name
= xmalloc (len
+ 2 + 6);
3034 bfd_boolean include_jmp_stub
= FALSE
;
3035 bfd_boolean is_cdecl
= FALSE
;
3036 bfd_boolean is_undef
= FALSE
;
3038 if (!lead_at
&& strchr (imp
[i
].internal_name
, '@') == NULL
)
3042 sprintf (name
, "%s", imp
[i
].internal_name
);
3044 sprintf (name
, "%s%s",U (""), imp
[i
].internal_name
);
3046 blhe
= bfd_link_hash_lookup (linfo
->hash
, name
,
3047 FALSE
, FALSE
, FALSE
);
3049 /* Include the jump stub for <sym> only if the <sym>
3051 if (!blhe
|| (blhe
&& blhe
->type
!= bfd_link_hash_undefined
))
3054 sprintf (name
, "%s%s", "__imp_", imp
[i
].internal_name
);
3056 sprintf (name
, "%s%s%s", "__imp_", U (""),
3057 imp
[i
].internal_name
);
3059 blhe
= bfd_link_hash_lookup (linfo
->hash
, name
,
3060 FALSE
, FALSE
, FALSE
);
3062 is_undef
= (blhe
->type
== bfd_link_hash_undefined
);
3066 include_jmp_stub
= TRUE
;
3067 is_undef
= (blhe
->type
== bfd_link_hash_undefined
);
3070 if (is_cdecl
&& (!blhe
|| (blhe
&& blhe
->type
!= bfd_link_hash_undefined
)))
3072 sprintf (name
, "%s%s",U (""), imp
[i
].internal_name
);
3073 blhe
= pe_find_cdecl_alias_match (linfo
, name
);
3074 include_jmp_stub
= TRUE
;
3076 is_undef
= (blhe
->type
== bfd_link_hash_undefined
);
3087 bfd
*ar_head
= make_head (output_bfd
);
3088 add_bfd_to_link (ar_head
, ar_head
->filename
, linfo
);
3091 exp
.internal_name
= imp
[i
].internal_name
;
3092 exp
.name
= imp
[i
].name
;
3093 exp
.its_name
= imp
[i
].its_name
;
3094 exp
.ordinal
= imp
[i
].ordinal
;
3095 exp
.hint
= exp
.ordinal
>= 0 ? exp
.ordinal
: 0;
3096 exp
.flag_private
= 0;
3097 exp
.flag_constant
= 0;
3098 exp
.flag_data
= imp
[i
].data
;
3099 exp
.flag_noname
= exp
.name
? 0 : 1;
3100 one
= make_one (&exp
, output_bfd
, (! exp
.flag_data
) && include_jmp_stub
);
3101 add_bfd_to_link (one
, one
->filename
, linfo
);
3106 bfd
*ar_tail
= make_tail (output_bfd
);
3107 add_bfd_to_link (ar_tail
, ar_tail
->filename
, linfo
);
3116 free (udef_table
[undef_count
].key
);
3121 /* We were handed a *.DLL file. Parse it and turn it into a set of
3122 IMPORTS directives in the def file. Return TRUE if the file was
3123 handled, FALSE if not. */
3126 pe_get16 (bfd
*abfd
, int where
)
3130 bfd_seek (abfd
, (file_ptr
) where
, SEEK_SET
);
3131 bfd_bread (b
, (bfd_size_type
) 2, abfd
);
3132 return b
[0] + (b
[1] << 8);
3136 pe_get32 (bfd
*abfd
, int where
)
3140 bfd_seek (abfd
, (file_ptr
) where
, SEEK_SET
);
3141 bfd_bread (b
, (bfd_size_type
) 4, abfd
);
3142 return b
[0] + (b
[1] << 8) + (b
[2] << 16) + (b
[3] << 24);
3148 unsigned char *b
= ptr
;
3150 return b
[0] + (b
[1] << 8) + (b
[2] << 16) + (b
[3] << 24);
3154 pe_implied_import_dll (const char *filename
)
3157 bfd_vma pe_header_offset
, opthdr_ofs
, num_entries
, i
;
3158 bfd_vma export_rva
, export_size
, nsections
, secptr
, expptr
;
3159 bfd_vma exp_funcbase
;
3160 unsigned char *expdata
;
3162 bfd_vma name_rvas
, nexp
;
3163 const char *dllname
;
3164 /* Initialization with start > end guarantees that is_data
3165 will not be set by mistake, and avoids compiler warning. */
3166 bfd_vma data_start
= 1;
3167 bfd_vma data_end
= 0;
3168 bfd_vma rdata_start
= 1;
3169 bfd_vma rdata_end
= 0;
3170 bfd_vma bss_start
= 1;
3171 bfd_vma bss_end
= 0;
3173 /* No, I can't use bfd here. kernel32.dll puts its export table in
3174 the middle of the .rdata section. */
3175 dll
= bfd_openr (filename
, pe_details
->target_name
);
3178 einfo ("%Xopen %s: %E\n", filename
);
3182 /* PEI dlls seem to be bfd_objects. */
3183 if (!bfd_check_format (dll
, bfd_object
))
3185 einfo ("%X%s: this doesn't appear to be a DLL\n", filename
);
3189 /* Get pe_header, optional header and numbers of directory entries. */
3190 pe_header_offset
= pe_get32 (dll
, 0x3c);
3191 opthdr_ofs
= pe_header_offset
+ 4 + 20;
3192 #ifdef pe_use_x86_64
3193 num_entries
= pe_get32 (dll
, opthdr_ofs
+ 92 + 4 * 4); /* & NumberOfRvaAndSizes. */
3195 num_entries
= pe_get32 (dll
, opthdr_ofs
+ 92);
3198 /* No import or export directory entry. */
3199 if (num_entries
< 1)
3202 #ifdef pe_use_x86_64
3203 export_rva
= pe_get32 (dll
, opthdr_ofs
+ 96 + 4 * 4);
3204 export_size
= pe_get32 (dll
, opthdr_ofs
+ 100 + 4 * 4);
3206 export_rva
= pe_get32 (dll
, opthdr_ofs
+ 96);
3207 export_size
= pe_get32 (dll
, opthdr_ofs
+ 100);
3210 /* No export table - nothing to export. */
3211 if (export_size
== 0)
3214 nsections
= pe_get16 (dll
, pe_header_offset
+ 4 + 2);
3215 secptr
= (pe_header_offset
+ 4 + 20 +
3216 pe_get16 (dll
, pe_header_offset
+ 4 + 16));
3219 /* Get the rva and size of the export section. */
3220 for (i
= 0; i
< nsections
; i
++)
3223 bfd_vma secptr1
= secptr
+ 40 * i
;
3224 bfd_vma vaddr
= pe_get32 (dll
, secptr1
+ 12);
3225 bfd_vma vsize
= pe_get32 (dll
, secptr1
+ 16);
3226 bfd_vma fptr
= pe_get32 (dll
, secptr1
+ 20);
3228 bfd_seek (dll
, (file_ptr
) secptr1
, SEEK_SET
);
3229 bfd_bread (sname
, (bfd_size_type
) 8, dll
);
3231 if (vaddr
<= export_rva
&& vaddr
+ vsize
> export_rva
)
3233 expptr
= fptr
+ (export_rva
- vaddr
);
3234 if (export_rva
+ export_size
> vaddr
+ vsize
)
3235 export_size
= vsize
- (export_rva
- vaddr
);
3240 /* Scan sections and store the base and size of the
3241 data and bss segments in data/base_start/end. */
3242 for (i
= 0; i
< nsections
; i
++)
3244 bfd_vma secptr1
= secptr
+ 40 * i
;
3245 bfd_vma vsize
= pe_get32 (dll
, secptr1
+ 8);
3246 bfd_vma vaddr
= pe_get32 (dll
, secptr1
+ 12);
3247 bfd_vma flags
= pe_get32 (dll
, secptr1
+ 36);
3251 bfd_seek (dll
, (file_ptr
) secptr1
+ 0, SEEK_SET
);
3252 bfd_bread (sec_name
, (bfd_size_type
) 8, dll
);
3254 if (strcmp(sec_name
,".data") == 0)
3257 data_end
= vaddr
+ vsize
;
3259 if (pe_dll_extra_pe_debug
)
3260 printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n",
3261 __FUNCTION__
, sec_name
, (unsigned long) vaddr
,
3262 (unsigned long) (vaddr
+ vsize
), (unsigned long) flags
);
3264 else if (strcmp(sec_name
,".rdata") == 0)
3266 rdata_start
= vaddr
;
3267 rdata_end
= vaddr
+ vsize
;
3269 if (pe_dll_extra_pe_debug
)
3270 printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n",
3271 __FUNCTION__
, sec_name
, (unsigned long) vaddr
,
3272 (unsigned long) (vaddr
+ vsize
), (unsigned long) flags
);
3274 else if (strcmp (sec_name
,".bss") == 0)
3277 bss_end
= vaddr
+ vsize
;
3279 if (pe_dll_extra_pe_debug
)
3280 printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n",
3281 __FUNCTION__
, sec_name
, (unsigned long) vaddr
,
3282 (unsigned long) (vaddr
+ vsize
), (unsigned long) flags
);
3286 expdata
= xmalloc (export_size
);
3287 bfd_seek (dll
, (file_ptr
) expptr
, SEEK_SET
);
3288 bfd_bread (expdata
, (bfd_size_type
) export_size
, dll
);
3289 erva
= (char *) expdata
- export_rva
;
3291 if (pe_def_file
== 0)
3292 pe_def_file
= def_file_empty ();
3294 nexp
= pe_as32 (expdata
+ 24);
3295 name_rvas
= pe_as32 (expdata
+ 32);
3296 exp_funcbase
= pe_as32 (expdata
+ 28);
3298 /* Use internal dll name instead of filename
3299 to enable symbolic dll linking. */
3300 dllname
= erva
+ pe_as32 (expdata
+ 12);
3302 /* Check to see if the dll has already been added to
3303 the definition list and if so return without error.
3304 This avoids multiple symbol definitions. */
3305 if (def_get_module (pe_def_file
, dllname
))
3307 if (pe_dll_extra_pe_debug
)
3308 printf ("%s is already loaded\n", dllname
);
3312 /* Iterate through the list of symbols. */
3313 for (i
= 0; i
< nexp
; i
++)
3315 /* Pointer to the names vector. */
3316 bfd_vma name_rva
= pe_as32 (erva
+ name_rvas
+ i
* 4);
3317 def_file_import
*imp
;
3318 /* Pointer to the function address vector. */
3319 bfd_vma func_rva
= pe_as32 (erva
+ exp_funcbase
+ i
* 4);
3322 /* Skip unwanted symbols, which are
3323 exported in buggy auto-import releases. */
3324 if (! CONST_STRNEQ (erva
+ name_rva
, "__nm_"))
3327 /* is_data is true if the address is in the data, rdata or bss
3330 (func_rva
>= data_start
&& func_rva
< data_end
)
3331 || (func_rva
>= rdata_start
&& func_rva
< rdata_end
)
3332 || (func_rva
>= bss_start
&& func_rva
< bss_end
);
3334 imp
= def_file_add_import (pe_def_file
, erva
+ name_rva
,
3335 dllname
, i
, NULL
, NULL
, &is_dup
);
3336 /* Mark symbol type. */
3338 imp
->data
= is_data
;
3340 if (pe_dll_extra_pe_debug
)
3341 printf ("%s dll-name: %s sym: %s addr: 0x%lx %s\n",
3342 __FUNCTION__
, dllname
, erva
+ name_rva
,
3343 (unsigned long) func_rva
, is_data
? "(data)" : "");
3351 pe_output_file_set_long_section_names (bfd
*abfd
)
3353 if (pe_use_coff_long_section_names
< 0)
3355 if (!bfd_coff_set_long_section_names (abfd
, pe_use_coff_long_section_names
))
3356 einfo (_("%XError: can't use long section names on this arch\n"));
3359 /* These are the main functions, called from the emulation. The first
3360 is called after the bfds are read, so we can guess at how much space
3361 we need. The second is called after everything is placed, so we
3362 can put the right values in place. */
3365 pe_dll_build_sections (bfd
*abfd
, struct bfd_link_info
*info
)
3367 pe_dll_id_target (bfd_get_target (abfd
));
3368 pe_output_file_set_long_section_names (abfd
);
3369 process_def_file_and_drectve (abfd
, info
);
3371 if (pe_def_file
->num_exports
== 0 && !info
->shared
)
3374 generate_edata (abfd
, info
);
3375 build_filler_bfd (1);
3376 pe_output_file_set_long_section_names (filler_bfd
);
3380 pe_exe_build_sections (bfd
*abfd
, struct bfd_link_info
*info ATTRIBUTE_UNUSED
)
3382 pe_dll_id_target (bfd_get_target (abfd
));
3383 pe_output_file_set_long_section_names (abfd
);
3384 build_filler_bfd (0);
3385 pe_output_file_set_long_section_names (filler_bfd
);
3389 pe_dll_fill_sections (bfd
*abfd
, struct bfd_link_info
*info
)
3391 pe_dll_id_target (bfd_get_target (abfd
));
3392 pe_output_file_set_long_section_names (abfd
);
3393 image_base
= pe_data (abfd
)->pe_opthdr
.ImageBase
;
3395 generate_reloc (abfd
, info
);
3398 bfd_set_section_size (filler_bfd
, reloc_s
, reloc_sz
);
3400 /* Resize the sections. */
3401 lang_reset_memory_regions ();
3402 lang_size_sections (NULL
, TRUE
);
3404 /* Redo special stuff. */
3405 ldemul_after_allocation ();
3407 /* Do the assignments again. */
3408 lang_do_assignments (lang_final_phase_enum
);
3411 fill_edata (abfd
, info
);
3413 if (info
->shared
&& !info
->pie
)
3414 pe_data (abfd
)->dll
= 1;
3416 edata_s
->contents
= edata_d
;
3417 reloc_s
->contents
= reloc_d
;
3421 pe_exe_fill_sections (bfd
*abfd
, struct bfd_link_info
*info
)
3423 pe_dll_id_target (bfd_get_target (abfd
));
3424 pe_output_file_set_long_section_names (abfd
);
3425 image_base
= pe_data (abfd
)->pe_opthdr
.ImageBase
;
3427 generate_reloc (abfd
, info
);
3430 bfd_set_section_size (filler_bfd
, reloc_s
, reloc_sz
);
3432 /* Resize the sections. */
3433 lang_reset_memory_regions ();
3434 lang_size_sections (NULL
, TRUE
);
3436 /* Redo special stuff. */
3437 ldemul_after_allocation ();
3439 /* Do the assignments again. */
3440 lang_do_assignments (lang_final_phase_enum
);
3442 reloc_s
->contents
= reloc_d
;
3446 pe_bfd_is_dll (bfd
*abfd
)
3448 return (bfd_get_format (abfd
) == bfd_object
3450 && pe_data (abfd
)->dll
);