1 /* Routines to help build PEI-format DLLs (Win32 etc)
2 Copyright 1998, 1999, 2000, 2001, 2002 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 practise 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 someting 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 parellel 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 practise,
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, prohibitting 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
;
149 unsigned int imagebase_reloc
;
161 autofilter_entry_type
;
163 #define PE_ARCH_i386 1
165 #define PE_ARCH_mips 3
166 #define PE_ARCH_arm 4
167 #define PE_ARCH_arm_epoc 5
169 static pe_details_type pe_detail_list
[] =
182 16 /* R_SH_IMAGEBASE */,
204 "epoc-pei-arm-little",
205 "epoc-pe-arm-little",
211 { NULL
, NULL
, 0, 0, 0, 0 }
214 static pe_details_type
*pe_details
;
216 static autofilter_entry_type autofilter_symbollist
[] =
218 { "DllMain@12", 10 },
219 { "DllEntryPoint@0", 15 },
220 { "DllMainCRTStartup@12", 20 },
221 { "_cygwin_dll_entry@12", 20 },
222 { "_cygwin_crt0_common@8", 21 },
223 { "_cygwin_noncygwin_dll_entry@12", 30 },
224 { "impure_ptr", 10 },
228 /* Do not specify library suffix explicitly, to allow for dllized versions. */
229 static autofilter_entry_type autofilter_liblist
[] =
232 { "libstdc++.", 10 },
233 { "libmingw32.", 11 },
235 { "libsupc++.", 10 },
240 static autofilter_entry_type autofilter_objlist
[] =
250 { "crtbegin.o", 10 },
255 static autofilter_entry_type autofilter_symbolprefixlist
[] =
257 /* { "__imp_", 6 }, */
258 /* Do __imp_ explicitly to save time. */
260 /* Don't re-export auto-imported symbols. */
262 { "__builtin_", 10 },
263 /* Don't export symbols specifying internal DLL layout. */
266 { "_impure_ptr", 11 },
267 { "cygwin_attach_dll", 17 },
268 { "cygwin_premain0", 15 },
269 { "cygwin_premain1", 15 },
270 { "cygwin_premain2", 15 },
271 { "cygwin_premain3", 15 },
276 static autofilter_entry_type autofilter_symbolsuffixlist
[] =
282 #define U(str) (pe_details->underscored ? "_" str : str)
284 static int reloc_sort
PARAMS ((const void *, const void *));
285 static int pe_export_sort
PARAMS ((const void *, const void *));
286 static int auto_export
PARAMS ((bfd
*, def_file
*, const char *));
287 static void process_def_file
PARAMS ((bfd
*, struct bfd_link_info
*));
288 static void build_filler_bfd
PARAMS ((int));
289 static void generate_edata
PARAMS ((bfd
*, struct bfd_link_info
*));
290 static void fill_exported_offsets
PARAMS ((bfd
*, struct bfd_link_info
*));
291 static void fill_edata
PARAMS ((bfd
*, struct bfd_link_info
*));
292 static void generate_reloc
PARAMS ((bfd
*, struct bfd_link_info
*));
293 static void quoteput
PARAMS ((char *, FILE *, int));
294 static asection
*quick_section
PARAMS ((bfd
*, const char *, int, int));
295 static void quick_symbol
296 PARAMS ((bfd
*, const char *, const char *, const char *,
297 asection
*, int, int));
298 static void quick_reloc
PARAMS ((bfd
*, int, int, int));
299 static bfd
*make_head
PARAMS ((bfd
*));
300 static bfd
*make_tail
PARAMS ((bfd
*));
301 static bfd
*make_one
PARAMS ((def_file_export
*, bfd
*));
302 static bfd
*make_singleton_name_thunk
PARAMS ((const char *, bfd
*));
303 static char *make_import_fixup_mark
PARAMS ((arelent
*));
304 static bfd
*make_import_fixup_entry
305 PARAMS ((const char *, const char *, const char *, bfd
*));
306 static unsigned int pe_get16
PARAMS ((bfd
*, int));
307 static unsigned int pe_get32
PARAMS ((bfd
*, int));
308 static unsigned int pe_as32
PARAMS ((void *));
311 pe_dll_id_target (target
)
316 for (i
= 0; pe_detail_list
[i
].target_name
; i
++)
317 if (strcmp (pe_detail_list
[i
].target_name
, target
) == 0
318 || strcmp (pe_detail_list
[i
].object_target
, target
) == 0)
320 pe_details
= pe_detail_list
+ i
;
323 einfo (_("%XUnsupported PEI architecture: %s\n"), target
);
327 /* Helper functions for qsort. Relocs must be sorted so that we can write
328 them out by pages. */
342 bfd_vma a
= ((reloc_data_type
*) va
)->vma
;
343 bfd_vma b
= ((reloc_data_type
*) vb
)->vma
;
345 return (a
> b
) ? 1 : ((a
< b
) ? -1 : 0);
349 pe_export_sort (va
, vb
)
352 def_file_export
*a
= (def_file_export
*) va
;
353 def_file_export
*b
= (def_file_export
*) vb
;
355 return strcmp (a
->name
, b
->name
);
358 /* Read and process the .DEF file. */
360 /* These correspond to the entries in pe_def_file->exports[]. I use
361 exported_symbol_sections[i] to tag whether or not the symbol was
362 defined, since we can't export symbols we don't have. */
364 static bfd_vma
*exported_symbol_offsets
;
365 static struct sec
**exported_symbol_sections
;
366 static int export_table_size
;
367 static int count_exported
;
368 static int count_exported_byname
;
369 static int count_with_ordinals
;
370 static const char *dll_name
;
371 static int min_ordinal
, max_ordinal
;
372 static int *exported_symbols
;
374 typedef struct exclude_list_struct
377 struct exclude_list_struct
*next
;
382 static struct exclude_list_struct
*excludes
= 0;
385 pe_dll_add_excludes (new_excludes
, type
)
386 const char *new_excludes
;
390 char *exclude_string
;
392 local_copy
= xstrdup (new_excludes
);
394 exclude_string
= strtok (local_copy
, ",:");
395 for (; exclude_string
; exclude_string
= strtok (NULL
, ",:"))
397 struct exclude_list_struct
*new_exclude
;
399 new_exclude
= ((struct exclude_list_struct
*)
400 xmalloc (sizeof (struct exclude_list_struct
)));
401 new_exclude
->string
= (char *) xmalloc (strlen (exclude_string
) + 1);
402 strcpy (new_exclude
->string
, exclude_string
);
403 new_exclude
->type
= type
;
404 new_exclude
->next
= excludes
;
405 excludes
= new_exclude
;
412 /* abfd is a bfd containing n (or NULL)
413 It can be used for contextual checks. */
416 auto_export (abfd
, d
, n
)
422 struct exclude_list_struct
*ex
;
423 autofilter_entry_type
*afptr
;
424 const char * libname
= 0;
425 if (abfd
&& abfd
->my_archive
)
426 libname
= lbasename (abfd
->my_archive
->filename
);
428 /* We should not re-export imported stuff. */
429 if (strncmp (n
, "_imp__", 6) == 0)
432 for (i
= 0; i
< d
->num_exports
; i
++)
433 if (strcmp (d
->exports
[i
].name
, n
) == 0)
436 if (pe_dll_do_default_excludes
)
441 if (pe_dll_extra_pe_debug
)
442 printf ("considering exporting: %s, abfd=%p, abfd->my_arc=%p\n",
443 n
, abfd
, abfd
->my_archive
);
445 /* First of all, make context checks:
446 Don't export anything from standard libs. */
449 afptr
= autofilter_liblist
;
453 if (strncmp (libname
, afptr
->name
, afptr
->len
) == 0 )
459 /* Next, exclude symbols from certain startup objects. */
461 if (abfd
&& (p
= lbasename (abfd
->filename
)))
463 afptr
= autofilter_objlist
;
466 if (strcmp (p
, afptr
->name
) == 0)
472 /* Don't try to blindly exclude all symbols
473 that begin with '__'; this was tried and
474 it is too restrictive. */
476 /* Then, exclude specific symbols. */
477 afptr
= autofilter_symbollist
;
480 if (strcmp (n
, afptr
->name
) == 0)
486 /* Next, exclude symbols starting with ... */
487 afptr
= autofilter_symbolprefixlist
;
490 if (strncmp (n
, afptr
->name
, afptr
->len
) == 0)
496 /* Finally, exclude symbols ending with ... */
498 afptr
= autofilter_symbolsuffixlist
;
501 if ((len
>= afptr
->len
)
502 /* Add 1 to insure match with trailing '\0'. */
503 && strncmp (n
+ len
- afptr
->len
, afptr
->name
,
504 afptr
->len
+ 1) == 0)
511 for (ex
= excludes
; ex
; ex
= ex
->next
)
513 if (ex
->type
== 1) /* exclude-libs */
516 && ((strcmp (libname
, ex
->string
) == 0)
517 || (strcasecmp ("ALL", ex
->string
) == 0)))
520 else if (strcmp (n
, ex
->string
) == 0)
528 process_def_file (abfd
, info
)
529 bfd
*abfd ATTRIBUTE_UNUSED
;
530 struct bfd_link_info
*info
;
533 struct bfd_link_hash_entry
*blhe
;
536 def_file_export
*e
= 0;
539 pe_def_file
= def_file_empty ();
541 /* First, run around to all the objects looking for the .drectve
542 sections, and push those into the def file too. */
543 for (b
= info
->input_bfds
; b
; b
= b
->link_next
)
545 s
= bfd_get_section_by_name (b
, ".drectve");
548 int size
= bfd_get_section_size_before_reloc (s
);
549 char *buf
= xmalloc (size
);
551 bfd_get_section_contents (b
, s
, buf
, 0, size
);
552 def_file_add_directive (pe_def_file
, buf
, size
);
557 /* Now, maybe export everything else the default way. */
558 if (pe_dll_export_everything
|| pe_def_file
->num_exports
== 0)
560 for (b
= info
->input_bfds
; b
; b
= b
->link_next
)
565 symsize
= bfd_get_symtab_upper_bound (b
);
566 symbols
= (asymbol
**) xmalloc (symsize
);
567 nsyms
= bfd_canonicalize_symtab (b
, symbols
);
569 for (j
= 0; j
< nsyms
; j
++)
571 /* We should export symbols which are either global or not
572 anything at all. (.bss data is the latter)
573 We should not export undefined symbols. */
574 if (symbols
[j
]->section
!= &bfd_und_section
575 && ((symbols
[j
]->flags
& BSF_GLOBAL
)
576 || (symbols
[j
]->flags
== BFD_FORT_COMM_DEFAULT_VALUE
)))
578 const char *sn
= symbols
[j
]->name
;
580 /* We should not re-export imported stuff. */
582 char *name
= (char *) xmalloc (strlen (sn
) + 2 + 6);
583 sprintf (name
, "%s%s", U("_imp_"), sn
);
585 blhe
= bfd_link_hash_lookup (info
->hash
, name
,
586 false, false, false);
589 if (blhe
&& blhe
->type
== bfd_link_hash_defined
)
596 if (auto_export (b
, pe_def_file
, sn
))
599 p
=def_file_add_export (pe_def_file
, sn
, 0, -1);
600 /* Fill data flag properly, from dlltool.c. */
601 p
->flag_data
= !(symbols
[j
]->flags
& BSF_FUNCTION
);
609 #define NE pe_def_file->num_exports
611 /* Canonicalize the export list. */
614 for (i
= 0; i
< NE
; i
++)
616 if (strchr (pe_def_file
->exports
[i
].name
, '@'))
618 /* This will preserve internal_name, which may have been
619 pointing to the same memory as name, or might not
621 char *tmp
= xstrdup (pe_def_file
->exports
[i
].name
);
623 *(strchr (tmp
, '@')) = 0;
624 pe_def_file
->exports
[i
].name
= tmp
;
629 if (pe_dll_stdcall_aliases
)
631 for (i
= 0; i
< NE
; i
++)
633 if (strchr (pe_def_file
->exports
[i
].name
, '@'))
635 char *tmp
= xstrdup (pe_def_file
->exports
[i
].name
);
637 *(strchr (tmp
, '@')) = 0;
638 if (auto_export (NULL
, pe_def_file
, tmp
))
639 def_file_add_export (pe_def_file
, tmp
,
640 pe_def_file
->exports
[i
].internal_name
,
648 /* Convenience, but watch out for it changing. */
649 e
= pe_def_file
->exports
;
651 exported_symbol_offsets
= (bfd_vma
*) xmalloc (NE
* sizeof (bfd_vma
));
652 exported_symbol_sections
= (struct sec
**) xmalloc (NE
* sizeof (struct sec
*));
654 memset (exported_symbol_sections
, 0, NE
* sizeof (struct sec
*));
658 count_exported_byname
= 0;
659 count_with_ordinals
= 0;
661 qsort (pe_def_file
->exports
, NE
, sizeof (pe_def_file
->exports
[0]), pe_export_sort
);
662 for (i
= 0, j
= 0; i
< NE
; i
++)
664 if (i
> 0 && strcmp (e
[i
].name
, e
[i
- 1].name
) == 0)
666 /* This is a duplicate. */
667 if (e
[j
- 1].ordinal
!= -1
668 && e
[i
].ordinal
!= -1
669 && e
[j
- 1].ordinal
!= e
[i
].ordinal
)
671 if (pe_dll_warn_dup_exports
)
672 /* xgettext:c-format */
673 einfo (_("%XError, duplicate EXPORT with ordinals: %s (%d vs %d)\n"),
674 e
[j
- 1].name
, e
[j
- 1].ordinal
, e
[i
].ordinal
);
678 if (pe_dll_warn_dup_exports
)
679 /* xgettext:c-format */
680 einfo (_("Warning, duplicate EXPORT: %s\n"),
684 if (e
[i
].ordinal
!= -1)
685 e
[j
- 1].ordinal
= e
[i
].ordinal
;
686 e
[j
- 1].flag_private
|= e
[i
].flag_private
;
687 e
[j
- 1].flag_constant
|= e
[i
].flag_constant
;
688 e
[j
- 1].flag_noname
|= e
[i
].flag_noname
;
689 e
[j
- 1].flag_data
|= e
[i
].flag_data
;
698 pe_def_file
->num_exports
= j
; /* == NE */
700 for (i
= 0; i
< NE
; i
++)
702 char *name
= (char *) xmalloc (strlen (pe_def_file
->exports
[i
].internal_name
) + 2);
704 if (pe_details
->underscored
)
707 strcpy (name
+ 1, pe_def_file
->exports
[i
].internal_name
);
710 strcpy (name
, pe_def_file
->exports
[i
].internal_name
);
712 blhe
= bfd_link_hash_lookup (info
->hash
,
717 && (blhe
->type
== bfd_link_hash_defined
718 || (blhe
->type
== bfd_link_hash_common
)))
721 if (!pe_def_file
->exports
[i
].flag_noname
)
722 count_exported_byname
++;
724 /* Only fill in the sections. The actual offsets are computed
725 in fill_exported_offsets() after common symbols are laid
727 if (blhe
->type
== bfd_link_hash_defined
)
728 exported_symbol_sections
[i
] = blhe
->u
.def
.section
;
730 exported_symbol_sections
[i
] = blhe
->u
.c
.p
->section
;
732 if (pe_def_file
->exports
[i
].ordinal
!= -1)
734 if (max_ordinal
< pe_def_file
->exports
[i
].ordinal
)
735 max_ordinal
= pe_def_file
->exports
[i
].ordinal
;
736 if (min_ordinal
> pe_def_file
->exports
[i
].ordinal
)
737 min_ordinal
= pe_def_file
->exports
[i
].ordinal
;
738 count_with_ordinals
++;
741 else if (blhe
&& blhe
->type
== bfd_link_hash_undefined
)
743 /* xgettext:c-format */
744 einfo (_("%XCannot export %s: symbol not defined\n"),
745 pe_def_file
->exports
[i
].internal_name
);
749 /* xgettext:c-format */
750 einfo (_("%XCannot export %s: symbol wrong type (%d vs %d)\n"),
751 pe_def_file
->exports
[i
].internal_name
,
752 blhe
->type
, bfd_link_hash_defined
);
756 /* xgettext:c-format */
757 einfo (_("%XCannot export %s: symbol not found\n"),
758 pe_def_file
->exports
[i
].internal_name
);
764 /* Build the bfd that will contain .edata and .reloc sections. */
767 build_filler_bfd (include_edata
)
770 lang_input_statement_type
*filler_file
;
771 filler_file
= lang_add_input_file ("dll stuff",
772 lang_input_file_is_fake_enum
,
774 filler_file
->the_bfd
= filler_bfd
= bfd_create ("dll stuff", output_bfd
);
775 if (filler_bfd
== NULL
776 || !bfd_set_arch_mach (filler_bfd
,
777 bfd_get_arch (output_bfd
),
778 bfd_get_mach (output_bfd
)))
780 einfo ("%X%P: can not create BFD %E\n");
786 edata_s
= bfd_make_section_old_way (filler_bfd
, ".edata");
788 || !bfd_set_section_flags (filler_bfd
, edata_s
,
795 einfo ("%X%P: can not create .edata section: %E\n");
798 bfd_set_section_size (filler_bfd
, edata_s
, edata_sz
);
801 reloc_s
= bfd_make_section_old_way (filler_bfd
, ".reloc");
803 || !bfd_set_section_flags (filler_bfd
, reloc_s
,
810 einfo ("%X%P: can not create .reloc section: %E\n");
814 bfd_set_section_size (filler_bfd
, reloc_s
, 0);
816 ldlang_add_file (filler_file
);
819 /* Gather all the exported symbols and build the .edata section. */
822 generate_edata (abfd
, info
)
824 struct bfd_link_info
*info ATTRIBUTE_UNUSED
;
827 int name_table_size
= 0;
830 /* First, we need to know how many exported symbols there are,
831 and what the range of ordinals is. */
832 if (pe_def_file
->name
)
833 dll_name
= pe_def_file
->name
;
836 dll_name
= abfd
->filename
;
838 for (dlnp
= dll_name
; *dlnp
; dlnp
++)
839 if (*dlnp
== '\\' || *dlnp
== '/' || *dlnp
== ':')
843 if (count_with_ordinals
&& max_ordinal
> count_exported
)
845 if (min_ordinal
> max_ordinal
- count_exported
+ 1)
846 min_ordinal
= max_ordinal
- count_exported
+ 1;
851 max_ordinal
= count_exported
;
854 export_table_size
= max_ordinal
- min_ordinal
+ 1;
855 exported_symbols
= (int *) xmalloc (export_table_size
* sizeof (int));
856 for (i
= 0; i
< export_table_size
; i
++)
857 exported_symbols
[i
] = -1;
859 /* Now we need to assign ordinals to those that don't have them. */
860 for (i
= 0; i
< NE
; i
++)
862 if (exported_symbol_sections
[i
])
864 if (pe_def_file
->exports
[i
].ordinal
!= -1)
866 int ei
= pe_def_file
->exports
[i
].ordinal
- min_ordinal
;
867 int pi
= exported_symbols
[ei
];
871 /* xgettext:c-format */
872 einfo (_("%XError, ordinal used twice: %d (%s vs %s)\n"),
873 pe_def_file
->exports
[i
].ordinal
,
874 pe_def_file
->exports
[i
].name
,
875 pe_def_file
->exports
[pi
].name
);
877 exported_symbols
[ei
] = i
;
879 name_table_size
+= strlen (pe_def_file
->exports
[i
].name
) + 1;
883 next_ordinal
= min_ordinal
;
884 for (i
= 0; i
< NE
; i
++)
885 if (exported_symbol_sections
[i
])
886 if (pe_def_file
->exports
[i
].ordinal
== -1)
888 while (exported_symbols
[next_ordinal
- min_ordinal
] != -1)
891 exported_symbols
[next_ordinal
- min_ordinal
] = i
;
892 pe_def_file
->exports
[i
].ordinal
= next_ordinal
;
895 /* OK, now we can allocate some memory. */
896 edata_sz
= (40 /* directory */
897 + 4 * export_table_size
/* addresses */
898 + 4 * count_exported_byname
/* name ptrs */
899 + 2 * count_exported_byname
/* ordinals */
900 + name_table_size
+ strlen (dll_name
) + 1);
903 /* Fill the exported symbol offsets. The preliminary work has already
904 been done in process_def_file(). */
907 fill_exported_offsets (abfd
, info
)
908 bfd
*abfd ATTRIBUTE_UNUSED
;
909 struct bfd_link_info
*info
;
912 struct bfd_link_hash_entry
*blhe
;
914 for (i
= 0; i
< pe_def_file
->num_exports
; i
++)
916 char *name
= (char *) xmalloc (strlen (pe_def_file
->exports
[i
].internal_name
) + 2);
918 if (pe_details
->underscored
)
921 strcpy (name
+ 1, pe_def_file
->exports
[i
].internal_name
);
924 strcpy (name
, pe_def_file
->exports
[i
].internal_name
);
926 blhe
= bfd_link_hash_lookup (info
->hash
,
930 if (blhe
&& (blhe
->type
== bfd_link_hash_defined
))
931 exported_symbol_offsets
[i
] = blhe
->u
.def
.value
;
938 fill_edata (abfd
, info
)
940 struct bfd_link_info
*info ATTRIBUTE_UNUSED
;
943 unsigned char *edirectory
;
944 unsigned long *eaddresses
;
945 unsigned long *enameptrs
;
946 unsigned short *eordinals
;
947 unsigned char *enamestr
;
952 edata_d
= (unsigned char *) xmalloc (edata_sz
);
954 /* Note use of array pointer math here. */
955 edirectory
= edata_d
;
956 eaddresses
= (unsigned long *) (edata_d
+ 40);
957 enameptrs
= eaddresses
+ export_table_size
;
958 eordinals
= (unsigned short *) (enameptrs
+ count_exported_byname
);
959 enamestr
= (char *) (eordinals
+ count_exported_byname
);
961 #define ERVA(ptr) (((unsigned char *)(ptr) - edata_d) + edata_s->output_section->vma - image_base)
963 memset (edata_d
, 0, edata_sz
);
964 bfd_put_32 (abfd
, now
, edata_d
+ 4);
965 if (pe_def_file
->version_major
!= -1)
967 bfd_put_16 (abfd
, pe_def_file
->version_major
, edata_d
+ 8);
968 bfd_put_16 (abfd
, pe_def_file
->version_minor
, edata_d
+ 10);
971 bfd_put_32 (abfd
, ERVA (enamestr
), edata_d
+ 12);
972 strcpy (enamestr
, dll_name
);
973 enamestr
+= strlen (enamestr
) + 1;
974 bfd_put_32 (abfd
, min_ordinal
, edata_d
+ 16);
975 bfd_put_32 (abfd
, export_table_size
, edata_d
+ 20);
976 bfd_put_32 (abfd
, count_exported_byname
, edata_d
+ 24);
977 bfd_put_32 (abfd
, ERVA (eaddresses
), edata_d
+ 28);
978 bfd_put_32 (abfd
, ERVA (enameptrs
), edata_d
+ 32);
979 bfd_put_32 (abfd
, ERVA (eordinals
), edata_d
+ 36);
981 fill_exported_offsets (abfd
, info
);
983 /* Ok, now for the filling in part. */
985 for (i
= 0; i
< export_table_size
; i
++)
987 int s
= exported_symbols
[i
];
991 struct sec
*ssec
= exported_symbol_sections
[s
];
992 unsigned long srva
= (exported_symbol_offsets
[s
]
993 + ssec
->output_section
->vma
994 + ssec
->output_offset
);
995 int ord
= pe_def_file
->exports
[s
].ordinal
;
997 bfd_put_32 (abfd
, srva
- image_base
,
998 (void *) (eaddresses
+ ord
- min_ordinal
));
1000 if (!pe_def_file
->exports
[s
].flag_noname
)
1002 char *ename
= pe_def_file
->exports
[s
].name
;
1003 bfd_put_32 (abfd
, ERVA (enamestr
), (void *) enameptrs
);
1005 strcpy (enamestr
, ename
);
1006 enamestr
+= strlen (enamestr
) + 1;
1007 bfd_put_16 (abfd
, ord
- min_ordinal
, (void *) eordinals
);
1009 pe_def_file
->exports
[s
].hint
= hint
++;
1016 static struct sec
*current_sec
;
1019 pe_walk_relocs_of_symbol (info
, name
, cb
)
1020 struct bfd_link_info
*info
;
1022 int (*cb
) (arelent
*, asection
*);
1027 for (b
= info
->input_bfds
; b
; b
= b
->link_next
)
1032 symsize
= bfd_get_symtab_upper_bound (b
);
1033 symbols
= (asymbol
**) xmalloc (symsize
);
1034 nsyms
= bfd_canonicalize_symtab (b
, symbols
);
1036 for (s
= b
->sections
; s
; s
= s
->next
)
1039 int relsize
, nrelocs
, i
;
1040 int flags
= bfd_get_section_flags (b
, s
);
1042 /* Skip discarded linkonce sections. */
1043 if (flags
& SEC_LINK_ONCE
1044 && s
->output_section
== bfd_abs_section_ptr
)
1049 relsize
= bfd_get_reloc_upper_bound (b
, s
);
1050 relocs
= (arelent
**) xmalloc ((size_t) relsize
);
1051 nrelocs
= bfd_canonicalize_reloc (b
, s
, relocs
, symbols
);
1053 for (i
= 0; i
< nrelocs
; i
++)
1055 struct symbol_cache_entry
*sym
= *relocs
[i
]->sym_ptr_ptr
;
1057 if (!strcmp (name
, sym
->name
))
1063 /* Warning: the allocated symbols are remembered in BFD and reused
1064 later, so don't free them! */
1065 /* free (symbols); */
1070 /* Gather all the relocations and build the .reloc section. */
1073 generate_reloc (abfd
, info
)
1075 struct bfd_link_info
*info
;
1078 /* For .reloc stuff. */
1079 reloc_data_type
*reloc_data
;
1080 int total_relocs
= 0;
1082 unsigned long sec_page
= (unsigned long) (-1);
1083 unsigned long page_ptr
, page_count
;
1089 for (b
= info
->input_bfds
; b
; b
= b
->link_next
)
1090 for (s
= b
->sections
; s
; s
= s
->next
)
1091 total_relocs
+= s
->reloc_count
;
1094 (reloc_data_type
*) xmalloc (total_relocs
* sizeof (reloc_data_type
));
1098 for (bi
= 0, b
= info
->input_bfds
; b
; bi
++, b
= b
->link_next
)
1101 int relsize
, nrelocs
, i
;
1103 for (s
= b
->sections
; s
; s
= s
->next
)
1105 unsigned long sec_vma
= s
->output_section
->vma
+ s
->output_offset
;
1109 /* If it's not loaded, we don't need to relocate it this way. */
1110 if (!(s
->output_section
->flags
& SEC_LOAD
))
1113 /* I don't know why there would be a reloc for these, but I've
1114 seen it happen - DJ */
1115 if (s
->output_section
== &bfd_abs_section
)
1118 if (s
->output_section
->vma
== 0)
1120 /* Huh? Shouldn't happen, but punt if it does. */
1121 einfo ("DJ: zero vma section reloc detected: `%s' #%d f=%d\n",
1122 s
->output_section
->name
, s
->output_section
->index
,
1123 s
->output_section
->flags
);
1127 symsize
= bfd_get_symtab_upper_bound (b
);
1128 symbols
= (asymbol
**) xmalloc (symsize
);
1129 nsyms
= bfd_canonicalize_symtab (b
, symbols
);
1131 relsize
= bfd_get_reloc_upper_bound (b
, s
);
1132 relocs
= (arelent
**) xmalloc ((size_t) relsize
);
1133 nrelocs
= bfd_canonicalize_reloc (b
, s
, relocs
, symbols
);
1135 for (i
= 0; i
< nrelocs
; i
++)
1137 if (pe_dll_extra_pe_debug
)
1139 struct symbol_cache_entry
*sym
= *relocs
[i
]->sym_ptr_ptr
;
1140 printf ("rel: %s\n", sym
->name
);
1142 if (!relocs
[i
]->howto
->pc_relative
1143 && relocs
[i
]->howto
->type
!= pe_details
->imagebase_reloc
)
1146 struct symbol_cache_entry
*sym
= *relocs
[i
]->sym_ptr_ptr
;
1148 sym_vma
= (relocs
[i
]->addend
1151 + sym
->section
->output_offset
1152 + sym
->section
->output_section
->vma
);
1153 reloc_data
[total_relocs
].vma
= sec_vma
+ relocs
[i
]->address
;
1155 #define BITS_AND_SHIFT(bits, shift) (bits * 1000 | shift)
1157 switch BITS_AND_SHIFT (relocs
[i
]->howto
->bitsize
,
1158 relocs
[i
]->howto
->rightshift
)
1160 case BITS_AND_SHIFT (32, 0):
1161 reloc_data
[total_relocs
].type
= 3;
1164 case BITS_AND_SHIFT (16, 0):
1165 reloc_data
[total_relocs
].type
= 2;
1168 case BITS_AND_SHIFT (16, 16):
1169 reloc_data
[total_relocs
].type
= 4;
1170 /* FIXME: we can't know the symbol's right value
1171 yet, but we probably can safely assume that
1172 CE will relocate us in 64k blocks, so leaving
1174 reloc_data
[total_relocs
].extra
= 0;
1177 case BITS_AND_SHIFT (26, 2):
1178 reloc_data
[total_relocs
].type
= 5;
1182 /* xgettext:c-format */
1183 einfo (_("%XError: %d-bit reloc in dll\n"),
1184 relocs
[i
]->howto
->bitsize
);
1190 /* Warning: the allocated symbols are remembered in BFD and
1191 reused later, so don't free them! */
1198 /* At this point, we have total_relocs relocation addresses in
1199 reloc_addresses, which are all suitable for the .reloc section.
1200 We must now create the new sections. */
1201 qsort (reloc_data
, total_relocs
, sizeof (*reloc_data
), reloc_sort
);
1203 for (i
= 0; i
< total_relocs
; i
++)
1205 unsigned long this_page
= (reloc_data
[i
].vma
>> 12);
1207 if (this_page
!= sec_page
)
1209 reloc_sz
= (reloc_sz
+ 3) & ~3; /* 4-byte align. */
1211 sec_page
= this_page
;
1216 if (reloc_data
[i
].type
== 4)
1220 reloc_sz
= (reloc_sz
+ 3) & ~3; /* 4-byte align. */
1221 reloc_d
= (unsigned char *) xmalloc (reloc_sz
);
1222 sec_page
= (unsigned long) (-1);
1224 page_ptr
= (unsigned long) (-1);
1227 for (i
= 0; i
< total_relocs
; i
++)
1229 unsigned long rva
= reloc_data
[i
].vma
- image_base
;
1230 unsigned long this_page
= (rva
& ~0xfff);
1232 if (this_page
!= sec_page
)
1234 while (reloc_sz
& 3)
1235 reloc_d
[reloc_sz
++] = 0;
1237 if (page_ptr
!= (unsigned long) (-1))
1238 bfd_put_32 (abfd
, reloc_sz
- page_ptr
, reloc_d
+ page_ptr
+ 4);
1240 bfd_put_32 (abfd
, this_page
, reloc_d
+ reloc_sz
);
1241 page_ptr
= reloc_sz
;
1243 sec_page
= this_page
;
1247 bfd_put_16 (abfd
, (rva
& 0xfff) + (reloc_data
[i
].type
<< 12),
1248 reloc_d
+ reloc_sz
);
1251 if (reloc_data
[i
].type
== 4)
1253 bfd_put_16 (abfd
, reloc_data
[i
].extra
, reloc_d
+ reloc_sz
);
1260 while (reloc_sz
& 3)
1261 reloc_d
[reloc_sz
++] = 0;
1263 if (page_ptr
!= (unsigned long) (-1))
1264 bfd_put_32 (abfd
, reloc_sz
- page_ptr
, reloc_d
+ page_ptr
+ 4);
1266 while (reloc_sz
< reloc_s
->_raw_size
)
1267 reloc_d
[reloc_sz
++] = 0;
1270 /* Given the exiting def_file structure, print out a .DEF file that
1271 corresponds to it. */
1274 quoteput (s
, f
, needs_quotes
)
1281 for (cp
= s
; *cp
; cp
++)
1296 if (*s
== '"' || *s
== '\\')
1310 pe_dll_generate_def_file (pe_out_def_filename
)
1311 const char *pe_out_def_filename
;
1314 FILE *out
= fopen (pe_out_def_filename
, "w");
1317 /* xgettext:c-format */
1318 einfo (_("%s: Can't open output def file %s\n"),
1319 program_name
, pe_out_def_filename
);
1323 if (pe_def_file
->name
)
1325 if (pe_def_file
->is_dll
)
1326 fprintf (out
, "LIBRARY ");
1328 fprintf (out
, "NAME ");
1330 quoteput (pe_def_file
->name
, out
, 1);
1332 if (pe_data (output_bfd
)->pe_opthdr
.ImageBase
)
1333 fprintf (out
, " BASE=0x%lx",
1334 (unsigned long) pe_data (output_bfd
)->pe_opthdr
.ImageBase
);
1335 fprintf (out
, "\n");
1338 if (pe_def_file
->description
)
1340 fprintf (out
, "DESCRIPTION ");
1341 quoteput (pe_def_file
->description
, out
, 1);
1342 fprintf (out
, "\n");
1345 if (pe_def_file
->version_minor
!= -1)
1346 fprintf (out
, "VERSION %d.%d\n", pe_def_file
->version_major
,
1347 pe_def_file
->version_minor
);
1348 else if (pe_def_file
->version_major
!= -1)
1349 fprintf (out
, "VERSION %d\n", pe_def_file
->version_major
);
1351 if (pe_def_file
->stack_reserve
!= -1 || pe_def_file
->heap_reserve
!= -1)
1352 fprintf (out
, "\n");
1354 if (pe_def_file
->stack_commit
!= -1)
1355 fprintf (out
, "STACKSIZE 0x%x,0x%x\n",
1356 pe_def_file
->stack_reserve
, pe_def_file
->stack_commit
);
1357 else if (pe_def_file
->stack_reserve
!= -1)
1358 fprintf (out
, "STACKSIZE 0x%x\n", pe_def_file
->stack_reserve
);
1360 if (pe_def_file
->heap_commit
!= -1)
1361 fprintf (out
, "HEAPSIZE 0x%x,0x%x\n",
1362 pe_def_file
->heap_reserve
, pe_def_file
->heap_commit
);
1363 else if (pe_def_file
->heap_reserve
!= -1)
1364 fprintf (out
, "HEAPSIZE 0x%x\n", pe_def_file
->heap_reserve
);
1366 if (pe_def_file
->num_section_defs
> 0)
1368 fprintf (out
, "\nSECTIONS\n\n");
1370 for (i
= 0; i
< pe_def_file
->num_section_defs
; i
++)
1373 quoteput (pe_def_file
->section_defs
[i
].name
, out
, 0);
1375 if (pe_def_file
->section_defs
[i
].class)
1377 fprintf (out
, " CLASS ");
1378 quoteput (pe_def_file
->section_defs
[i
].class, out
, 0);
1381 if (pe_def_file
->section_defs
[i
].flag_read
)
1382 fprintf (out
, " READ");
1384 if (pe_def_file
->section_defs
[i
].flag_write
)
1385 fprintf (out
, " WRITE");
1387 if (pe_def_file
->section_defs
[i
].flag_execute
)
1388 fprintf (out
, " EXECUTE");
1390 if (pe_def_file
->section_defs
[i
].flag_shared
)
1391 fprintf (out
, " SHARED");
1393 fprintf (out
, "\n");
1397 if (pe_def_file
->num_exports
> 0)
1399 fprintf (out
, "EXPORTS\n");
1401 for (i
= 0; i
< pe_def_file
->num_exports
; i
++)
1403 def_file_export
*e
= pe_def_file
->exports
+ i
;
1405 quoteput (e
->name
, out
, 0);
1407 if (e
->internal_name
&& strcmp (e
->internal_name
, e
->name
))
1409 fprintf (out
, " = ");
1410 quoteput (e
->internal_name
, out
, 0);
1413 if (e
->ordinal
!= -1)
1414 fprintf (out
, " @%d", e
->ordinal
);
1416 if (e
->flag_private
)
1417 fprintf (out
, " PRIVATE");
1419 if (e
->flag_constant
)
1420 fprintf (out
, " CONSTANT");
1423 fprintf (out
, " NONAME");
1426 fprintf (out
, " DATA");
1428 fprintf (out
, "\n");
1432 if (pe_def_file
->num_imports
> 0)
1434 fprintf (out
, "\nIMPORTS\n\n");
1436 for (i
= 0; i
< pe_def_file
->num_imports
; i
++)
1438 def_file_import
*im
= pe_def_file
->imports
+ i
;
1441 if (im
->internal_name
1442 && (!im
->name
|| strcmp (im
->internal_name
, im
->name
)))
1444 quoteput (im
->internal_name
, out
, 0);
1445 fprintf (out
, " = ");
1448 quoteput (im
->module
->name
, out
, 0);
1452 quoteput (im
->name
, out
, 0);
1454 fprintf (out
, "%d", im
->ordinal
);
1456 fprintf (out
, "\n");
1461 fprintf (out
, _("; no contents available\n"));
1463 if (fclose (out
) == EOF
)
1464 /* xgettext:c-format */
1465 einfo (_("%P: Error closing file `%s'\n"), pe_out_def_filename
);
1468 /* Generate the import library. */
1470 static asymbol
**symtab
;
1473 static const char *dll_filename
;
1474 static char *dll_symname
;
1476 #define UNDSEC (asection *) &bfd_und_section
1479 quick_section (abfd
, name
, flags
, align
)
1488 sec
= bfd_make_section_old_way (abfd
, name
);
1489 bfd_set_section_flags (abfd
, sec
, flags
| SEC_ALLOC
| SEC_LOAD
| SEC_KEEP
);
1490 bfd_set_section_alignment (abfd
, sec
, align
);
1491 /* Remember to undo this before trying to link internally! */
1492 sec
->output_section
= sec
;
1494 sym
= bfd_make_empty_symbol (abfd
);
1495 symtab
[symptr
++] = sym
;
1496 sym
->name
= sec
->name
;
1498 sym
->flags
= BSF_LOCAL
;
1505 quick_symbol (abfd
, n1
, n2
, n3
, sec
, flags
, addr
)
1515 char *name
= (char *) xmalloc (strlen (n1
) + strlen (n2
) + strlen (n3
) + 1);
1520 sym
= bfd_make_empty_symbol (abfd
);
1525 symtab
[symptr
++] = sym
;
1528 static arelent
*reltab
= 0;
1529 static int relcount
= 0, relsize
= 0;
1532 quick_reloc (abfd
, address
, which_howto
, symidx
)
1538 if (relcount
>= (relsize
- 1))
1542 reltab
= (arelent
*) xrealloc (reltab
, relsize
* sizeof (arelent
));
1544 reltab
= (arelent
*) xmalloc (relsize
* sizeof (arelent
));
1546 reltab
[relcount
].address
= address
;
1547 reltab
[relcount
].addend
= 0;
1548 reltab
[relcount
].howto
= bfd_reloc_type_lookup (abfd
, which_howto
);
1549 reltab
[relcount
].sym_ptr_ptr
= symtab
+ symidx
;
1554 save_relocs (asection
*sec
)
1558 sec
->relocation
= reltab
;
1559 sec
->reloc_count
= relcount
;
1560 sec
->orelocation
= (arelent
**) xmalloc ((relcount
+ 1) * sizeof (arelent
*));
1561 for (i
= 0; i
< relcount
; i
++)
1562 sec
->orelocation
[i
] = sec
->relocation
+ i
;
1563 sec
->orelocation
[relcount
] = 0;
1564 sec
->flags
|= SEC_RELOC
;
1566 relcount
= relsize
= 0;
1569 /* .section .idata$2
1570 .global __head_my_dll
1590 asection
*id2
, *id5
, *id4
;
1591 unsigned char *d2
, *d5
, *d4
;
1595 oname
= (char *) xmalloc (20);
1596 sprintf (oname
, "d%06d.o", tmp_seq
);
1599 abfd
= bfd_create (oname
, parent
);
1600 bfd_find_target (pe_details
->object_target
, abfd
);
1601 bfd_make_writable (abfd
);
1603 bfd_set_format (abfd
, bfd_object
);
1604 bfd_set_arch_mach (abfd
, pe_details
->bfd_arch
, 0);
1607 symtab
= (asymbol
**) xmalloc (6 * sizeof (asymbol
*));
1608 id2
= quick_section (abfd
, ".idata$2", SEC_HAS_CONTENTS
, 2);
1609 id5
= quick_section (abfd
, ".idata$5", SEC_HAS_CONTENTS
, 2);
1610 id4
= quick_section (abfd
, ".idata$4", SEC_HAS_CONTENTS
, 2);
1611 quick_symbol (abfd
, U ("_head_"), dll_symname
, "", id2
, BSF_GLOBAL
, 0);
1612 quick_symbol (abfd
, U (""), dll_symname
, "_iname", UNDSEC
, BSF_GLOBAL
, 0);
1614 /* OK, pay attention here. I got confused myself looking back at
1615 it. We create a four-byte section to mark the beginning of the
1616 list, and we include an offset of 4 in the section, so that the
1617 pointer to the list points to the *end* of this section, which is
1618 the start of the list of sections from other objects. */
1620 bfd_set_section_size (abfd
, id2
, 20);
1621 d2
= (unsigned char *) xmalloc (20);
1624 d2
[0] = d2
[16] = 4; /* Reloc addend. */
1625 quick_reloc (abfd
, 0, BFD_RELOC_RVA
, 2);
1626 quick_reloc (abfd
, 12, BFD_RELOC_RVA
, 4);
1627 quick_reloc (abfd
, 16, BFD_RELOC_RVA
, 1);
1630 bfd_set_section_size (abfd
, id5
, 4);
1631 d5
= (unsigned char *) xmalloc (4);
1635 bfd_set_section_size (abfd
, id4
, 4);
1636 d4
= (unsigned char *) xmalloc (4);
1640 bfd_set_symtab (abfd
, symtab
, symptr
);
1642 bfd_set_section_contents (abfd
, id2
, d2
, 0, 20);
1643 bfd_set_section_contents (abfd
, id5
, d5
, 0, 4);
1644 bfd_set_section_contents (abfd
, id4
, d4
, 0, 4);
1646 bfd_make_readable (abfd
);
1650 /* .section .idata$4
1655 .global __my_dll_iname
1663 asection
*id4
, *id5
, *id7
;
1664 unsigned char *d4
, *d5
, *d7
;
1669 oname
= (char *) xmalloc (20);
1670 sprintf (oname
, "d%06d.o", tmp_seq
);
1673 abfd
= bfd_create (oname
, parent
);
1674 bfd_find_target (pe_details
->object_target
, abfd
);
1675 bfd_make_writable (abfd
);
1677 bfd_set_format (abfd
, bfd_object
);
1678 bfd_set_arch_mach (abfd
, pe_details
->bfd_arch
, 0);
1681 symtab
= (asymbol
**) xmalloc (5 * sizeof (asymbol
*));
1682 id4
= quick_section (abfd
, ".idata$4", SEC_HAS_CONTENTS
, 2);
1683 id5
= quick_section (abfd
, ".idata$5", SEC_HAS_CONTENTS
, 2);
1684 id7
= quick_section (abfd
, ".idata$7", SEC_HAS_CONTENTS
, 2);
1685 quick_symbol (abfd
, U (""), dll_symname
, "_iname", id7
, BSF_GLOBAL
, 0);
1687 bfd_set_section_size (abfd
, id4
, 4);
1688 d4
= (unsigned char *) xmalloc (4);
1692 bfd_set_section_size (abfd
, id5
, 4);
1693 d5
= (unsigned char *) xmalloc (4);
1697 len
= strlen (dll_filename
) + 1;
1700 bfd_set_section_size (abfd
, id7
, len
);
1701 d7
= (unsigned char *) xmalloc (len
);
1703 strcpy (d7
, dll_filename
);
1705 bfd_set_symtab (abfd
, symtab
, symptr
);
1707 bfd_set_section_contents (abfd
, id4
, d4
, 0, 4);
1708 bfd_set_section_contents (abfd
, id5
, d5
, 0, 4);
1709 bfd_set_section_contents (abfd
, id7
, d7
, 0, len
);
1711 bfd_make_readable (abfd
);
1717 .global ___imp_function
1718 .global __imp__function
1720 jmp *__imp__function:
1734 .asciz "function" xlate? (add underscore, kill at) */
1736 static unsigned char jmp_ix86_bytes
[] =
1738 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x90, 0x90
1746 .dw __imp_function */
1748 static unsigned char jmp_sh_bytes
[] =
1750 0x01, 0xd0, 0x02, 0x60, 0x2b, 0x40, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00
1754 lui $t0,<high:__imp_function>
1755 lw $t0,<low:__imp_function>
1759 static unsigned char jmp_mips_bytes
[] =
1761 0x00, 0x00, 0x08, 0x3c, 0x00, 0x00, 0x08, 0x8d,
1762 0x08, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00
1766 make_one (exp
, parent
)
1767 def_file_export
*exp
;
1770 asection
*tx
, *id7
, *id5
, *id4
, *id6
;
1771 unsigned char *td
= NULL
, *d7
, *d5
, *d4
, *d6
= NULL
;
1775 unsigned char *jmp_bytes
= NULL
;
1776 int jmp_byte_count
= 0;
1778 switch (pe_details
->pe_arch
)
1781 jmp_bytes
= jmp_ix86_bytes
;
1782 jmp_byte_count
= sizeof (jmp_ix86_bytes
);
1785 jmp_bytes
= jmp_sh_bytes
;
1786 jmp_byte_count
= sizeof (jmp_sh_bytes
);
1789 jmp_bytes
= jmp_mips_bytes
;
1790 jmp_byte_count
= sizeof (jmp_mips_bytes
);
1796 oname
= (char *) xmalloc (20);
1797 sprintf (oname
, "d%06d.o", tmp_seq
);
1800 abfd
= bfd_create (oname
, parent
);
1801 bfd_find_target (pe_details
->object_target
, abfd
);
1802 bfd_make_writable (abfd
);
1804 bfd_set_format (abfd
, bfd_object
);
1805 bfd_set_arch_mach (abfd
, pe_details
->bfd_arch
, 0);
1808 symtab
= (asymbol
**) xmalloc (11 * sizeof (asymbol
*));
1809 tx
= quick_section (abfd
, ".text", SEC_CODE
|SEC_HAS_CONTENTS
, 2);
1810 id7
= quick_section (abfd
, ".idata$7", SEC_HAS_CONTENTS
, 2);
1811 id5
= quick_section (abfd
, ".idata$5", SEC_HAS_CONTENTS
, 2);
1812 id4
= quick_section (abfd
, ".idata$4", SEC_HAS_CONTENTS
, 2);
1813 id6
= quick_section (abfd
, ".idata$6", SEC_HAS_CONTENTS
, 2);
1814 if (! exp
->flag_data
)
1815 quick_symbol (abfd
, U (""), exp
->internal_name
, "", tx
, BSF_GLOBAL
, 0);
1816 quick_symbol (abfd
, U ("_head_"), dll_symname
, "", UNDSEC
, BSF_GLOBAL
, 0);
1817 quick_symbol (abfd
, U ("_imp__"), exp
->internal_name
, "", id5
, BSF_GLOBAL
, 0);
1818 /* Symbol to reference ord/name of imported
1819 data symbol, used to implement auto-import. */
1821 quick_symbol (abfd
, U("_nm__"), exp
->internal_name
, "", id6
,
1823 if (pe_dll_compat_implib
)
1824 quick_symbol (abfd
, U ("__imp_"), exp
->internal_name
, "",
1825 id5
, BSF_GLOBAL
, 0);
1827 if (! exp
->flag_data
)
1829 bfd_set_section_size (abfd
, tx
, jmp_byte_count
);
1830 td
= (unsigned char *) xmalloc (jmp_byte_count
);
1832 memcpy (td
, jmp_bytes
, jmp_byte_count
);
1834 switch (pe_details
->pe_arch
)
1837 quick_reloc (abfd
, 2, BFD_RELOC_32
, 2);
1840 quick_reloc (abfd
, 8, BFD_RELOC_32
, 2);
1843 quick_reloc (abfd
, 0, BFD_RELOC_HI16_S
, 2);
1844 quick_reloc (abfd
, 0, BFD_RELOC_LO16
, 0); /* MIPS_R_PAIR */
1845 quick_reloc (abfd
, 4, BFD_RELOC_LO16
, 2);
1853 bfd_set_section_size (abfd
, id7
, 4);
1854 d7
= (unsigned char *) xmalloc (4);
1857 quick_reloc (abfd
, 0, BFD_RELOC_RVA
, 6);
1860 bfd_set_section_size (abfd
, id5
, 4);
1861 d5
= (unsigned char *) xmalloc (4);
1865 if (exp
->flag_noname
)
1867 d5
[0] = exp
->ordinal
;
1868 d5
[1] = exp
->ordinal
>> 8;
1873 quick_reloc (abfd
, 0, BFD_RELOC_RVA
, 4);
1877 bfd_set_section_size (abfd
, id4
, 4);
1878 d4
= (unsigned char *) xmalloc (4);
1882 if (exp
->flag_noname
)
1884 d4
[0] = exp
->ordinal
;
1885 d4
[1] = exp
->ordinal
>> 8;
1890 quick_reloc (abfd
, 0, BFD_RELOC_RVA
, 4);
1894 if (exp
->flag_noname
)
1897 bfd_set_section_size (abfd
, id6
, 0);
1901 len
= strlen (exp
->name
) + 3;
1904 bfd_set_section_size (abfd
, id6
, len
);
1905 d6
= (unsigned char *) xmalloc (len
);
1907 memset (d6
, 0, len
);
1908 d6
[0] = exp
->hint
& 0xff;
1909 d6
[1] = exp
->hint
>> 8;
1910 strcpy (d6
+ 2, exp
->name
);
1913 bfd_set_symtab (abfd
, symtab
, symptr
);
1915 bfd_set_section_contents (abfd
, tx
, td
, 0, jmp_byte_count
);
1916 bfd_set_section_contents (abfd
, id7
, d7
, 0, 4);
1917 bfd_set_section_contents (abfd
, id5
, d5
, 0, 4);
1918 bfd_set_section_contents (abfd
, id4
, d4
, 0, 4);
1919 if (!exp
->flag_noname
)
1920 bfd_set_section_contents (abfd
, id6
, d6
, 0, len
);
1922 bfd_make_readable (abfd
);
1927 make_singleton_name_thunk (import
, parent
)
1931 /* Name thunks go to idata$4. */
1937 oname
= (char *) xmalloc (20);
1938 sprintf (oname
, "nmth%06d.o", tmp_seq
);
1941 abfd
= bfd_create (oname
, parent
);
1942 bfd_find_target (pe_details
->object_target
, abfd
);
1943 bfd_make_writable (abfd
);
1945 bfd_set_format (abfd
, bfd_object
);
1946 bfd_set_arch_mach (abfd
, pe_details
->bfd_arch
, 0);
1949 symtab
= (asymbol
**) xmalloc (3 * sizeof (asymbol
*));
1950 id4
= quick_section (abfd
, ".idata$4", SEC_HAS_CONTENTS
, 2);
1951 quick_symbol (abfd
, U ("_nm_thnk_"), import
, "", id4
, BSF_GLOBAL
, 0);
1952 quick_symbol (abfd
, U ("_nm_"), import
, "", UNDSEC
, BSF_GLOBAL
, 0);
1954 bfd_set_section_size (abfd
, id4
, 8);
1955 d4
= (unsigned char *) xmalloc (4);
1958 quick_reloc (abfd
, 0, BFD_RELOC_RVA
, 2);
1961 bfd_set_symtab (abfd
, symtab
, symptr
);
1963 bfd_set_section_contents (abfd
, id4
, d4
, 0, 8);
1965 bfd_make_readable (abfd
);
1970 make_import_fixup_mark (rel
)
1973 /* We convert reloc to symbol, for later reference. */
1975 static char *fixup_name
= NULL
;
1976 static size_t buffer_len
= 0;
1978 struct symbol_cache_entry
*sym
= *rel
->sym_ptr_ptr
;
1980 bfd
*abfd
= bfd_asymbol_bfd (sym
);
1981 struct bfd_link_hash_entry
*bh
;
1985 fixup_name
= (char *) xmalloc (384);
1989 if (strlen (sym
->name
) + 25 > buffer_len
)
1990 /* Assume 25 chars for "__fu" + counter + "_". If counter is
1991 bigger than 20 digits long, we've got worse problems than
1992 overflowing this buffer... */
1995 /* New buffer size is length of symbol, plus 25, but then
1996 rounded up to the nearest multiple of 128. */
1997 buffer_len
= ((strlen (sym
->name
) + 25) + 127) & ~127;
1998 fixup_name
= (char *) xmalloc (buffer_len
);
2001 sprintf (fixup_name
, "__fu%d_%s", counter
++, sym
->name
);
2004 bfd_coff_link_add_one_symbol (&link_info
, abfd
, fixup_name
, BSF_GLOBAL
,
2005 current_sec
, /* sym->section, */
2006 rel
->address
, NULL
, true, false, &bh
);
2010 struct coff_link_hash_entry
*myh
;
2012 myh
= (struct coff_link_hash_entry
*) bh
;
2013 printf ("type:%d\n", myh
->type
);
2014 printf ("%s\n", myh
->root
.u
.def
.section
->name
);
2020 /* .section .idata$3
2021 .rva __nm_thnk_SYM (singleton thunk with name of func)
2024 .rva __my_dll_iname (name of dll)
2025 .rva __fuNN_SYM (pointer to reference (address) in text) */
2028 make_import_fixup_entry (name
, fixup_name
, dll_symname
, parent
)
2030 const char *fixup_name
;
2031 const char *dll_symname
;
2039 oname
= (char *) xmalloc (20);
2040 sprintf (oname
, "fu%06d.o", tmp_seq
);
2043 abfd
= bfd_create (oname
, parent
);
2044 bfd_find_target (pe_details
->object_target
, abfd
);
2045 bfd_make_writable (abfd
);
2047 bfd_set_format (abfd
, bfd_object
);
2048 bfd_set_arch_mach (abfd
, pe_details
->bfd_arch
, 0);
2051 symtab
= (asymbol
**) xmalloc (6 * sizeof (asymbol
*));
2052 id3
= quick_section (abfd
, ".idata$3", SEC_HAS_CONTENTS
, 2);
2055 quick_symbol (abfd
, U ("_head_"), dll_symname
, "", id2
, BSF_GLOBAL
, 0);
2057 quick_symbol (abfd
, U ("_nm_thnk_"), name
, "", UNDSEC
, BSF_GLOBAL
, 0);
2058 quick_symbol (abfd
, U (""), dll_symname
, "_iname", UNDSEC
, BSF_GLOBAL
, 0);
2059 quick_symbol (abfd
, "", fixup_name
, "", UNDSEC
, BSF_GLOBAL
, 0);
2061 bfd_set_section_size (abfd
, id3
, 20);
2062 d3
= (unsigned char *) xmalloc (20);
2066 quick_reloc (abfd
, 0, BFD_RELOC_RVA
, 1);
2067 quick_reloc (abfd
, 12, BFD_RELOC_RVA
, 2);
2068 quick_reloc (abfd
, 16, BFD_RELOC_RVA
, 3);
2071 bfd_set_symtab (abfd
, symtab
, symptr
);
2073 bfd_set_section_contents (abfd
, id3
, d3
, 0, 20);
2075 bfd_make_readable (abfd
);
2080 pe_create_import_fixup (rel
)
2084 struct symbol_cache_entry
*sym
= *rel
->sym_ptr_ptr
;
2085 struct bfd_link_hash_entry
*name_thunk_sym
;
2086 const char *name
= sym
->name
;
2087 char *fixup_name
= make_import_fixup_mark (rel
);
2089 sprintf (buf
, U ("_nm_thnk_%s"), name
);
2091 name_thunk_sym
= bfd_link_hash_lookup (link_info
.hash
, buf
, 0, 0, 1);
2093 if (!name_thunk_sym
|| name_thunk_sym
->type
!= bfd_link_hash_defined
)
2095 bfd
*b
= make_singleton_name_thunk (name
, output_bfd
);
2096 add_bfd_to_link (b
, b
->filename
, &link_info
);
2098 /* If we ever use autoimport, we have to cast text section writable. */
2099 config
.text_read_only
= false;
2103 extern char * pe_data_import_dll
;
2104 char * dll_symname
= pe_data_import_dll
? pe_data_import_dll
: "unknown";
2106 bfd
*b
= make_import_fixup_entry (name
, fixup_name
, dll_symname
,
2108 add_bfd_to_link (b
, b
->filename
, &link_info
);
2114 pe_dll_generate_implib (def
, impfilename
)
2116 const char *impfilename
;
2124 dll_filename
= (def
->name
) ? def
->name
: dll_name
;
2125 dll_symname
= xstrdup (dll_filename
);
2126 for (i
= 0; dll_symname
[i
]; i
++)
2127 if (!ISALNUM (dll_symname
[i
]))
2128 dll_symname
[i
] = '_';
2130 unlink (impfilename
);
2132 outarch
= bfd_openw (impfilename
, 0);
2136 /* xgettext:c-format */
2137 einfo (_("%XCan't open .lib file: %s\n"), impfilename
);
2141 /* xgettext:c-format */
2142 einfo (_("Creating library file: %s\n"), impfilename
);
2144 bfd_set_format (outarch
, bfd_archive
);
2145 outarch
->has_armap
= 1;
2147 /* Work out a reasonable size of things to put onto one line. */
2148 ar_head
= make_head (outarch
);
2150 for (i
= 0; i
< def
->num_exports
; i
++)
2152 /* The import library doesn't know about the internal name. */
2153 char *internal
= def
->exports
[i
].internal_name
;
2156 def
->exports
[i
].internal_name
= def
->exports
[i
].name
;
2157 n
= make_one (def
->exports
+ i
, outarch
);
2160 def
->exports
[i
].internal_name
= internal
;
2163 ar_tail
= make_tail (outarch
);
2165 if (ar_head
== NULL
|| ar_tail
== NULL
)
2168 /* Now stick them all into the archive. */
2169 ar_head
->next
= head
;
2170 ar_tail
->next
= ar_head
;
2173 if (! bfd_set_archive_head (outarch
, head
))
2174 einfo ("%Xbfd_set_archive_head: %s\n", bfd_errmsg (bfd_get_error ()));
2176 if (! bfd_close (outarch
))
2177 einfo ("%Xbfd_close %s: %s\n", impfilename
, bfd_errmsg (bfd_get_error ()));
2179 while (head
!= NULL
)
2181 bfd
*n
= head
->next
;
2188 add_bfd_to_link (abfd
, name
, link_info
)
2191 struct bfd_link_info
*link_info
;
2193 lang_input_statement_type
*fake_file
;
2195 fake_file
= lang_add_input_file (name
,
2196 lang_input_file_is_fake_enum
,
2198 fake_file
->the_bfd
= abfd
;
2199 ldlang_add_file (fake_file
);
2201 if (!bfd_link_add_symbols (abfd
, link_info
))
2202 einfo ("%Xaddsym %s: %s\n", name
, bfd_errmsg (bfd_get_error ()));
2206 pe_process_import_defs (output_bfd
, link_info
)
2208 struct bfd_link_info
*link_info
;
2210 def_file_module
*module
;
2212 pe_dll_id_target (bfd_get_target (output_bfd
));
2217 for (module
= pe_def_file
->modules
; module
; module
= module
->next
)
2221 dll_filename
= module
->name
;
2222 dll_symname
= xstrdup (module
->name
);
2223 for (i
= 0; dll_symname
[i
]; i
++)
2224 if (!ISALNUM (dll_symname
[i
]))
2225 dll_symname
[i
] = '_';
2229 for (i
= 0; i
< pe_def_file
->num_imports
; i
++)
2230 if (pe_def_file
->imports
[i
].module
== module
)
2232 def_file_export exp
;
2233 struct bfd_link_hash_entry
*blhe
;
2235 /* See if we need this import. */
2236 char *name
= (char *) xmalloc (strlen (pe_def_file
->imports
[i
].internal_name
) + 2 + 6);
2237 sprintf (name
, "%s%s", U (""), pe_def_file
->imports
[i
].internal_name
);
2238 blhe
= bfd_link_hash_lookup (link_info
->hash
, name
,
2239 false, false, false);
2240 if (!blhe
|| (blhe
&& blhe
->type
!= bfd_link_hash_undefined
))
2242 sprintf (name
, "%s%s", U ("_imp__"),
2243 pe_def_file
->imports
[i
].internal_name
);
2244 blhe
= bfd_link_hash_lookup (link_info
->hash
, name
,
2245 false, false, false);
2248 if (blhe
&& blhe
->type
== bfd_link_hash_undefined
)
2254 bfd
*ar_head
= make_head (output_bfd
);
2255 add_bfd_to_link (ar_head
, ar_head
->filename
, link_info
);
2258 exp
.internal_name
= pe_def_file
->imports
[i
].internal_name
;
2259 exp
.name
= pe_def_file
->imports
[i
].name
;
2260 exp
.ordinal
= pe_def_file
->imports
[i
].ordinal
;
2261 exp
.hint
= exp
.ordinal
>= 0 ? exp
.ordinal
: 0;
2262 exp
.flag_private
= 0;
2263 exp
.flag_constant
= 0;
2265 exp
.flag_noname
= exp
.name
? 0 : 1;
2266 one
= make_one (&exp
, output_bfd
);
2267 add_bfd_to_link (one
, one
->filename
, link_info
);
2272 bfd
*ar_tail
= make_tail (output_bfd
);
2273 add_bfd_to_link (ar_tail
, ar_tail
->filename
, link_info
);
2280 /* We were handed a *.DLL file. Parse it and turn it into a set of
2281 IMPORTS directives in the def file. Return true if the file was
2282 handled, false if not. */
2285 pe_get16 (abfd
, where
)
2291 bfd_seek (abfd
, (file_ptr
) where
, SEEK_SET
);
2292 bfd_bread (b
, (bfd_size_type
) 2, abfd
);
2293 return b
[0] + (b
[1] << 8);
2297 pe_get32 (abfd
, where
)
2303 bfd_seek (abfd
, (file_ptr
) where
, SEEK_SET
);
2304 bfd_bread (b
, (bfd_size_type
) 4, abfd
);
2305 return b
[0] + (b
[1] << 8) + (b
[2] << 16) + (b
[3] << 24);
2308 #if 0 /* This is not currently used. */
2314 unsigned char *b
= ptr
;
2316 return b
[0] + (b
[1] << 8);
2325 unsigned char *b
= ptr
;
2327 return b
[0] + (b
[1] << 8) + (b
[2] << 16) + (b
[3] << 24);
2331 pe_implied_import_dll (filename
)
2332 const char *filename
;
2335 unsigned long pe_header_offset
, opthdr_ofs
, num_entries
, i
;
2336 unsigned long export_rva
, export_size
, nsections
, secptr
, expptr
;
2337 unsigned char *expdata
, *erva
;
2338 unsigned long name_rvas
, ordinals
, nexp
, ordbase
;
2339 const char *dll_name
;
2341 /* No, I can't use bfd here. kernel32.dll puts its export table in
2342 the middle of the .rdata section. */
2343 dll
= bfd_openr (filename
, pe_details
->target_name
);
2346 einfo ("%Xopen %s: %s\n", filename
, bfd_errmsg (bfd_get_error ()));
2350 /* PEI dlls seem to be bfd_objects. */
2351 if (!bfd_check_format (dll
, bfd_object
))
2353 einfo ("%X%s: this doesn't appear to be a DLL\n", filename
);
2357 dll_name
= filename
;
2358 for (i
= 0; filename
[i
]; i
++)
2359 if (filename
[i
] == '/' || filename
[i
] == '\\' || filename
[i
] == ':')
2360 dll_name
= filename
+ i
+ 1;
2362 pe_header_offset
= pe_get32 (dll
, 0x3c);
2363 opthdr_ofs
= pe_header_offset
+ 4 + 20;
2364 num_entries
= pe_get32 (dll
, opthdr_ofs
+ 92);
2366 if (num_entries
< 1) /* No exports. */
2369 export_rva
= pe_get32 (dll
, opthdr_ofs
+ 96);
2370 export_size
= pe_get32 (dll
, opthdr_ofs
+ 100);
2371 nsections
= pe_get16 (dll
, pe_header_offset
+ 4 + 2);
2372 secptr
= (pe_header_offset
+ 4 + 20 +
2373 pe_get16 (dll
, pe_header_offset
+ 4 + 16));
2376 for (i
= 0; i
< nsections
; i
++)
2379 unsigned long secptr1
= secptr
+ 40 * i
;
2380 unsigned long vaddr
= pe_get32 (dll
, secptr1
+ 12);
2381 unsigned long vsize
= pe_get32 (dll
, secptr1
+ 16);
2382 unsigned long fptr
= pe_get32 (dll
, secptr1
+ 20);
2384 bfd_seek (dll
, (file_ptr
) secptr1
, SEEK_SET
);
2385 bfd_bread (sname
, (bfd_size_type
) 8, dll
);
2387 if (vaddr
<= export_rva
&& vaddr
+ vsize
> export_rva
)
2389 expptr
= fptr
+ (export_rva
- vaddr
);
2390 if (export_rva
+ export_size
> vaddr
+ vsize
)
2391 export_size
= vsize
- (export_rva
- vaddr
);
2396 expdata
= (unsigned char *) xmalloc (export_size
);
2397 bfd_seek (dll
, (file_ptr
) expptr
, SEEK_SET
);
2398 bfd_bread (expdata
, (bfd_size_type
) export_size
, dll
);
2399 erva
= expdata
- export_rva
;
2401 if (pe_def_file
== 0)
2402 pe_def_file
= def_file_empty ();
2404 nexp
= pe_as32 (expdata
+ 24);
2405 name_rvas
= pe_as32 (expdata
+ 32);
2406 ordinals
= pe_as32 (expdata
+ 36);
2407 ordbase
= pe_as32 (expdata
+ 16);
2409 for (i
= 0; i
< nexp
; i
++)
2411 unsigned long name_rva
= pe_as32 (erva
+ name_rvas
+ i
* 4);
2412 def_file_import
*imp
;
2414 imp
= def_file_add_import (pe_def_file
, erva
+ name_rva
, dll_name
,
2421 /* These are the main functions, called from the emulation. The first
2422 is called after the bfds are read, so we can guess at how much space
2423 we need. The second is called after everything is placed, so we
2424 can put the right values in place. */
2427 pe_dll_build_sections (abfd
, info
)
2429 struct bfd_link_info
*info
;
2431 pe_dll_id_target (bfd_get_target (abfd
));
2432 process_def_file (abfd
, info
);
2434 generate_edata (abfd
, info
);
2435 build_filler_bfd (1);
2439 pe_exe_build_sections (abfd
, info
)
2441 struct bfd_link_info
*info ATTRIBUTE_UNUSED
;
2443 pe_dll_id_target (bfd_get_target (abfd
));
2444 build_filler_bfd (0);
2448 pe_dll_fill_sections (abfd
, info
)
2450 struct bfd_link_info
*info
;
2452 pe_dll_id_target (bfd_get_target (abfd
));
2453 image_base
= pe_data (abfd
)->pe_opthdr
.ImageBase
;
2455 generate_reloc (abfd
, info
);
2458 bfd_set_section_size (filler_bfd
, reloc_s
, reloc_sz
);
2460 /* Resize the sections. */
2461 lang_size_sections (stat_ptr
->head
, abs_output_section
,
2462 &stat_ptr
->head
, 0, (bfd_vma
) 0, NULL
);
2464 /* Redo special stuff. */
2465 ldemul_after_allocation ();
2467 /* Do the assignments again. */
2468 lang_do_assignments (stat_ptr
->head
,
2470 (fill_type
*) 0, (bfd_vma
) 0);
2473 fill_edata (abfd
, info
);
2475 pe_data (abfd
)->dll
= 1;
2477 edata_s
->contents
= edata_d
;
2478 reloc_s
->contents
= reloc_d
;
2482 pe_exe_fill_sections (abfd
, info
)
2484 struct bfd_link_info
*info
;
2486 pe_dll_id_target (bfd_get_target (abfd
));
2487 image_base
= pe_data (abfd
)->pe_opthdr
.ImageBase
;
2489 generate_reloc (abfd
, info
);
2492 bfd_set_section_size (filler_bfd
, reloc_s
, reloc_sz
);
2494 /* Resize the sections. */
2495 lang_size_sections (stat_ptr
->head
, abs_output_section
,
2496 &stat_ptr
->head
, 0, (bfd_vma
) 0, NULL
);
2498 /* Redo special stuff. */
2499 ldemul_after_allocation ();
2501 /* Do the assignments again. */
2502 lang_do_assignments (stat_ptr
->head
,
2504 (fill_type
*) 0, (bfd_vma
) 0);
2506 reloc_s
->contents
= reloc_d
;