1 /* Routines to help build PEI-format DLLs (Win32 etc)
2 Copyright 1998, 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
3 Written by DJ Delorie <dj@cygnus.com>
5 This file is part of GLD, the Gnu Linker.
7 GLD 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 2, or (at your option)
12 GLD 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 GLD; see the file COPYING. If not, write to the Free
19 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
25 #include "libiberty.h"
26 #include "safe-ctype.h"
39 #include "coff/internal.h"
40 #include "../bfd/libcoff.h"
44 /* This file turns a regular Windows PE image into a DLL. Because of
45 the complexity of this operation, it has been broken down into a
46 number of separate modules which are all called by the main function
47 at the end of this file. This function is not re-entrant and is
48 normally only called once, so static variables are used to reduce
49 the number of parameters and return values required.
51 See also: ld/emultempl/pe.em. */
53 /* Auto-import feature by Paul Sokolovsky
57 1. With this feature on, DLL clients can import variables from DLL
58 without any concern from their side (for example, without any source
61 2. This is done completely in bounds of the PE specification (to be fair,
62 there's a place where it pokes nose out of, but in practice it works).
63 So, resulting module can be used with any other PE compiler/linker.
65 3. Auto-import is fully compatible with standard import method and they
66 can be mixed together.
68 4. Overheads: space: 8 bytes per imported symbol, plus 20 for each
69 reference to it; load time: negligible; virtual/physical memory: should be
70 less than effect of DLL relocation, and I sincerely hope it doesn't affect
71 DLL sharability (too much).
75 The obvious and only way to get rid of dllimport insanity is to make client
76 access variable directly in the DLL, bypassing extra dereference. I.e.,
77 whenever client contains something like
81 address of dll_var in the command should be relocated to point into loaded
82 DLL. The aim is to make OS loader do so, and than make ld help with that.
83 Import section of PE made following way: there's a vector of structures
84 each describing imports from particular DLL. Each such structure points
85 to two other parallel vectors: one holding imported names, and one which
86 will hold address of corresponding imported name. So, the solution is
87 de-vectorize these structures, making import locations be sparse and
88 pointing directly into code. Before continuing, it is worth a note that,
89 while authors strives to make PE act ELF-like, there're some other people
90 make ELF act PE-like: elfvector, ;-) .
94 For each reference of data symbol to be imported from DLL (to set of which
95 belong symbols with name <sym>, if __imp_<sym> is found in implib), the
96 import fixup entry is generated. That entry is of type
97 IMAGE_IMPORT_DESCRIPTOR and stored in .idata$3 subsection. Each
98 fixup entry contains pointer to symbol's address within .text section
99 (marked with __fuN_<sym> symbol, where N is integer), pointer to DLL name
100 (so, DLL name is referenced by multiple entries), and pointer to symbol
101 name thunk. Symbol name thunk is singleton vector (__nm_th_<symbol>)
102 pointing to IMAGE_IMPORT_BY_NAME structure (__nm_<symbol>) directly
103 containing imported name. Here comes that "om the edge" problem mentioned
104 above: PE specification rambles that name vector (OriginalFirstThunk)
105 should run in parallel with addresses vector (FirstThunk), i.e. that they
106 should have same number of elements and terminated with zero. We violate
107 this, since FirstThunk points directly into machine code. But in practice,
108 OS loader implemented the sane way: it goes thru OriginalFirstThunk and
109 puts addresses to FirstThunk, not something else. It once again should be
110 noted that dll and symbol name structures are reused across fixup entries
111 and should be there anyway to support standard import stuff, so sustained
112 overhead is 20 bytes per reference. Other question is whether having several
113 IMAGE_IMPORT_DESCRIPTORS for the same DLL is possible. Answer is yes, it is
114 done even by native compiler/linker (libth32's functions are in fact reside
115 in windows9x kernel32.dll, so if you use it, you have two
116 IMAGE_IMPORT_DESCRIPTORS for kernel32.dll). Yet other question is whether
117 referencing the same PE structures several times is valid. The answer is why
118 not, prohibiting that (detecting violation) would require more work on
119 behalf of loader than not doing it.
121 See also: ld/emultempl/pe.em. */
124 add_bfd_to_link
PARAMS ((bfd
*, const char *, struct bfd_link_info
*));
126 /* For emultempl/pe.em. */
128 def_file
* pe_def_file
= 0;
129 int pe_dll_export_everything
= 0;
130 int pe_dll_do_default_excludes
= 1;
131 int pe_dll_kill_ats
= 0;
132 int pe_dll_stdcall_aliases
= 0;
133 int pe_dll_warn_dup_exports
= 0;
134 int pe_dll_compat_implib
= 0;
135 int pe_dll_extra_pe_debug
= 0;
137 /* Static variables and types. */
139 static bfd_vma image_base
;
140 static bfd
*filler_bfd
;
141 static struct sec
*edata_s
, *reloc_s
;
142 static unsigned char *edata_d
, *reloc_d
;
143 static size_t edata_sz
, reloc_sz
;
144 static int runtime_pseudo_relocs_created
= 0;
150 unsigned int imagebase_reloc
;
162 autofilter_entry_type
;
164 #define PE_ARCH_i386 1
166 #define PE_ARCH_mips 3
167 #define PE_ARCH_arm 4
168 #define PE_ARCH_arm_epoc 5
170 static pe_details_type pe_detail_list
[] =
183 16 /* R_SH_IMAGEBASE */,
205 "epoc-pei-arm-little",
206 "epoc-pe-arm-little",
212 { NULL
, NULL
, 0, 0, 0, 0 }
215 static pe_details_type
*pe_details
;
217 static autofilter_entry_type autofilter_symbollist
[] =
219 { "DllMain@12", 10 },
220 { "DllEntryPoint@0", 15 },
221 { "DllMainCRTStartup@12", 20 },
222 { "_cygwin_dll_entry@12", 20 },
223 { "_cygwin_crt0_common@8", 21 },
224 { "_cygwin_noncygwin_dll_entry@12", 30 },
225 { "impure_ptr", 10 },
226 { "_pei386_runtime_relocator", 25 },
227 { "do_pseudo_reloc", 15 },
228 { "cygwin_crt0", 11 },
232 /* Do not specify library suffix explicitly, to allow for dllized versions. */
233 static autofilter_entry_type autofilter_liblist
[] =
237 { "libmingw32", 10 },
238 { "libmingwex", 10 },
246 static autofilter_entry_type autofilter_objlist
[] =
256 { "crtbegin.o", 10 },
261 static autofilter_entry_type autofilter_symbolprefixlist
[] =
263 /* { "__imp_", 6 }, */
264 /* Do __imp_ explicitly to save time. */
266 /* Don't re-export auto-imported symbols. */
268 { "__builtin_", 10 },
269 /* Don't export symbols specifying internal DLL layout. */
272 { "_impure_ptr", 11 },
273 { "cygwin_attach_dll", 17 },
274 { "cygwin_premain0", 15 },
275 { "cygwin_premain1", 15 },
276 { "cygwin_premain2", 15 },
277 { "cygwin_premain3", 15 },
282 static autofilter_entry_type autofilter_symbolsuffixlist
[] =
288 #define U(str) (pe_details->underscored ? "_" str : str)
290 static int reloc_sort
PARAMS ((const void *, const void *));
291 static int pe_export_sort
PARAMS ((const void *, const void *));
292 static int auto_export
PARAMS ((bfd
*, def_file
*, const char *));
293 static void process_def_file
PARAMS ((bfd
*, struct bfd_link_info
*));
294 static void build_filler_bfd
PARAMS ((int));
295 static void generate_edata
PARAMS ((bfd
*, struct bfd_link_info
*));
296 static void fill_exported_offsets
PARAMS ((bfd
*, struct bfd_link_info
*));
297 static void fill_edata
PARAMS ((bfd
*, struct bfd_link_info
*));
298 static void generate_reloc
PARAMS ((bfd
*, struct bfd_link_info
*));
299 static void quoteput
PARAMS ((char *, FILE *, int));
300 static asection
*quick_section
PARAMS ((bfd
*, const char *, int, int));
301 static void quick_symbol
302 PARAMS ((bfd
*, const char *, const char *, const char *,
303 asection
*, int, int));
304 static void quick_reloc
PARAMS ((bfd
*, int, int, int));
305 static bfd
*make_head
PARAMS ((bfd
*));
306 static bfd
*make_tail
PARAMS ((bfd
*));
307 static bfd
*make_one
PARAMS ((def_file_export
*, bfd
*));
308 static bfd
*make_singleton_name_thunk
PARAMS ((const char *, bfd
*));
309 static char *make_import_fixup_mark
PARAMS ((arelent
*));
310 static bfd
*make_import_fixup_entry
311 PARAMS ((const char *, const char *, const char *, bfd
*));
312 static bfd
*make_runtime_pseudo_reloc
313 PARAMS ((const char *, const char *, int, bfd
*));
314 static bfd
*pe_create_runtime_relocator_reference
316 static unsigned int pe_get16
PARAMS ((bfd
*, int));
317 static unsigned int pe_get32
PARAMS ((bfd
*, int));
318 static unsigned int pe_as32
PARAMS ((void *));
321 pe_dll_id_target (target
)
326 for (i
= 0; pe_detail_list
[i
].target_name
; i
++)
327 if (strcmp (pe_detail_list
[i
].target_name
, target
) == 0
328 || strcmp (pe_detail_list
[i
].object_target
, target
) == 0)
330 pe_details
= pe_detail_list
+ i
;
333 einfo (_("%XUnsupported PEI architecture: %s\n"), target
);
337 /* Helper functions for qsort. Relocs must be sorted so that we can write
338 them out by pages. */
352 bfd_vma a
= ((reloc_data_type
*) va
)->vma
;
353 bfd_vma b
= ((reloc_data_type
*) vb
)->vma
;
355 return (a
> b
) ? 1 : ((a
< b
) ? -1 : 0);
359 pe_export_sort (va
, vb
)
362 def_file_export
*a
= (def_file_export
*) va
;
363 def_file_export
*b
= (def_file_export
*) vb
;
365 return strcmp (a
->name
, b
->name
);
368 /* Read and process the .DEF file. */
370 /* These correspond to the entries in pe_def_file->exports[]. I use
371 exported_symbol_sections[i] to tag whether or not the symbol was
372 defined, since we can't export symbols we don't have. */
374 static bfd_vma
*exported_symbol_offsets
;
375 static struct sec
**exported_symbol_sections
;
376 static int export_table_size
;
377 static int count_exported
;
378 static int count_exported_byname
;
379 static int count_with_ordinals
;
380 static const char *dll_name
;
381 static int min_ordinal
, max_ordinal
;
382 static int *exported_symbols
;
384 typedef struct exclude_list_struct
387 struct exclude_list_struct
*next
;
392 static struct exclude_list_struct
*excludes
= 0;
395 pe_dll_add_excludes (new_excludes
, type
)
396 const char *new_excludes
;
400 char *exclude_string
;
402 local_copy
= xstrdup (new_excludes
);
404 exclude_string
= strtok (local_copy
, ",:");
405 for (; exclude_string
; exclude_string
= strtok (NULL
, ",:"))
407 struct exclude_list_struct
*new_exclude
;
409 new_exclude
= ((struct exclude_list_struct
*)
410 xmalloc (sizeof (struct exclude_list_struct
)));
411 new_exclude
->string
= (char *) xmalloc (strlen (exclude_string
) + 1);
412 strcpy (new_exclude
->string
, exclude_string
);
413 new_exclude
->type
= type
;
414 new_exclude
->next
= excludes
;
415 excludes
= new_exclude
;
422 /* abfd is a bfd containing n (or NULL)
423 It can be used for contextual checks. */
426 auto_export (abfd
, d
, n
)
432 struct exclude_list_struct
*ex
;
433 autofilter_entry_type
*afptr
;
434 const char * libname
= 0;
435 if (abfd
&& abfd
->my_archive
)
436 libname
= lbasename (abfd
->my_archive
->filename
);
438 /* We should not re-export imported stuff. */
439 if (strncmp (n
, "_imp__", 6) == 0)
442 for (i
= 0; i
< d
->num_exports
; i
++)
443 if (strcmp (d
->exports
[i
].name
, n
) == 0)
446 if (pe_dll_do_default_excludes
)
451 if (pe_dll_extra_pe_debug
)
452 printf ("considering exporting: %s, abfd=%p, abfd->my_arc=%p\n",
453 n
, abfd
, abfd
->my_archive
);
455 /* First of all, make context checks:
456 Don't export anything from standard libs. */
459 afptr
= autofilter_liblist
;
463 if (strncmp (libname
, afptr
->name
, afptr
->len
) == 0 )
469 /* Next, exclude symbols from certain startup objects. */
471 if (abfd
&& (p
= lbasename (abfd
->filename
)))
473 afptr
= autofilter_objlist
;
476 if (strcmp (p
, afptr
->name
) == 0)
482 /* Don't try to blindly exclude all symbols
483 that begin with '__'; this was tried and
484 it is too restrictive. */
486 /* Then, exclude specific symbols. */
487 afptr
= autofilter_symbollist
;
490 if (strcmp (n
, afptr
->name
) == 0)
496 /* Next, exclude symbols starting with ... */
497 afptr
= autofilter_symbolprefixlist
;
500 if (strncmp (n
, afptr
->name
, afptr
->len
) == 0)
506 /* Finally, exclude symbols ending with ... */
508 afptr
= autofilter_symbolsuffixlist
;
511 if ((len
>= afptr
->len
)
512 /* Add 1 to insure match with trailing '\0'. */
513 && strncmp (n
+ len
- afptr
->len
, afptr
->name
,
514 afptr
->len
+ 1) == 0)
521 for (ex
= excludes
; ex
; ex
= ex
->next
)
523 if (ex
->type
== 1) /* exclude-libs */
526 && ((strcmp (libname
, ex
->string
) == 0)
527 || (strcasecmp ("ALL", ex
->string
) == 0)))
530 else if (strcmp (n
, ex
->string
) == 0)
538 process_def_file (abfd
, info
)
539 bfd
*abfd ATTRIBUTE_UNUSED
;
540 struct bfd_link_info
*info
;
543 struct bfd_link_hash_entry
*blhe
;
546 def_file_export
*e
= 0;
549 pe_def_file
= def_file_empty ();
551 /* First, run around to all the objects looking for the .drectve
552 sections, and push those into the def file too. */
553 for (b
= info
->input_bfds
; b
; b
= b
->link_next
)
555 s
= bfd_get_section_by_name (b
, ".drectve");
558 int size
= bfd_get_section_size_before_reloc (s
);
559 char *buf
= xmalloc (size
);
561 bfd_get_section_contents (b
, s
, buf
, 0, size
);
562 def_file_add_directive (pe_def_file
, buf
, size
);
567 /* Now, maybe export everything else the default way. */
568 if (pe_dll_export_everything
|| pe_def_file
->num_exports
== 0)
570 for (b
= info
->input_bfds
; b
; b
= b
->link_next
)
575 symsize
= bfd_get_symtab_upper_bound (b
);
576 symbols
= (asymbol
**) xmalloc (symsize
);
577 nsyms
= bfd_canonicalize_symtab (b
, symbols
);
579 for (j
= 0; j
< nsyms
; j
++)
581 /* We should export symbols which are either global or not
582 anything at all. (.bss data is the latter)
583 We should not export undefined symbols. */
584 if (symbols
[j
]->section
!= &bfd_und_section
585 && ((symbols
[j
]->flags
& BSF_GLOBAL
)
586 || (symbols
[j
]->flags
== BFD_FORT_COMM_DEFAULT_VALUE
)))
588 const char *sn
= symbols
[j
]->name
;
590 /* We should not re-export imported stuff. */
592 char *name
= (char *) xmalloc (strlen (sn
) + 2 + 6);
593 sprintf (name
, "%s%s", U("_imp_"), sn
);
595 blhe
= bfd_link_hash_lookup (info
->hash
, name
,
596 FALSE
, FALSE
, FALSE
);
599 if (blhe
&& blhe
->type
== bfd_link_hash_defined
)
606 if (auto_export (b
, pe_def_file
, sn
))
609 p
=def_file_add_export (pe_def_file
, sn
, 0, -1);
610 /* Fill data flag properly, from dlltool.c. */
611 p
->flag_data
= !(symbols
[j
]->flags
& BSF_FUNCTION
);
619 #define NE pe_def_file->num_exports
621 /* Canonicalize the export list. */
624 for (i
= 0; i
< NE
; i
++)
626 if (strchr (pe_def_file
->exports
[i
].name
, '@'))
628 /* This will preserve internal_name, which may have been
629 pointing to the same memory as name, or might not
631 int lead_at
= (*pe_def_file
->exports
[i
].name
=='@');
632 char *tmp
= xstrdup (pe_def_file
->exports
[i
].name
+ lead_at
);
634 *(strchr (tmp
, '@')) = 0;
635 pe_def_file
->exports
[i
].name
= tmp
;
640 if (pe_dll_stdcall_aliases
)
642 for (i
= 0; i
< NE
; i
++)
644 if (strchr (pe_def_file
->exports
[i
].name
, '@'))
646 int lead_at
= (*pe_def_file
->exports
[i
].name
== '@' ) ;
647 char *tmp
= xstrdup (pe_def_file
->exports
[i
].name
+ lead_at
);
649 *(strchr (tmp
, '@')) = 0;
650 if (auto_export (NULL
, pe_def_file
, tmp
))
651 def_file_add_export (pe_def_file
, tmp
,
652 pe_def_file
->exports
[i
].internal_name
,
660 /* Convenience, but watch out for it changing. */
661 e
= pe_def_file
->exports
;
663 exported_symbol_offsets
= (bfd_vma
*) xmalloc (NE
* sizeof (bfd_vma
));
664 exported_symbol_sections
= (struct sec
**) xmalloc (NE
* sizeof (struct sec
*));
666 memset (exported_symbol_sections
, 0, NE
* sizeof (struct sec
*));
670 count_exported_byname
= 0;
671 count_with_ordinals
= 0;
673 qsort (pe_def_file
->exports
, NE
, sizeof (pe_def_file
->exports
[0]), pe_export_sort
);
674 for (i
= 0, j
= 0; i
< NE
; i
++)
676 if (i
> 0 && strcmp (e
[i
].name
, e
[i
- 1].name
) == 0)
678 /* This is a duplicate. */
679 if (e
[j
- 1].ordinal
!= -1
680 && e
[i
].ordinal
!= -1
681 && e
[j
- 1].ordinal
!= e
[i
].ordinal
)
683 if (pe_dll_warn_dup_exports
)
684 /* xgettext:c-format */
685 einfo (_("%XError, duplicate EXPORT with ordinals: %s (%d vs %d)\n"),
686 e
[j
- 1].name
, e
[j
- 1].ordinal
, e
[i
].ordinal
);
690 if (pe_dll_warn_dup_exports
)
691 /* xgettext:c-format */
692 einfo (_("Warning, duplicate EXPORT: %s\n"),
696 if (e
[i
].ordinal
!= -1)
697 e
[j
- 1].ordinal
= e
[i
].ordinal
;
698 e
[j
- 1].flag_private
|= e
[i
].flag_private
;
699 e
[j
- 1].flag_constant
|= e
[i
].flag_constant
;
700 e
[j
- 1].flag_noname
|= e
[i
].flag_noname
;
701 e
[j
- 1].flag_data
|= e
[i
].flag_data
;
710 pe_def_file
->num_exports
= j
; /* == NE */
712 for (i
= 0; i
< NE
; i
++)
714 char *name
= (char *) xmalloc (strlen (pe_def_file
->exports
[i
].internal_name
) + 2);
716 if (pe_details
->underscored
717 && (*pe_def_file
->exports
[i
].internal_name
!= '@'))
720 strcpy (name
+ 1, pe_def_file
->exports
[i
].internal_name
);
723 strcpy (name
, pe_def_file
->exports
[i
].internal_name
);
725 blhe
= bfd_link_hash_lookup (info
->hash
,
730 && (blhe
->type
== bfd_link_hash_defined
731 || (blhe
->type
== bfd_link_hash_common
)))
734 if (!pe_def_file
->exports
[i
].flag_noname
)
735 count_exported_byname
++;
737 /* Only fill in the sections. The actual offsets are computed
738 in fill_exported_offsets() after common symbols are laid
740 if (blhe
->type
== bfd_link_hash_defined
)
741 exported_symbol_sections
[i
] = blhe
->u
.def
.section
;
743 exported_symbol_sections
[i
] = blhe
->u
.c
.p
->section
;
745 if (pe_def_file
->exports
[i
].ordinal
!= -1)
747 if (max_ordinal
< pe_def_file
->exports
[i
].ordinal
)
748 max_ordinal
= pe_def_file
->exports
[i
].ordinal
;
749 if (min_ordinal
> pe_def_file
->exports
[i
].ordinal
)
750 min_ordinal
= pe_def_file
->exports
[i
].ordinal
;
751 count_with_ordinals
++;
754 else if (blhe
&& blhe
->type
== bfd_link_hash_undefined
)
756 /* xgettext:c-format */
757 einfo (_("%XCannot export %s: symbol not defined\n"),
758 pe_def_file
->exports
[i
].internal_name
);
762 /* xgettext:c-format */
763 einfo (_("%XCannot export %s: symbol wrong type (%d vs %d)\n"),
764 pe_def_file
->exports
[i
].internal_name
,
765 blhe
->type
, bfd_link_hash_defined
);
769 /* xgettext:c-format */
770 einfo (_("%XCannot export %s: symbol not found\n"),
771 pe_def_file
->exports
[i
].internal_name
);
777 /* Build the bfd that will contain .edata and .reloc sections. */
780 build_filler_bfd (include_edata
)
783 lang_input_statement_type
*filler_file
;
784 filler_file
= lang_add_input_file ("dll stuff",
785 lang_input_file_is_fake_enum
,
787 filler_file
->the_bfd
= filler_bfd
= bfd_create ("dll stuff", output_bfd
);
788 if (filler_bfd
== NULL
789 || !bfd_set_arch_mach (filler_bfd
,
790 bfd_get_arch (output_bfd
),
791 bfd_get_mach (output_bfd
)))
793 einfo ("%X%P: can not create BFD %E\n");
799 edata_s
= bfd_make_section_old_way (filler_bfd
, ".edata");
801 || !bfd_set_section_flags (filler_bfd
, edata_s
,
808 einfo ("%X%P: can not create .edata section: %E\n");
811 bfd_set_section_size (filler_bfd
, edata_s
, edata_sz
);
814 reloc_s
= bfd_make_section_old_way (filler_bfd
, ".reloc");
816 || !bfd_set_section_flags (filler_bfd
, reloc_s
,
823 einfo ("%X%P: can not create .reloc section: %E\n");
827 bfd_set_section_size (filler_bfd
, reloc_s
, 0);
829 ldlang_add_file (filler_file
);
832 /* Gather all the exported symbols and build the .edata section. */
835 generate_edata (abfd
, info
)
837 struct bfd_link_info
*info ATTRIBUTE_UNUSED
;
840 int name_table_size
= 0;
843 /* First, we need to know how many exported symbols there are,
844 and what the range of ordinals is. */
845 if (pe_def_file
->name
)
846 dll_name
= pe_def_file
->name
;
849 dll_name
= abfd
->filename
;
851 for (dlnp
= dll_name
; *dlnp
; dlnp
++)
852 if (*dlnp
== '\\' || *dlnp
== '/' || *dlnp
== ':')
856 if (count_with_ordinals
&& max_ordinal
> count_exported
)
858 if (min_ordinal
> max_ordinal
- count_exported
+ 1)
859 min_ordinal
= max_ordinal
- count_exported
+ 1;
864 max_ordinal
= count_exported
;
867 export_table_size
= max_ordinal
- min_ordinal
+ 1;
868 exported_symbols
= (int *) xmalloc (export_table_size
* sizeof (int));
869 for (i
= 0; i
< export_table_size
; i
++)
870 exported_symbols
[i
] = -1;
872 /* Now we need to assign ordinals to those that don't have them. */
873 for (i
= 0; i
< NE
; i
++)
875 if (exported_symbol_sections
[i
])
877 if (pe_def_file
->exports
[i
].ordinal
!= -1)
879 int ei
= pe_def_file
->exports
[i
].ordinal
- min_ordinal
;
880 int pi
= exported_symbols
[ei
];
884 /* xgettext:c-format */
885 einfo (_("%XError, ordinal used twice: %d (%s vs %s)\n"),
886 pe_def_file
->exports
[i
].ordinal
,
887 pe_def_file
->exports
[i
].name
,
888 pe_def_file
->exports
[pi
].name
);
890 exported_symbols
[ei
] = i
;
892 name_table_size
+= strlen (pe_def_file
->exports
[i
].name
) + 1;
896 next_ordinal
= min_ordinal
;
897 for (i
= 0; i
< NE
; i
++)
898 if (exported_symbol_sections
[i
])
899 if (pe_def_file
->exports
[i
].ordinal
== -1)
901 while (exported_symbols
[next_ordinal
- min_ordinal
] != -1)
904 exported_symbols
[next_ordinal
- min_ordinal
] = i
;
905 pe_def_file
->exports
[i
].ordinal
= next_ordinal
;
908 /* OK, now we can allocate some memory. */
909 edata_sz
= (40 /* directory */
910 + 4 * export_table_size
/* addresses */
911 + 4 * count_exported_byname
/* name ptrs */
912 + 2 * count_exported_byname
/* ordinals */
913 + name_table_size
+ strlen (dll_name
) + 1);
916 /* Fill the exported symbol offsets. The preliminary work has already
917 been done in process_def_file(). */
920 fill_exported_offsets (abfd
, info
)
921 bfd
*abfd ATTRIBUTE_UNUSED
;
922 struct bfd_link_info
*info
;
925 struct bfd_link_hash_entry
*blhe
;
927 for (i
= 0; i
< pe_def_file
->num_exports
; i
++)
929 char *name
= (char *) xmalloc (strlen (pe_def_file
->exports
[i
].internal_name
) + 2);
931 if (pe_details
->underscored
932 && (*pe_def_file
->exports
[i
].internal_name
!= '@'))
935 strcpy (name
+ 1, pe_def_file
->exports
[i
].internal_name
);
938 strcpy (name
, pe_def_file
->exports
[i
].internal_name
);
940 blhe
= bfd_link_hash_lookup (info
->hash
,
944 if (blhe
&& (blhe
->type
== bfd_link_hash_defined
))
945 exported_symbol_offsets
[i
] = blhe
->u
.def
.value
;
952 fill_edata (abfd
, info
)
954 struct bfd_link_info
*info ATTRIBUTE_UNUSED
;
957 unsigned char *edirectory
;
958 unsigned long *eaddresses
;
959 unsigned long *enameptrs
;
960 unsigned short *eordinals
;
961 unsigned char *enamestr
;
966 edata_d
= (unsigned char *) xmalloc (edata_sz
);
968 /* Note use of array pointer math here. */
969 edirectory
= edata_d
;
970 eaddresses
= (unsigned long *) (edata_d
+ 40);
971 enameptrs
= eaddresses
+ export_table_size
;
972 eordinals
= (unsigned short *) (enameptrs
+ count_exported_byname
);
973 enamestr
= (char *) (eordinals
+ count_exported_byname
);
975 #define ERVA(ptr) (((unsigned char *)(ptr) - edata_d) + edata_s->output_section->vma - image_base)
977 memset (edata_d
, 0, edata_sz
);
978 bfd_put_32 (abfd
, now
, edata_d
+ 4);
979 if (pe_def_file
->version_major
!= -1)
981 bfd_put_16 (abfd
, pe_def_file
->version_major
, edata_d
+ 8);
982 bfd_put_16 (abfd
, pe_def_file
->version_minor
, edata_d
+ 10);
985 bfd_put_32 (abfd
, ERVA (enamestr
), edata_d
+ 12);
986 strcpy (enamestr
, dll_name
);
987 enamestr
+= strlen (enamestr
) + 1;
988 bfd_put_32 (abfd
, min_ordinal
, edata_d
+ 16);
989 bfd_put_32 (abfd
, export_table_size
, edata_d
+ 20);
990 bfd_put_32 (abfd
, count_exported_byname
, edata_d
+ 24);
991 bfd_put_32 (abfd
, ERVA (eaddresses
), edata_d
+ 28);
992 bfd_put_32 (abfd
, ERVA (enameptrs
), edata_d
+ 32);
993 bfd_put_32 (abfd
, ERVA (eordinals
), edata_d
+ 36);
995 fill_exported_offsets (abfd
, info
);
997 /* Ok, now for the filling in part. */
999 for (i
= 0; i
< export_table_size
; i
++)
1001 int s
= exported_symbols
[i
];
1005 struct sec
*ssec
= exported_symbol_sections
[s
];
1006 unsigned long srva
= (exported_symbol_offsets
[s
]
1007 + ssec
->output_section
->vma
1008 + ssec
->output_offset
);
1009 int ord
= pe_def_file
->exports
[s
].ordinal
;
1011 bfd_put_32 (abfd
, srva
- image_base
,
1012 (void *) (eaddresses
+ ord
- min_ordinal
));
1014 if (!pe_def_file
->exports
[s
].flag_noname
)
1016 char *ename
= pe_def_file
->exports
[s
].name
;
1017 bfd_put_32 (abfd
, ERVA (enamestr
), (void *) enameptrs
);
1019 strcpy (enamestr
, ename
);
1020 enamestr
+= strlen (enamestr
) + 1;
1021 bfd_put_16 (abfd
, ord
- min_ordinal
, (void *) eordinals
);
1023 pe_def_file
->exports
[s
].hint
= hint
++;
1030 static struct sec
*current_sec
;
1033 pe_walk_relocs_of_symbol (info
, name
, cb
)
1034 struct bfd_link_info
*info
;
1036 int (*cb
) (arelent
*, asection
*);
1041 for (b
= info
->input_bfds
; b
; b
= b
->link_next
)
1046 symsize
= bfd_get_symtab_upper_bound (b
);
1047 symbols
= (asymbol
**) xmalloc (symsize
);
1048 nsyms
= bfd_canonicalize_symtab (b
, symbols
);
1050 for (s
= b
->sections
; s
; s
= s
->next
)
1053 int relsize
, nrelocs
, i
;
1054 int flags
= bfd_get_section_flags (b
, s
);
1056 /* Skip discarded linkonce sections. */
1057 if (flags
& SEC_LINK_ONCE
1058 && s
->output_section
== bfd_abs_section_ptr
)
1063 relsize
= bfd_get_reloc_upper_bound (b
, s
);
1064 relocs
= (arelent
**) xmalloc ((size_t) relsize
);
1065 nrelocs
= bfd_canonicalize_reloc (b
, s
, relocs
, symbols
);
1067 for (i
= 0; i
< nrelocs
; i
++)
1069 struct symbol_cache_entry
*sym
= *relocs
[i
]->sym_ptr_ptr
;
1071 if (!strcmp (name
, sym
->name
))
1077 /* Warning: the allocated symbols are remembered in BFD and reused
1078 later, so don't free them! */
1079 /* free (symbols); */
1084 /* Gather all the relocations and build the .reloc section. */
1087 generate_reloc (abfd
, info
)
1089 struct bfd_link_info
*info
;
1092 /* For .reloc stuff. */
1093 reloc_data_type
*reloc_data
;
1094 int total_relocs
= 0;
1096 unsigned long sec_page
= (unsigned long) (-1);
1097 unsigned long page_ptr
, page_count
;
1103 for (b
= info
->input_bfds
; b
; b
= b
->link_next
)
1104 for (s
= b
->sections
; s
; s
= s
->next
)
1105 total_relocs
+= s
->reloc_count
;
1108 (reloc_data_type
*) xmalloc (total_relocs
* sizeof (reloc_data_type
));
1112 for (bi
= 0, b
= info
->input_bfds
; b
; bi
++, b
= b
->link_next
)
1115 int relsize
, nrelocs
, i
;
1117 for (s
= b
->sections
; s
; s
= s
->next
)
1119 unsigned long sec_vma
= s
->output_section
->vma
+ s
->output_offset
;
1123 /* If it's not loaded, we don't need to relocate it this way. */
1124 if (!(s
->output_section
->flags
& SEC_LOAD
))
1127 /* I don't know why there would be a reloc for these, but I've
1128 seen it happen - DJ */
1129 if (s
->output_section
== &bfd_abs_section
)
1132 if (s
->output_section
->vma
== 0)
1134 /* Huh? Shouldn't happen, but punt if it does. */
1135 einfo ("DJ: zero vma section reloc detected: `%s' #%d f=%d\n",
1136 s
->output_section
->name
, s
->output_section
->index
,
1137 s
->output_section
->flags
);
1141 symsize
= bfd_get_symtab_upper_bound (b
);
1142 symbols
= (asymbol
**) xmalloc (symsize
);
1143 nsyms
= bfd_canonicalize_symtab (b
, symbols
);
1145 relsize
= bfd_get_reloc_upper_bound (b
, s
);
1146 relocs
= (arelent
**) xmalloc ((size_t) relsize
);
1147 nrelocs
= bfd_canonicalize_reloc (b
, s
, relocs
, symbols
);
1149 for (i
= 0; i
< nrelocs
; i
++)
1151 if (pe_dll_extra_pe_debug
)
1153 struct symbol_cache_entry
*sym
= *relocs
[i
]->sym_ptr_ptr
;
1154 printf ("rel: %s\n", sym
->name
);
1156 if (!relocs
[i
]->howto
->pc_relative
1157 && relocs
[i
]->howto
->type
!= pe_details
->imagebase_reloc
)
1160 struct symbol_cache_entry
*sym
= *relocs
[i
]->sym_ptr_ptr
;
1162 sym_vma
= (relocs
[i
]->addend
1165 + sym
->section
->output_offset
1166 + sym
->section
->output_section
->vma
);
1167 reloc_data
[total_relocs
].vma
= sec_vma
+ relocs
[i
]->address
;
1169 #define BITS_AND_SHIFT(bits, shift) (bits * 1000 | shift)
1171 switch BITS_AND_SHIFT (relocs
[i
]->howto
->bitsize
,
1172 relocs
[i
]->howto
->rightshift
)
1174 case BITS_AND_SHIFT (32, 0):
1175 reloc_data
[total_relocs
].type
= 3;
1178 case BITS_AND_SHIFT (16, 0):
1179 reloc_data
[total_relocs
].type
= 2;
1182 case BITS_AND_SHIFT (16, 16):
1183 reloc_data
[total_relocs
].type
= 4;
1184 /* FIXME: we can't know the symbol's right value
1185 yet, but we probably can safely assume that
1186 CE will relocate us in 64k blocks, so leaving
1188 reloc_data
[total_relocs
].extra
= 0;
1191 case BITS_AND_SHIFT (26, 2):
1192 reloc_data
[total_relocs
].type
= 5;
1196 /* xgettext:c-format */
1197 einfo (_("%XError: %d-bit reloc in dll\n"),
1198 relocs
[i
]->howto
->bitsize
);
1204 /* Warning: the allocated symbols are remembered in BFD and
1205 reused later, so don't free them! */
1212 /* At this point, we have total_relocs relocation addresses in
1213 reloc_addresses, which are all suitable for the .reloc section.
1214 We must now create the new sections. */
1215 qsort (reloc_data
, total_relocs
, sizeof (*reloc_data
), reloc_sort
);
1217 for (i
= 0; i
< total_relocs
; i
++)
1219 unsigned long this_page
= (reloc_data
[i
].vma
>> 12);
1221 if (this_page
!= sec_page
)
1223 reloc_sz
= (reloc_sz
+ 3) & ~3; /* 4-byte align. */
1225 sec_page
= this_page
;
1230 if (reloc_data
[i
].type
== 4)
1234 reloc_sz
= (reloc_sz
+ 3) & ~3; /* 4-byte align. */
1235 reloc_d
= (unsigned char *) xmalloc (reloc_sz
);
1236 sec_page
= (unsigned long) (-1);
1238 page_ptr
= (unsigned long) (-1);
1241 for (i
= 0; i
< total_relocs
; i
++)
1243 unsigned long rva
= reloc_data
[i
].vma
- image_base
;
1244 unsigned long this_page
= (rva
& ~0xfff);
1246 if (this_page
!= sec_page
)
1248 while (reloc_sz
& 3)
1249 reloc_d
[reloc_sz
++] = 0;
1251 if (page_ptr
!= (unsigned long) (-1))
1252 bfd_put_32 (abfd
, reloc_sz
- page_ptr
, reloc_d
+ page_ptr
+ 4);
1254 bfd_put_32 (abfd
, this_page
, reloc_d
+ reloc_sz
);
1255 page_ptr
= reloc_sz
;
1257 sec_page
= this_page
;
1261 bfd_put_16 (abfd
, (rva
& 0xfff) + (reloc_data
[i
].type
<< 12),
1262 reloc_d
+ reloc_sz
);
1265 if (reloc_data
[i
].type
== 4)
1267 bfd_put_16 (abfd
, reloc_data
[i
].extra
, reloc_d
+ reloc_sz
);
1274 while (reloc_sz
& 3)
1275 reloc_d
[reloc_sz
++] = 0;
1277 if (page_ptr
!= (unsigned long) (-1))
1278 bfd_put_32 (abfd
, reloc_sz
- page_ptr
, reloc_d
+ page_ptr
+ 4);
1280 while (reloc_sz
< reloc_s
->_raw_size
)
1281 reloc_d
[reloc_sz
++] = 0;
1284 /* Given the exiting def_file structure, print out a .DEF file that
1285 corresponds to it. */
1288 quoteput (s
, f
, needs_quotes
)
1295 for (cp
= s
; *cp
; cp
++)
1310 if (*s
== '"' || *s
== '\\')
1324 pe_dll_generate_def_file (pe_out_def_filename
)
1325 const char *pe_out_def_filename
;
1328 FILE *out
= fopen (pe_out_def_filename
, "w");
1331 /* xgettext:c-format */
1332 einfo (_("%s: Can't open output def file %s\n"),
1333 program_name
, pe_out_def_filename
);
1337 if (pe_def_file
->name
)
1339 if (pe_def_file
->is_dll
)
1340 fprintf (out
, "LIBRARY ");
1342 fprintf (out
, "NAME ");
1344 quoteput (pe_def_file
->name
, out
, 1);
1346 if (pe_data (output_bfd
)->pe_opthdr
.ImageBase
)
1347 fprintf (out
, " BASE=0x%lx",
1348 (unsigned long) pe_data (output_bfd
)->pe_opthdr
.ImageBase
);
1349 fprintf (out
, "\n");
1352 if (pe_def_file
->description
)
1354 fprintf (out
, "DESCRIPTION ");
1355 quoteput (pe_def_file
->description
, out
, 1);
1356 fprintf (out
, "\n");
1359 if (pe_def_file
->version_minor
!= -1)
1360 fprintf (out
, "VERSION %d.%d\n", pe_def_file
->version_major
,
1361 pe_def_file
->version_minor
);
1362 else if (pe_def_file
->version_major
!= -1)
1363 fprintf (out
, "VERSION %d\n", pe_def_file
->version_major
);
1365 if (pe_def_file
->stack_reserve
!= -1 || pe_def_file
->heap_reserve
!= -1)
1366 fprintf (out
, "\n");
1368 if (pe_def_file
->stack_commit
!= -1)
1369 fprintf (out
, "STACKSIZE 0x%x,0x%x\n",
1370 pe_def_file
->stack_reserve
, pe_def_file
->stack_commit
);
1371 else if (pe_def_file
->stack_reserve
!= -1)
1372 fprintf (out
, "STACKSIZE 0x%x\n", pe_def_file
->stack_reserve
);
1374 if (pe_def_file
->heap_commit
!= -1)
1375 fprintf (out
, "HEAPSIZE 0x%x,0x%x\n",
1376 pe_def_file
->heap_reserve
, pe_def_file
->heap_commit
);
1377 else if (pe_def_file
->heap_reserve
!= -1)
1378 fprintf (out
, "HEAPSIZE 0x%x\n", pe_def_file
->heap_reserve
);
1380 if (pe_def_file
->num_section_defs
> 0)
1382 fprintf (out
, "\nSECTIONS\n\n");
1384 for (i
= 0; i
< pe_def_file
->num_section_defs
; i
++)
1387 quoteput (pe_def_file
->section_defs
[i
].name
, out
, 0);
1389 if (pe_def_file
->section_defs
[i
].class)
1391 fprintf (out
, " CLASS ");
1392 quoteput (pe_def_file
->section_defs
[i
].class, out
, 0);
1395 if (pe_def_file
->section_defs
[i
].flag_read
)
1396 fprintf (out
, " READ");
1398 if (pe_def_file
->section_defs
[i
].flag_write
)
1399 fprintf (out
, " WRITE");
1401 if (pe_def_file
->section_defs
[i
].flag_execute
)
1402 fprintf (out
, " EXECUTE");
1404 if (pe_def_file
->section_defs
[i
].flag_shared
)
1405 fprintf (out
, " SHARED");
1407 fprintf (out
, "\n");
1411 if (pe_def_file
->num_exports
> 0)
1413 fprintf (out
, "EXPORTS\n");
1415 for (i
= 0; i
< pe_def_file
->num_exports
; i
++)
1417 def_file_export
*e
= pe_def_file
->exports
+ i
;
1419 quoteput (e
->name
, out
, 0);
1421 if (e
->internal_name
&& strcmp (e
->internal_name
, e
->name
))
1423 fprintf (out
, " = ");
1424 quoteput (e
->internal_name
, out
, 0);
1427 if (e
->ordinal
!= -1)
1428 fprintf (out
, " @%d", e
->ordinal
);
1430 if (e
->flag_private
)
1431 fprintf (out
, " PRIVATE");
1433 if (e
->flag_constant
)
1434 fprintf (out
, " CONSTANT");
1437 fprintf (out
, " NONAME");
1440 fprintf (out
, " DATA");
1442 fprintf (out
, "\n");
1446 if (pe_def_file
->num_imports
> 0)
1448 fprintf (out
, "\nIMPORTS\n\n");
1450 for (i
= 0; i
< pe_def_file
->num_imports
; i
++)
1452 def_file_import
*im
= pe_def_file
->imports
+ i
;
1455 if (im
->internal_name
1456 && (!im
->name
|| strcmp (im
->internal_name
, im
->name
)))
1458 quoteput (im
->internal_name
, out
, 0);
1459 fprintf (out
, " = ");
1462 quoteput (im
->module
->name
, out
, 0);
1466 quoteput (im
->name
, out
, 0);
1468 fprintf (out
, "%d", im
->ordinal
);
1470 fprintf (out
, "\n");
1475 fprintf (out
, _("; no contents available\n"));
1477 if (fclose (out
) == EOF
)
1478 /* xgettext:c-format */
1479 einfo (_("%P: Error closing file `%s'\n"), pe_out_def_filename
);
1482 /* Generate the import library. */
1484 static asymbol
**symtab
;
1487 static const char *dll_filename
;
1488 static char *dll_symname
;
1490 #define UNDSEC (asection *) &bfd_und_section
1493 quick_section (abfd
, name
, flags
, align
)
1502 sec
= bfd_make_section_old_way (abfd
, name
);
1503 bfd_set_section_flags (abfd
, sec
, flags
| SEC_ALLOC
| SEC_LOAD
| SEC_KEEP
);
1504 bfd_set_section_alignment (abfd
, sec
, align
);
1505 /* Remember to undo this before trying to link internally! */
1506 sec
->output_section
= sec
;
1508 sym
= bfd_make_empty_symbol (abfd
);
1509 symtab
[symptr
++] = sym
;
1510 sym
->name
= sec
->name
;
1512 sym
->flags
= BSF_LOCAL
;
1519 quick_symbol (abfd
, n1
, n2
, n3
, sec
, flags
, addr
)
1529 char *name
= (char *) xmalloc (strlen (n1
) + strlen (n2
) + strlen (n3
) + 1);
1534 sym
= bfd_make_empty_symbol (abfd
);
1539 symtab
[symptr
++] = sym
;
1542 static arelent
*reltab
= 0;
1543 static int relcount
= 0, relsize
= 0;
1546 quick_reloc (abfd
, address
, which_howto
, symidx
)
1552 if (relcount
>= (relsize
- 1))
1556 reltab
= (arelent
*) xrealloc (reltab
, relsize
* sizeof (arelent
));
1558 reltab
= (arelent
*) xmalloc (relsize
* sizeof (arelent
));
1560 reltab
[relcount
].address
= address
;
1561 reltab
[relcount
].addend
= 0;
1562 reltab
[relcount
].howto
= bfd_reloc_type_lookup (abfd
, which_howto
);
1563 reltab
[relcount
].sym_ptr_ptr
= symtab
+ symidx
;
1568 save_relocs (asection
*sec
)
1572 sec
->relocation
= reltab
;
1573 sec
->reloc_count
= relcount
;
1574 sec
->orelocation
= (arelent
**) xmalloc ((relcount
+ 1) * sizeof (arelent
*));
1575 for (i
= 0; i
< relcount
; i
++)
1576 sec
->orelocation
[i
] = sec
->relocation
+ i
;
1577 sec
->orelocation
[relcount
] = 0;
1578 sec
->flags
|= SEC_RELOC
;
1580 relcount
= relsize
= 0;
1583 /* .section .idata$2
1584 .global __head_my_dll
1604 asection
*id2
, *id5
, *id4
;
1605 unsigned char *d2
, *d5
, *d4
;
1609 oname
= (char *) xmalloc (20);
1610 sprintf (oname
, "d%06d.o", tmp_seq
);
1613 abfd
= bfd_create (oname
, parent
);
1614 bfd_find_target (pe_details
->object_target
, abfd
);
1615 bfd_make_writable (abfd
);
1617 bfd_set_format (abfd
, bfd_object
);
1618 bfd_set_arch_mach (abfd
, pe_details
->bfd_arch
, 0);
1621 symtab
= (asymbol
**) xmalloc (6 * sizeof (asymbol
*));
1622 id2
= quick_section (abfd
, ".idata$2", SEC_HAS_CONTENTS
, 2);
1623 id5
= quick_section (abfd
, ".idata$5", SEC_HAS_CONTENTS
, 2);
1624 id4
= quick_section (abfd
, ".idata$4", SEC_HAS_CONTENTS
, 2);
1625 quick_symbol (abfd
, U ("_head_"), dll_symname
, "", id2
, BSF_GLOBAL
, 0);
1626 quick_symbol (abfd
, U (""), dll_symname
, "_iname", UNDSEC
, BSF_GLOBAL
, 0);
1628 /* OK, pay attention here. I got confused myself looking back at
1629 it. We create a four-byte section to mark the beginning of the
1630 list, and we include an offset of 4 in the section, so that the
1631 pointer to the list points to the *end* of this section, which is
1632 the start of the list of sections from other objects. */
1634 bfd_set_section_size (abfd
, id2
, 20);
1635 d2
= (unsigned char *) xmalloc (20);
1638 d2
[0] = d2
[16] = 4; /* Reloc addend. */
1639 quick_reloc (abfd
, 0, BFD_RELOC_RVA
, 2);
1640 quick_reloc (abfd
, 12, BFD_RELOC_RVA
, 4);
1641 quick_reloc (abfd
, 16, BFD_RELOC_RVA
, 1);
1644 bfd_set_section_size (abfd
, id5
, 4);
1645 d5
= (unsigned char *) xmalloc (4);
1649 bfd_set_section_size (abfd
, id4
, 4);
1650 d4
= (unsigned char *) xmalloc (4);
1654 bfd_set_symtab (abfd
, symtab
, symptr
);
1656 bfd_set_section_contents (abfd
, id2
, d2
, 0, 20);
1657 bfd_set_section_contents (abfd
, id5
, d5
, 0, 4);
1658 bfd_set_section_contents (abfd
, id4
, d4
, 0, 4);
1660 bfd_make_readable (abfd
);
1664 /* .section .idata$4
1669 .global __my_dll_iname
1677 asection
*id4
, *id5
, *id7
;
1678 unsigned char *d4
, *d5
, *d7
;
1683 oname
= (char *) xmalloc (20);
1684 sprintf (oname
, "d%06d.o", tmp_seq
);
1687 abfd
= bfd_create (oname
, parent
);
1688 bfd_find_target (pe_details
->object_target
, abfd
);
1689 bfd_make_writable (abfd
);
1691 bfd_set_format (abfd
, bfd_object
);
1692 bfd_set_arch_mach (abfd
, pe_details
->bfd_arch
, 0);
1695 symtab
= (asymbol
**) xmalloc (5 * sizeof (asymbol
*));
1696 id4
= quick_section (abfd
, ".idata$4", SEC_HAS_CONTENTS
, 2);
1697 id5
= quick_section (abfd
, ".idata$5", SEC_HAS_CONTENTS
, 2);
1698 id7
= quick_section (abfd
, ".idata$7", SEC_HAS_CONTENTS
, 2);
1699 quick_symbol (abfd
, U (""), dll_symname
, "_iname", id7
, BSF_GLOBAL
, 0);
1701 bfd_set_section_size (abfd
, id4
, 4);
1702 d4
= (unsigned char *) xmalloc (4);
1706 bfd_set_section_size (abfd
, id5
, 4);
1707 d5
= (unsigned char *) xmalloc (4);
1711 len
= strlen (dll_filename
) + 1;
1714 bfd_set_section_size (abfd
, id7
, len
);
1715 d7
= (unsigned char *) xmalloc (len
);
1717 strcpy (d7
, dll_filename
);
1719 bfd_set_symtab (abfd
, symtab
, symptr
);
1721 bfd_set_section_contents (abfd
, id4
, d4
, 0, 4);
1722 bfd_set_section_contents (abfd
, id5
, d5
, 0, 4);
1723 bfd_set_section_contents (abfd
, id7
, d7
, 0, len
);
1725 bfd_make_readable (abfd
);
1731 .global ___imp_function
1732 .global __imp__function
1734 jmp *__imp__function:
1748 .asciz "function" xlate? (add underscore, kill at) */
1750 static unsigned char jmp_ix86_bytes
[] =
1752 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x90, 0x90
1760 .dw __imp_function */
1762 static unsigned char jmp_sh_bytes
[] =
1764 0x01, 0xd0, 0x02, 0x60, 0x2b, 0x40, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00
1768 lui $t0,<high:__imp_function>
1769 lw $t0,<low:__imp_function>
1773 static unsigned char jmp_mips_bytes
[] =
1775 0x00, 0x00, 0x08, 0x3c, 0x00, 0x00, 0x08, 0x8d,
1776 0x08, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00
1780 make_one (exp
, parent
)
1781 def_file_export
*exp
;
1784 asection
*tx
, *id7
, *id5
, *id4
, *id6
;
1785 unsigned char *td
= NULL
, *d7
, *d5
, *d4
, *d6
= NULL
;
1789 unsigned char *jmp_bytes
= NULL
;
1790 int jmp_byte_count
= 0;
1792 switch (pe_details
->pe_arch
)
1795 jmp_bytes
= jmp_ix86_bytes
;
1796 jmp_byte_count
= sizeof (jmp_ix86_bytes
);
1799 jmp_bytes
= jmp_sh_bytes
;
1800 jmp_byte_count
= sizeof (jmp_sh_bytes
);
1803 jmp_bytes
= jmp_mips_bytes
;
1804 jmp_byte_count
= sizeof (jmp_mips_bytes
);
1810 oname
= (char *) xmalloc (20);
1811 sprintf (oname
, "d%06d.o", tmp_seq
);
1814 abfd
= bfd_create (oname
, parent
);
1815 bfd_find_target (pe_details
->object_target
, abfd
);
1816 bfd_make_writable (abfd
);
1818 bfd_set_format (abfd
, bfd_object
);
1819 bfd_set_arch_mach (abfd
, pe_details
->bfd_arch
, 0);
1822 symtab
= (asymbol
**) xmalloc (11 * sizeof (asymbol
*));
1823 tx
= quick_section (abfd
, ".text", SEC_CODE
|SEC_HAS_CONTENTS
, 2);
1824 id7
= quick_section (abfd
, ".idata$7", SEC_HAS_CONTENTS
, 2);
1825 id5
= quick_section (abfd
, ".idata$5", SEC_HAS_CONTENTS
, 2);
1826 id4
= quick_section (abfd
, ".idata$4", SEC_HAS_CONTENTS
, 2);
1827 id6
= quick_section (abfd
, ".idata$6", SEC_HAS_CONTENTS
, 2);
1829 if (*exp
->internal_name
== '@')
1831 if (! exp
->flag_data
)
1832 quick_symbol (abfd
, "", exp
->internal_name
, "", tx
, BSF_GLOBAL
, 0);
1833 quick_symbol (abfd
, U ("_head_"), dll_symname
, "", UNDSEC
, BSF_GLOBAL
, 0);
1834 quick_symbol (abfd
, U ("_imp_"), exp
->internal_name
, "", id5
, BSF_GLOBAL
, 0);
1835 /* Fastcall applies only to functions,
1836 so no need for auto-import symbol. */
1840 if (! exp
->flag_data
)
1841 quick_symbol (abfd
, U (""), exp
->internal_name
, "", tx
, BSF_GLOBAL
, 0);
1842 quick_symbol (abfd
, U ("_head_"), dll_symname
, "", UNDSEC
, BSF_GLOBAL
, 0);
1843 quick_symbol (abfd
, U ("_imp__"), exp
->internal_name
, "", id5
, BSF_GLOBAL
, 0);
1844 /* Symbol to reference ord/name of imported
1845 data symbol, used to implement auto-import. */
1847 quick_symbol (abfd
, U("_nm__"), exp
->internal_name
, "", id6
, BSF_GLOBAL
,0);
1849 if (pe_dll_compat_implib
)
1850 quick_symbol (abfd
, U ("__imp_"), exp
->internal_name
, "",
1851 id5
, BSF_GLOBAL
, 0);
1853 if (! exp
->flag_data
)
1855 bfd_set_section_size (abfd
, tx
, jmp_byte_count
);
1856 td
= (unsigned char *) xmalloc (jmp_byte_count
);
1858 memcpy (td
, jmp_bytes
, jmp_byte_count
);
1860 switch (pe_details
->pe_arch
)
1863 quick_reloc (abfd
, 2, BFD_RELOC_32
, 2);
1866 quick_reloc (abfd
, 8, BFD_RELOC_32
, 2);
1869 quick_reloc (abfd
, 0, BFD_RELOC_HI16_S
, 2);
1870 quick_reloc (abfd
, 0, BFD_RELOC_LO16
, 0); /* MIPS_R_PAIR */
1871 quick_reloc (abfd
, 4, BFD_RELOC_LO16
, 2);
1879 bfd_set_section_size (abfd
, id7
, 4);
1880 d7
= (unsigned char *) xmalloc (4);
1883 quick_reloc (abfd
, 0, BFD_RELOC_RVA
, 6);
1886 bfd_set_section_size (abfd
, id5
, 4);
1887 d5
= (unsigned char *) xmalloc (4);
1891 if (exp
->flag_noname
)
1893 d5
[0] = exp
->ordinal
;
1894 d5
[1] = exp
->ordinal
>> 8;
1899 quick_reloc (abfd
, 0, BFD_RELOC_RVA
, 4);
1903 bfd_set_section_size (abfd
, id4
, 4);
1904 d4
= (unsigned char *) xmalloc (4);
1908 if (exp
->flag_noname
)
1910 d4
[0] = exp
->ordinal
;
1911 d4
[1] = exp
->ordinal
>> 8;
1916 quick_reloc (abfd
, 0, BFD_RELOC_RVA
, 4);
1920 if (exp
->flag_noname
)
1923 bfd_set_section_size (abfd
, id6
, 0);
1927 len
= strlen (exp
->name
) + 3;
1930 bfd_set_section_size (abfd
, id6
, len
);
1931 d6
= (unsigned char *) xmalloc (len
);
1933 memset (d6
, 0, len
);
1934 d6
[0] = exp
->hint
& 0xff;
1935 d6
[1] = exp
->hint
>> 8;
1936 strcpy (d6
+ 2, exp
->name
);
1939 bfd_set_symtab (abfd
, symtab
, symptr
);
1941 bfd_set_section_contents (abfd
, tx
, td
, 0, jmp_byte_count
);
1942 bfd_set_section_contents (abfd
, id7
, d7
, 0, 4);
1943 bfd_set_section_contents (abfd
, id5
, d5
, 0, 4);
1944 bfd_set_section_contents (abfd
, id4
, d4
, 0, 4);
1945 if (!exp
->flag_noname
)
1946 bfd_set_section_contents (abfd
, id6
, d6
, 0, len
);
1948 bfd_make_readable (abfd
);
1953 make_singleton_name_thunk (import
, parent
)
1957 /* Name thunks go to idata$4. */
1963 oname
= (char *) xmalloc (20);
1964 sprintf (oname
, "nmth%06d.o", tmp_seq
);
1967 abfd
= bfd_create (oname
, parent
);
1968 bfd_find_target (pe_details
->object_target
, abfd
);
1969 bfd_make_writable (abfd
);
1971 bfd_set_format (abfd
, bfd_object
);
1972 bfd_set_arch_mach (abfd
, pe_details
->bfd_arch
, 0);
1975 symtab
= (asymbol
**) xmalloc (3 * sizeof (asymbol
*));
1976 id4
= quick_section (abfd
, ".idata$4", SEC_HAS_CONTENTS
, 2);
1977 quick_symbol (abfd
, U ("_nm_thnk_"), import
, "", id4
, BSF_GLOBAL
, 0);
1978 quick_symbol (abfd
, U ("_nm_"), import
, "", UNDSEC
, BSF_GLOBAL
, 0);
1980 bfd_set_section_size (abfd
, id4
, 8);
1981 d4
= (unsigned char *) xmalloc (4);
1984 quick_reloc (abfd
, 0, BFD_RELOC_RVA
, 2);
1987 bfd_set_symtab (abfd
, symtab
, symptr
);
1989 bfd_set_section_contents (abfd
, id4
, d4
, 0, 8);
1991 bfd_make_readable (abfd
);
1996 make_import_fixup_mark (rel
)
1999 /* We convert reloc to symbol, for later reference. */
2001 static char *fixup_name
= NULL
;
2002 static size_t buffer_len
= 0;
2004 struct symbol_cache_entry
*sym
= *rel
->sym_ptr_ptr
;
2006 bfd
*abfd
= bfd_asymbol_bfd (sym
);
2007 struct bfd_link_hash_entry
*bh
;
2011 fixup_name
= (char *) xmalloc (384);
2015 if (strlen (sym
->name
) + 25 > buffer_len
)
2016 /* Assume 25 chars for "__fu" + counter + "_". If counter is
2017 bigger than 20 digits long, we've got worse problems than
2018 overflowing this buffer... */
2021 /* New buffer size is length of symbol, plus 25, but
2022 then rounded up to the nearest multiple of 128. */
2023 buffer_len
= ((strlen (sym
->name
) + 25) + 127) & ~127;
2024 fixup_name
= (char *) xmalloc (buffer_len
);
2027 sprintf (fixup_name
, "__fu%d_%s", counter
++, sym
->name
);
2030 bfd_coff_link_add_one_symbol (&link_info
, abfd
, fixup_name
, BSF_GLOBAL
,
2031 current_sec
, /* sym->section, */
2032 rel
->address
, NULL
, TRUE
, FALSE
, &bh
);
2036 struct coff_link_hash_entry
*myh
;
2038 myh
= (struct coff_link_hash_entry
*) bh
;
2039 printf ("type:%d\n", myh
->type
);
2040 printf ("%s\n", myh
->root
.u
.def
.section
->name
);
2046 /* .section .idata$3
2047 .rva __nm_thnk_SYM (singleton thunk with name of func)
2050 .rva __my_dll_iname (name of dll)
2051 .rva __fuNN_SYM (pointer to reference (address) in text) */
2054 make_import_fixup_entry (name
, fixup_name
, dll_symname
, parent
)
2056 const char *fixup_name
;
2057 const char *dll_symname
;
2065 oname
= (char *) xmalloc (20);
2066 sprintf (oname
, "fu%06d.o", tmp_seq
);
2069 abfd
= bfd_create (oname
, parent
);
2070 bfd_find_target (pe_details
->object_target
, abfd
);
2071 bfd_make_writable (abfd
);
2073 bfd_set_format (abfd
, bfd_object
);
2074 bfd_set_arch_mach (abfd
, pe_details
->bfd_arch
, 0);
2077 symtab
= (asymbol
**) xmalloc (6 * sizeof (asymbol
*));
2078 id3
= quick_section (abfd
, ".idata$3", SEC_HAS_CONTENTS
, 2);
2081 quick_symbol (abfd
, U ("_head_"), dll_symname
, "", id2
, BSF_GLOBAL
, 0);
2083 quick_symbol (abfd
, U ("_nm_thnk_"), name
, "", UNDSEC
, BSF_GLOBAL
, 0);
2084 quick_symbol (abfd
, U (""), dll_symname
, "_iname", UNDSEC
, BSF_GLOBAL
, 0);
2085 quick_symbol (abfd
, "", fixup_name
, "", UNDSEC
, BSF_GLOBAL
, 0);
2087 bfd_set_section_size (abfd
, id3
, 20);
2088 d3
= (unsigned char *) xmalloc (20);
2092 quick_reloc (abfd
, 0, BFD_RELOC_RVA
, 1);
2093 quick_reloc (abfd
, 12, BFD_RELOC_RVA
, 2);
2094 quick_reloc (abfd
, 16, BFD_RELOC_RVA
, 3);
2097 bfd_set_symtab (abfd
, symtab
, symptr
);
2099 bfd_set_section_contents (abfd
, id3
, d3
, 0, 20);
2101 bfd_make_readable (abfd
);
2105 /* .section .rdata_runtime_pseudo_reloc
2107 .rva __fuNN_SYM (pointer to reference (address) in text) */
2110 make_runtime_pseudo_reloc (name
, fixup_name
, addend
, parent
)
2111 const char *name ATTRIBUTE_UNUSED
;
2112 const char *fixup_name
;
2117 unsigned char *rt_rel_d
;
2121 oname
= (char *) xmalloc (20);
2122 sprintf (oname
, "rtr%06d.o", tmp_seq
);
2125 abfd
= bfd_create (oname
, parent
);
2126 bfd_find_target (pe_details
->object_target
, abfd
);
2127 bfd_make_writable (abfd
);
2129 bfd_set_format (abfd
, bfd_object
);
2130 bfd_set_arch_mach (abfd
, pe_details
->bfd_arch
, 0);
2133 symtab
= (asymbol
**) xmalloc (2 * sizeof (asymbol
*));
2134 rt_rel
= quick_section (abfd
, ".rdata_runtime_pseudo_reloc", SEC_HAS_CONTENTS
, 2);
2136 quick_symbol (abfd
, "", fixup_name
, "", UNDSEC
, BSF_GLOBAL
, 0);
2138 bfd_set_section_size (abfd
, rt_rel
, 8);
2139 rt_rel_d
= (unsigned char *) xmalloc (8);
2140 rt_rel
->contents
= rt_rel_d
;
2141 memset (rt_rel_d
, 0, 8);
2142 bfd_put_32 (abfd
, addend
, rt_rel_d
);
2144 quick_reloc (abfd
, 4, BFD_RELOC_RVA
, 1);
2145 save_relocs (rt_rel
);
2147 bfd_set_symtab (abfd
, symtab
, symptr
);
2149 bfd_set_section_contents (abfd
, rt_rel
, rt_rel_d
, 0, 8);
2151 bfd_make_readable (abfd
);
2156 .rva __pei386_runtime_relocator */
2159 pe_create_runtime_relocator_reference (parent
)
2162 asection
*extern_rt_rel
;
2163 unsigned char *extern_rt_rel_d
;
2167 oname
= (char *) xmalloc (20);
2168 sprintf (oname
, "ertr%06d.o", tmp_seq
);
2171 abfd
= bfd_create (oname
, parent
);
2172 bfd_find_target (pe_details
->object_target
, abfd
);
2173 bfd_make_writable (abfd
);
2175 bfd_set_format (abfd
, bfd_object
);
2176 bfd_set_arch_mach (abfd
, pe_details
->bfd_arch
, 0);
2179 symtab
= (asymbol
**) xmalloc (2 * sizeof (asymbol
*));
2180 extern_rt_rel
= quick_section (abfd
, ".rdata", SEC_HAS_CONTENTS
, 2);
2182 quick_symbol (abfd
, "", "__pei386_runtime_relocator", "", UNDSEC
, BSF_NO_FLAGS
, 0);
2184 bfd_set_section_size (abfd
, extern_rt_rel
, 4);
2185 extern_rt_rel_d
= (unsigned char *) xmalloc (4);
2186 extern_rt_rel
->contents
= extern_rt_rel_d
;
2188 quick_reloc (abfd
, 0, BFD_RELOC_RVA
, 1);
2189 save_relocs (extern_rt_rel
);
2191 bfd_set_symtab (abfd
, symtab
, symptr
);
2193 bfd_set_section_contents (abfd
, extern_rt_rel
, extern_rt_rel_d
, 0, 4);
2195 bfd_make_readable (abfd
);
2200 pe_create_import_fixup (rel
, s
, addend
)
2206 struct symbol_cache_entry
*sym
= *rel
->sym_ptr_ptr
;
2207 struct bfd_link_hash_entry
*name_thunk_sym
;
2208 const char *name
= sym
->name
;
2209 char *fixup_name
= make_import_fixup_mark (rel
);
2212 sprintf (buf
, U ("_nm_thnk_%s"), name
);
2214 name_thunk_sym
= bfd_link_hash_lookup (link_info
.hash
, buf
, 0, 0, 1);
2216 if (!name_thunk_sym
|| name_thunk_sym
->type
!= bfd_link_hash_defined
)
2218 bfd
*b
= make_singleton_name_thunk (name
, output_bfd
);
2219 add_bfd_to_link (b
, b
->filename
, &link_info
);
2221 /* If we ever use autoimport, we have to cast text section writable. */
2222 config
.text_read_only
= FALSE
;
2225 if (addend
== 0 || link_info
.pei386_runtime_pseudo_reloc
)
2227 extern char * pe_data_import_dll
;
2228 char * dll_symname
= pe_data_import_dll
? pe_data_import_dll
: "unknown";
2230 b
= make_import_fixup_entry (name
, fixup_name
, dll_symname
, output_bfd
);
2231 add_bfd_to_link (b
, b
->filename
, &link_info
);
2236 if (link_info
.pei386_runtime_pseudo_reloc
)
2238 if (pe_dll_extra_pe_debug
)
2239 printf ("creating runtime pseudo-reloc entry for %s (addend=%d)\n",
2240 fixup_name
, addend
);
2241 b
= make_runtime_pseudo_reloc (name
, fixup_name
, addend
, output_bfd
);
2242 add_bfd_to_link (b
, b
->filename
, &link_info
);
2244 if (runtime_pseudo_relocs_created
== 0)
2246 b
= pe_create_runtime_relocator_reference (output_bfd
);
2247 add_bfd_to_link (b
, b
->filename
, &link_info
);
2249 runtime_pseudo_relocs_created
++;
2253 einfo (_("%C: variable '%T' can't be auto-imported. Please read the documentation for ld's --enable-auto-import for details.\n"),
2254 s
->owner
, s
, rel
->address
, sym
->name
);
2262 pe_dll_generate_implib (def
, impfilename
)
2264 const char *impfilename
;
2272 dll_filename
= (def
->name
) ? def
->name
: dll_name
;
2273 dll_symname
= xstrdup (dll_filename
);
2274 for (i
= 0; dll_symname
[i
]; i
++)
2275 if (!ISALNUM (dll_symname
[i
]))
2276 dll_symname
[i
] = '_';
2278 unlink (impfilename
);
2280 outarch
= bfd_openw (impfilename
, 0);
2284 /* xgettext:c-format */
2285 einfo (_("%XCan't open .lib file: %s\n"), impfilename
);
2289 /* xgettext:c-format */
2290 einfo (_("Creating library file: %s\n"), impfilename
);
2292 bfd_set_format (outarch
, bfd_archive
);
2293 outarch
->has_armap
= 1;
2295 /* Work out a reasonable size of things to put onto one line. */
2296 ar_head
= make_head (outarch
);
2298 for (i
= 0; i
< def
->num_exports
; i
++)
2300 /* The import library doesn't know about the internal name. */
2301 char *internal
= def
->exports
[i
].internal_name
;
2304 def
->exports
[i
].internal_name
= def
->exports
[i
].name
;
2305 n
= make_one (def
->exports
+ i
, outarch
);
2308 def
->exports
[i
].internal_name
= internal
;
2311 ar_tail
= make_tail (outarch
);
2313 if (ar_head
== NULL
|| ar_tail
== NULL
)
2316 /* Now stick them all into the archive. */
2317 ar_head
->next
= head
;
2318 ar_tail
->next
= ar_head
;
2321 if (! bfd_set_archive_head (outarch
, head
))
2322 einfo ("%Xbfd_set_archive_head: %s\n", bfd_errmsg (bfd_get_error ()));
2324 if (! bfd_close (outarch
))
2325 einfo ("%Xbfd_close %s: %s\n", impfilename
, bfd_errmsg (bfd_get_error ()));
2327 while (head
!= NULL
)
2329 bfd
*n
= head
->next
;
2336 add_bfd_to_link (abfd
, name
, link_info
)
2339 struct bfd_link_info
*link_info
;
2341 lang_input_statement_type
*fake_file
;
2343 fake_file
= lang_add_input_file (name
,
2344 lang_input_file_is_fake_enum
,
2346 fake_file
->the_bfd
= abfd
;
2347 ldlang_add_file (fake_file
);
2349 if (!bfd_link_add_symbols (abfd
, link_info
))
2350 einfo ("%Xaddsym %s: %s\n", name
, bfd_errmsg (bfd_get_error ()));
2354 pe_process_import_defs (output_bfd
, link_info
)
2356 struct bfd_link_info
*link_info
;
2358 def_file_module
*module
;
2360 pe_dll_id_target (bfd_get_target (output_bfd
));
2365 for (module
= pe_def_file
->modules
; module
; module
= module
->next
)
2369 dll_filename
= module
->name
;
2370 dll_symname
= xstrdup (module
->name
);
2371 for (i
= 0; dll_symname
[i
]; i
++)
2372 if (!ISALNUM (dll_symname
[i
]))
2373 dll_symname
[i
] = '_';
2377 for (i
= 0; i
< pe_def_file
->num_imports
; i
++)
2378 if (pe_def_file
->imports
[i
].module
== module
)
2380 def_file_export exp
;
2381 struct bfd_link_hash_entry
*blhe
;
2382 int lead_at
= (*pe_def_file
->imports
[i
].internal_name
== '@');
2383 /* See if we need this import. */
2384 char *name
= (char *) xmalloc (strlen (pe_def_file
->imports
[i
].internal_name
) + 2 + 6);
2387 sprintf (name
, "%s%s", "", pe_def_file
->imports
[i
].internal_name
);
2389 sprintf (name
, "%s%s",U (""), pe_def_file
->imports
[i
].internal_name
);
2391 blhe
= bfd_link_hash_lookup (link_info
->hash
, name
,
2392 FALSE
, FALSE
, FALSE
);
2394 if (!blhe
|| (blhe
&& blhe
->type
!= bfd_link_hash_undefined
))
2397 sprintf (name
, "%s%s", U ("_imp_"),
2398 pe_def_file
->imports
[i
].internal_name
);
2400 sprintf (name
, "%s%s", U ("_imp__"),
2401 pe_def_file
->imports
[i
].internal_name
);
2403 blhe
= bfd_link_hash_lookup (link_info
->hash
, name
,
2404 FALSE
, FALSE
, FALSE
);
2408 if (blhe
&& blhe
->type
== bfd_link_hash_undefined
)
2414 bfd
*ar_head
= make_head (output_bfd
);
2415 add_bfd_to_link (ar_head
, ar_head
->filename
, link_info
);
2418 exp
.internal_name
= pe_def_file
->imports
[i
].internal_name
;
2419 exp
.name
= pe_def_file
->imports
[i
].name
;
2420 exp
.ordinal
= pe_def_file
->imports
[i
].ordinal
;
2421 exp
.hint
= exp
.ordinal
>= 0 ? exp
.ordinal
: 0;
2422 exp
.flag_private
= 0;
2423 exp
.flag_constant
= 0;
2424 exp
.flag_data
= pe_def_file
->imports
[i
].data
;
2425 exp
.flag_noname
= exp
.name
? 0 : 1;
2426 one
= make_one (&exp
, output_bfd
);
2427 add_bfd_to_link (one
, one
->filename
, link_info
);
2432 bfd
*ar_tail
= make_tail (output_bfd
);
2433 add_bfd_to_link (ar_tail
, ar_tail
->filename
, link_info
);
2440 /* We were handed a *.DLL file. Parse it and turn it into a set of
2441 IMPORTS directives in the def file. Return TRUE if the file was
2442 handled, FALSE if not. */
2445 pe_get16 (abfd
, where
)
2451 bfd_seek (abfd
, (file_ptr
) where
, SEEK_SET
);
2452 bfd_bread (b
, (bfd_size_type
) 2, abfd
);
2453 return b
[0] + (b
[1] << 8);
2457 pe_get32 (abfd
, where
)
2463 bfd_seek (abfd
, (file_ptr
) where
, SEEK_SET
);
2464 bfd_bread (b
, (bfd_size_type
) 4, abfd
);
2465 return b
[0] + (b
[1] << 8) + (b
[2] << 16) + (b
[3] << 24);
2468 #if 0 /* This is not currently used. */
2474 unsigned char *b
= ptr
;
2476 return b
[0] + (b
[1] << 8);
2485 unsigned char *b
= ptr
;
2487 return b
[0] + (b
[1] << 8) + (b
[2] << 16) + (b
[3] << 24);
2491 pe_implied_import_dll (filename
)
2492 const char *filename
;
2495 unsigned long pe_header_offset
, opthdr_ofs
, num_entries
, i
;
2496 unsigned long export_rva
, export_size
, nsections
, secptr
, expptr
;
2497 unsigned long exp_funcbase
;
2498 unsigned char *expdata
, *erva
;
2499 unsigned long name_rvas
, ordinals
, nexp
, ordbase
;
2500 const char *dll_name
;
2501 /* Initialization with start > end guarantees that is_data
2502 will not be set by mistake, and avoids compiler warning. */
2503 unsigned long data_start
= 1;
2504 unsigned long data_end
= 0;
2505 unsigned long bss_start
= 1;
2506 unsigned long bss_end
= 0;
2508 /* No, I can't use bfd here. kernel32.dll puts its export table in
2509 the middle of the .rdata section. */
2510 dll
= bfd_openr (filename
, pe_details
->target_name
);
2513 einfo ("%Xopen %s: %s\n", filename
, bfd_errmsg (bfd_get_error ()));
2517 /* PEI dlls seem to be bfd_objects. */
2518 if (!bfd_check_format (dll
, bfd_object
))
2520 einfo ("%X%s: this doesn't appear to be a DLL\n", filename
);
2524 /* Get pe_header, optional header and numbers of export entries. */
2525 pe_header_offset
= pe_get32 (dll
, 0x3c);
2526 opthdr_ofs
= pe_header_offset
+ 4 + 20;
2527 num_entries
= pe_get32 (dll
, opthdr_ofs
+ 92);
2529 if (num_entries
< 1) /* No exports. */
2532 export_rva
= pe_get32 (dll
, opthdr_ofs
+ 96);
2533 export_size
= pe_get32 (dll
, opthdr_ofs
+ 100);
2534 nsections
= pe_get16 (dll
, pe_header_offset
+ 4 + 2);
2535 secptr
= (pe_header_offset
+ 4 + 20 +
2536 pe_get16 (dll
, pe_header_offset
+ 4 + 16));
2539 /* Get the rva and size of the export section. */
2540 for (i
= 0; i
< nsections
; i
++)
2543 unsigned long secptr1
= secptr
+ 40 * i
;
2544 unsigned long vaddr
= pe_get32 (dll
, secptr1
+ 12);
2545 unsigned long vsize
= pe_get32 (dll
, secptr1
+ 16);
2546 unsigned long fptr
= pe_get32 (dll
, secptr1
+ 20);
2548 bfd_seek (dll
, (file_ptr
) secptr1
, SEEK_SET
);
2549 bfd_bread (sname
, (bfd_size_type
) 8, dll
);
2551 if (vaddr
<= export_rva
&& vaddr
+ vsize
> export_rva
)
2553 expptr
= fptr
+ (export_rva
- vaddr
);
2554 if (export_rva
+ export_size
> vaddr
+ vsize
)
2555 export_size
= vsize
- (export_rva
- vaddr
);
2560 /* Scan sections and store the base and size of the
2561 data and bss segments in data/base_start/end. */
2562 for (i
= 0; i
< nsections
; i
++)
2564 unsigned long secptr1
= secptr
+ 40 * i
;
2565 unsigned long vsize
= pe_get32 (dll
, secptr1
+ 8);
2566 unsigned long vaddr
= pe_get32 (dll
, secptr1
+ 12);
2567 unsigned long flags
= pe_get32 (dll
, secptr1
+ 36);
2571 bfd_seek (dll
, (file_ptr
) secptr1
+ 0, SEEK_SET
);
2572 bfd_bread (sec_name
, (bfd_size_type
) 8, dll
);
2574 if (strcmp(sec_name
,".data") == 0)
2577 data_end
= vaddr
+ vsize
;
2579 if (pe_dll_extra_pe_debug
)
2580 printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n",
2581 __FUNCTION__
, sec_name
, vaddr
, vaddr
+ vsize
, flags
);
2583 else if (strcmp (sec_name
,".bss") == 0)
2586 bss_end
= vaddr
+ vsize
;
2588 if (pe_dll_extra_pe_debug
)
2589 printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n",
2590 __FUNCTION__
, sec_name
, vaddr
, vaddr
+ vsize
, flags
);
2594 expdata
= (unsigned char *) xmalloc (export_size
);
2595 bfd_seek (dll
, (file_ptr
) expptr
, SEEK_SET
);
2596 bfd_bread (expdata
, (bfd_size_type
) export_size
, dll
);
2597 erva
= expdata
- export_rva
;
2599 if (pe_def_file
== 0)
2600 pe_def_file
= def_file_empty ();
2602 nexp
= pe_as32 (expdata
+ 24);
2603 name_rvas
= pe_as32 (expdata
+ 32);
2604 ordinals
= pe_as32 (expdata
+ 36);
2605 ordbase
= pe_as32 (expdata
+ 16);
2606 exp_funcbase
= pe_as32 (expdata
+ 28);
2608 /* Use internal dll name instead of filename
2609 to enable symbolic dll linking. */
2610 dll_name
= pe_as32 (expdata
+ 12) + erva
;
2612 /* Check to see if the dll has already been added to
2613 the definition list and if so return without error.
2614 This avoids multiple symbol definitions. */
2615 if (def_get_module (pe_def_file
, dll_name
))
2617 if (pe_dll_extra_pe_debug
)
2618 printf ("%s is already loaded\n", dll_name
);
2622 /* Iterate through the list of symbols. */
2623 for (i
= 0; i
< nexp
; i
++)
2625 /* Pointer to the names vector. */
2626 unsigned long name_rva
= pe_as32 (erva
+ name_rvas
+ i
* 4);
2627 def_file_import
*imp
;
2628 /* Pointer to the function address vector. */
2629 unsigned long func_rva
= pe_as32 (erva
+ exp_funcbase
+ i
* 4);
2632 /* Skip unwanted symbols, which are
2633 exported in buggy auto-import releases. */
2634 if (strncmp (erva
+ name_rva
, "_nm_", 4) != 0)
2636 /* is_data is true if the address is in the data or bss segment. */
2638 (func_rva
>= data_start
&& func_rva
< data_end
)
2639 || (func_rva
>= bss_start
&& func_rva
< bss_end
);
2641 imp
= def_file_add_import (pe_def_file
, erva
+ name_rva
,
2643 /* Mark symbol type. */
2644 imp
->data
= is_data
;
2646 if (pe_dll_extra_pe_debug
)
2647 printf ("%s dll-name: %s sym: %s addr: 0x%lx %s\n",
2648 __FUNCTION__
, dll_name
, erva
+ name_rva
,
2649 func_rva
, is_data
? "(data)" : "");
2656 /* These are the main functions, called from the emulation. The first
2657 is called after the bfds are read, so we can guess at how much space
2658 we need. The second is called after everything is placed, so we
2659 can put the right values in place. */
2662 pe_dll_build_sections (abfd
, info
)
2664 struct bfd_link_info
*info
;
2666 pe_dll_id_target (bfd_get_target (abfd
));
2667 process_def_file (abfd
, info
);
2669 generate_edata (abfd
, info
);
2670 build_filler_bfd (1);
2674 pe_exe_build_sections (abfd
, info
)
2676 struct bfd_link_info
*info ATTRIBUTE_UNUSED
;
2678 pe_dll_id_target (bfd_get_target (abfd
));
2679 build_filler_bfd (0);
2683 pe_dll_fill_sections (abfd
, info
)
2685 struct bfd_link_info
*info
;
2687 pe_dll_id_target (bfd_get_target (abfd
));
2688 image_base
= pe_data (abfd
)->pe_opthdr
.ImageBase
;
2690 generate_reloc (abfd
, info
);
2693 bfd_set_section_size (filler_bfd
, reloc_s
, reloc_sz
);
2695 /* Resize the sections. */
2696 lang_size_sections (stat_ptr
->head
, abs_output_section
,
2697 &stat_ptr
->head
, 0, (bfd_vma
) 0, NULL
);
2699 /* Redo special stuff. */
2700 ldemul_after_allocation ();
2702 /* Do the assignments again. */
2703 lang_do_assignments (stat_ptr
->head
,
2705 (fill_type
*) 0, (bfd_vma
) 0);
2708 fill_edata (abfd
, info
);
2710 pe_data (abfd
)->dll
= 1;
2712 edata_s
->contents
= edata_d
;
2713 reloc_s
->contents
= reloc_d
;
2717 pe_exe_fill_sections (abfd
, info
)
2719 struct bfd_link_info
*info
;
2721 pe_dll_id_target (bfd_get_target (abfd
));
2722 image_base
= pe_data (abfd
)->pe_opthdr
.ImageBase
;
2724 generate_reloc (abfd
, info
);
2727 bfd_set_section_size (filler_bfd
, reloc_s
, reloc_sz
);
2729 /* Resize the sections. */
2730 lang_size_sections (stat_ptr
->head
, abs_output_section
,
2731 &stat_ptr
->head
, 0, (bfd_vma
) 0, NULL
);
2733 /* Redo special stuff. */
2734 ldemul_after_allocation ();
2736 /* Do the assignments again. */
2737 lang_do_assignments (stat_ptr
->head
,
2739 (fill_type
*) 0, (bfd_vma
) 0);
2741 reloc_s
->contents
= reloc_d
;