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 /* If we are not building a DLL, when there are no exports
568 we do not build an export table at all. */
569 if (!pe_dll_export_everything
&& pe_def_file
->num_exports
== 0
573 /* Now, maybe export everything else the default way. */
574 if (pe_dll_export_everything
|| pe_def_file
->num_exports
== 0)
576 for (b
= info
->input_bfds
; b
; b
= b
->link_next
)
581 symsize
= bfd_get_symtab_upper_bound (b
);
582 symbols
= (asymbol
**) xmalloc (symsize
);
583 nsyms
= bfd_canonicalize_symtab (b
, symbols
);
585 for (j
= 0; j
< nsyms
; j
++)
587 /* We should export symbols which are either global or not
588 anything at all. (.bss data is the latter)
589 We should not export undefined symbols. */
590 if (symbols
[j
]->section
!= &bfd_und_section
591 && ((symbols
[j
]->flags
& BSF_GLOBAL
)
592 || (symbols
[j
]->flags
== BFD_FORT_COMM_DEFAULT_VALUE
)))
594 const char *sn
= symbols
[j
]->name
;
596 /* We should not re-export imported stuff. */
598 char *name
= (char *) xmalloc (strlen (sn
) + 2 + 6);
599 sprintf (name
, "%s%s", U("_imp_"), sn
);
601 blhe
= bfd_link_hash_lookup (info
->hash
, name
,
602 FALSE
, FALSE
, FALSE
);
605 if (blhe
&& blhe
->type
== bfd_link_hash_defined
)
612 if (auto_export (b
, pe_def_file
, sn
))
615 p
=def_file_add_export (pe_def_file
, sn
, 0, -1);
616 /* Fill data flag properly, from dlltool.c. */
617 p
->flag_data
= !(symbols
[j
]->flags
& BSF_FUNCTION
);
625 #define NE pe_def_file->num_exports
627 /* Canonicalize the export list. */
630 for (i
= 0; i
< NE
; i
++)
632 if (strchr (pe_def_file
->exports
[i
].name
, '@'))
634 /* This will preserve internal_name, which may have been
635 pointing to the same memory as name, or might not
637 int lead_at
= (*pe_def_file
->exports
[i
].name
=='@');
638 char *tmp
= xstrdup (pe_def_file
->exports
[i
].name
+ lead_at
);
640 *(strchr (tmp
, '@')) = 0;
641 pe_def_file
->exports
[i
].name
= tmp
;
646 if (pe_dll_stdcall_aliases
)
648 for (i
= 0; i
< NE
; i
++)
650 if (strchr (pe_def_file
->exports
[i
].name
, '@'))
652 int lead_at
= (*pe_def_file
->exports
[i
].name
== '@' ) ;
653 char *tmp
= xstrdup (pe_def_file
->exports
[i
].name
+ lead_at
);
655 *(strchr (tmp
, '@')) = 0;
656 if (auto_export (NULL
, pe_def_file
, tmp
))
657 def_file_add_export (pe_def_file
, tmp
,
658 pe_def_file
->exports
[i
].internal_name
,
666 /* Convenience, but watch out for it changing. */
667 e
= pe_def_file
->exports
;
669 exported_symbol_offsets
= (bfd_vma
*) xmalloc (NE
* sizeof (bfd_vma
));
670 exported_symbol_sections
= (struct sec
**) xmalloc (NE
* sizeof (struct sec
*));
672 memset (exported_symbol_sections
, 0, NE
* sizeof (struct sec
*));
676 count_exported_byname
= 0;
677 count_with_ordinals
= 0;
679 qsort (pe_def_file
->exports
, NE
, sizeof (pe_def_file
->exports
[0]), pe_export_sort
);
680 for (i
= 0, j
= 0; i
< NE
; i
++)
682 if (i
> 0 && strcmp (e
[i
].name
, e
[i
- 1].name
) == 0)
684 /* This is a duplicate. */
685 if (e
[j
- 1].ordinal
!= -1
686 && e
[i
].ordinal
!= -1
687 && e
[j
- 1].ordinal
!= e
[i
].ordinal
)
689 if (pe_dll_warn_dup_exports
)
690 /* xgettext:c-format */
691 einfo (_("%XError, duplicate EXPORT with ordinals: %s (%d vs %d)\n"),
692 e
[j
- 1].name
, e
[j
- 1].ordinal
, e
[i
].ordinal
);
696 if (pe_dll_warn_dup_exports
)
697 /* xgettext:c-format */
698 einfo (_("Warning, duplicate EXPORT: %s\n"),
702 if (e
[i
].ordinal
!= -1)
703 e
[j
- 1].ordinal
= e
[i
].ordinal
;
704 e
[j
- 1].flag_private
|= e
[i
].flag_private
;
705 e
[j
- 1].flag_constant
|= e
[i
].flag_constant
;
706 e
[j
- 1].flag_noname
|= e
[i
].flag_noname
;
707 e
[j
- 1].flag_data
|= e
[i
].flag_data
;
716 pe_def_file
->num_exports
= j
; /* == NE */
718 for (i
= 0; i
< NE
; i
++)
720 char *name
= (char *) xmalloc (strlen (pe_def_file
->exports
[i
].internal_name
) + 2);
722 if (pe_details
->underscored
723 && (*pe_def_file
->exports
[i
].internal_name
!= '@'))
726 strcpy (name
+ 1, pe_def_file
->exports
[i
].internal_name
);
729 strcpy (name
, pe_def_file
->exports
[i
].internal_name
);
731 blhe
= bfd_link_hash_lookup (info
->hash
,
736 && (blhe
->type
== bfd_link_hash_defined
737 || (blhe
->type
== bfd_link_hash_common
)))
740 if (!pe_def_file
->exports
[i
].flag_noname
)
741 count_exported_byname
++;
743 /* Only fill in the sections. The actual offsets are computed
744 in fill_exported_offsets() after common symbols are laid
746 if (blhe
->type
== bfd_link_hash_defined
)
747 exported_symbol_sections
[i
] = blhe
->u
.def
.section
;
749 exported_symbol_sections
[i
] = blhe
->u
.c
.p
->section
;
751 if (pe_def_file
->exports
[i
].ordinal
!= -1)
753 if (max_ordinal
< pe_def_file
->exports
[i
].ordinal
)
754 max_ordinal
= pe_def_file
->exports
[i
].ordinal
;
755 if (min_ordinal
> pe_def_file
->exports
[i
].ordinal
)
756 min_ordinal
= pe_def_file
->exports
[i
].ordinal
;
757 count_with_ordinals
++;
760 else if (blhe
&& blhe
->type
== bfd_link_hash_undefined
)
762 /* xgettext:c-format */
763 einfo (_("%XCannot export %s: symbol not defined\n"),
764 pe_def_file
->exports
[i
].internal_name
);
768 /* xgettext:c-format */
769 einfo (_("%XCannot export %s: symbol wrong type (%d vs %d)\n"),
770 pe_def_file
->exports
[i
].internal_name
,
771 blhe
->type
, bfd_link_hash_defined
);
775 /* xgettext:c-format */
776 einfo (_("%XCannot export %s: symbol not found\n"),
777 pe_def_file
->exports
[i
].internal_name
);
783 /* Build the bfd that will contain .edata and .reloc sections. */
786 build_filler_bfd (include_edata
)
789 lang_input_statement_type
*filler_file
;
790 filler_file
= lang_add_input_file ("dll stuff",
791 lang_input_file_is_fake_enum
,
793 filler_file
->the_bfd
= filler_bfd
= bfd_create ("dll stuff", output_bfd
);
794 if (filler_bfd
== NULL
795 || !bfd_set_arch_mach (filler_bfd
,
796 bfd_get_arch (output_bfd
),
797 bfd_get_mach (output_bfd
)))
799 einfo ("%X%P: can not create BFD %E\n");
805 edata_s
= bfd_make_section_old_way (filler_bfd
, ".edata");
807 || !bfd_set_section_flags (filler_bfd
, edata_s
,
814 einfo ("%X%P: can not create .edata section: %E\n");
817 bfd_set_section_size (filler_bfd
, edata_s
, edata_sz
);
820 reloc_s
= bfd_make_section_old_way (filler_bfd
, ".reloc");
822 || !bfd_set_section_flags (filler_bfd
, reloc_s
,
829 einfo ("%X%P: can not create .reloc section: %E\n");
833 bfd_set_section_size (filler_bfd
, reloc_s
, 0);
835 ldlang_add_file (filler_file
);
838 /* Gather all the exported symbols and build the .edata section. */
841 generate_edata (abfd
, info
)
843 struct bfd_link_info
*info ATTRIBUTE_UNUSED
;
846 int name_table_size
= 0;
849 /* First, we need to know how many exported symbols there are,
850 and what the range of ordinals is. */
851 if (pe_def_file
->name
)
852 dll_name
= pe_def_file
->name
;
855 dll_name
= abfd
->filename
;
857 for (dlnp
= dll_name
; *dlnp
; dlnp
++)
858 if (*dlnp
== '\\' || *dlnp
== '/' || *dlnp
== ':')
862 if (count_with_ordinals
&& max_ordinal
> count_exported
)
864 if (min_ordinal
> max_ordinal
- count_exported
+ 1)
865 min_ordinal
= max_ordinal
- count_exported
+ 1;
870 max_ordinal
= count_exported
;
873 export_table_size
= max_ordinal
- min_ordinal
+ 1;
874 exported_symbols
= (int *) xmalloc (export_table_size
* sizeof (int));
875 for (i
= 0; i
< export_table_size
; i
++)
876 exported_symbols
[i
] = -1;
878 /* Now we need to assign ordinals to those that don't have them. */
879 for (i
= 0; i
< NE
; i
++)
881 if (exported_symbol_sections
[i
])
883 if (pe_def_file
->exports
[i
].ordinal
!= -1)
885 int ei
= pe_def_file
->exports
[i
].ordinal
- min_ordinal
;
886 int pi
= exported_symbols
[ei
];
890 /* xgettext:c-format */
891 einfo (_("%XError, ordinal used twice: %d (%s vs %s)\n"),
892 pe_def_file
->exports
[i
].ordinal
,
893 pe_def_file
->exports
[i
].name
,
894 pe_def_file
->exports
[pi
].name
);
896 exported_symbols
[ei
] = i
;
898 name_table_size
+= strlen (pe_def_file
->exports
[i
].name
) + 1;
902 next_ordinal
= min_ordinal
;
903 for (i
= 0; i
< NE
; i
++)
904 if (exported_symbol_sections
[i
])
905 if (pe_def_file
->exports
[i
].ordinal
== -1)
907 while (exported_symbols
[next_ordinal
- min_ordinal
] != -1)
910 exported_symbols
[next_ordinal
- min_ordinal
] = i
;
911 pe_def_file
->exports
[i
].ordinal
= next_ordinal
;
914 /* OK, now we can allocate some memory. */
915 edata_sz
= (40 /* directory */
916 + 4 * export_table_size
/* addresses */
917 + 4 * count_exported_byname
/* name ptrs */
918 + 2 * count_exported_byname
/* ordinals */
919 + name_table_size
+ strlen (dll_name
) + 1);
922 /* Fill the exported symbol offsets. The preliminary work has already
923 been done in process_def_file(). */
926 fill_exported_offsets (abfd
, info
)
927 bfd
*abfd ATTRIBUTE_UNUSED
;
928 struct bfd_link_info
*info
;
931 struct bfd_link_hash_entry
*blhe
;
933 for (i
= 0; i
< pe_def_file
->num_exports
; i
++)
935 char *name
= (char *) xmalloc (strlen (pe_def_file
->exports
[i
].internal_name
) + 2);
937 if (pe_details
->underscored
938 && (*pe_def_file
->exports
[i
].internal_name
!= '@'))
941 strcpy (name
+ 1, pe_def_file
->exports
[i
].internal_name
);
944 strcpy (name
, pe_def_file
->exports
[i
].internal_name
);
946 blhe
= bfd_link_hash_lookup (info
->hash
,
950 if (blhe
&& (blhe
->type
== bfd_link_hash_defined
))
951 exported_symbol_offsets
[i
] = blhe
->u
.def
.value
;
958 fill_edata (abfd
, info
)
960 struct bfd_link_info
*info ATTRIBUTE_UNUSED
;
963 unsigned char *edirectory
;
964 unsigned long *eaddresses
;
965 unsigned long *enameptrs
;
966 unsigned short *eordinals
;
967 unsigned char *enamestr
;
972 edata_d
= (unsigned char *) xmalloc (edata_sz
);
974 /* Note use of array pointer math here. */
975 edirectory
= edata_d
;
976 eaddresses
= (unsigned long *) (edata_d
+ 40);
977 enameptrs
= eaddresses
+ export_table_size
;
978 eordinals
= (unsigned short *) (enameptrs
+ count_exported_byname
);
979 enamestr
= (char *) (eordinals
+ count_exported_byname
);
981 #define ERVA(ptr) (((unsigned char *)(ptr) - edata_d) + edata_s->output_section->vma - image_base)
983 memset (edata_d
, 0, edata_sz
);
984 bfd_put_32 (abfd
, now
, edata_d
+ 4);
985 if (pe_def_file
->version_major
!= -1)
987 bfd_put_16 (abfd
, pe_def_file
->version_major
, edata_d
+ 8);
988 bfd_put_16 (abfd
, pe_def_file
->version_minor
, edata_d
+ 10);
991 bfd_put_32 (abfd
, ERVA (enamestr
), edata_d
+ 12);
992 strcpy (enamestr
, dll_name
);
993 enamestr
+= strlen (enamestr
) + 1;
994 bfd_put_32 (abfd
, min_ordinal
, edata_d
+ 16);
995 bfd_put_32 (abfd
, export_table_size
, edata_d
+ 20);
996 bfd_put_32 (abfd
, count_exported_byname
, edata_d
+ 24);
997 bfd_put_32 (abfd
, ERVA (eaddresses
), edata_d
+ 28);
998 bfd_put_32 (abfd
, ERVA (enameptrs
), edata_d
+ 32);
999 bfd_put_32 (abfd
, ERVA (eordinals
), edata_d
+ 36);
1001 fill_exported_offsets (abfd
, info
);
1003 /* Ok, now for the filling in part. */
1005 for (i
= 0; i
< export_table_size
; i
++)
1007 int s
= exported_symbols
[i
];
1011 struct sec
*ssec
= exported_symbol_sections
[s
];
1012 unsigned long srva
= (exported_symbol_offsets
[s
]
1013 + ssec
->output_section
->vma
1014 + ssec
->output_offset
);
1015 int ord
= pe_def_file
->exports
[s
].ordinal
;
1017 bfd_put_32 (abfd
, srva
- image_base
,
1018 (void *) (eaddresses
+ ord
- min_ordinal
));
1020 if (!pe_def_file
->exports
[s
].flag_noname
)
1022 char *ename
= pe_def_file
->exports
[s
].name
;
1023 bfd_put_32 (abfd
, ERVA (enamestr
), (void *) enameptrs
);
1025 strcpy (enamestr
, ename
);
1026 enamestr
+= strlen (enamestr
) + 1;
1027 bfd_put_16 (abfd
, ord
- min_ordinal
, (void *) eordinals
);
1029 pe_def_file
->exports
[s
].hint
= hint
++;
1036 static struct sec
*current_sec
;
1039 pe_walk_relocs_of_symbol (info
, name
, cb
)
1040 struct bfd_link_info
*info
;
1042 int (*cb
) (arelent
*, asection
*);
1047 for (b
= info
->input_bfds
; b
; b
= b
->link_next
)
1052 symsize
= bfd_get_symtab_upper_bound (b
);
1053 symbols
= (asymbol
**) xmalloc (symsize
);
1054 nsyms
= bfd_canonicalize_symtab (b
, symbols
);
1056 for (s
= b
->sections
; s
; s
= s
->next
)
1059 int relsize
, nrelocs
, i
;
1060 int flags
= bfd_get_section_flags (b
, s
);
1062 /* Skip discarded linkonce sections. */
1063 if (flags
& SEC_LINK_ONCE
1064 && s
->output_section
== bfd_abs_section_ptr
)
1069 relsize
= bfd_get_reloc_upper_bound (b
, s
);
1070 relocs
= (arelent
**) xmalloc ((size_t) relsize
);
1071 nrelocs
= bfd_canonicalize_reloc (b
, s
, relocs
, symbols
);
1073 for (i
= 0; i
< nrelocs
; i
++)
1075 struct symbol_cache_entry
*sym
= *relocs
[i
]->sym_ptr_ptr
;
1077 if (!strcmp (name
, sym
->name
))
1083 /* Warning: the allocated symbols are remembered in BFD and reused
1084 later, so don't free them! */
1085 /* free (symbols); */
1090 /* Gather all the relocations and build the .reloc section. */
1093 generate_reloc (abfd
, info
)
1095 struct bfd_link_info
*info
;
1098 /* For .reloc stuff. */
1099 reloc_data_type
*reloc_data
;
1100 int total_relocs
= 0;
1102 unsigned long sec_page
= (unsigned long) (-1);
1103 unsigned long page_ptr
, page_count
;
1109 for (b
= info
->input_bfds
; b
; b
= b
->link_next
)
1110 for (s
= b
->sections
; s
; s
= s
->next
)
1111 total_relocs
+= s
->reloc_count
;
1114 (reloc_data_type
*) xmalloc (total_relocs
* sizeof (reloc_data_type
));
1118 for (bi
= 0, b
= info
->input_bfds
; b
; bi
++, b
= b
->link_next
)
1121 int relsize
, nrelocs
, i
;
1123 for (s
= b
->sections
; s
; s
= s
->next
)
1125 unsigned long sec_vma
= s
->output_section
->vma
+ s
->output_offset
;
1129 /* If it's not loaded, we don't need to relocate it this way. */
1130 if (!(s
->output_section
->flags
& SEC_LOAD
))
1133 /* I don't know why there would be a reloc for these, but I've
1134 seen it happen - DJ */
1135 if (s
->output_section
== &bfd_abs_section
)
1138 if (s
->output_section
->vma
== 0)
1140 /* Huh? Shouldn't happen, but punt if it does. */
1141 einfo ("DJ: zero vma section reloc detected: `%s' #%d f=%d\n",
1142 s
->output_section
->name
, s
->output_section
->index
,
1143 s
->output_section
->flags
);
1147 symsize
= bfd_get_symtab_upper_bound (b
);
1148 symbols
= (asymbol
**) xmalloc (symsize
);
1149 nsyms
= bfd_canonicalize_symtab (b
, symbols
);
1151 relsize
= bfd_get_reloc_upper_bound (b
, s
);
1152 relocs
= (arelent
**) xmalloc ((size_t) relsize
);
1153 nrelocs
= bfd_canonicalize_reloc (b
, s
, relocs
, symbols
);
1155 for (i
= 0; i
< nrelocs
; i
++)
1157 if (pe_dll_extra_pe_debug
)
1159 struct symbol_cache_entry
*sym
= *relocs
[i
]->sym_ptr_ptr
;
1160 printf ("rel: %s\n", sym
->name
);
1162 if (!relocs
[i
]->howto
->pc_relative
1163 && relocs
[i
]->howto
->type
!= pe_details
->imagebase_reloc
)
1166 struct symbol_cache_entry
*sym
= *relocs
[i
]->sym_ptr_ptr
;
1168 sym_vma
= (relocs
[i
]->addend
1171 + sym
->section
->output_offset
1172 + sym
->section
->output_section
->vma
);
1173 reloc_data
[total_relocs
].vma
= sec_vma
+ relocs
[i
]->address
;
1175 #define BITS_AND_SHIFT(bits, shift) (bits * 1000 | shift)
1177 switch BITS_AND_SHIFT (relocs
[i
]->howto
->bitsize
,
1178 relocs
[i
]->howto
->rightshift
)
1180 case BITS_AND_SHIFT (32, 0):
1181 reloc_data
[total_relocs
].type
= 3;
1184 case BITS_AND_SHIFT (16, 0):
1185 reloc_data
[total_relocs
].type
= 2;
1188 case BITS_AND_SHIFT (16, 16):
1189 reloc_data
[total_relocs
].type
= 4;
1190 /* FIXME: we can't know the symbol's right value
1191 yet, but we probably can safely assume that
1192 CE will relocate us in 64k blocks, so leaving
1194 reloc_data
[total_relocs
].extra
= 0;
1197 case BITS_AND_SHIFT (26, 2):
1198 reloc_data
[total_relocs
].type
= 5;
1202 /* xgettext:c-format */
1203 einfo (_("%XError: %d-bit reloc in dll\n"),
1204 relocs
[i
]->howto
->bitsize
);
1210 /* Warning: the allocated symbols are remembered in BFD and
1211 reused later, so don't free them! */
1218 /* At this point, we have total_relocs relocation addresses in
1219 reloc_addresses, which are all suitable for the .reloc section.
1220 We must now create the new sections. */
1221 qsort (reloc_data
, total_relocs
, sizeof (*reloc_data
), reloc_sort
);
1223 for (i
= 0; i
< total_relocs
; i
++)
1225 unsigned long this_page
= (reloc_data
[i
].vma
>> 12);
1227 if (this_page
!= sec_page
)
1229 reloc_sz
= (reloc_sz
+ 3) & ~3; /* 4-byte align. */
1231 sec_page
= this_page
;
1236 if (reloc_data
[i
].type
== 4)
1240 reloc_sz
= (reloc_sz
+ 3) & ~3; /* 4-byte align. */
1241 reloc_d
= (unsigned char *) xmalloc (reloc_sz
);
1242 sec_page
= (unsigned long) (-1);
1244 page_ptr
= (unsigned long) (-1);
1247 for (i
= 0; i
< total_relocs
; i
++)
1249 unsigned long rva
= reloc_data
[i
].vma
- image_base
;
1250 unsigned long this_page
= (rva
& ~0xfff);
1252 if (this_page
!= sec_page
)
1254 while (reloc_sz
& 3)
1255 reloc_d
[reloc_sz
++] = 0;
1257 if (page_ptr
!= (unsigned long) (-1))
1258 bfd_put_32 (abfd
, reloc_sz
- page_ptr
, reloc_d
+ page_ptr
+ 4);
1260 bfd_put_32 (abfd
, this_page
, reloc_d
+ reloc_sz
);
1261 page_ptr
= reloc_sz
;
1263 sec_page
= this_page
;
1267 bfd_put_16 (abfd
, (rva
& 0xfff) + (reloc_data
[i
].type
<< 12),
1268 reloc_d
+ reloc_sz
);
1271 if (reloc_data
[i
].type
== 4)
1273 bfd_put_16 (abfd
, reloc_data
[i
].extra
, reloc_d
+ reloc_sz
);
1280 while (reloc_sz
& 3)
1281 reloc_d
[reloc_sz
++] = 0;
1283 if (page_ptr
!= (unsigned long) (-1))
1284 bfd_put_32 (abfd
, reloc_sz
- page_ptr
, reloc_d
+ page_ptr
+ 4);
1286 while (reloc_sz
< reloc_s
->_raw_size
)
1287 reloc_d
[reloc_sz
++] = 0;
1290 /* Given the exiting def_file structure, print out a .DEF file that
1291 corresponds to it. */
1294 quoteput (s
, f
, needs_quotes
)
1301 for (cp
= s
; *cp
; cp
++)
1316 if (*s
== '"' || *s
== '\\')
1330 pe_dll_generate_def_file (pe_out_def_filename
)
1331 const char *pe_out_def_filename
;
1334 FILE *out
= fopen (pe_out_def_filename
, "w");
1337 /* xgettext:c-format */
1338 einfo (_("%s: Can't open output def file %s\n"),
1339 program_name
, pe_out_def_filename
);
1343 if (pe_def_file
->name
)
1345 if (pe_def_file
->is_dll
)
1346 fprintf (out
, "LIBRARY ");
1348 fprintf (out
, "NAME ");
1350 quoteput (pe_def_file
->name
, out
, 1);
1352 if (pe_data (output_bfd
)->pe_opthdr
.ImageBase
)
1353 fprintf (out
, " BASE=0x%lx",
1354 (unsigned long) pe_data (output_bfd
)->pe_opthdr
.ImageBase
);
1355 fprintf (out
, "\n");
1358 if (pe_def_file
->description
)
1360 fprintf (out
, "DESCRIPTION ");
1361 quoteput (pe_def_file
->description
, out
, 1);
1362 fprintf (out
, "\n");
1365 if (pe_def_file
->version_minor
!= -1)
1366 fprintf (out
, "VERSION %d.%d\n", pe_def_file
->version_major
,
1367 pe_def_file
->version_minor
);
1368 else if (pe_def_file
->version_major
!= -1)
1369 fprintf (out
, "VERSION %d\n", pe_def_file
->version_major
);
1371 if (pe_def_file
->stack_reserve
!= -1 || pe_def_file
->heap_reserve
!= -1)
1372 fprintf (out
, "\n");
1374 if (pe_def_file
->stack_commit
!= -1)
1375 fprintf (out
, "STACKSIZE 0x%x,0x%x\n",
1376 pe_def_file
->stack_reserve
, pe_def_file
->stack_commit
);
1377 else if (pe_def_file
->stack_reserve
!= -1)
1378 fprintf (out
, "STACKSIZE 0x%x\n", pe_def_file
->stack_reserve
);
1380 if (pe_def_file
->heap_commit
!= -1)
1381 fprintf (out
, "HEAPSIZE 0x%x,0x%x\n",
1382 pe_def_file
->heap_reserve
, pe_def_file
->heap_commit
);
1383 else if (pe_def_file
->heap_reserve
!= -1)
1384 fprintf (out
, "HEAPSIZE 0x%x\n", pe_def_file
->heap_reserve
);
1386 if (pe_def_file
->num_section_defs
> 0)
1388 fprintf (out
, "\nSECTIONS\n\n");
1390 for (i
= 0; i
< pe_def_file
->num_section_defs
; i
++)
1393 quoteput (pe_def_file
->section_defs
[i
].name
, out
, 0);
1395 if (pe_def_file
->section_defs
[i
].class)
1397 fprintf (out
, " CLASS ");
1398 quoteput (pe_def_file
->section_defs
[i
].class, out
, 0);
1401 if (pe_def_file
->section_defs
[i
].flag_read
)
1402 fprintf (out
, " READ");
1404 if (pe_def_file
->section_defs
[i
].flag_write
)
1405 fprintf (out
, " WRITE");
1407 if (pe_def_file
->section_defs
[i
].flag_execute
)
1408 fprintf (out
, " EXECUTE");
1410 if (pe_def_file
->section_defs
[i
].flag_shared
)
1411 fprintf (out
, " SHARED");
1413 fprintf (out
, "\n");
1417 if (pe_def_file
->num_exports
> 0)
1419 fprintf (out
, "EXPORTS\n");
1421 for (i
= 0; i
< pe_def_file
->num_exports
; i
++)
1423 def_file_export
*e
= pe_def_file
->exports
+ i
;
1425 quoteput (e
->name
, out
, 0);
1427 if (e
->internal_name
&& strcmp (e
->internal_name
, e
->name
))
1429 fprintf (out
, " = ");
1430 quoteput (e
->internal_name
, out
, 0);
1433 if (e
->ordinal
!= -1)
1434 fprintf (out
, " @%d", e
->ordinal
);
1436 if (e
->flag_private
)
1437 fprintf (out
, " PRIVATE");
1439 if (e
->flag_constant
)
1440 fprintf (out
, " CONSTANT");
1443 fprintf (out
, " NONAME");
1446 fprintf (out
, " DATA");
1448 fprintf (out
, "\n");
1452 if (pe_def_file
->num_imports
> 0)
1454 fprintf (out
, "\nIMPORTS\n\n");
1456 for (i
= 0; i
< pe_def_file
->num_imports
; i
++)
1458 def_file_import
*im
= pe_def_file
->imports
+ i
;
1461 if (im
->internal_name
1462 && (!im
->name
|| strcmp (im
->internal_name
, im
->name
)))
1464 quoteput (im
->internal_name
, out
, 0);
1465 fprintf (out
, " = ");
1468 quoteput (im
->module
->name
, out
, 0);
1472 quoteput (im
->name
, out
, 0);
1474 fprintf (out
, "%d", im
->ordinal
);
1476 fprintf (out
, "\n");
1481 fprintf (out
, _("; no contents available\n"));
1483 if (fclose (out
) == EOF
)
1484 /* xgettext:c-format */
1485 einfo (_("%P: Error closing file `%s'\n"), pe_out_def_filename
);
1488 /* Generate the import library. */
1490 static asymbol
**symtab
;
1493 static const char *dll_filename
;
1494 static char *dll_symname
;
1496 #define UNDSEC (asection *) &bfd_und_section
1499 quick_section (abfd
, name
, flags
, align
)
1508 sec
= bfd_make_section_old_way (abfd
, name
);
1509 bfd_set_section_flags (abfd
, sec
, flags
| SEC_ALLOC
| SEC_LOAD
| SEC_KEEP
);
1510 bfd_set_section_alignment (abfd
, sec
, align
);
1511 /* Remember to undo this before trying to link internally! */
1512 sec
->output_section
= sec
;
1514 sym
= bfd_make_empty_symbol (abfd
);
1515 symtab
[symptr
++] = sym
;
1516 sym
->name
= sec
->name
;
1518 sym
->flags
= BSF_LOCAL
;
1525 quick_symbol (abfd
, n1
, n2
, n3
, sec
, flags
, addr
)
1535 char *name
= (char *) xmalloc (strlen (n1
) + strlen (n2
) + strlen (n3
) + 1);
1540 sym
= bfd_make_empty_symbol (abfd
);
1545 symtab
[symptr
++] = sym
;
1548 static arelent
*reltab
= 0;
1549 static int relcount
= 0, relsize
= 0;
1552 quick_reloc (abfd
, address
, which_howto
, symidx
)
1558 if (relcount
>= (relsize
- 1))
1562 reltab
= (arelent
*) xrealloc (reltab
, relsize
* sizeof (arelent
));
1564 reltab
= (arelent
*) xmalloc (relsize
* sizeof (arelent
));
1566 reltab
[relcount
].address
= address
;
1567 reltab
[relcount
].addend
= 0;
1568 reltab
[relcount
].howto
= bfd_reloc_type_lookup (abfd
, which_howto
);
1569 reltab
[relcount
].sym_ptr_ptr
= symtab
+ symidx
;
1574 save_relocs (asection
*sec
)
1578 sec
->relocation
= reltab
;
1579 sec
->reloc_count
= relcount
;
1580 sec
->orelocation
= (arelent
**) xmalloc ((relcount
+ 1) * sizeof (arelent
*));
1581 for (i
= 0; i
< relcount
; i
++)
1582 sec
->orelocation
[i
] = sec
->relocation
+ i
;
1583 sec
->orelocation
[relcount
] = 0;
1584 sec
->flags
|= SEC_RELOC
;
1586 relcount
= relsize
= 0;
1589 /* .section .idata$2
1590 .global __head_my_dll
1610 asection
*id2
, *id5
, *id4
;
1611 unsigned char *d2
, *d5
, *d4
;
1615 oname
= (char *) xmalloc (20);
1616 sprintf (oname
, "d%06d.o", tmp_seq
);
1619 abfd
= bfd_create (oname
, parent
);
1620 bfd_find_target (pe_details
->object_target
, abfd
);
1621 bfd_make_writable (abfd
);
1623 bfd_set_format (abfd
, bfd_object
);
1624 bfd_set_arch_mach (abfd
, pe_details
->bfd_arch
, 0);
1627 symtab
= (asymbol
**) xmalloc (6 * sizeof (asymbol
*));
1628 id2
= quick_section (abfd
, ".idata$2", SEC_HAS_CONTENTS
, 2);
1629 id5
= quick_section (abfd
, ".idata$5", SEC_HAS_CONTENTS
, 2);
1630 id4
= quick_section (abfd
, ".idata$4", SEC_HAS_CONTENTS
, 2);
1631 quick_symbol (abfd
, U ("_head_"), dll_symname
, "", id2
, BSF_GLOBAL
, 0);
1632 quick_symbol (abfd
, U (""), dll_symname
, "_iname", UNDSEC
, BSF_GLOBAL
, 0);
1634 /* OK, pay attention here. I got confused myself looking back at
1635 it. We create a four-byte section to mark the beginning of the
1636 list, and we include an offset of 4 in the section, so that the
1637 pointer to the list points to the *end* of this section, which is
1638 the start of the list of sections from other objects. */
1640 bfd_set_section_size (abfd
, id2
, 20);
1641 d2
= (unsigned char *) xmalloc (20);
1644 d2
[0] = d2
[16] = 4; /* Reloc addend. */
1645 quick_reloc (abfd
, 0, BFD_RELOC_RVA
, 2);
1646 quick_reloc (abfd
, 12, BFD_RELOC_RVA
, 4);
1647 quick_reloc (abfd
, 16, BFD_RELOC_RVA
, 1);
1650 bfd_set_section_size (abfd
, id5
, 4);
1651 d5
= (unsigned char *) xmalloc (4);
1655 bfd_set_section_size (abfd
, id4
, 4);
1656 d4
= (unsigned char *) xmalloc (4);
1660 bfd_set_symtab (abfd
, symtab
, symptr
);
1662 bfd_set_section_contents (abfd
, id2
, d2
, 0, 20);
1663 bfd_set_section_contents (abfd
, id5
, d5
, 0, 4);
1664 bfd_set_section_contents (abfd
, id4
, d4
, 0, 4);
1666 bfd_make_readable (abfd
);
1670 /* .section .idata$4
1675 .global __my_dll_iname
1683 asection
*id4
, *id5
, *id7
;
1684 unsigned char *d4
, *d5
, *d7
;
1689 oname
= (char *) xmalloc (20);
1690 sprintf (oname
, "d%06d.o", tmp_seq
);
1693 abfd
= bfd_create (oname
, parent
);
1694 bfd_find_target (pe_details
->object_target
, abfd
);
1695 bfd_make_writable (abfd
);
1697 bfd_set_format (abfd
, bfd_object
);
1698 bfd_set_arch_mach (abfd
, pe_details
->bfd_arch
, 0);
1701 symtab
= (asymbol
**) xmalloc (5 * sizeof (asymbol
*));
1702 id4
= quick_section (abfd
, ".idata$4", SEC_HAS_CONTENTS
, 2);
1703 id5
= quick_section (abfd
, ".idata$5", SEC_HAS_CONTENTS
, 2);
1704 id7
= quick_section (abfd
, ".idata$7", SEC_HAS_CONTENTS
, 2);
1705 quick_symbol (abfd
, U (""), dll_symname
, "_iname", id7
, BSF_GLOBAL
, 0);
1707 bfd_set_section_size (abfd
, id4
, 4);
1708 d4
= (unsigned char *) xmalloc (4);
1712 bfd_set_section_size (abfd
, id5
, 4);
1713 d5
= (unsigned char *) xmalloc (4);
1717 len
= strlen (dll_filename
) + 1;
1720 bfd_set_section_size (abfd
, id7
, len
);
1721 d7
= (unsigned char *) xmalloc (len
);
1723 strcpy (d7
, dll_filename
);
1725 bfd_set_symtab (abfd
, symtab
, symptr
);
1727 bfd_set_section_contents (abfd
, id4
, d4
, 0, 4);
1728 bfd_set_section_contents (abfd
, id5
, d5
, 0, 4);
1729 bfd_set_section_contents (abfd
, id7
, d7
, 0, len
);
1731 bfd_make_readable (abfd
);
1737 .global ___imp_function
1738 .global __imp__function
1740 jmp *__imp__function:
1754 .asciz "function" xlate? (add underscore, kill at) */
1756 static unsigned char jmp_ix86_bytes
[] =
1758 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x90, 0x90
1766 .dw __imp_function */
1768 static unsigned char jmp_sh_bytes
[] =
1770 0x01, 0xd0, 0x02, 0x60, 0x2b, 0x40, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00
1774 lui $t0,<high:__imp_function>
1775 lw $t0,<low:__imp_function>
1779 static unsigned char jmp_mips_bytes
[] =
1781 0x00, 0x00, 0x08, 0x3c, 0x00, 0x00, 0x08, 0x8d,
1782 0x08, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00
1786 make_one (exp
, parent
)
1787 def_file_export
*exp
;
1790 asection
*tx
, *id7
, *id5
, *id4
, *id6
;
1791 unsigned char *td
= NULL
, *d7
, *d5
, *d4
, *d6
= NULL
;
1795 unsigned char *jmp_bytes
= NULL
;
1796 int jmp_byte_count
= 0;
1798 switch (pe_details
->pe_arch
)
1801 jmp_bytes
= jmp_ix86_bytes
;
1802 jmp_byte_count
= sizeof (jmp_ix86_bytes
);
1805 jmp_bytes
= jmp_sh_bytes
;
1806 jmp_byte_count
= sizeof (jmp_sh_bytes
);
1809 jmp_bytes
= jmp_mips_bytes
;
1810 jmp_byte_count
= sizeof (jmp_mips_bytes
);
1816 oname
= (char *) xmalloc (20);
1817 sprintf (oname
, "d%06d.o", tmp_seq
);
1820 abfd
= bfd_create (oname
, parent
);
1821 bfd_find_target (pe_details
->object_target
, abfd
);
1822 bfd_make_writable (abfd
);
1824 bfd_set_format (abfd
, bfd_object
);
1825 bfd_set_arch_mach (abfd
, pe_details
->bfd_arch
, 0);
1828 symtab
= (asymbol
**) xmalloc (11 * sizeof (asymbol
*));
1829 tx
= quick_section (abfd
, ".text", SEC_CODE
|SEC_HAS_CONTENTS
, 2);
1830 id7
= quick_section (abfd
, ".idata$7", SEC_HAS_CONTENTS
, 2);
1831 id5
= quick_section (abfd
, ".idata$5", SEC_HAS_CONTENTS
, 2);
1832 id4
= quick_section (abfd
, ".idata$4", SEC_HAS_CONTENTS
, 2);
1833 id6
= quick_section (abfd
, ".idata$6", SEC_HAS_CONTENTS
, 2);
1835 if (*exp
->internal_name
== '@')
1837 if (! exp
->flag_data
)
1838 quick_symbol (abfd
, "", exp
->internal_name
, "", tx
, BSF_GLOBAL
, 0);
1839 quick_symbol (abfd
, U ("_head_"), dll_symname
, "", UNDSEC
, BSF_GLOBAL
, 0);
1840 quick_symbol (abfd
, U ("_imp_"), exp
->internal_name
, "", id5
, BSF_GLOBAL
, 0);
1841 /* Fastcall applies only to functions,
1842 so no need for auto-import symbol. */
1846 if (! exp
->flag_data
)
1847 quick_symbol (abfd
, U (""), exp
->internal_name
, "", tx
, BSF_GLOBAL
, 0);
1848 quick_symbol (abfd
, U ("_head_"), dll_symname
, "", UNDSEC
, BSF_GLOBAL
, 0);
1849 quick_symbol (abfd
, U ("_imp__"), exp
->internal_name
, "", id5
, BSF_GLOBAL
, 0);
1850 /* Symbol to reference ord/name of imported
1851 data symbol, used to implement auto-import. */
1853 quick_symbol (abfd
, U("_nm__"), exp
->internal_name
, "", id6
, BSF_GLOBAL
,0);
1855 if (pe_dll_compat_implib
)
1856 quick_symbol (abfd
, U ("__imp_"), exp
->internal_name
, "",
1857 id5
, BSF_GLOBAL
, 0);
1859 if (! exp
->flag_data
)
1861 bfd_set_section_size (abfd
, tx
, jmp_byte_count
);
1862 td
= (unsigned char *) xmalloc (jmp_byte_count
);
1864 memcpy (td
, jmp_bytes
, jmp_byte_count
);
1866 switch (pe_details
->pe_arch
)
1869 quick_reloc (abfd
, 2, BFD_RELOC_32
, 2);
1872 quick_reloc (abfd
, 8, BFD_RELOC_32
, 2);
1875 quick_reloc (abfd
, 0, BFD_RELOC_HI16_S
, 2);
1876 quick_reloc (abfd
, 0, BFD_RELOC_LO16
, 0); /* MIPS_R_PAIR */
1877 quick_reloc (abfd
, 4, BFD_RELOC_LO16
, 2);
1885 bfd_set_section_size (abfd
, id7
, 4);
1886 d7
= (unsigned char *) xmalloc (4);
1889 quick_reloc (abfd
, 0, BFD_RELOC_RVA
, 6);
1892 bfd_set_section_size (abfd
, id5
, 4);
1893 d5
= (unsigned char *) xmalloc (4);
1897 if (exp
->flag_noname
)
1899 d5
[0] = exp
->ordinal
;
1900 d5
[1] = exp
->ordinal
>> 8;
1905 quick_reloc (abfd
, 0, BFD_RELOC_RVA
, 4);
1909 bfd_set_section_size (abfd
, id4
, 4);
1910 d4
= (unsigned char *) xmalloc (4);
1914 if (exp
->flag_noname
)
1916 d4
[0] = exp
->ordinal
;
1917 d4
[1] = exp
->ordinal
>> 8;
1922 quick_reloc (abfd
, 0, BFD_RELOC_RVA
, 4);
1926 if (exp
->flag_noname
)
1929 bfd_set_section_size (abfd
, id6
, 0);
1933 len
= strlen (exp
->name
) + 3;
1936 bfd_set_section_size (abfd
, id6
, len
);
1937 d6
= (unsigned char *) xmalloc (len
);
1939 memset (d6
, 0, len
);
1940 d6
[0] = exp
->hint
& 0xff;
1941 d6
[1] = exp
->hint
>> 8;
1942 strcpy (d6
+ 2, exp
->name
);
1945 bfd_set_symtab (abfd
, symtab
, symptr
);
1947 bfd_set_section_contents (abfd
, tx
, td
, 0, jmp_byte_count
);
1948 bfd_set_section_contents (abfd
, id7
, d7
, 0, 4);
1949 bfd_set_section_contents (abfd
, id5
, d5
, 0, 4);
1950 bfd_set_section_contents (abfd
, id4
, d4
, 0, 4);
1951 if (!exp
->flag_noname
)
1952 bfd_set_section_contents (abfd
, id6
, d6
, 0, len
);
1954 bfd_make_readable (abfd
);
1959 make_singleton_name_thunk (import
, parent
)
1963 /* Name thunks go to idata$4. */
1969 oname
= (char *) xmalloc (20);
1970 sprintf (oname
, "nmth%06d.o", tmp_seq
);
1973 abfd
= bfd_create (oname
, parent
);
1974 bfd_find_target (pe_details
->object_target
, abfd
);
1975 bfd_make_writable (abfd
);
1977 bfd_set_format (abfd
, bfd_object
);
1978 bfd_set_arch_mach (abfd
, pe_details
->bfd_arch
, 0);
1981 symtab
= (asymbol
**) xmalloc (3 * sizeof (asymbol
*));
1982 id4
= quick_section (abfd
, ".idata$4", SEC_HAS_CONTENTS
, 2);
1983 quick_symbol (abfd
, U ("_nm_thnk_"), import
, "", id4
, BSF_GLOBAL
, 0);
1984 quick_symbol (abfd
, U ("_nm_"), import
, "", UNDSEC
, BSF_GLOBAL
, 0);
1986 bfd_set_section_size (abfd
, id4
, 8);
1987 d4
= (unsigned char *) xmalloc (4);
1990 quick_reloc (abfd
, 0, BFD_RELOC_RVA
, 2);
1993 bfd_set_symtab (abfd
, symtab
, symptr
);
1995 bfd_set_section_contents (abfd
, id4
, d4
, 0, 8);
1997 bfd_make_readable (abfd
);
2002 make_import_fixup_mark (rel
)
2005 /* We convert reloc to symbol, for later reference. */
2007 static char *fixup_name
= NULL
;
2008 static size_t buffer_len
= 0;
2010 struct symbol_cache_entry
*sym
= *rel
->sym_ptr_ptr
;
2012 bfd
*abfd
= bfd_asymbol_bfd (sym
);
2013 struct bfd_link_hash_entry
*bh
;
2017 fixup_name
= (char *) xmalloc (384);
2021 if (strlen (sym
->name
) + 25 > buffer_len
)
2022 /* Assume 25 chars for "__fu" + counter + "_". If counter is
2023 bigger than 20 digits long, we've got worse problems than
2024 overflowing this buffer... */
2027 /* New buffer size is length of symbol, plus 25, but
2028 then rounded up to the nearest multiple of 128. */
2029 buffer_len
= ((strlen (sym
->name
) + 25) + 127) & ~127;
2030 fixup_name
= (char *) xmalloc (buffer_len
);
2033 sprintf (fixup_name
, "__fu%d_%s", counter
++, sym
->name
);
2036 bfd_coff_link_add_one_symbol (&link_info
, abfd
, fixup_name
, BSF_GLOBAL
,
2037 current_sec
, /* sym->section, */
2038 rel
->address
, NULL
, TRUE
, FALSE
, &bh
);
2042 struct coff_link_hash_entry
*myh
;
2044 myh
= (struct coff_link_hash_entry
*) bh
;
2045 printf ("type:%d\n", myh
->type
);
2046 printf ("%s\n", myh
->root
.u
.def
.section
->name
);
2052 /* .section .idata$3
2053 .rva __nm_thnk_SYM (singleton thunk with name of func)
2056 .rva __my_dll_iname (name of dll)
2057 .rva __fuNN_SYM (pointer to reference (address) in text) */
2060 make_import_fixup_entry (name
, fixup_name
, dll_symname
, parent
)
2062 const char *fixup_name
;
2063 const char *dll_symname
;
2071 oname
= (char *) xmalloc (20);
2072 sprintf (oname
, "fu%06d.o", tmp_seq
);
2075 abfd
= bfd_create (oname
, parent
);
2076 bfd_find_target (pe_details
->object_target
, abfd
);
2077 bfd_make_writable (abfd
);
2079 bfd_set_format (abfd
, bfd_object
);
2080 bfd_set_arch_mach (abfd
, pe_details
->bfd_arch
, 0);
2083 symtab
= (asymbol
**) xmalloc (6 * sizeof (asymbol
*));
2084 id3
= quick_section (abfd
, ".idata$3", SEC_HAS_CONTENTS
, 2);
2087 quick_symbol (abfd
, U ("_head_"), dll_symname
, "", id2
, BSF_GLOBAL
, 0);
2089 quick_symbol (abfd
, U ("_nm_thnk_"), name
, "", UNDSEC
, BSF_GLOBAL
, 0);
2090 quick_symbol (abfd
, U (""), dll_symname
, "_iname", UNDSEC
, BSF_GLOBAL
, 0);
2091 quick_symbol (abfd
, "", fixup_name
, "", UNDSEC
, BSF_GLOBAL
, 0);
2093 bfd_set_section_size (abfd
, id3
, 20);
2094 d3
= (unsigned char *) xmalloc (20);
2098 quick_reloc (abfd
, 0, BFD_RELOC_RVA
, 1);
2099 quick_reloc (abfd
, 12, BFD_RELOC_RVA
, 2);
2100 quick_reloc (abfd
, 16, BFD_RELOC_RVA
, 3);
2103 bfd_set_symtab (abfd
, symtab
, symptr
);
2105 bfd_set_section_contents (abfd
, id3
, d3
, 0, 20);
2107 bfd_make_readable (abfd
);
2111 /* .section .rdata_runtime_pseudo_reloc
2113 .rva __fuNN_SYM (pointer to reference (address) in text) */
2116 make_runtime_pseudo_reloc (name
, fixup_name
, addend
, parent
)
2117 const char *name ATTRIBUTE_UNUSED
;
2118 const char *fixup_name
;
2123 unsigned char *rt_rel_d
;
2127 oname
= (char *) xmalloc (20);
2128 sprintf (oname
, "rtr%06d.o", tmp_seq
);
2131 abfd
= bfd_create (oname
, parent
);
2132 bfd_find_target (pe_details
->object_target
, abfd
);
2133 bfd_make_writable (abfd
);
2135 bfd_set_format (abfd
, bfd_object
);
2136 bfd_set_arch_mach (abfd
, pe_details
->bfd_arch
, 0);
2139 symtab
= (asymbol
**) xmalloc (2 * sizeof (asymbol
*));
2140 rt_rel
= quick_section (abfd
, ".rdata_runtime_pseudo_reloc", SEC_HAS_CONTENTS
, 2);
2142 quick_symbol (abfd
, "", fixup_name
, "", UNDSEC
, BSF_GLOBAL
, 0);
2144 bfd_set_section_size (abfd
, rt_rel
, 8);
2145 rt_rel_d
= (unsigned char *) xmalloc (8);
2146 rt_rel
->contents
= rt_rel_d
;
2147 memset (rt_rel_d
, 0, 8);
2148 bfd_put_32 (abfd
, addend
, rt_rel_d
);
2150 quick_reloc (abfd
, 4, BFD_RELOC_RVA
, 1);
2151 save_relocs (rt_rel
);
2153 bfd_set_symtab (abfd
, symtab
, symptr
);
2155 bfd_set_section_contents (abfd
, rt_rel
, rt_rel_d
, 0, 8);
2157 bfd_make_readable (abfd
);
2162 .rva __pei386_runtime_relocator */
2165 pe_create_runtime_relocator_reference (parent
)
2168 asection
*extern_rt_rel
;
2169 unsigned char *extern_rt_rel_d
;
2173 oname
= (char *) xmalloc (20);
2174 sprintf (oname
, "ertr%06d.o", tmp_seq
);
2177 abfd
= bfd_create (oname
, parent
);
2178 bfd_find_target (pe_details
->object_target
, abfd
);
2179 bfd_make_writable (abfd
);
2181 bfd_set_format (abfd
, bfd_object
);
2182 bfd_set_arch_mach (abfd
, pe_details
->bfd_arch
, 0);
2185 symtab
= (asymbol
**) xmalloc (2 * sizeof (asymbol
*));
2186 extern_rt_rel
= quick_section (abfd
, ".rdata", SEC_HAS_CONTENTS
, 2);
2188 quick_symbol (abfd
, "", "__pei386_runtime_relocator", "", UNDSEC
, BSF_NO_FLAGS
, 0);
2190 bfd_set_section_size (abfd
, extern_rt_rel
, 4);
2191 extern_rt_rel_d
= (unsigned char *) xmalloc (4);
2192 extern_rt_rel
->contents
= extern_rt_rel_d
;
2194 quick_reloc (abfd
, 0, BFD_RELOC_RVA
, 1);
2195 save_relocs (extern_rt_rel
);
2197 bfd_set_symtab (abfd
, symtab
, symptr
);
2199 bfd_set_section_contents (abfd
, extern_rt_rel
, extern_rt_rel_d
, 0, 4);
2201 bfd_make_readable (abfd
);
2206 pe_create_import_fixup (rel
, s
, addend
)
2212 struct symbol_cache_entry
*sym
= *rel
->sym_ptr_ptr
;
2213 struct bfd_link_hash_entry
*name_thunk_sym
;
2214 const char *name
= sym
->name
;
2215 char *fixup_name
= make_import_fixup_mark (rel
);
2218 sprintf (buf
, U ("_nm_thnk_%s"), name
);
2220 name_thunk_sym
= bfd_link_hash_lookup (link_info
.hash
, buf
, 0, 0, 1);
2222 if (!name_thunk_sym
|| name_thunk_sym
->type
!= bfd_link_hash_defined
)
2224 bfd
*b
= make_singleton_name_thunk (name
, output_bfd
);
2225 add_bfd_to_link (b
, b
->filename
, &link_info
);
2227 /* If we ever use autoimport, we have to cast text section writable. */
2228 config
.text_read_only
= FALSE
;
2231 if (addend
== 0 || link_info
.pei386_runtime_pseudo_reloc
)
2233 extern char * pe_data_import_dll
;
2234 char * dll_symname
= pe_data_import_dll
? pe_data_import_dll
: "unknown";
2236 b
= make_import_fixup_entry (name
, fixup_name
, dll_symname
, output_bfd
);
2237 add_bfd_to_link (b
, b
->filename
, &link_info
);
2242 if (link_info
.pei386_runtime_pseudo_reloc
)
2244 if (pe_dll_extra_pe_debug
)
2245 printf ("creating runtime pseudo-reloc entry for %s (addend=%d)\n",
2246 fixup_name
, addend
);
2247 b
= make_runtime_pseudo_reloc (name
, fixup_name
, addend
, output_bfd
);
2248 add_bfd_to_link (b
, b
->filename
, &link_info
);
2250 if (runtime_pseudo_relocs_created
== 0)
2252 b
= pe_create_runtime_relocator_reference (output_bfd
);
2253 add_bfd_to_link (b
, b
->filename
, &link_info
);
2255 runtime_pseudo_relocs_created
++;
2259 einfo (_("%C: variable '%T' can't be auto-imported. Please read the documentation for ld's --enable-auto-import for details.\n"),
2260 s
->owner
, s
, rel
->address
, sym
->name
);
2268 pe_dll_generate_implib (def
, impfilename
)
2270 const char *impfilename
;
2278 dll_filename
= (def
->name
) ? def
->name
: dll_name
;
2279 dll_symname
= xstrdup (dll_filename
);
2280 for (i
= 0; dll_symname
[i
]; i
++)
2281 if (!ISALNUM (dll_symname
[i
]))
2282 dll_symname
[i
] = '_';
2284 unlink (impfilename
);
2286 outarch
= bfd_openw (impfilename
, 0);
2290 /* xgettext:c-format */
2291 einfo (_("%XCan't open .lib file: %s\n"), impfilename
);
2295 /* xgettext:c-format */
2296 einfo (_("Creating library file: %s\n"), impfilename
);
2298 bfd_set_format (outarch
, bfd_archive
);
2299 outarch
->has_armap
= 1;
2301 /* Work out a reasonable size of things to put onto one line. */
2302 ar_head
= make_head (outarch
);
2304 for (i
= 0; i
< def
->num_exports
; i
++)
2306 /* The import library doesn't know about the internal name. */
2307 char *internal
= def
->exports
[i
].internal_name
;
2310 def
->exports
[i
].internal_name
= def
->exports
[i
].name
;
2311 n
= make_one (def
->exports
+ i
, outarch
);
2314 def
->exports
[i
].internal_name
= internal
;
2317 ar_tail
= make_tail (outarch
);
2319 if (ar_head
== NULL
|| ar_tail
== NULL
)
2322 /* Now stick them all into the archive. */
2323 ar_head
->next
= head
;
2324 ar_tail
->next
= ar_head
;
2327 if (! bfd_set_archive_head (outarch
, head
))
2328 einfo ("%Xbfd_set_archive_head: %s\n", bfd_errmsg (bfd_get_error ()));
2330 if (! bfd_close (outarch
))
2331 einfo ("%Xbfd_close %s: %s\n", impfilename
, bfd_errmsg (bfd_get_error ()));
2333 while (head
!= NULL
)
2335 bfd
*n
= head
->next
;
2342 add_bfd_to_link (abfd
, name
, link_info
)
2345 struct bfd_link_info
*link_info
;
2347 lang_input_statement_type
*fake_file
;
2349 fake_file
= lang_add_input_file (name
,
2350 lang_input_file_is_fake_enum
,
2352 fake_file
->the_bfd
= abfd
;
2353 ldlang_add_file (fake_file
);
2355 if (!bfd_link_add_symbols (abfd
, link_info
))
2356 einfo ("%Xaddsym %s: %s\n", name
, bfd_errmsg (bfd_get_error ()));
2360 pe_process_import_defs (output_bfd
, link_info
)
2362 struct bfd_link_info
*link_info
;
2364 def_file_module
*module
;
2366 pe_dll_id_target (bfd_get_target (output_bfd
));
2371 for (module
= pe_def_file
->modules
; module
; module
= module
->next
)
2375 dll_filename
= module
->name
;
2376 dll_symname
= xstrdup (module
->name
);
2377 for (i
= 0; dll_symname
[i
]; i
++)
2378 if (!ISALNUM (dll_symname
[i
]))
2379 dll_symname
[i
] = '_';
2383 for (i
= 0; i
< pe_def_file
->num_imports
; i
++)
2384 if (pe_def_file
->imports
[i
].module
== module
)
2386 def_file_export exp
;
2387 struct bfd_link_hash_entry
*blhe
;
2388 int lead_at
= (*pe_def_file
->imports
[i
].internal_name
== '@');
2389 /* See if we need this import. */
2390 char *name
= (char *) xmalloc (strlen (pe_def_file
->imports
[i
].internal_name
) + 2 + 6);
2393 sprintf (name
, "%s%s", "", pe_def_file
->imports
[i
].internal_name
);
2395 sprintf (name
, "%s%s",U (""), pe_def_file
->imports
[i
].internal_name
);
2397 blhe
= bfd_link_hash_lookup (link_info
->hash
, name
,
2398 FALSE
, FALSE
, FALSE
);
2400 if (!blhe
|| (blhe
&& blhe
->type
!= bfd_link_hash_undefined
))
2403 sprintf (name
, "%s%s", U ("_imp_"),
2404 pe_def_file
->imports
[i
].internal_name
);
2406 sprintf (name
, "%s%s", U ("_imp__"),
2407 pe_def_file
->imports
[i
].internal_name
);
2409 blhe
= bfd_link_hash_lookup (link_info
->hash
, name
,
2410 FALSE
, FALSE
, FALSE
);
2414 if (blhe
&& blhe
->type
== bfd_link_hash_undefined
)
2420 bfd
*ar_head
= make_head (output_bfd
);
2421 add_bfd_to_link (ar_head
, ar_head
->filename
, link_info
);
2424 exp
.internal_name
= pe_def_file
->imports
[i
].internal_name
;
2425 exp
.name
= pe_def_file
->imports
[i
].name
;
2426 exp
.ordinal
= pe_def_file
->imports
[i
].ordinal
;
2427 exp
.hint
= exp
.ordinal
>= 0 ? exp
.ordinal
: 0;
2428 exp
.flag_private
= 0;
2429 exp
.flag_constant
= 0;
2430 exp
.flag_data
= pe_def_file
->imports
[i
].data
;
2431 exp
.flag_noname
= exp
.name
? 0 : 1;
2432 one
= make_one (&exp
, output_bfd
);
2433 add_bfd_to_link (one
, one
->filename
, link_info
);
2438 bfd
*ar_tail
= make_tail (output_bfd
);
2439 add_bfd_to_link (ar_tail
, ar_tail
->filename
, link_info
);
2446 /* We were handed a *.DLL file. Parse it and turn it into a set of
2447 IMPORTS directives in the def file. Return TRUE if the file was
2448 handled, FALSE if not. */
2451 pe_get16 (abfd
, where
)
2457 bfd_seek (abfd
, (file_ptr
) where
, SEEK_SET
);
2458 bfd_bread (b
, (bfd_size_type
) 2, abfd
);
2459 return b
[0] + (b
[1] << 8);
2463 pe_get32 (abfd
, where
)
2469 bfd_seek (abfd
, (file_ptr
) where
, SEEK_SET
);
2470 bfd_bread (b
, (bfd_size_type
) 4, abfd
);
2471 return b
[0] + (b
[1] << 8) + (b
[2] << 16) + (b
[3] << 24);
2474 #if 0 /* This is not currently used. */
2480 unsigned char *b
= ptr
;
2482 return b
[0] + (b
[1] << 8);
2491 unsigned char *b
= ptr
;
2493 return b
[0] + (b
[1] << 8) + (b
[2] << 16) + (b
[3] << 24);
2497 pe_implied_import_dll (filename
)
2498 const char *filename
;
2501 unsigned long pe_header_offset
, opthdr_ofs
, num_entries
, i
;
2502 unsigned long export_rva
, export_size
, nsections
, secptr
, expptr
;
2503 unsigned long exp_funcbase
;
2504 unsigned char *expdata
, *erva
;
2505 unsigned long name_rvas
, ordinals
, nexp
, ordbase
;
2506 const char *dll_name
;
2507 /* Initialization with start > end guarantees that is_data
2508 will not be set by mistake, and avoids compiler warning. */
2509 unsigned long data_start
= 1;
2510 unsigned long data_end
= 0;
2511 unsigned long bss_start
= 1;
2512 unsigned long bss_end
= 0;
2514 /* No, I can't use bfd here. kernel32.dll puts its export table in
2515 the middle of the .rdata section. */
2516 dll
= bfd_openr (filename
, pe_details
->target_name
);
2519 einfo ("%Xopen %s: %s\n", filename
, bfd_errmsg (bfd_get_error ()));
2523 /* PEI dlls seem to be bfd_objects. */
2524 if (!bfd_check_format (dll
, bfd_object
))
2526 einfo ("%X%s: this doesn't appear to be a DLL\n", filename
);
2530 /* Get pe_header, optional header and numbers of export entries. */
2531 pe_header_offset
= pe_get32 (dll
, 0x3c);
2532 opthdr_ofs
= pe_header_offset
+ 4 + 20;
2533 num_entries
= pe_get32 (dll
, opthdr_ofs
+ 92);
2535 if (num_entries
< 1) /* No exports. */
2538 export_rva
= pe_get32 (dll
, opthdr_ofs
+ 96);
2539 export_size
= pe_get32 (dll
, opthdr_ofs
+ 100);
2540 nsections
= pe_get16 (dll
, pe_header_offset
+ 4 + 2);
2541 secptr
= (pe_header_offset
+ 4 + 20 +
2542 pe_get16 (dll
, pe_header_offset
+ 4 + 16));
2545 /* Get the rva and size of the export section. */
2546 for (i
= 0; i
< nsections
; i
++)
2549 unsigned long secptr1
= secptr
+ 40 * i
;
2550 unsigned long vaddr
= pe_get32 (dll
, secptr1
+ 12);
2551 unsigned long vsize
= pe_get32 (dll
, secptr1
+ 16);
2552 unsigned long fptr
= pe_get32 (dll
, secptr1
+ 20);
2554 bfd_seek (dll
, (file_ptr
) secptr1
, SEEK_SET
);
2555 bfd_bread (sname
, (bfd_size_type
) 8, dll
);
2557 if (vaddr
<= export_rva
&& vaddr
+ vsize
> export_rva
)
2559 expptr
= fptr
+ (export_rva
- vaddr
);
2560 if (export_rva
+ export_size
> vaddr
+ vsize
)
2561 export_size
= vsize
- (export_rva
- vaddr
);
2566 /* Scan sections and store the base and size of the
2567 data and bss segments in data/base_start/end. */
2568 for (i
= 0; i
< nsections
; i
++)
2570 unsigned long secptr1
= secptr
+ 40 * i
;
2571 unsigned long vsize
= pe_get32 (dll
, secptr1
+ 8);
2572 unsigned long vaddr
= pe_get32 (dll
, secptr1
+ 12);
2573 unsigned long flags
= pe_get32 (dll
, secptr1
+ 36);
2577 bfd_seek (dll
, (file_ptr
) secptr1
+ 0, SEEK_SET
);
2578 bfd_bread (sec_name
, (bfd_size_type
) 8, dll
);
2580 if (strcmp(sec_name
,".data") == 0)
2583 data_end
= vaddr
+ vsize
;
2585 if (pe_dll_extra_pe_debug
)
2586 printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n",
2587 __FUNCTION__
, sec_name
, vaddr
, vaddr
+ vsize
, flags
);
2589 else if (strcmp (sec_name
,".bss") == 0)
2592 bss_end
= vaddr
+ vsize
;
2594 if (pe_dll_extra_pe_debug
)
2595 printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n",
2596 __FUNCTION__
, sec_name
, vaddr
, vaddr
+ vsize
, flags
);
2600 expdata
= (unsigned char *) xmalloc (export_size
);
2601 bfd_seek (dll
, (file_ptr
) expptr
, SEEK_SET
);
2602 bfd_bread (expdata
, (bfd_size_type
) export_size
, dll
);
2603 erva
= expdata
- export_rva
;
2605 if (pe_def_file
== 0)
2606 pe_def_file
= def_file_empty ();
2608 nexp
= pe_as32 (expdata
+ 24);
2609 name_rvas
= pe_as32 (expdata
+ 32);
2610 ordinals
= pe_as32 (expdata
+ 36);
2611 ordbase
= pe_as32 (expdata
+ 16);
2612 exp_funcbase
= pe_as32 (expdata
+ 28);
2614 /* Use internal dll name instead of filename
2615 to enable symbolic dll linking. */
2616 dll_name
= pe_as32 (expdata
+ 12) + erva
;
2618 /* Check to see if the dll has already been added to
2619 the definition list and if so return without error.
2620 This avoids multiple symbol definitions. */
2621 if (def_get_module (pe_def_file
, dll_name
))
2623 if (pe_dll_extra_pe_debug
)
2624 printf ("%s is already loaded\n", dll_name
);
2628 /* Iterate through the list of symbols. */
2629 for (i
= 0; i
< nexp
; i
++)
2631 /* Pointer to the names vector. */
2632 unsigned long name_rva
= pe_as32 (erva
+ name_rvas
+ i
* 4);
2633 def_file_import
*imp
;
2634 /* Pointer to the function address vector. */
2635 unsigned long func_rva
= pe_as32 (erva
+ exp_funcbase
+ i
* 4);
2638 /* Skip unwanted symbols, which are
2639 exported in buggy auto-import releases. */
2640 if (strncmp (erva
+ name_rva
, "_nm_", 4) != 0)
2642 /* is_data is true if the address is in the data or bss segment. */
2644 (func_rva
>= data_start
&& func_rva
< data_end
)
2645 || (func_rva
>= bss_start
&& func_rva
< bss_end
);
2647 imp
= def_file_add_import (pe_def_file
, erva
+ name_rva
,
2649 /* Mark symbol type. */
2650 imp
->data
= is_data
;
2652 if (pe_dll_extra_pe_debug
)
2653 printf ("%s dll-name: %s sym: %s addr: 0x%lx %s\n",
2654 __FUNCTION__
, dll_name
, erva
+ name_rva
,
2655 func_rva
, is_data
? "(data)" : "");
2662 /* These are the main functions, called from the emulation. The first
2663 is called after the bfds are read, so we can guess at how much space
2664 we need. The second is called after everything is placed, so we
2665 can put the right values in place. */
2668 pe_dll_build_sections (abfd
, info
)
2670 struct bfd_link_info
*info
;
2672 pe_dll_id_target (bfd_get_target (abfd
));
2673 process_def_file (abfd
, info
);
2675 if (pe_def_file
->num_exports
== 0 && !(info
->shared
))
2678 generate_edata (abfd
, info
);
2679 build_filler_bfd (1);
2683 pe_exe_build_sections (abfd
, info
)
2685 struct bfd_link_info
*info ATTRIBUTE_UNUSED
;
2687 pe_dll_id_target (bfd_get_target (abfd
));
2688 build_filler_bfd (0);
2692 pe_dll_fill_sections (abfd
, info
)
2694 struct bfd_link_info
*info
;
2696 pe_dll_id_target (bfd_get_target (abfd
));
2697 image_base
= pe_data (abfd
)->pe_opthdr
.ImageBase
;
2699 generate_reloc (abfd
, info
);
2702 bfd_set_section_size (filler_bfd
, reloc_s
, reloc_sz
);
2704 /* Resize the sections. */
2705 lang_size_sections (stat_ptr
->head
, abs_output_section
,
2706 &stat_ptr
->head
, 0, (bfd_vma
) 0, NULL
, TRUE
);
2708 /* Redo special stuff. */
2709 ldemul_after_allocation ();
2711 /* Do the assignments again. */
2712 lang_do_assignments (stat_ptr
->head
,
2714 (fill_type
*) 0, (bfd_vma
) 0);
2717 fill_edata (abfd
, info
);
2720 pe_data (abfd
)->dll
= 1;
2722 edata_s
->contents
= edata_d
;
2723 reloc_s
->contents
= reloc_d
;
2727 pe_exe_fill_sections (abfd
, info
)
2729 struct bfd_link_info
*info
;
2731 pe_dll_id_target (bfd_get_target (abfd
));
2732 image_base
= pe_data (abfd
)->pe_opthdr
.ImageBase
;
2734 generate_reloc (abfd
, info
);
2737 bfd_set_section_size (filler_bfd
, reloc_s
, reloc_sz
);
2739 /* Resize the sections. */
2740 lang_size_sections (stat_ptr
->head
, abs_output_section
,
2741 &stat_ptr
->head
, 0, (bfd_vma
) 0, NULL
, TRUE
);
2743 /* Redo special stuff. */
2744 ldemul_after_allocation ();
2746 /* Do the assignments again. */
2747 lang_do_assignments (stat_ptr
->head
,
2749 (fill_type
*) 0, (bfd_vma
) 0);
2751 reloc_s
->contents
= reloc_d
;