1 /* Routines to help build PEI-format DLLs (Win32 etc)
2 Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004
3 Free Software Foundation, Inc.
4 Written by DJ Delorie <dj@cygnus.com>
6 This file is part of GLD, the Gnu Linker.
8 GLD is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2, or (at your option)
13 GLD is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with GLD; see the file COPYING. If not, write to the Free
20 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
26 #include "libiberty.h"
27 #include "safe-ctype.h"
41 #include "coff/internal.h"
42 #include "../bfd/libcoff.h"
46 /* This file turns a regular Windows PE image into a DLL. Because of
47 the complexity of this operation, it has been broken down into a
48 number of separate modules which are all called by the main function
49 at the end of this file. This function is not re-entrant and is
50 normally only called once, so static variables are used to reduce
51 the number of parameters and return values required.
53 See also: ld/emultempl/pe.em. */
55 /* Auto-import feature by Paul Sokolovsky
59 1. With this feature on, DLL clients can import variables from DLL
60 without any concern from their side (for example, without any source
63 2. This is done completely in bounds of the PE specification (to be fair,
64 there's a place where it pokes nose out of, but in practice it works).
65 So, resulting module can be used with any other PE compiler/linker.
67 3. Auto-import is fully compatible with standard import method and they
68 can be mixed together.
70 4. Overheads: space: 8 bytes per imported symbol, plus 20 for each
71 reference to it; load time: negligible; virtual/physical memory: should be
72 less than effect of DLL relocation, and I sincerely hope it doesn't affect
73 DLL sharability (too much).
77 The obvious and only way to get rid of dllimport insanity is to make client
78 access variable directly in the DLL, bypassing extra dereference. I.e.,
79 whenever client contains something like
83 address of dll_var in the command should be relocated to point into loaded
84 DLL. The aim is to make OS loader do so, and than make ld help with that.
85 Import section of PE made following way: there's a vector of structures
86 each describing imports from particular DLL. Each such structure points
87 to two other parallel vectors: one holding imported names, and one which
88 will hold address of corresponding imported name. So, the solution is
89 de-vectorize these structures, making import locations be sparse and
90 pointing directly into code. Before continuing, it is worth a note that,
91 while authors strives to make PE act ELF-like, there're some other people
92 make ELF act PE-like: elfvector, ;-) .
96 For each reference of data symbol to be imported from DLL (to set of which
97 belong symbols with name <sym>, if __imp_<sym> is found in implib), the
98 import fixup entry is generated. That entry is of type
99 IMAGE_IMPORT_DESCRIPTOR and stored in .idata$3 subsection. Each
100 fixup entry contains pointer to symbol's address within .text section
101 (marked with __fuN_<sym> symbol, where N is integer), pointer to DLL name
102 (so, DLL name is referenced by multiple entries), and pointer to symbol
103 name thunk. Symbol name thunk is singleton vector (__nm_th_<symbol>)
104 pointing to IMAGE_IMPORT_BY_NAME structure (__nm_<symbol>) directly
105 containing imported name. Here comes that "om the edge" problem mentioned
106 above: PE specification rambles that name vector (OriginalFirstThunk)
107 should run in parallel with addresses vector (FirstThunk), i.e. that they
108 should have same number of elements and terminated with zero. We violate
109 this, since FirstThunk points directly into machine code. But in practice,
110 OS loader implemented the sane way: it goes thru OriginalFirstThunk and
111 puts addresses to FirstThunk, not something else. It once again should be
112 noted that dll and symbol name structures are reused across fixup entries
113 and should be there anyway to support standard import stuff, so sustained
114 overhead is 20 bytes per reference. Other question is whether having several
115 IMAGE_IMPORT_DESCRIPTORS for the same DLL is possible. Answer is yes, it is
116 done even by native compiler/linker (libth32's functions are in fact reside
117 in windows9x kernel32.dll, so if you use it, you have two
118 IMAGE_IMPORT_DESCRIPTORS for kernel32.dll). Yet other question is whether
119 referencing the same PE structures several times is valid. The answer is why
120 not, prohibiting that (detecting violation) would require more work on
121 behalf of loader than not doing it.
123 See also: ld/emultempl/pe.em. */
125 static void add_bfd_to_link (bfd
*, const char *, struct bfd_link_info
*);
127 /* For emultempl/pe.em. */
129 def_file
* pe_def_file
= 0;
130 int pe_dll_export_everything
= 0;
131 int pe_dll_do_default_excludes
= 1;
132 int pe_dll_kill_ats
= 0;
133 int pe_dll_stdcall_aliases
= 0;
134 int pe_dll_warn_dup_exports
= 0;
135 int pe_dll_compat_implib
= 0;
136 int pe_dll_extra_pe_debug
= 0;
138 /* Static variables and types. */
140 static bfd_vma image_base
;
141 static bfd
*filler_bfd
;
142 static struct bfd_section
*edata_s
, *reloc_s
;
143 static unsigned char *edata_d
, *reloc_d
;
144 static size_t edata_sz
, reloc_sz
;
145 static int runtime_pseudo_relocs_created
= 0;
151 unsigned int imagebase_reloc
;
163 autofilter_entry_type
;
165 #define PE_ARCH_i386 1
167 #define PE_ARCH_mips 3
168 #define PE_ARCH_arm 4
169 #define PE_ARCH_arm_epoc 5
171 static pe_details_type pe_detail_list
[] =
184 16 /* R_SH_IMAGEBASE */,
206 "epoc-pei-arm-little",
207 "epoc-pe-arm-little",
213 { NULL
, NULL
, 0, 0, 0, 0 }
216 static pe_details_type
*pe_details
;
218 static autofilter_entry_type autofilter_symbollist
[] =
220 { "DllMain@12", 10 },
221 { "DllEntryPoint@0", 15 },
222 { "DllMainCRTStartup@12", 20 },
223 { "_cygwin_dll_entry@12", 20 },
224 { "_cygwin_crt0_common@8", 21 },
225 { "_cygwin_noncygwin_dll_entry@12", 30 },
226 { "impure_ptr", 10 },
227 { "_pei386_runtime_relocator", 25 },
228 { "do_pseudo_reloc", 15 },
229 { "cygwin_crt0", 11 },
233 /* Do not specify library suffix explicitly, to allow for dllized versions. */
234 static autofilter_entry_type autofilter_liblist
[] =
239 { "libmingw32", 10 },
240 { "libmingwex", 10 },
248 static autofilter_entry_type autofilter_objlist
[] =
258 { "crtbegin.o", 10 },
263 static autofilter_entry_type autofilter_symbolprefixlist
[] =
265 /* { "__imp_", 6 }, */
266 /* Do __imp_ explicitly to save time. */
268 /* Don't re-export auto-imported symbols. */
270 { "__builtin_", 10 },
271 /* Don't export symbols specifying internal DLL layout. */
274 { "_impure_ptr", 11 },
275 { "cygwin_attach_dll", 17 },
276 { "cygwin_premain0", 15 },
277 { "cygwin_premain1", 15 },
278 { "cygwin_premain2", 15 },
279 { "cygwin_premain3", 15 },
284 static autofilter_entry_type autofilter_symbolsuffixlist
[] =
290 #define U(str) (pe_details->underscored ? "_" str : str)
293 pe_dll_id_target (const char *target
)
297 for (i
= 0; pe_detail_list
[i
].target_name
; i
++)
298 if (strcmp (pe_detail_list
[i
].target_name
, target
) == 0
299 || strcmp (pe_detail_list
[i
].object_target
, target
) == 0)
301 pe_details
= pe_detail_list
+ i
;
304 einfo (_("%XUnsupported PEI architecture: %s\n"), target
);
308 /* Helper functions for qsort. Relocs must be sorted so that we can write
309 them out by pages. */
320 reloc_sort (const void *va
, const void *vb
)
322 bfd_vma a
= ((const reloc_data_type
*) va
)->vma
;
323 bfd_vma b
= ((const reloc_data_type
*) vb
)->vma
;
325 return (a
> b
) ? 1 : ((a
< b
) ? -1 : 0);
329 pe_export_sort (const void *va
, const void *vb
)
331 const def_file_export
*a
= va
;
332 const def_file_export
*b
= vb
;
334 return strcmp (a
->name
, b
->name
);
337 /* Read and process the .DEF file. */
339 /* These correspond to the entries in pe_def_file->exports[]. I use
340 exported_symbol_sections[i] to tag whether or not the symbol was
341 defined, since we can't export symbols we don't have. */
343 static bfd_vma
*exported_symbol_offsets
;
344 static struct bfd_section
**exported_symbol_sections
;
345 static int export_table_size
;
346 static int count_exported
;
347 static int count_exported_byname
;
348 static int count_with_ordinals
;
349 static const char *dll_name
;
350 static int min_ordinal
, max_ordinal
;
351 static int *exported_symbols
;
353 typedef struct exclude_list_struct
356 struct exclude_list_struct
*next
;
361 static struct exclude_list_struct
*excludes
= 0;
364 pe_dll_add_excludes (const char *new_excludes
, const int type
)
367 char *exclude_string
;
369 local_copy
= xstrdup (new_excludes
);
371 exclude_string
= strtok (local_copy
, ",:");
372 for (; exclude_string
; exclude_string
= strtok (NULL
, ",:"))
374 struct exclude_list_struct
*new_exclude
;
376 new_exclude
= xmalloc (sizeof (struct exclude_list_struct
));
377 new_exclude
->string
= xmalloc (strlen (exclude_string
) + 1);
378 strcpy (new_exclude
->string
, exclude_string
);
379 new_exclude
->type
= type
;
380 new_exclude
->next
= excludes
;
381 excludes
= new_exclude
;
388 /* abfd is a bfd containing n (or NULL)
389 It can be used for contextual checks. */
392 auto_export (bfd
*abfd
, def_file
*d
, const char *n
)
395 struct exclude_list_struct
*ex
;
396 autofilter_entry_type
*afptr
;
397 const char * libname
= 0;
398 if (abfd
&& abfd
->my_archive
)
399 libname
= lbasename (abfd
->my_archive
->filename
);
401 /* We should not re-export imported stuff. */
402 if (strncmp (n
, "_imp__", 6) == 0)
405 for (i
= 0; i
< d
->num_exports
; i
++)
406 if (strcmp (d
->exports
[i
].name
, n
) == 0)
409 if (pe_dll_do_default_excludes
)
414 if (pe_dll_extra_pe_debug
)
415 printf ("considering exporting: %s, abfd=%p, abfd->my_arc=%p\n",
416 n
, abfd
, abfd
->my_archive
);
418 /* First of all, make context checks:
419 Don't export anything from standard libs. */
422 afptr
= autofilter_liblist
;
426 if (strncmp (libname
, afptr
->name
, afptr
->len
) == 0 )
432 /* Next, exclude symbols from certain startup objects. */
434 if (abfd
&& (p
= lbasename (abfd
->filename
)))
436 afptr
= autofilter_objlist
;
439 if (strcmp (p
, afptr
->name
) == 0)
445 /* Don't try to blindly exclude all symbols
446 that begin with '__'; this was tried and
447 it is too restrictive. */
449 /* Then, exclude specific symbols. */
450 afptr
= autofilter_symbollist
;
453 if (strcmp (n
, afptr
->name
) == 0)
459 /* Next, exclude symbols starting with ... */
460 afptr
= autofilter_symbolprefixlist
;
463 if (strncmp (n
, afptr
->name
, afptr
->len
) == 0)
469 /* Finally, exclude symbols ending with ... */
471 afptr
= autofilter_symbolsuffixlist
;
474 if ((len
>= afptr
->len
)
475 /* Add 1 to insure match with trailing '\0'. */
476 && strncmp (n
+ len
- afptr
->len
, afptr
->name
,
477 afptr
->len
+ 1) == 0)
484 for (ex
= excludes
; ex
; ex
= ex
->next
)
486 if (ex
->type
== 1) /* exclude-libs */
489 && ((strcmp (libname
, ex
->string
) == 0)
490 || (strcasecmp ("ALL", ex
->string
) == 0)))
493 else if (strcmp (n
, ex
->string
) == 0)
501 process_def_file (bfd
*abfd ATTRIBUTE_UNUSED
, struct bfd_link_info
*info
)
504 struct bfd_link_hash_entry
*blhe
;
506 struct bfd_section
*s
;
507 def_file_export
*e
= 0;
510 pe_def_file
= def_file_empty ();
512 /* First, run around to all the objects looking for the .drectve
513 sections, and push those into the def file too. */
514 for (b
= info
->input_bfds
; b
; b
= b
->link_next
)
516 s
= bfd_get_section_by_name (b
, ".drectve");
519 int size
= bfd_get_section_size_before_reloc (s
);
520 char *buf
= xmalloc (size
);
522 bfd_get_section_contents (b
, s
, buf
, 0, size
);
523 def_file_add_directive (pe_def_file
, buf
, size
);
528 /* If we are not building a DLL, when there are no exports
529 we do not build an export table at all. */
530 if (!pe_dll_export_everything
&& pe_def_file
->num_exports
== 0
534 /* Now, maybe export everything else the default way. */
535 if (pe_dll_export_everything
|| pe_def_file
->num_exports
== 0)
537 for (b
= info
->input_bfds
; b
; b
= b
->link_next
)
542 symsize
= bfd_get_symtab_upper_bound (b
);
543 symbols
= xmalloc (symsize
);
544 nsyms
= bfd_canonicalize_symtab (b
, symbols
);
546 for (j
= 0; j
< nsyms
; j
++)
548 /* We should export symbols which are either global or not
549 anything at all. (.bss data is the latter)
550 We should not export undefined symbols. */
551 if (symbols
[j
]->section
!= &bfd_und_section
552 && ((symbols
[j
]->flags
& BSF_GLOBAL
)
553 || (symbols
[j
]->flags
== BFD_FORT_COMM_DEFAULT_VALUE
)))
555 const char *sn
= symbols
[j
]->name
;
557 /* We should not re-export imported stuff. */
559 char *name
= xmalloc (strlen (sn
) + 2 + 6);
560 sprintf (name
, "%s%s", U("_imp_"), sn
);
562 blhe
= bfd_link_hash_lookup (info
->hash
, name
,
563 FALSE
, FALSE
, FALSE
);
566 if (blhe
&& blhe
->type
== bfd_link_hash_defined
)
573 if (auto_export (b
, pe_def_file
, sn
))
576 p
=def_file_add_export (pe_def_file
, sn
, 0, -1);
577 /* Fill data flag properly, from dlltool.c. */
578 p
->flag_data
= !(symbols
[j
]->flags
& BSF_FUNCTION
);
586 #define NE pe_def_file->num_exports
588 /* Canonicalize the export list. */
591 for (i
= 0; i
< NE
; i
++)
593 if (strchr (pe_def_file
->exports
[i
].name
, '@'))
595 /* This will preserve internal_name, which may have been
596 pointing to the same memory as name, or might not
598 int lead_at
= (*pe_def_file
->exports
[i
].name
== '@');
599 char *tmp
= xstrdup (pe_def_file
->exports
[i
].name
+ lead_at
);
601 *(strchr (tmp
, '@')) = 0;
602 pe_def_file
->exports
[i
].name
= tmp
;
607 if (pe_dll_stdcall_aliases
)
609 for (i
= 0; i
< NE
; i
++)
611 if (strchr (pe_def_file
->exports
[i
].name
, '@'))
613 int lead_at
= (*pe_def_file
->exports
[i
].name
== '@');
614 char *tmp
= xstrdup (pe_def_file
->exports
[i
].name
+ lead_at
);
616 *(strchr (tmp
, '@')) = 0;
617 if (auto_export (NULL
, pe_def_file
, tmp
))
618 def_file_add_export (pe_def_file
, tmp
,
619 pe_def_file
->exports
[i
].internal_name
,
627 /* Convenience, but watch out for it changing. */
628 e
= pe_def_file
->exports
;
630 exported_symbol_offsets
= xmalloc (NE
* sizeof (bfd_vma
));
631 exported_symbol_sections
= xmalloc (NE
* sizeof (struct bfd_section
*));
633 memset (exported_symbol_sections
, 0, NE
* sizeof (struct bfd_section
*));
637 count_exported_byname
= 0;
638 count_with_ordinals
= 0;
640 qsort (pe_def_file
->exports
, NE
, sizeof (pe_def_file
->exports
[0]),
642 for (i
= 0, j
= 0; i
< NE
; i
++)
644 if (i
> 0 && strcmp (e
[i
].name
, e
[i
- 1].name
) == 0)
646 /* This is a duplicate. */
647 if (e
[j
- 1].ordinal
!= -1
648 && e
[i
].ordinal
!= -1
649 && e
[j
- 1].ordinal
!= e
[i
].ordinal
)
651 if (pe_dll_warn_dup_exports
)
652 /* xgettext:c-format */
653 einfo (_("%XError, duplicate EXPORT with ordinals: %s (%d vs %d)\n"),
654 e
[j
- 1].name
, e
[j
- 1].ordinal
, e
[i
].ordinal
);
658 if (pe_dll_warn_dup_exports
)
659 /* xgettext:c-format */
660 einfo (_("Warning, duplicate EXPORT: %s\n"),
664 if (e
[i
].ordinal
!= -1)
665 e
[j
- 1].ordinal
= e
[i
].ordinal
;
666 e
[j
- 1].flag_private
|= e
[i
].flag_private
;
667 e
[j
- 1].flag_constant
|= e
[i
].flag_constant
;
668 e
[j
- 1].flag_noname
|= e
[i
].flag_noname
;
669 e
[j
- 1].flag_data
|= e
[i
].flag_data
;
678 pe_def_file
->num_exports
= j
; /* == NE */
680 for (i
= 0; i
< NE
; i
++)
684 name
= xmalloc (strlen (pe_def_file
->exports
[i
].internal_name
) + 2);
685 if (pe_details
->underscored
686 && (*pe_def_file
->exports
[i
].internal_name
!= '@'))
689 strcpy (name
+ 1, pe_def_file
->exports
[i
].internal_name
);
692 strcpy (name
, pe_def_file
->exports
[i
].internal_name
);
694 blhe
= bfd_link_hash_lookup (info
->hash
,
699 && (blhe
->type
== bfd_link_hash_defined
700 || (blhe
->type
== bfd_link_hash_common
)))
703 if (!pe_def_file
->exports
[i
].flag_noname
)
704 count_exported_byname
++;
706 /* Only fill in the sections. The actual offsets are computed
707 in fill_exported_offsets() after common symbols are laid
709 if (blhe
->type
== bfd_link_hash_defined
)
710 exported_symbol_sections
[i
] = blhe
->u
.def
.section
;
712 exported_symbol_sections
[i
] = blhe
->u
.c
.p
->section
;
714 if (pe_def_file
->exports
[i
].ordinal
!= -1)
716 if (max_ordinal
< pe_def_file
->exports
[i
].ordinal
)
717 max_ordinal
= pe_def_file
->exports
[i
].ordinal
;
718 if (min_ordinal
> pe_def_file
->exports
[i
].ordinal
)
719 min_ordinal
= pe_def_file
->exports
[i
].ordinal
;
720 count_with_ordinals
++;
723 else if (blhe
&& blhe
->type
== bfd_link_hash_undefined
)
725 /* xgettext:c-format */
726 einfo (_("%XCannot export %s: symbol not defined\n"),
727 pe_def_file
->exports
[i
].internal_name
);
731 /* xgettext:c-format */
732 einfo (_("%XCannot export %s: symbol wrong type (%d vs %d)\n"),
733 pe_def_file
->exports
[i
].internal_name
,
734 blhe
->type
, bfd_link_hash_defined
);
738 /* xgettext:c-format */
739 einfo (_("%XCannot export %s: symbol not found\n"),
740 pe_def_file
->exports
[i
].internal_name
);
746 /* Build the bfd that will contain .edata and .reloc sections. */
749 build_filler_bfd (int include_edata
)
751 lang_input_statement_type
*filler_file
;
752 filler_file
= lang_add_input_file ("dll stuff",
753 lang_input_file_is_fake_enum
,
755 filler_file
->the_bfd
= filler_bfd
= bfd_create ("dll stuff", output_bfd
);
756 if (filler_bfd
== NULL
757 || !bfd_set_arch_mach (filler_bfd
,
758 bfd_get_arch (output_bfd
),
759 bfd_get_mach (output_bfd
)))
761 einfo ("%X%P: can not create BFD %E\n");
767 edata_s
= bfd_make_section_old_way (filler_bfd
, ".edata");
769 || !bfd_set_section_flags (filler_bfd
, edata_s
,
776 einfo ("%X%P: can not create .edata section: %E\n");
779 bfd_set_section_size (filler_bfd
, edata_s
, edata_sz
);
782 reloc_s
= bfd_make_section_old_way (filler_bfd
, ".reloc");
784 || !bfd_set_section_flags (filler_bfd
, reloc_s
,
791 einfo ("%X%P: can not create .reloc section: %E\n");
795 bfd_set_section_size (filler_bfd
, reloc_s
, 0);
797 ldlang_add_file (filler_file
);
800 /* Gather all the exported symbols and build the .edata section. */
803 generate_edata (bfd
*abfd
, struct bfd_link_info
*info ATTRIBUTE_UNUSED
)
806 int name_table_size
= 0;
809 /* First, we need to know how many exported symbols there are,
810 and what the range of ordinals is. */
811 if (pe_def_file
->name
)
812 dll_name
= pe_def_file
->name
;
815 dll_name
= abfd
->filename
;
817 for (dlnp
= dll_name
; *dlnp
; dlnp
++)
818 if (*dlnp
== '\\' || *dlnp
== '/' || *dlnp
== ':')
822 if (count_with_ordinals
&& max_ordinal
> count_exported
)
824 if (min_ordinal
> max_ordinal
- count_exported
+ 1)
825 min_ordinal
= max_ordinal
- count_exported
+ 1;
830 max_ordinal
= count_exported
;
833 export_table_size
= max_ordinal
- min_ordinal
+ 1;
834 exported_symbols
= xmalloc (export_table_size
* sizeof (int));
835 for (i
= 0; i
< export_table_size
; i
++)
836 exported_symbols
[i
] = -1;
838 /* Now we need to assign ordinals to those that don't have them. */
839 for (i
= 0; i
< NE
; i
++)
841 if (exported_symbol_sections
[i
])
843 if (pe_def_file
->exports
[i
].ordinal
!= -1)
845 int ei
= pe_def_file
->exports
[i
].ordinal
- min_ordinal
;
846 int pi
= exported_symbols
[ei
];
850 /* xgettext:c-format */
851 einfo (_("%XError, ordinal used twice: %d (%s vs %s)\n"),
852 pe_def_file
->exports
[i
].ordinal
,
853 pe_def_file
->exports
[i
].name
,
854 pe_def_file
->exports
[pi
].name
);
856 exported_symbols
[ei
] = i
;
858 name_table_size
+= strlen (pe_def_file
->exports
[i
].name
) + 1;
862 next_ordinal
= min_ordinal
;
863 for (i
= 0; i
< NE
; i
++)
864 if (exported_symbol_sections
[i
])
865 if (pe_def_file
->exports
[i
].ordinal
== -1)
867 while (exported_symbols
[next_ordinal
- min_ordinal
] != -1)
870 exported_symbols
[next_ordinal
- min_ordinal
] = i
;
871 pe_def_file
->exports
[i
].ordinal
= next_ordinal
;
874 /* OK, now we can allocate some memory. */
875 edata_sz
= (40 /* directory */
876 + 4 * export_table_size
/* addresses */
877 + 4 * count_exported_byname
/* name ptrs */
878 + 2 * count_exported_byname
/* ordinals */
879 + name_table_size
+ strlen (dll_name
) + 1);
882 /* Fill the exported symbol offsets. The preliminary work has already
883 been done in process_def_file(). */
886 fill_exported_offsets (bfd
*abfd ATTRIBUTE_UNUSED
, struct bfd_link_info
*info
)
889 struct bfd_link_hash_entry
*blhe
;
891 for (i
= 0; i
< pe_def_file
->num_exports
; i
++)
895 name
= xmalloc (strlen (pe_def_file
->exports
[i
].internal_name
) + 2);
896 if (pe_details
->underscored
897 && *pe_def_file
->exports
[i
].internal_name
!= '@')
900 strcpy (name
+ 1, pe_def_file
->exports
[i
].internal_name
);
903 strcpy (name
, pe_def_file
->exports
[i
].internal_name
);
905 blhe
= bfd_link_hash_lookup (info
->hash
,
909 if (blhe
&& blhe
->type
== bfd_link_hash_defined
)
910 exported_symbol_offsets
[i
] = blhe
->u
.def
.value
;
917 fill_edata (bfd
*abfd
, struct bfd_link_info
*info ATTRIBUTE_UNUSED
)
920 unsigned char *edirectory
;
921 uint32_t *eaddresses
;
923 unsigned short *eordinals
;
924 unsigned char *enamestr
;
929 edata_d
= xmalloc (edata_sz
);
931 /* Note use of array pointer math here. */
932 edirectory
= edata_d
;
933 eaddresses
= (uint32_t *) (edata_d
+ 40);
934 enameptrs
= eaddresses
+ export_table_size
;
935 eordinals
= (unsigned short *) (enameptrs
+ count_exported_byname
);
936 enamestr
= (char *) (eordinals
+ count_exported_byname
);
938 #define ERVA(ptr) (((unsigned char *)(ptr) - edata_d) \
939 + edata_s->output_section->vma - image_base)
941 memset (edata_d
, 0, edata_sz
);
942 bfd_put_32 (abfd
, now
, edata_d
+ 4);
943 if (pe_def_file
->version_major
!= -1)
945 bfd_put_16 (abfd
, pe_def_file
->version_major
, edata_d
+ 8);
946 bfd_put_16 (abfd
, pe_def_file
->version_minor
, edata_d
+ 10);
949 bfd_put_32 (abfd
, ERVA (enamestr
), edata_d
+ 12);
950 strcpy (enamestr
, dll_name
);
951 enamestr
+= strlen (enamestr
) + 1;
952 bfd_put_32 (abfd
, min_ordinal
, edata_d
+ 16);
953 bfd_put_32 (abfd
, export_table_size
, edata_d
+ 20);
954 bfd_put_32 (abfd
, count_exported_byname
, edata_d
+ 24);
955 bfd_put_32 (abfd
, ERVA (eaddresses
), edata_d
+ 28);
956 bfd_put_32 (abfd
, ERVA (enameptrs
), edata_d
+ 32);
957 bfd_put_32 (abfd
, ERVA (eordinals
), edata_d
+ 36);
959 fill_exported_offsets (abfd
, info
);
961 /* Ok, now for the filling in part.
962 Scan alphabetically - ie the ordering in the exports[] table,
963 rather than by ordinal - the ordering in the exported_symbol[]
964 table. See dlltool.c and:
965 http://sources.redhat.com/ml/binutils/2003-04/msg00379.html
966 for more information. */
968 for (s
= 0; s
< NE
; s
++)
970 struct bfd_section
*ssec
= exported_symbol_sections
[s
];
971 if (ssec
&& pe_def_file
->exports
[s
].ordinal
!= -1)
973 unsigned long srva
= (exported_symbol_offsets
[s
]
974 + ssec
->output_section
->vma
975 + ssec
->output_offset
);
976 int ord
= pe_def_file
->exports
[s
].ordinal
;
978 bfd_put_32 (abfd
, srva
- image_base
,
979 (void *) (eaddresses
+ ord
- min_ordinal
));
981 if (!pe_def_file
->exports
[s
].flag_noname
)
983 char *ename
= pe_def_file
->exports
[s
].name
;
985 bfd_put_32 (abfd
, ERVA (enamestr
), (void *) enameptrs
);
987 strcpy (enamestr
, ename
);
988 enamestr
+= strlen (enamestr
) + 1;
989 bfd_put_16 (abfd
, ord
- min_ordinal
, (void *) eordinals
);
991 pe_def_file
->exports
[s
].hint
= hint
++;
998 static struct bfd_section
*current_sec
;
1001 pe_walk_relocs_of_symbol (struct bfd_link_info
*info
,
1003 int (*cb
) (arelent
*, asection
*))
1008 for (b
= info
->input_bfds
; b
; b
= b
->link_next
)
1013 symsize
= bfd_get_symtab_upper_bound (b
);
1014 symbols
= xmalloc (symsize
);
1015 nsyms
= bfd_canonicalize_symtab (b
, symbols
);
1017 for (s
= b
->sections
; s
; s
= s
->next
)
1020 int relsize
, nrelocs
, i
;
1021 int flags
= bfd_get_section_flags (b
, s
);
1023 /* Skip discarded linkonce sections. */
1024 if (flags
& SEC_LINK_ONCE
1025 && s
->output_section
== bfd_abs_section_ptr
)
1030 relsize
= bfd_get_reloc_upper_bound (b
, s
);
1031 relocs
= xmalloc (relsize
);
1032 nrelocs
= bfd_canonicalize_reloc (b
, s
, relocs
, symbols
);
1034 for (i
= 0; i
< nrelocs
; i
++)
1036 struct bfd_symbol
*sym
= *relocs
[i
]->sym_ptr_ptr
;
1038 if (!strcmp (name
, sym
->name
))
1044 /* Warning: the allocated symbols are remembered in BFD and reused
1045 later, so don't free them! */
1046 /* free (symbols); */
1051 /* Gather all the relocations and build the .reloc section. */
1054 generate_reloc (bfd
*abfd
, struct bfd_link_info
*info
)
1057 /* For .reloc stuff. */
1058 reloc_data_type
*reloc_data
;
1059 int total_relocs
= 0;
1061 unsigned long sec_page
= (unsigned long) -1;
1062 unsigned long page_ptr
, page_count
;
1065 struct bfd_section
*s
;
1068 for (b
= info
->input_bfds
; b
; b
= b
->link_next
)
1069 for (s
= b
->sections
; s
; s
= s
->next
)
1070 total_relocs
+= s
->reloc_count
;
1072 reloc_data
= xmalloc (total_relocs
* sizeof (reloc_data_type
));
1076 for (bi
= 0, b
= info
->input_bfds
; b
; bi
++, b
= b
->link_next
)
1079 int relsize
, nrelocs
, i
;
1081 for (s
= b
->sections
; s
; s
= s
->next
)
1083 unsigned long sec_vma
= s
->output_section
->vma
+ s
->output_offset
;
1087 /* If it's not loaded, we don't need to relocate it this way. */
1088 if (!(s
->output_section
->flags
& SEC_LOAD
))
1091 /* I don't know why there would be a reloc for these, but I've
1092 seen it happen - DJ */
1093 if (s
->output_section
== &bfd_abs_section
)
1096 if (s
->output_section
->vma
== 0)
1098 /* Huh? Shouldn't happen, but punt if it does. */
1099 einfo ("DJ: zero vma section reloc detected: `%s' #%d f=%d\n",
1100 s
->output_section
->name
, s
->output_section
->index
,
1101 s
->output_section
->flags
);
1105 symsize
= bfd_get_symtab_upper_bound (b
);
1106 symbols
= xmalloc (symsize
);
1107 nsyms
= bfd_canonicalize_symtab (b
, symbols
);
1109 relsize
= bfd_get_reloc_upper_bound (b
, s
);
1110 relocs
= xmalloc (relsize
);
1111 nrelocs
= bfd_canonicalize_reloc (b
, s
, relocs
, symbols
);
1113 for (i
= 0; i
< nrelocs
; i
++)
1115 if (pe_dll_extra_pe_debug
)
1117 struct bfd_symbol
*sym
= *relocs
[i
]->sym_ptr_ptr
;
1118 printf ("rel: %s\n", sym
->name
);
1120 if (!relocs
[i
]->howto
->pc_relative
1121 && relocs
[i
]->howto
->type
!= pe_details
->imagebase_reloc
)
1124 struct bfd_symbol
*sym
= *relocs
[i
]->sym_ptr_ptr
;
1126 sym_vma
= (relocs
[i
]->addend
1129 + sym
->section
->output_offset
1130 + sym
->section
->output_section
->vma
);
1131 reloc_data
[total_relocs
].vma
= sec_vma
+ relocs
[i
]->address
;
1133 #define BITS_AND_SHIFT(bits, shift) (bits * 1000 | shift)
1135 switch BITS_AND_SHIFT (relocs
[i
]->howto
->bitsize
,
1136 relocs
[i
]->howto
->rightshift
)
1138 case BITS_AND_SHIFT (32, 0):
1139 reloc_data
[total_relocs
].type
= 3;
1142 case BITS_AND_SHIFT (16, 0):
1143 reloc_data
[total_relocs
].type
= 2;
1146 case BITS_AND_SHIFT (16, 16):
1147 reloc_data
[total_relocs
].type
= 4;
1148 /* FIXME: we can't know the symbol's right value
1149 yet, but we probably can safely assume that
1150 CE will relocate us in 64k blocks, so leaving
1152 reloc_data
[total_relocs
].extra
= 0;
1155 case BITS_AND_SHIFT (26, 2):
1156 reloc_data
[total_relocs
].type
= 5;
1159 case BITS_AND_SHIFT (24, 2):
1160 /* FIXME: 0 is ARM_26D, it is defined in bfd/coff-arm.c
1161 Those ARM_xxx definitions should go in proper
1163 if (relocs
[i
]->howto
->type
== 0
1164 /* Older GNU linkers used 5 instead of 0 for this reloc. */
1165 || relocs
[i
]->howto
->type
== 5)
1166 /* This is an ARM_26D reloc, which is an ARM_26 reloc
1167 that has already been fully processed during a
1168 previous link stage, so ignore it here. */
1172 /* xgettext:c-format */
1173 einfo (_("%XError: %d-bit reloc in dll\n"),
1174 relocs
[i
]->howto
->bitsize
);
1180 /* Warning: the allocated symbols are remembered in BFD and
1181 reused later, so don't free them! */
1188 /* At this point, we have total_relocs relocation addresses in
1189 reloc_addresses, which are all suitable for the .reloc section.
1190 We must now create the new sections. */
1191 qsort (reloc_data
, total_relocs
, sizeof (*reloc_data
), reloc_sort
);
1193 for (i
= 0; i
< total_relocs
; i
++)
1195 unsigned long this_page
= (reloc_data
[i
].vma
>> 12);
1197 if (this_page
!= sec_page
)
1199 reloc_sz
= (reloc_sz
+ 3) & ~3; /* 4-byte align. */
1201 sec_page
= this_page
;
1206 if (reloc_data
[i
].type
== 4)
1210 reloc_sz
= (reloc_sz
+ 3) & ~3; /* 4-byte align. */
1211 reloc_d
= xmalloc (reloc_sz
);
1212 sec_page
= (unsigned long) -1;
1214 page_ptr
= (unsigned long) -1;
1217 for (i
= 0; i
< total_relocs
; i
++)
1219 unsigned long rva
= reloc_data
[i
].vma
- image_base
;
1220 unsigned long this_page
= (rva
& ~0xfff);
1222 if (this_page
!= sec_page
)
1224 while (reloc_sz
& 3)
1225 reloc_d
[reloc_sz
++] = 0;
1227 if (page_ptr
!= (unsigned long) -1)
1228 bfd_put_32 (abfd
, reloc_sz
- page_ptr
, reloc_d
+ page_ptr
+ 4);
1230 bfd_put_32 (abfd
, this_page
, reloc_d
+ reloc_sz
);
1231 page_ptr
= reloc_sz
;
1233 sec_page
= this_page
;
1237 bfd_put_16 (abfd
, (rva
& 0xfff) + (reloc_data
[i
].type
<< 12),
1238 reloc_d
+ reloc_sz
);
1241 if (reloc_data
[i
].type
== 4)
1243 bfd_put_16 (abfd
, reloc_data
[i
].extra
, reloc_d
+ reloc_sz
);
1250 while (reloc_sz
& 3)
1251 reloc_d
[reloc_sz
++] = 0;
1253 if (page_ptr
!= (unsigned long) -1)
1254 bfd_put_32 (abfd
, reloc_sz
- page_ptr
, reloc_d
+ page_ptr
+ 4);
1256 while (reloc_sz
< reloc_s
->_raw_size
)
1257 reloc_d
[reloc_sz
++] = 0;
1260 /* Given the exiting def_file structure, print out a .DEF file that
1261 corresponds to it. */
1264 quoteput (char *s
, FILE *f
, int needs_quotes
)
1268 for (cp
= s
; *cp
; cp
++)
1283 if (*s
== '"' || *s
== '\\')
1297 pe_dll_generate_def_file (const char *pe_out_def_filename
)
1300 FILE *out
= fopen (pe_out_def_filename
, "w");
1303 /* xgettext:c-format */
1304 einfo (_("%s: Can't open output def file %s\n"),
1305 program_name
, pe_out_def_filename
);
1309 if (pe_def_file
->name
)
1311 if (pe_def_file
->is_dll
)
1312 fprintf (out
, "LIBRARY ");
1314 fprintf (out
, "NAME ");
1316 quoteput (pe_def_file
->name
, out
, 1);
1318 if (pe_data (output_bfd
)->pe_opthdr
.ImageBase
)
1319 fprintf (out
, " BASE=0x%lx",
1320 (unsigned long) pe_data (output_bfd
)->pe_opthdr
.ImageBase
);
1321 fprintf (out
, "\n");
1324 if (pe_def_file
->description
)
1326 fprintf (out
, "DESCRIPTION ");
1327 quoteput (pe_def_file
->description
, out
, 1);
1328 fprintf (out
, "\n");
1331 if (pe_def_file
->version_minor
!= -1)
1332 fprintf (out
, "VERSION %d.%d\n", pe_def_file
->version_major
,
1333 pe_def_file
->version_minor
);
1334 else if (pe_def_file
->version_major
!= -1)
1335 fprintf (out
, "VERSION %d\n", pe_def_file
->version_major
);
1337 if (pe_def_file
->stack_reserve
!= -1 || pe_def_file
->heap_reserve
!= -1)
1338 fprintf (out
, "\n");
1340 if (pe_def_file
->stack_commit
!= -1)
1341 fprintf (out
, "STACKSIZE 0x%x,0x%x\n",
1342 pe_def_file
->stack_reserve
, pe_def_file
->stack_commit
);
1343 else if (pe_def_file
->stack_reserve
!= -1)
1344 fprintf (out
, "STACKSIZE 0x%x\n", pe_def_file
->stack_reserve
);
1346 if (pe_def_file
->heap_commit
!= -1)
1347 fprintf (out
, "HEAPSIZE 0x%x,0x%x\n",
1348 pe_def_file
->heap_reserve
, pe_def_file
->heap_commit
);
1349 else if (pe_def_file
->heap_reserve
!= -1)
1350 fprintf (out
, "HEAPSIZE 0x%x\n", pe_def_file
->heap_reserve
);
1352 if (pe_def_file
->num_section_defs
> 0)
1354 fprintf (out
, "\nSECTIONS\n\n");
1356 for (i
= 0; i
< pe_def_file
->num_section_defs
; i
++)
1359 quoteput (pe_def_file
->section_defs
[i
].name
, out
, 0);
1361 if (pe_def_file
->section_defs
[i
].class)
1363 fprintf (out
, " CLASS ");
1364 quoteput (pe_def_file
->section_defs
[i
].class, out
, 0);
1367 if (pe_def_file
->section_defs
[i
].flag_read
)
1368 fprintf (out
, " READ");
1370 if (pe_def_file
->section_defs
[i
].flag_write
)
1371 fprintf (out
, " WRITE");
1373 if (pe_def_file
->section_defs
[i
].flag_execute
)
1374 fprintf (out
, " EXECUTE");
1376 if (pe_def_file
->section_defs
[i
].flag_shared
)
1377 fprintf (out
, " SHARED");
1379 fprintf (out
, "\n");
1383 if (pe_def_file
->num_exports
> 0)
1385 fprintf (out
, "EXPORTS\n");
1387 for (i
= 0; i
< pe_def_file
->num_exports
; i
++)
1389 def_file_export
*e
= pe_def_file
->exports
+ i
;
1391 quoteput (e
->name
, out
, 0);
1393 if (e
->internal_name
&& strcmp (e
->internal_name
, e
->name
))
1395 fprintf (out
, " = ");
1396 quoteput (e
->internal_name
, out
, 0);
1399 if (e
->ordinal
!= -1)
1400 fprintf (out
, " @%d", e
->ordinal
);
1402 if (e
->flag_private
)
1403 fprintf (out
, " PRIVATE");
1405 if (e
->flag_constant
)
1406 fprintf (out
, " CONSTANT");
1409 fprintf (out
, " NONAME");
1412 fprintf (out
, " DATA");
1414 fprintf (out
, "\n");
1418 if (pe_def_file
->num_imports
> 0)
1420 fprintf (out
, "\nIMPORTS\n\n");
1422 for (i
= 0; i
< pe_def_file
->num_imports
; i
++)
1424 def_file_import
*im
= pe_def_file
->imports
+ i
;
1427 if (im
->internal_name
1428 && (!im
->name
|| strcmp (im
->internal_name
, im
->name
)))
1430 quoteput (im
->internal_name
, out
, 0);
1431 fprintf (out
, " = ");
1434 quoteput (im
->module
->name
, out
, 0);
1438 quoteput (im
->name
, out
, 0);
1440 fprintf (out
, "%d", im
->ordinal
);
1442 fprintf (out
, "\n");
1447 fprintf (out
, _("; no contents available\n"));
1449 if (fclose (out
) == EOF
)
1450 /* xgettext:c-format */
1451 einfo (_("%P: Error closing file `%s'\n"), pe_out_def_filename
);
1454 /* Generate the import library. */
1456 static asymbol
**symtab
;
1459 static const char *dll_filename
;
1460 static char *dll_symname
;
1462 #define UNDSEC (asection *) &bfd_und_section
1465 quick_section (bfd
*abfd
, const char *name
, int flags
, int align
)
1470 sec
= bfd_make_section_old_way (abfd
, name
);
1471 bfd_set_section_flags (abfd
, sec
, flags
| SEC_ALLOC
| SEC_LOAD
| SEC_KEEP
);
1472 bfd_set_section_alignment (abfd
, sec
, align
);
1473 /* Remember to undo this before trying to link internally! */
1474 sec
->output_section
= sec
;
1476 sym
= bfd_make_empty_symbol (abfd
);
1477 symtab
[symptr
++] = sym
;
1478 sym
->name
= sec
->name
;
1480 sym
->flags
= BSF_LOCAL
;
1487 quick_symbol (bfd
*abfd
,
1496 char *name
= xmalloc (strlen (n1
) + strlen (n2
) + strlen (n3
) + 1);
1501 sym
= bfd_make_empty_symbol (abfd
);
1506 symtab
[symptr
++] = sym
;
1509 static arelent
*reltab
= 0;
1510 static int relcount
= 0, relsize
= 0;
1513 quick_reloc (bfd
*abfd
, int address
, int which_howto
, int symidx
)
1515 if (relcount
>= relsize
- 1)
1519 reltab
= xrealloc (reltab
, relsize
* sizeof (arelent
));
1521 reltab
= xmalloc (relsize
* sizeof (arelent
));
1523 reltab
[relcount
].address
= address
;
1524 reltab
[relcount
].addend
= 0;
1525 reltab
[relcount
].howto
= bfd_reloc_type_lookup (abfd
, which_howto
);
1526 reltab
[relcount
].sym_ptr_ptr
= symtab
+ symidx
;
1531 save_relocs (asection
*sec
)
1535 sec
->relocation
= reltab
;
1536 sec
->reloc_count
= relcount
;
1537 sec
->orelocation
= xmalloc ((relcount
+ 1) * sizeof (arelent
*));
1538 for (i
= 0; i
< relcount
; i
++)
1539 sec
->orelocation
[i
] = sec
->relocation
+ i
;
1540 sec
->orelocation
[relcount
] = 0;
1541 sec
->flags
|= SEC_RELOC
;
1543 relcount
= relsize
= 0;
1546 /* .section .idata$2
1547 .global __head_my_dll
1564 make_head (bfd
*parent
)
1566 asection
*id2
, *id5
, *id4
;
1567 unsigned char *d2
, *d5
, *d4
;
1571 oname
= xmalloc (20);
1572 sprintf (oname
, "d%06d.o", tmp_seq
);
1575 abfd
= bfd_create (oname
, parent
);
1576 bfd_find_target (pe_details
->object_target
, abfd
);
1577 bfd_make_writable (abfd
);
1579 bfd_set_format (abfd
, bfd_object
);
1580 bfd_set_arch_mach (abfd
, pe_details
->bfd_arch
, 0);
1583 symtab
= xmalloc (6 * sizeof (asymbol
*));
1584 id2
= quick_section (abfd
, ".idata$2", SEC_HAS_CONTENTS
, 2);
1585 id5
= quick_section (abfd
, ".idata$5", SEC_HAS_CONTENTS
, 2);
1586 id4
= quick_section (abfd
, ".idata$4", SEC_HAS_CONTENTS
, 2);
1587 quick_symbol (abfd
, U ("_head_"), dll_symname
, "", id2
, BSF_GLOBAL
, 0);
1588 quick_symbol (abfd
, U (""), dll_symname
, "_iname", UNDSEC
, BSF_GLOBAL
, 0);
1590 /* OK, pay attention here. I got confused myself looking back at
1591 it. We create a four-byte section to mark the beginning of the
1592 list, and we include an offset of 4 in the section, so that the
1593 pointer to the list points to the *end* of this section, which is
1594 the start of the list of sections from other objects. */
1596 bfd_set_section_size (abfd
, id2
, 20);
1600 d2
[0] = d2
[16] = 4; /* Reloc addend. */
1601 quick_reloc (abfd
, 0, BFD_RELOC_RVA
, 2);
1602 quick_reloc (abfd
, 12, BFD_RELOC_RVA
, 4);
1603 quick_reloc (abfd
, 16, BFD_RELOC_RVA
, 1);
1606 bfd_set_section_size (abfd
, id5
, 4);
1611 bfd_set_section_size (abfd
, id4
, 4);
1616 bfd_set_symtab (abfd
, symtab
, symptr
);
1618 bfd_set_section_contents (abfd
, id2
, d2
, 0, 20);
1619 bfd_set_section_contents (abfd
, id5
, d5
, 0, 4);
1620 bfd_set_section_contents (abfd
, id4
, d4
, 0, 4);
1622 bfd_make_readable (abfd
);
1626 /* .section .idata$4
1631 .global __my_dll_iname
1636 make_tail (bfd
*parent
)
1638 asection
*id4
, *id5
, *id7
;
1639 unsigned char *d4
, *d5
, *d7
;
1644 oname
= xmalloc (20);
1645 sprintf (oname
, "d%06d.o", tmp_seq
);
1648 abfd
= bfd_create (oname
, parent
);
1649 bfd_find_target (pe_details
->object_target
, abfd
);
1650 bfd_make_writable (abfd
);
1652 bfd_set_format (abfd
, bfd_object
);
1653 bfd_set_arch_mach (abfd
, pe_details
->bfd_arch
, 0);
1656 symtab
= xmalloc (5 * sizeof (asymbol
*));
1657 id4
= quick_section (abfd
, ".idata$4", SEC_HAS_CONTENTS
, 2);
1658 id5
= quick_section (abfd
, ".idata$5", SEC_HAS_CONTENTS
, 2);
1659 id7
= quick_section (abfd
, ".idata$7", SEC_HAS_CONTENTS
, 2);
1660 quick_symbol (abfd
, U (""), dll_symname
, "_iname", id7
, BSF_GLOBAL
, 0);
1662 bfd_set_section_size (abfd
, id4
, 4);
1667 bfd_set_section_size (abfd
, id5
, 4);
1672 len
= strlen (dll_filename
) + 1;
1675 bfd_set_section_size (abfd
, id7
, len
);
1678 strcpy (d7
, dll_filename
);
1680 bfd_set_symtab (abfd
, symtab
, symptr
);
1682 bfd_set_section_contents (abfd
, id4
, d4
, 0, 4);
1683 bfd_set_section_contents (abfd
, id5
, d5
, 0, 4);
1684 bfd_set_section_contents (abfd
, id7
, d7
, 0, len
);
1686 bfd_make_readable (abfd
);
1692 .global ___imp_function
1693 .global __imp__function
1695 jmp *__imp__function:
1709 .asciz "function" xlate? (add underscore, kill at) */
1711 static unsigned char jmp_ix86_bytes
[] =
1713 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x90, 0x90
1721 .dw __imp_function */
1723 static unsigned char jmp_sh_bytes
[] =
1725 0x01, 0xd0, 0x02, 0x60, 0x2b, 0x40, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00
1729 lui $t0,<high:__imp_function>
1730 lw $t0,<low:__imp_function>
1734 static unsigned char jmp_mips_bytes
[] =
1736 0x00, 0x00, 0x08, 0x3c, 0x00, 0x00, 0x08, 0x8d,
1737 0x08, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00
1741 make_one (def_file_export
*exp
, bfd
*parent
)
1743 asection
*tx
, *id7
, *id5
, *id4
, *id6
;
1744 unsigned char *td
= NULL
, *d7
, *d5
, *d4
, *d6
= NULL
;
1748 unsigned char *jmp_bytes
= NULL
;
1749 int jmp_byte_count
= 0;
1751 switch (pe_details
->pe_arch
)
1754 jmp_bytes
= jmp_ix86_bytes
;
1755 jmp_byte_count
= sizeof (jmp_ix86_bytes
);
1758 jmp_bytes
= jmp_sh_bytes
;
1759 jmp_byte_count
= sizeof (jmp_sh_bytes
);
1762 jmp_bytes
= jmp_mips_bytes
;
1763 jmp_byte_count
= sizeof (jmp_mips_bytes
);
1769 oname
= xmalloc (20);
1770 sprintf (oname
, "d%06d.o", tmp_seq
);
1773 abfd
= bfd_create (oname
, parent
);
1774 bfd_find_target (pe_details
->object_target
, abfd
);
1775 bfd_make_writable (abfd
);
1777 bfd_set_format (abfd
, bfd_object
);
1778 bfd_set_arch_mach (abfd
, pe_details
->bfd_arch
, 0);
1781 symtab
= xmalloc (11 * sizeof (asymbol
*));
1782 tx
= quick_section (abfd
, ".text", SEC_CODE
|SEC_HAS_CONTENTS
, 2);
1783 id7
= quick_section (abfd
, ".idata$7", SEC_HAS_CONTENTS
, 2);
1784 id5
= quick_section (abfd
, ".idata$5", SEC_HAS_CONTENTS
, 2);
1785 id4
= quick_section (abfd
, ".idata$4", SEC_HAS_CONTENTS
, 2);
1786 id6
= quick_section (abfd
, ".idata$6", SEC_HAS_CONTENTS
, 2);
1788 if (*exp
->internal_name
== '@')
1790 quick_symbol (abfd
, U ("_head_"), dll_symname
, "", UNDSEC
,
1792 if (! exp
->flag_data
)
1793 quick_symbol (abfd
, "", exp
->internal_name
, "", tx
, BSF_GLOBAL
, 0);
1794 quick_symbol (abfd
, U ("_imp_"), exp
->internal_name
, "", id5
,
1796 /* Fastcall applies only to functions,
1797 so no need for auto-import symbol. */
1801 quick_symbol (abfd
, U ("_head_"), dll_symname
, "", UNDSEC
,
1803 if (! exp
->flag_data
)
1804 quick_symbol (abfd
, U (""), exp
->internal_name
, "", tx
,
1806 quick_symbol (abfd
, U ("_imp__"), exp
->internal_name
, "", id5
,
1808 /* Symbol to reference ord/name of imported
1809 data symbol, used to implement auto-import. */
1811 quick_symbol (abfd
, U("_nm__"), exp
->internal_name
, "", id6
,
1814 if (pe_dll_compat_implib
)
1815 quick_symbol (abfd
, U ("__imp_"), exp
->internal_name
, "", id5
,
1818 if (! exp
->flag_data
)
1820 bfd_set_section_size (abfd
, tx
, jmp_byte_count
);
1821 td
= xmalloc (jmp_byte_count
);
1823 memcpy (td
, jmp_bytes
, jmp_byte_count
);
1825 switch (pe_details
->pe_arch
)
1828 quick_reloc (abfd
, 2, BFD_RELOC_32
, 2);
1831 quick_reloc (abfd
, 8, BFD_RELOC_32
, 2);
1834 quick_reloc (abfd
, 0, BFD_RELOC_HI16_S
, 2);
1835 quick_reloc (abfd
, 0, BFD_RELOC_LO16
, 0); /* MIPS_R_PAIR */
1836 quick_reloc (abfd
, 4, BFD_RELOC_LO16
, 2);
1844 bfd_set_section_size (abfd
, id7
, 4);
1848 quick_reloc (abfd
, 0, BFD_RELOC_RVA
, 5);
1851 bfd_set_section_size (abfd
, id5
, 4);
1856 if (exp
->flag_noname
)
1858 d5
[0] = exp
->ordinal
;
1859 d5
[1] = exp
->ordinal
>> 8;
1864 quick_reloc (abfd
, 0, BFD_RELOC_RVA
, 4);
1868 bfd_set_section_size (abfd
, id4
, 4);
1873 if (exp
->flag_noname
)
1875 d4
[0] = exp
->ordinal
;
1876 d4
[1] = exp
->ordinal
>> 8;
1881 quick_reloc (abfd
, 0, BFD_RELOC_RVA
, 4);
1885 if (exp
->flag_noname
)
1888 bfd_set_section_size (abfd
, id6
, 0);
1892 len
= strlen (exp
->name
) + 3;
1895 bfd_set_section_size (abfd
, id6
, len
);
1898 memset (d6
, 0, len
);
1899 d6
[0] = exp
->hint
& 0xff;
1900 d6
[1] = exp
->hint
>> 8;
1901 strcpy (d6
+ 2, exp
->name
);
1904 bfd_set_symtab (abfd
, symtab
, symptr
);
1906 bfd_set_section_contents (abfd
, tx
, td
, 0, jmp_byte_count
);
1907 bfd_set_section_contents (abfd
, id7
, d7
, 0, 4);
1908 bfd_set_section_contents (abfd
, id5
, d5
, 0, 4);
1909 bfd_set_section_contents (abfd
, id4
, d4
, 0, 4);
1910 if (!exp
->flag_noname
)
1911 bfd_set_section_contents (abfd
, id6
, d6
, 0, len
);
1913 bfd_make_readable (abfd
);
1918 make_singleton_name_thunk (const char *import
, bfd
*parent
)
1920 /* Name thunks go to idata$4. */
1926 oname
= xmalloc (20);
1927 sprintf (oname
, "nmth%06d.o", tmp_seq
);
1930 abfd
= bfd_create (oname
, parent
);
1931 bfd_find_target (pe_details
->object_target
, abfd
);
1932 bfd_make_writable (abfd
);
1934 bfd_set_format (abfd
, bfd_object
);
1935 bfd_set_arch_mach (abfd
, pe_details
->bfd_arch
, 0);
1938 symtab
= xmalloc (3 * sizeof (asymbol
*));
1939 id4
= quick_section (abfd
, ".idata$4", SEC_HAS_CONTENTS
, 2);
1940 quick_symbol (abfd
, U ("_nm_thnk_"), import
, "", id4
, BSF_GLOBAL
, 0);
1941 quick_symbol (abfd
, U ("_nm_"), import
, "", UNDSEC
, BSF_GLOBAL
, 0);
1943 bfd_set_section_size (abfd
, id4
, 8);
1947 quick_reloc (abfd
, 0, BFD_RELOC_RVA
, 2);
1950 bfd_set_symtab (abfd
, symtab
, symptr
);
1952 bfd_set_section_contents (abfd
, id4
, d4
, 0, 8);
1954 bfd_make_readable (abfd
);
1959 make_import_fixup_mark (arelent
*rel
)
1961 /* We convert reloc to symbol, for later reference. */
1963 static char *fixup_name
= NULL
;
1964 static size_t buffer_len
= 0;
1966 struct bfd_symbol
*sym
= *rel
->sym_ptr_ptr
;
1968 bfd
*abfd
= bfd_asymbol_bfd (sym
);
1969 struct bfd_link_hash_entry
*bh
;
1973 fixup_name
= xmalloc (384);
1977 if (strlen (sym
->name
) + 25 > buffer_len
)
1978 /* Assume 25 chars for "__fu" + counter + "_". If counter is
1979 bigger than 20 digits long, we've got worse problems than
1980 overflowing this buffer... */
1983 /* New buffer size is length of symbol, plus 25, but
1984 then rounded up to the nearest multiple of 128. */
1985 buffer_len
= ((strlen (sym
->name
) + 25) + 127) & ~127;
1986 fixup_name
= xmalloc (buffer_len
);
1989 sprintf (fixup_name
, "__fu%d_%s", counter
++, sym
->name
);
1992 bfd_coff_link_add_one_symbol (&link_info
, abfd
, fixup_name
, BSF_GLOBAL
,
1993 current_sec
, /* sym->section, */
1994 rel
->address
, NULL
, TRUE
, FALSE
, &bh
);
1998 struct coff_link_hash_entry
*myh
;
2000 myh
= (struct coff_link_hash_entry
*) bh
;
2001 printf ("type:%d\n", myh
->type
);
2002 printf ("%s\n", myh
->root
.u
.def
.section
->name
);
2008 /* .section .idata$3
2009 .rva __nm_thnk_SYM (singleton thunk with name of func)
2012 .rva __my_dll_iname (name of dll)
2013 .rva __fuNN_SYM (pointer to reference (address) in text) */
2016 make_import_fixup_entry (const char *name
,
2017 const char *fixup_name
,
2018 const char *dll_symname
,
2026 oname
= xmalloc (20);
2027 sprintf (oname
, "fu%06d.o", tmp_seq
);
2030 abfd
= bfd_create (oname
, parent
);
2031 bfd_find_target (pe_details
->object_target
, abfd
);
2032 bfd_make_writable (abfd
);
2034 bfd_set_format (abfd
, bfd_object
);
2035 bfd_set_arch_mach (abfd
, pe_details
->bfd_arch
, 0);
2038 symtab
= xmalloc (6 * sizeof (asymbol
*));
2039 id3
= quick_section (abfd
, ".idata$3", SEC_HAS_CONTENTS
, 2);
2042 quick_symbol (abfd
, U ("_head_"), dll_symname
, "", id2
, BSF_GLOBAL
, 0);
2044 quick_symbol (abfd
, U ("_nm_thnk_"), name
, "", UNDSEC
, BSF_GLOBAL
, 0);
2045 quick_symbol (abfd
, U (""), dll_symname
, "_iname", UNDSEC
, BSF_GLOBAL
, 0);
2046 quick_symbol (abfd
, "", fixup_name
, "", UNDSEC
, BSF_GLOBAL
, 0);
2048 bfd_set_section_size (abfd
, id3
, 20);
2053 quick_reloc (abfd
, 0, BFD_RELOC_RVA
, 1);
2054 quick_reloc (abfd
, 12, BFD_RELOC_RVA
, 2);
2055 quick_reloc (abfd
, 16, BFD_RELOC_RVA
, 3);
2058 bfd_set_symtab (abfd
, symtab
, symptr
);
2060 bfd_set_section_contents (abfd
, id3
, d3
, 0, 20);
2062 bfd_make_readable (abfd
);
2066 /* .section .rdata_runtime_pseudo_reloc
2068 .rva __fuNN_SYM (pointer to reference (address) in text) */
2071 make_runtime_pseudo_reloc (const char *name ATTRIBUTE_UNUSED
,
2072 const char *fixup_name
,
2077 unsigned char *rt_rel_d
;
2081 oname
= xmalloc (20);
2082 sprintf (oname
, "rtr%06d.o", tmp_seq
);
2085 abfd
= bfd_create (oname
, parent
);
2086 bfd_find_target (pe_details
->object_target
, abfd
);
2087 bfd_make_writable (abfd
);
2089 bfd_set_format (abfd
, bfd_object
);
2090 bfd_set_arch_mach (abfd
, pe_details
->bfd_arch
, 0);
2093 symtab
= xmalloc (2 * sizeof (asymbol
*));
2094 rt_rel
= quick_section (abfd
, ".rdata_runtime_pseudo_reloc",
2095 SEC_HAS_CONTENTS
, 2);
2097 quick_symbol (abfd
, "", fixup_name
, "", UNDSEC
, BSF_GLOBAL
, 0);
2099 bfd_set_section_size (abfd
, rt_rel
, 8);
2100 rt_rel_d
= xmalloc (8);
2101 rt_rel
->contents
= rt_rel_d
;
2102 memset (rt_rel_d
, 0, 8);
2103 bfd_put_32 (abfd
, addend
, rt_rel_d
);
2105 quick_reloc (abfd
, 4, BFD_RELOC_RVA
, 1);
2106 save_relocs (rt_rel
);
2108 bfd_set_symtab (abfd
, symtab
, symptr
);
2110 bfd_set_section_contents (abfd
, rt_rel
, rt_rel_d
, 0, 8);
2112 bfd_make_readable (abfd
);
2117 .rva __pei386_runtime_relocator */
2120 pe_create_runtime_relocator_reference (bfd
*parent
)
2122 asection
*extern_rt_rel
;
2123 unsigned char *extern_rt_rel_d
;
2127 oname
= xmalloc (20);
2128 sprintf (oname
, "ertr%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
= xmalloc (2 * sizeof (asymbol
*));
2140 extern_rt_rel
= quick_section (abfd
, ".rdata", SEC_HAS_CONTENTS
, 2);
2142 quick_symbol (abfd
, "", "__pei386_runtime_relocator", "", UNDSEC
,
2145 bfd_set_section_size (abfd
, extern_rt_rel
, 4);
2146 extern_rt_rel_d
= xmalloc (4);
2147 extern_rt_rel
->contents
= extern_rt_rel_d
;
2149 quick_reloc (abfd
, 0, BFD_RELOC_RVA
, 1);
2150 save_relocs (extern_rt_rel
);
2152 bfd_set_symtab (abfd
, symtab
, symptr
);
2154 bfd_set_section_contents (abfd
, extern_rt_rel
, extern_rt_rel_d
, 0, 4);
2156 bfd_make_readable (abfd
);
2161 pe_create_import_fixup (arelent
*rel
, asection
*s
, int addend
)
2164 struct bfd_symbol
*sym
= *rel
->sym_ptr_ptr
;
2165 struct bfd_link_hash_entry
*name_thunk_sym
;
2166 const char *name
= sym
->name
;
2167 char *fixup_name
= make_import_fixup_mark (rel
);
2170 sprintf (buf
, U ("_nm_thnk_%s"), name
);
2172 name_thunk_sym
= bfd_link_hash_lookup (link_info
.hash
, buf
, 0, 0, 1);
2174 if (!name_thunk_sym
|| name_thunk_sym
->type
!= bfd_link_hash_defined
)
2176 bfd
*b
= make_singleton_name_thunk (name
, output_bfd
);
2177 add_bfd_to_link (b
, b
->filename
, &link_info
);
2179 /* If we ever use autoimport, we have to cast text section writable. */
2180 config
.text_read_only
= FALSE
;
2181 output_bfd
->flags
&= ~WP_TEXT
;
2184 if (addend
== 0 || link_info
.pei386_runtime_pseudo_reloc
)
2186 extern char * pe_data_import_dll
;
2187 char * dll_symname
= pe_data_import_dll
? pe_data_import_dll
: "unknown";
2189 b
= make_import_fixup_entry (name
, fixup_name
, dll_symname
, output_bfd
);
2190 add_bfd_to_link (b
, b
->filename
, &link_info
);
2195 if (link_info
.pei386_runtime_pseudo_reloc
)
2197 if (pe_dll_extra_pe_debug
)
2198 printf ("creating runtime pseudo-reloc entry for %s (addend=%d)\n",
2199 fixup_name
, addend
);
2200 b
= make_runtime_pseudo_reloc (name
, fixup_name
, addend
, output_bfd
);
2201 add_bfd_to_link (b
, b
->filename
, &link_info
);
2203 if (runtime_pseudo_relocs_created
== 0)
2205 b
= pe_create_runtime_relocator_reference (output_bfd
);
2206 add_bfd_to_link (b
, b
->filename
, &link_info
);
2208 runtime_pseudo_relocs_created
++;
2212 einfo (_("%C: variable '%T' can't be auto-imported. Please read the documentation for ld's --enable-auto-import for details.\n"),
2213 s
->owner
, s
, rel
->address
, sym
->name
);
2221 pe_dll_generate_implib (def_file
*def
, const char *impfilename
)
2229 dll_filename
= (def
->name
) ? def
->name
: dll_name
;
2230 dll_symname
= xstrdup (dll_filename
);
2231 for (i
= 0; dll_symname
[i
]; i
++)
2232 if (!ISALNUM (dll_symname
[i
]))
2233 dll_symname
[i
] = '_';
2235 unlink (impfilename
);
2237 outarch
= bfd_openw (impfilename
, 0);
2241 /* xgettext:c-format */
2242 einfo (_("%XCan't open .lib file: %s\n"), impfilename
);
2246 /* xgettext:c-format */
2247 einfo (_("Creating library file: %s\n"), impfilename
);
2249 bfd_set_format (outarch
, bfd_archive
);
2250 outarch
->has_armap
= 1;
2252 /* Work out a reasonable size of things to put onto one line. */
2253 ar_head
= make_head (outarch
);
2255 for (i
= 0; i
< def
->num_exports
; i
++)
2257 /* The import library doesn't know about the internal name. */
2258 char *internal
= def
->exports
[i
].internal_name
;
2261 /* Don't add PRIVATE entries to import lib. */
2262 if (pe_def_file
->exports
[i
].flag_private
)
2264 def
->exports
[i
].internal_name
= def
->exports
[i
].name
;
2265 n
= make_one (def
->exports
+ i
, outarch
);
2268 def
->exports
[i
].internal_name
= internal
;
2271 ar_tail
= make_tail (outarch
);
2273 if (ar_head
== NULL
|| ar_tail
== NULL
)
2276 /* Now stick them all into the archive. */
2277 ar_head
->next
= head
;
2278 ar_tail
->next
= ar_head
;
2281 if (! bfd_set_archive_head (outarch
, head
))
2282 einfo ("%Xbfd_set_archive_head: %s\n", bfd_errmsg (bfd_get_error ()));
2284 if (! bfd_close (outarch
))
2285 einfo ("%Xbfd_close %s: %s\n", impfilename
, bfd_errmsg (bfd_get_error ()));
2287 while (head
!= NULL
)
2289 bfd
*n
= head
->next
;
2296 add_bfd_to_link (bfd
*abfd
, const char *name
, struct bfd_link_info
*link_info
)
2298 lang_input_statement_type
*fake_file
;
2300 fake_file
= lang_add_input_file (name
,
2301 lang_input_file_is_fake_enum
,
2303 fake_file
->the_bfd
= abfd
;
2304 ldlang_add_file (fake_file
);
2306 if (!bfd_link_add_symbols (abfd
, link_info
))
2307 einfo ("%Xaddsym %s: %s\n", name
, bfd_errmsg (bfd_get_error ()));
2311 pe_process_import_defs (bfd
*output_bfd
, struct bfd_link_info
*link_info
)
2313 def_file_module
*module
;
2315 pe_dll_id_target (bfd_get_target (output_bfd
));
2320 for (module
= pe_def_file
->modules
; module
; module
= module
->next
)
2324 dll_filename
= module
->name
;
2325 dll_symname
= xstrdup (module
->name
);
2326 for (i
= 0; dll_symname
[i
]; i
++)
2327 if (!ISALNUM (dll_symname
[i
]))
2328 dll_symname
[i
] = '_';
2332 for (i
= 0; i
< pe_def_file
->num_imports
; i
++)
2333 if (pe_def_file
->imports
[i
].module
== module
)
2335 def_file_export exp
;
2336 struct bfd_link_hash_entry
*blhe
;
2337 int lead_at
= (*pe_def_file
->imports
[i
].internal_name
== '@');
2338 /* See if we need this import. */
2339 size_t len
= strlen (pe_def_file
->imports
[i
].internal_name
);
2340 char *name
= xmalloc (len
+ 2 + 6);
2343 sprintf (name
, "%s%s", "",
2344 pe_def_file
->imports
[i
].internal_name
);
2346 sprintf (name
, "%s%s",U (""),
2347 pe_def_file
->imports
[i
].internal_name
);
2349 blhe
= bfd_link_hash_lookup (link_info
->hash
, name
,
2350 FALSE
, FALSE
, FALSE
);
2352 if (!blhe
|| (blhe
&& blhe
->type
!= bfd_link_hash_undefined
))
2355 sprintf (name
, "%s%s", U ("_imp_"),
2356 pe_def_file
->imports
[i
].internal_name
);
2358 sprintf (name
, "%s%s", U ("_imp__"),
2359 pe_def_file
->imports
[i
].internal_name
);
2361 blhe
= bfd_link_hash_lookup (link_info
->hash
, name
,
2362 FALSE
, FALSE
, FALSE
);
2366 if (blhe
&& blhe
->type
== bfd_link_hash_undefined
)
2372 bfd
*ar_head
= make_head (output_bfd
);
2373 add_bfd_to_link (ar_head
, ar_head
->filename
, link_info
);
2376 exp
.internal_name
= pe_def_file
->imports
[i
].internal_name
;
2377 exp
.name
= pe_def_file
->imports
[i
].name
;
2378 exp
.ordinal
= pe_def_file
->imports
[i
].ordinal
;
2379 exp
.hint
= exp
.ordinal
>= 0 ? exp
.ordinal
: 0;
2380 exp
.flag_private
= 0;
2381 exp
.flag_constant
= 0;
2382 exp
.flag_data
= pe_def_file
->imports
[i
].data
;
2383 exp
.flag_noname
= exp
.name
? 0 : 1;
2384 one
= make_one (&exp
, output_bfd
);
2385 add_bfd_to_link (one
, one
->filename
, link_info
);
2390 bfd
*ar_tail
= make_tail (output_bfd
);
2391 add_bfd_to_link (ar_tail
, ar_tail
->filename
, link_info
);
2398 /* We were handed a *.DLL file. Parse it and turn it into a set of
2399 IMPORTS directives in the def file. Return TRUE if the file was
2400 handled, FALSE if not. */
2403 pe_get16 (bfd
*abfd
, int where
)
2407 bfd_seek (abfd
, (file_ptr
) where
, SEEK_SET
);
2408 bfd_bread (b
, (bfd_size_type
) 2, abfd
);
2409 return b
[0] + (b
[1] << 8);
2413 pe_get32 (bfd
*abfd
, int where
)
2417 bfd_seek (abfd
, (file_ptr
) where
, SEEK_SET
);
2418 bfd_bread (b
, (bfd_size_type
) 4, abfd
);
2419 return b
[0] + (b
[1] << 8) + (b
[2] << 16) + (b
[3] << 24);
2422 #if 0 /* This is not currently used. */
2427 unsigned char *b
= ptr
;
2429 return b
[0] + (b
[1] << 8);
2437 unsigned char *b
= ptr
;
2439 return b
[0] + (b
[1] << 8) + (b
[2] << 16) + (b
[3] << 24);
2443 pe_implied_import_dll (const char *filename
)
2446 unsigned long pe_header_offset
, opthdr_ofs
, num_entries
, i
;
2447 unsigned long export_rva
, export_size
, nsections
, secptr
, expptr
;
2448 unsigned long exp_funcbase
;
2449 unsigned char *expdata
, *erva
;
2450 unsigned long name_rvas
, ordinals
, nexp
, ordbase
;
2451 const char *dll_name
;
2452 /* Initialization with start > end guarantees that is_data
2453 will not be set by mistake, and avoids compiler warning. */
2454 unsigned long data_start
= 1;
2455 unsigned long data_end
= 0;
2456 unsigned long rdata_start
= 1;
2457 unsigned long rdata_end
= 0;
2458 unsigned long bss_start
= 1;
2459 unsigned long bss_end
= 0;
2461 /* No, I can't use bfd here. kernel32.dll puts its export table in
2462 the middle of the .rdata section. */
2463 dll
= bfd_openr (filename
, pe_details
->target_name
);
2466 einfo ("%Xopen %s: %s\n", filename
, bfd_errmsg (bfd_get_error ()));
2470 /* PEI dlls seem to be bfd_objects. */
2471 if (!bfd_check_format (dll
, bfd_object
))
2473 einfo ("%X%s: this doesn't appear to be a DLL\n", filename
);
2477 /* Get pe_header, optional header and numbers of export entries. */
2478 pe_header_offset
= pe_get32 (dll
, 0x3c);
2479 opthdr_ofs
= pe_header_offset
+ 4 + 20;
2480 num_entries
= pe_get32 (dll
, opthdr_ofs
+ 92);
2482 if (num_entries
< 1) /* No exports. */
2485 export_rva
= pe_get32 (dll
, opthdr_ofs
+ 96);
2486 export_size
= pe_get32 (dll
, opthdr_ofs
+ 100);
2487 nsections
= pe_get16 (dll
, pe_header_offset
+ 4 + 2);
2488 secptr
= (pe_header_offset
+ 4 + 20 +
2489 pe_get16 (dll
, pe_header_offset
+ 4 + 16));
2492 /* Get the rva and size of the export section. */
2493 for (i
= 0; i
< nsections
; i
++)
2496 unsigned long secptr1
= secptr
+ 40 * i
;
2497 unsigned long vaddr
= pe_get32 (dll
, secptr1
+ 12);
2498 unsigned long vsize
= pe_get32 (dll
, secptr1
+ 16);
2499 unsigned long fptr
= pe_get32 (dll
, secptr1
+ 20);
2501 bfd_seek (dll
, (file_ptr
) secptr1
, SEEK_SET
);
2502 bfd_bread (sname
, (bfd_size_type
) 8, dll
);
2504 if (vaddr
<= export_rva
&& vaddr
+ vsize
> export_rva
)
2506 expptr
= fptr
+ (export_rva
- vaddr
);
2507 if (export_rva
+ export_size
> vaddr
+ vsize
)
2508 export_size
= vsize
- (export_rva
- vaddr
);
2513 /* Scan sections and store the base and size of the
2514 data and bss segments in data/base_start/end. */
2515 for (i
= 0; i
< nsections
; i
++)
2517 unsigned long secptr1
= secptr
+ 40 * i
;
2518 unsigned long vsize
= pe_get32 (dll
, secptr1
+ 8);
2519 unsigned long vaddr
= pe_get32 (dll
, secptr1
+ 12);
2520 unsigned long flags
= pe_get32 (dll
, secptr1
+ 36);
2524 bfd_seek (dll
, (file_ptr
) secptr1
+ 0, SEEK_SET
);
2525 bfd_bread (sec_name
, (bfd_size_type
) 8, dll
);
2527 if (strcmp(sec_name
,".data") == 0)
2530 data_end
= vaddr
+ vsize
;
2532 if (pe_dll_extra_pe_debug
)
2533 printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n",
2534 __FUNCTION__
, sec_name
, vaddr
, vaddr
+ vsize
, flags
);
2536 else if (strcmp(sec_name
,".rdata") == 0)
2538 rdata_start
= vaddr
;
2539 rdata_end
= vaddr
+ vsize
;
2541 if (pe_dll_extra_pe_debug
)
2542 printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n",
2543 __FUNCTION__
, sec_name
, vaddr
, vaddr
+ vsize
, flags
);
2545 else if (strcmp (sec_name
,".bss") == 0)
2548 bss_end
= vaddr
+ vsize
;
2550 if (pe_dll_extra_pe_debug
)
2551 printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n",
2552 __FUNCTION__
, sec_name
, vaddr
, vaddr
+ vsize
, flags
);
2556 expdata
= xmalloc (export_size
);
2557 bfd_seek (dll
, (file_ptr
) expptr
, SEEK_SET
);
2558 bfd_bread (expdata
, (bfd_size_type
) export_size
, dll
);
2559 erva
= expdata
- export_rva
;
2561 if (pe_def_file
== 0)
2562 pe_def_file
= def_file_empty ();
2564 nexp
= pe_as32 (expdata
+ 24);
2565 name_rvas
= pe_as32 (expdata
+ 32);
2566 ordinals
= pe_as32 (expdata
+ 36);
2567 ordbase
= pe_as32 (expdata
+ 16);
2568 exp_funcbase
= pe_as32 (expdata
+ 28);
2570 /* Use internal dll name instead of filename
2571 to enable symbolic dll linking. */
2572 dll_name
= pe_as32 (expdata
+ 12) + erva
;
2574 /* Check to see if the dll has already been added to
2575 the definition list and if so return without error.
2576 This avoids multiple symbol definitions. */
2577 if (def_get_module (pe_def_file
, dll_name
))
2579 if (pe_dll_extra_pe_debug
)
2580 printf ("%s is already loaded\n", dll_name
);
2584 /* Iterate through the list of symbols. */
2585 for (i
= 0; i
< nexp
; i
++)
2587 /* Pointer to the names vector. */
2588 unsigned long name_rva
= pe_as32 (erva
+ name_rvas
+ i
* 4);
2589 def_file_import
*imp
;
2590 /* Pointer to the function address vector. */
2591 unsigned long func_rva
= pe_as32 (erva
+ exp_funcbase
+ i
* 4);
2594 /* Skip unwanted symbols, which are
2595 exported in buggy auto-import releases. */
2596 if (strncmp (erva
+ name_rva
, "_nm_", 4) != 0)
2598 /* is_data is true if the address is in the data, rdata or bss
2601 (func_rva
>= data_start
&& func_rva
< data_end
)
2602 || (func_rva
>= rdata_start
&& func_rva
< rdata_end
)
2603 || (func_rva
>= bss_start
&& func_rva
< bss_end
);
2605 imp
= def_file_add_import (pe_def_file
, erva
+ name_rva
,
2607 /* Mark symbol type. */
2608 imp
->data
= is_data
;
2610 if (pe_dll_extra_pe_debug
)
2611 printf ("%s dll-name: %s sym: %s addr: 0x%lx %s\n",
2612 __FUNCTION__
, dll_name
, erva
+ name_rva
,
2613 func_rva
, is_data
? "(data)" : "");
2620 /* These are the main functions, called from the emulation. The first
2621 is called after the bfds are read, so we can guess at how much space
2622 we need. The second is called after everything is placed, so we
2623 can put the right values in place. */
2626 pe_dll_build_sections (bfd
*abfd
, struct bfd_link_info
*info
)
2628 pe_dll_id_target (bfd_get_target (abfd
));
2629 process_def_file (abfd
, info
);
2631 if (pe_def_file
->num_exports
== 0 && !info
->shared
)
2634 generate_edata (abfd
, info
);
2635 build_filler_bfd (1);
2639 pe_exe_build_sections (bfd
*abfd
, struct bfd_link_info
*info ATTRIBUTE_UNUSED
)
2641 pe_dll_id_target (bfd_get_target (abfd
));
2642 build_filler_bfd (0);
2646 pe_dll_fill_sections (bfd
*abfd
, struct bfd_link_info
*info
)
2648 pe_dll_id_target (bfd_get_target (abfd
));
2649 image_base
= pe_data (abfd
)->pe_opthdr
.ImageBase
;
2651 generate_reloc (abfd
, info
);
2654 bfd_set_section_size (filler_bfd
, reloc_s
, reloc_sz
);
2656 /* Resize the sections. */
2657 lang_size_sections (stat_ptr
->head
, abs_output_section
,
2658 &stat_ptr
->head
, 0, 0, NULL
, TRUE
);
2660 /* Redo special stuff. */
2661 ldemul_after_allocation ();
2663 /* Do the assignments again. */
2664 lang_do_assignments (stat_ptr
->head
, abs_output_section
, NULL
, 0);
2667 fill_edata (abfd
, info
);
2670 pe_data (abfd
)->dll
= 1;
2672 edata_s
->contents
= edata_d
;
2673 reloc_s
->contents
= reloc_d
;
2677 pe_exe_fill_sections (bfd
*abfd
, struct bfd_link_info
*info
)
2679 pe_dll_id_target (bfd_get_target (abfd
));
2680 image_base
= pe_data (abfd
)->pe_opthdr
.ImageBase
;
2682 generate_reloc (abfd
, info
);
2685 bfd_set_section_size (filler_bfd
, reloc_s
, reloc_sz
);
2687 /* Resize the sections. */
2688 lang_size_sections (stat_ptr
->head
, abs_output_section
,
2689 &stat_ptr
->head
, 0, 0, NULL
, TRUE
);
2691 /* Redo special stuff. */
2692 ldemul_after_allocation ();
2694 /* Do the assignments again. */
2695 lang_do_assignments (stat_ptr
->head
, abs_output_section
, NULL
, 0);
2697 reloc_s
->contents
= reloc_d
;