1 /* Routines to help build PEI-format DLLs (Win32 etc)
2 Copyright (C) 1998, 1999 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"
38 #include "coff/internal.h"
39 #include "../bfd/libcoff.h"
42 /************************************************************************
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 ************************************************************************/
55 /* for emultempl/pe.em */
57 def_file
*pe_def_file
= 0;
58 int pe_dll_export_everything
= 0;
59 int pe_dll_do_default_excludes
= 1;
60 int pe_dll_kill_ats
= 0;
61 int pe_dll_stdcall_aliases
= 0;
63 /************************************************************************
65 static variables and types
67 ************************************************************************/
69 static bfd_vma image_base
;
71 static bfd
*filler_bfd
;
72 static struct sec
*edata_s
, *reloc_s
;
73 static unsigned char *edata_d
, *reloc_d
;
74 static int edata_sz
, reloc_sz
;
85 #define PE_ARCH_i386 1
87 static pe_details_type pe_detail_list
[] = {
99 static pe_details_type
*pe_details
;
101 #define U(str) (pe_details->underscored ? "_" str : str)
104 pe_dll_id_target (target
)
108 for (i
=0; pe_detail_list
[i
].target_name
; i
++)
109 if (strcmp (pe_detail_list
[i
].target_name
, target
) == 0)
111 pe_details
= pe_detail_list
+i
;
114 einfo (_("%XUnsupported PEI architecture: %s\n"), target
);
118 /************************************************************************
120 Helper functions for qsort. Relocs must be sorted so that we can write
123 ************************************************************************/
135 bfd_vma a
= ((reloc_data_type
*) va
)->vma
;
136 bfd_vma b
= ((reloc_data_type
*) vb
)->vma
;
137 return (a
> b
) ? 1 : ((a
< b
) ? -1 : 0);
141 pe_export_sort (va
, vb
)
144 def_file_export
*a
= (def_file_export
*) va
;
145 def_file_export
*b
= (def_file_export
*) vb
;
146 return strcmp (a
->name
, b
->name
);
149 /************************************************************************
151 Read and process the .DEF file
153 ************************************************************************/
155 /* These correspond to the entries in pe_def_file->exports[]. I use
156 exported_symbol_sections[i] to tag whether or not the symbol was
157 defined, since we can't export symbols we don't have. */
159 static bfd_vma
*exported_symbol_offsets
;
160 static struct sec
**exported_symbol_sections
;
162 static int export_table_size
;
163 static int count_exported
;
164 static int count_exported_byname
;
165 static int count_with_ordinals
;
166 static const char *dll_name
;
167 static int min_ordinal
, max_ordinal
;
168 static int *exported_symbols
;
170 typedef struct exclude_list_struct
173 struct exclude_list_struct
*next
;
176 static struct exclude_list_struct
*excludes
= 0;
179 pe_dll_add_excludes (new_excludes
)
180 const char *new_excludes
;
183 char *exclude_string
;
185 local_copy
= xstrdup (new_excludes
);
187 exclude_string
= strtok (local_copy
, ",:");
188 for (; exclude_string
; exclude_string
= strtok (NULL
, ",:"))
190 struct exclude_list_struct
*new_exclude
;
192 new_exclude
= ((struct exclude_list_struct
*)
193 xmalloc (sizeof (struct exclude_list_struct
)));
194 new_exclude
->string
= (char *) xmalloc (strlen (exclude_string
) + 1);
195 strcpy (new_exclude
->string
, exclude_string
);
196 new_exclude
->next
= excludes
;
197 excludes
= new_exclude
;
209 struct exclude_list_struct
*ex
;
210 for (i
= 0; i
< d
->num_exports
; i
++)
211 if (strcmp (d
->exports
[i
].name
, n
) == 0)
213 if (pe_dll_do_default_excludes
)
215 if (strcmp (n
, "DllMain@12") == 0)
217 if (strcmp (n
, "DllEntryPoint@0") == 0)
219 if (strcmp (n
, "impure_ptr") == 0)
222 for (ex
= excludes
; ex
; ex
= ex
->next
)
223 if (strcmp (n
, ex
->string
) == 0)
229 process_def_file (abfd
, info
)
231 struct bfd_link_info
*info
;
234 struct bfd_link_hash_entry
*blhe
;
237 def_file_export
*e
=0;
240 pe_def_file
= def_file_empty ();
242 /* First, run around to all the objects looking for the .drectve
243 sections, and push those into the def file too */
245 for (b
= info
->input_bfds
; b
; b
= b
->link_next
)
247 s
= bfd_get_section_by_name (b
, ".drectve");
250 int size
= bfd_get_section_size_before_reloc (s
);
251 char *buf
= xmalloc (size
);
252 bfd_get_section_contents (b
, s
, buf
, 0, size
);
253 def_file_add_directive (pe_def_file
, buf
, size
);
258 /* Now, maybe export everything else the default way */
260 if (pe_dll_export_everything
|| pe_def_file
->num_exports
== 0)
262 for (b
= info
->input_bfds
; b
; b
= b
->link_next
)
267 symsize
= bfd_get_symtab_upper_bound (b
);
268 symbols
= (asymbol
**) xmalloc (symsize
);
269 nsyms
= bfd_canonicalize_symtab (b
, symbols
);
271 for (j
= 0; j
< nsyms
; j
++)
273 if ((symbols
[j
]->flags
& (BSF_FUNCTION
| BSF_GLOBAL
))
274 == (BSF_FUNCTION
| BSF_GLOBAL
))
276 const char *sn
= symbols
[j
]->name
;
279 if (auto_export (pe_def_file
, sn
))
280 def_file_add_export (pe_def_file
, sn
, 0, -1);
287 #define NE pe_def_file->num_exports
289 /* Canonicalize the export list */
293 for (i
= 0; i
< NE
; i
++)
295 if (strchr (pe_def_file
->exports
[i
].name
, '@'))
297 /* This will preserve internal_name, which may have been pointing
298 to the same memory as name, or might not have */
299 char *tmp
= xstrdup (pe_def_file
->exports
[i
].name
);
300 *(strchr (tmp
, '@')) = 0;
301 pe_def_file
->exports
[i
].name
= tmp
;
306 if (pe_dll_stdcall_aliases
)
308 for (i
= 0; i
< NE
; i
++)
310 if (strchr (pe_def_file
->exports
[i
].name
, '@'))
312 char *tmp
= xstrdup (pe_def_file
->exports
[i
].name
);
313 *(strchr (tmp
, '@')) = 0;
314 if (auto_export (pe_def_file
, tmp
))
315 def_file_add_export (pe_def_file
, tmp
,
316 pe_def_file
->exports
[i
].internal_name
, -1);
323 e
= pe_def_file
->exports
; /* convenience, but watch out for it changing */
325 exported_symbol_offsets
= (bfd_vma
*) xmalloc (NE
* sizeof (bfd_vma
));
326 exported_symbol_sections
= (struct sec
**) xmalloc (NE
* sizeof (struct sec
*));
328 memset (exported_symbol_sections
, 0, NE
* sizeof (struct sec
*));
332 count_exported_byname
= 0;
333 count_with_ordinals
= 0;
335 qsort (pe_def_file
->exports
, NE
, sizeof (pe_def_file
->exports
[0]), pe_export_sort
);
336 for (i
= 0, j
= 0; i
< NE
; i
++)
338 if (i
> 0 && strcmp (e
[i
].name
, e
[i
- 1].name
) == 0)
340 /* This is a duplicate */
341 if (e
[j
- 1].ordinal
!= -1
342 && e
[i
].ordinal
!= -1
343 && e
[j
- 1].ordinal
!= e
[i
].ordinal
)
345 /* xgettext:c-format */
346 einfo (_("%XError, duplicate EXPORT with oridinals: %s (%d vs %d)\n"),
347 e
[j
- 1].name
, e
[j
- 1].ordinal
, e
[i
].ordinal
);
351 /* xgettext:c-format */
352 einfo (_("Warning, duplicate EXPORT: %s\n"),
356 e
[j
- 1].ordinal
= e
[i
].ordinal
;
357 e
[j
- 1].flag_private
|= e
[i
].flag_private
;
358 e
[j
- 1].flag_constant
|= e
[i
].flag_constant
;
359 e
[j
- 1].flag_noname
|= e
[i
].flag_noname
;
360 e
[j
- 1].flag_data
|= e
[i
].flag_data
;
369 pe_def_file
->num_exports
= j
; /* == NE */
371 for (i
= 0; i
< NE
; i
++)
373 char *name
= (char *) xmalloc (strlen (pe_def_file
->exports
[i
].internal_name
) + 2);
374 if (pe_details
->underscored
)
377 strcpy (name
+ 1, pe_def_file
->exports
[i
].internal_name
);
380 strcpy (name
, pe_def_file
->exports
[i
].internal_name
);
382 blhe
= bfd_link_hash_lookup (info
->hash
,
386 if (blhe
&& (blhe
->type
== bfd_link_hash_defined
))
389 if (!pe_def_file
->exports
[i
].flag_noname
)
390 count_exported_byname
++;
391 exported_symbol_offsets
[i
] = blhe
->u
.def
.value
;
392 exported_symbol_sections
[i
] = blhe
->u
.def
.section
;
393 if (pe_def_file
->exports
[i
].ordinal
!= -1)
395 if (max_ordinal
< pe_def_file
->exports
[i
].ordinal
)
396 max_ordinal
= pe_def_file
->exports
[i
].ordinal
;
397 if (min_ordinal
> pe_def_file
->exports
[i
].ordinal
)
398 min_ordinal
= pe_def_file
->exports
[i
].ordinal
;
399 count_with_ordinals
++;
402 else if (blhe
&& blhe
->type
== bfd_link_hash_undefined
)
404 /* xgettext:c-format */
405 einfo (_("%XCannot export %s: symbol not defined\n"),
406 pe_def_file
->exports
[i
].internal_name
);
410 /* xgettext:c-format */
411 einfo (_("%XCannot export %s: symbol wrong type (%d vs %d)\n"),
412 pe_def_file
->exports
[i
].internal_name
,
413 blhe
->type
, bfd_link_hash_defined
);
417 /* xgettext:c-format */
418 einfo (_("%XCannot export %s: symbol not found\n"),
419 pe_def_file
->exports
[i
].internal_name
);
425 /************************************************************************
427 Build the bfd that will contain .edata and .reloc sections
429 ************************************************************************/
432 build_filler_bfd (include_edata
)
435 lang_input_statement_type
*filler_file
;
436 filler_file
= lang_add_input_file ("dll stuff",
437 lang_input_file_is_fake_enum
,
439 filler_file
->the_bfd
= filler_bfd
= bfd_create ("dll stuff", output_bfd
);
440 if (filler_bfd
== NULL
441 || !bfd_set_arch_mach (filler_bfd
,
442 bfd_get_arch (output_bfd
),
443 bfd_get_mach (output_bfd
)))
445 einfo ("%X%P: can not create BFD %E\n");
451 edata_s
= bfd_make_section_old_way (filler_bfd
, ".edata");
453 || !bfd_set_section_flags (filler_bfd
, edata_s
,
460 einfo ("%X%P: can not create .edata section: %E\n");
463 bfd_set_section_size (filler_bfd
, edata_s
, edata_sz
);
466 reloc_s
= bfd_make_section_old_way (filler_bfd
, ".reloc");
468 || !bfd_set_section_flags (filler_bfd
, reloc_s
,
475 einfo ("%X%P: can not create .reloc section: %E\n");
478 bfd_set_section_size (filler_bfd
, reloc_s
, 0);
480 ldlang_add_file (filler_file
);
483 /************************************************************************
485 Gather all the exported symbols and build the .edata section
487 ************************************************************************/
490 generate_edata (abfd
, info
)
492 struct bfd_link_info
*info
;
495 int name_table_size
= 0;
498 /* First, we need to know how many exported symbols there are,
499 and what the range of ordinals is. */
501 if (pe_def_file
->name
)
503 dll_name
= pe_def_file
->name
;
507 dll_name
= abfd
->filename
;
508 for (dlnp
= dll_name
; *dlnp
; dlnp
++)
510 if (*dlnp
== '\\' || *dlnp
== '/' || *dlnp
== ':')
515 if (count_with_ordinals
&& max_ordinal
> count_exported
)
517 if (min_ordinal
> max_ordinal
- count_exported
+ 1)
518 min_ordinal
= max_ordinal
- count_exported
+ 1;
523 max_ordinal
= count_exported
;
525 export_table_size
= max_ordinal
- min_ordinal
+ 1;
527 exported_symbols
= (int *) xmalloc (export_table_size
* sizeof (int));
528 for (i
= 0; i
< export_table_size
; i
++)
529 exported_symbols
[i
] = -1;
531 /* Now we need to assign ordinals to those that don't have them */
532 for (i
= 0; i
< NE
; i
++)
534 if (exported_symbol_sections
[i
])
536 if (pe_def_file
->exports
[i
].ordinal
!= -1)
538 int ei
= pe_def_file
->exports
[i
].ordinal
- min_ordinal
;
539 int pi
= exported_symbols
[ei
];
542 /* xgettext:c-format */
543 einfo (_("%XError, oridinal used twice: %d (%s vs %s)\n"),
544 pe_def_file
->exports
[i
].ordinal
,
545 pe_def_file
->exports
[i
].name
,
546 pe_def_file
->exports
[pi
].name
);
548 exported_symbols
[ei
] = i
;
550 name_table_size
+= strlen (pe_def_file
->exports
[i
].name
) + 1;
554 next_ordinal
= min_ordinal
;
555 for (i
= 0; i
< NE
; i
++)
556 if (exported_symbol_sections
[i
])
557 if (pe_def_file
->exports
[i
].ordinal
== -1)
559 while (exported_symbols
[next_ordinal
- min_ordinal
] != -1)
561 exported_symbols
[next_ordinal
- min_ordinal
] = i
;
562 pe_def_file
->exports
[i
].ordinal
= next_ordinal
;
565 /* OK, now we can allocate some memory */
567 edata_sz
= (40 /* directory */
568 + 4 * export_table_size
/* addresses */
569 + 4 * count_exported_byname
/* name ptrs */
570 + 2 * count_exported_byname
/* ordinals */
571 + name_table_size
+ strlen (dll_name
) + 1);
575 fill_edata (abfd
, info
)
577 struct bfd_link_info
*info
;
580 unsigned char *edirectory
;
581 unsigned long *eaddresses
;
582 unsigned long *enameptrs
;
583 unsigned short *eordinals
;
584 unsigned char *enamestr
;
589 edata_d
= (unsigned char *) xmalloc (edata_sz
);
591 /* Note use of array pointer math here */
592 edirectory
= edata_d
;
593 eaddresses
= (unsigned long *) (edata_d
+ 40);
594 enameptrs
= eaddresses
+ export_table_size
;
595 eordinals
= (unsigned short *) (enameptrs
+ count_exported_byname
);
596 enamestr
= (char *) (eordinals
+ count_exported_byname
);
598 #define ERVA(ptr) (((unsigned char *)(ptr) - edata_d) + edata_s->output_section->vma - image_base)
600 memset (edata_d
, 0, 40);
601 bfd_put_32 (abfd
, now
, edata_d
+ 4);
602 if (pe_def_file
->version_major
!= -1)
604 bfd_put_16 (abfd
, pe_def_file
->version_major
, edata_d
+ 8);
605 bfd_put_16 (abfd
, pe_def_file
->version_minor
, edata_d
+ 10);
607 bfd_put_32 (abfd
, ERVA (enamestr
), edata_d
+ 12);
608 strcpy (enamestr
, dll_name
);
609 enamestr
+= strlen (enamestr
) + 1;
610 bfd_put_32 (abfd
, min_ordinal
, edata_d
+ 16);
611 bfd_put_32 (abfd
, export_table_size
, edata_d
+ 20);
612 bfd_put_32 (abfd
, count_exported_byname
, edata_d
+ 24);
613 bfd_put_32 (abfd
, ERVA (eaddresses
), edata_d
+ 28);
614 bfd_put_32 (abfd
, ERVA (enameptrs
), edata_d
+ 32);
615 bfd_put_32 (abfd
, ERVA (eordinals
), edata_d
+ 36);
617 /* Ok, now for the filling in part */
619 for (i
= 0; i
< export_table_size
; i
++)
621 int s
= exported_symbols
[i
];
624 struct sec
*ssec
= exported_symbol_sections
[s
];
625 unsigned long srva
= (exported_symbol_offsets
[s
]
626 + ssec
->output_section
->vma
627 + ssec
->output_offset
);
629 bfd_put_32 (abfd
, srva
- image_base
, (void *) (eaddresses
+ i
));
630 if (!pe_def_file
->exports
[s
].flag_noname
)
632 char *ename
= pe_def_file
->exports
[s
].name
;
633 bfd_put_32 (abfd
, ERVA (enamestr
), (void *) enameptrs
);
634 strcpy (enamestr
, ename
);
635 enamestr
+= strlen (enamestr
) + 1;
636 bfd_put_16 (abfd
, i
, (void *) eordinals
);
638 pe_def_file
->exports
[s
].hint
= hint
++;
645 /************************************************************************
647 Gather all the relocations and build the .reloc section
649 ************************************************************************/
652 generate_reloc (abfd
, info
)
654 struct bfd_link_info
*info
;
657 /* for .reloc stuff */
658 reloc_data_type
*reloc_data
;
659 int total_relocs
= 0;
661 unsigned long sec_page
= (unsigned long) (-1);
662 unsigned long page_ptr
, page_count
;
668 for (b
= info
->input_bfds
; b
; b
= b
->link_next
)
669 for (s
= b
->sections
; s
; s
= s
->next
)
670 total_relocs
+= s
->reloc_count
;
672 reloc_data
= (reloc_data_type
*) xmalloc (total_relocs
* sizeof (reloc_data_type
));
676 for (bi
= 0, b
= info
->input_bfds
; b
; bi
++, b
= b
->link_next
)
679 int relsize
, nrelocs
, i
;
681 for (s
= b
->sections
; s
; s
= s
->next
)
683 unsigned long sec_vma
= s
->output_section
->vma
+ s
->output_offset
;
687 /* if it's not loaded, we don't need to relocate it this way */
688 if (!(s
->output_section
->flags
& SEC_LOAD
))
691 /* I don't know why there would be a reloc for these, but I've
692 seen it happen - DJ */
693 if (s
->output_section
== &bfd_abs_section
)
696 if (s
->output_section
->vma
== 0)
698 /* Huh? Shouldn't happen, but punt if it does */
699 einfo ("DJ: zero vma section reloc detected: `%s' #%d f=%d\n",
700 s
->output_section
->name
, s
->output_section
->index
,
701 s
->output_section
->flags
);
705 symsize
= bfd_get_symtab_upper_bound (b
);
706 symbols
= (asymbol
**) xmalloc (symsize
);
707 nsyms
= bfd_canonicalize_symtab (b
, symbols
);
709 relsize
= bfd_get_reloc_upper_bound (b
, s
);
710 relocs
= (arelent
**) xmalloc ((size_t) relsize
);
711 nrelocs
= bfd_canonicalize_reloc (b
, s
, relocs
, symbols
);
713 for (i
= 0; i
< nrelocs
; i
++)
715 if (!relocs
[i
]->howto
->pc_relative
716 && relocs
[i
]->howto
->type
!= pe_details
->imagebase_reloc
)
719 struct symbol_cache_entry
*sym
= *relocs
[i
]->sym_ptr_ptr
;
720 sym_vma
= (relocs
[i
]->addend
723 + sym
->section
->output_offset
724 + sym
->section
->output_section
->vma
);
725 reloc_data
[total_relocs
].vma
= sec_vma
+ relocs
[i
]->address
;
726 switch (relocs
[i
]->howto
->bitsize
*1000
727 + relocs
[i
]->howto
->rightshift
)
730 reloc_data
[total_relocs
].type
= 3;
734 /* xgettext:c-format */
735 einfo (_("%XError: %d-bit reloc in dll\n"),
736 relocs
[i
]->howto
->bitsize
);
742 /* Warning: the allocated symbols are remembered in BFD and reused
743 later, so don't free them! */
744 /* free (symbols); */
748 /* At this point, we have total_relocs relocation addresses in
749 reloc_addresses, which are all suitable for the .reloc section.
750 We must now create the new sections. */
752 qsort (reloc_data
, total_relocs
, sizeof (*reloc_data
), reloc_sort
);
754 for (i
= 0; i
< total_relocs
; i
++)
756 unsigned long this_page
= (reloc_data
[i
].vma
>> 12);
757 if (this_page
!= sec_page
)
759 reloc_sz
= (reloc_sz
+ 3) & ~3; /* 4-byte align */
761 sec_page
= this_page
;
765 reloc_sz
= (reloc_sz
+ 3) & ~3; /* 4-byte align */
767 reloc_d
= (unsigned char *) xmalloc (reloc_sz
);
769 sec_page
= (unsigned long) (-1);
771 page_ptr
= (unsigned long) (-1);
773 for (i
= 0; i
< total_relocs
; i
++)
775 unsigned long rva
= reloc_data
[i
].vma
- image_base
;
776 unsigned long this_page
= (rva
& ~0xfff);
777 if (this_page
!= sec_page
)
780 reloc_d
[reloc_sz
++] = 0;
781 if (page_ptr
!= (unsigned long) (-1))
782 bfd_put_32 (abfd
, reloc_sz
- page_ptr
, reloc_d
+ page_ptr
+ 4);
783 bfd_put_32 (abfd
, this_page
, reloc_d
+ reloc_sz
);
786 sec_page
= this_page
;
789 bfd_put_16 (abfd
, (rva
& 0xfff) + (reloc_data
[i
].type
<<12),
792 if (reloc_data
[i
].type
== 4)
794 bfd_put_16 (abfd
, reloc_data
[i
].extra
, reloc_d
+ reloc_sz
);
800 reloc_d
[reloc_sz
++] = 0;
801 if (page_ptr
!= (unsigned long) (-1))
802 bfd_put_32 (abfd
, reloc_sz
- page_ptr
, reloc_d
+ page_ptr
+ 4);
803 while (reloc_sz
< reloc_s
->_raw_size
)
804 reloc_d
[reloc_sz
++] = 0;
807 /************************************************************************
809 Given the exiting def_file structure, print out a .DEF file that
812 ************************************************************************/
815 quoteput (s
, f
, needs_quotes
)
821 for (cp
= s
; *cp
; cp
++)
825 || isspace ((unsigned char) *cp
)
834 if (*s
== '"' || *s
== '\\')
846 pe_dll_generate_def_file (pe_out_def_filename
)
847 char *pe_out_def_filename
;
850 FILE *out
= fopen (pe_out_def_filename
, "w");
853 /* xgettext:c-format */
854 einfo (_("%s: Can't open output def file %s\n"),
855 program_name
, pe_out_def_filename
);
860 if (pe_def_file
->name
)
862 if (pe_def_file
->is_dll
)
863 fprintf (out
, "LIBRARY ");
865 fprintf (out
, "NAME ");
866 quoteput (pe_def_file
->name
, out
, 1);
867 if (pe_data (output_bfd
)->pe_opthdr
.ImageBase
)
868 fprintf (out
, " BASE=0x%lx",
869 (unsigned long) pe_data (output_bfd
)->pe_opthdr
.ImageBase
);
873 if (pe_def_file
->description
)
875 fprintf (out
, "DESCRIPTION ");
876 quoteput (pe_def_file
->description
, out
, 1);
880 if (pe_def_file
->version_minor
!= -1)
881 fprintf (out
, "VERSION %d.%d\n", pe_def_file
->version_major
,
882 pe_def_file
->version_minor
);
883 else if (pe_def_file
->version_major
!= -1)
884 fprintf (out
, "VERSION %d\n", pe_def_file
->version_major
);
886 if (pe_def_file
->stack_reserve
!= -1 || pe_def_file
->heap_reserve
!= -1)
889 if (pe_def_file
->stack_commit
!= -1)
890 fprintf (out
, "STACKSIZE 0x%x,0x%x\n",
891 pe_def_file
->stack_reserve
, pe_def_file
->stack_commit
);
892 else if (pe_def_file
->stack_reserve
!= -1)
893 fprintf (out
, "STACKSIZE 0x%x\n", pe_def_file
->stack_reserve
);
894 if (pe_def_file
->heap_commit
!= -1)
895 fprintf (out
, "HEAPSIZE 0x%x,0x%x\n",
896 pe_def_file
->heap_reserve
, pe_def_file
->heap_commit
);
897 else if (pe_def_file
->heap_reserve
!= -1)
898 fprintf (out
, "HEAPSIZE 0x%x\n", pe_def_file
->heap_reserve
);
900 if (pe_def_file
->num_section_defs
> 0)
902 fprintf (out
, "\nSECTIONS\n\n");
903 for (i
= 0; i
< pe_def_file
->num_section_defs
; i
++)
906 quoteput (pe_def_file
->section_defs
[i
].name
, out
, 0);
907 if (pe_def_file
->section_defs
[i
].class)
909 fprintf (out
, " CLASS ");
910 quoteput (pe_def_file
->section_defs
[i
].class, out
, 0);
912 if (pe_def_file
->section_defs
[i
].flag_read
)
913 fprintf (out
, " READ");
914 if (pe_def_file
->section_defs
[i
].flag_write
)
915 fprintf (out
, " WRITE");
916 if (pe_def_file
->section_defs
[i
].flag_execute
)
917 fprintf (out
, " EXECUTE");
918 if (pe_def_file
->section_defs
[i
].flag_shared
)
919 fprintf (out
, " SHARED");
924 if (pe_def_file
->num_exports
> 0)
926 fprintf (out
, "\nEXPORTS\n\n");
927 for (i
= 0; i
< pe_def_file
->num_exports
; i
++)
929 def_file_export
*e
= pe_def_file
->exports
+ i
;
931 quoteput (e
->name
, out
, 0);
932 if (e
->internal_name
&& strcmp (e
->internal_name
, e
->name
))
934 fprintf (out
, " = ");
935 quoteput (e
->internal_name
, out
, 0);
937 if (e
->ordinal
!= -1)
938 fprintf (out
, " @%d", e
->ordinal
);
940 fprintf (out
, " PRIVATE");
941 if (e
->flag_constant
)
942 fprintf (out
, " CONSTANT");
944 fprintf (out
, " NONAME");
946 fprintf (out
, " DATA");
952 if (pe_def_file
->num_imports
> 0)
954 fprintf (out
, "\nIMPORTS\n\n");
955 for (i
= 0; i
< pe_def_file
->num_imports
; i
++)
957 def_file_import
*im
= pe_def_file
->imports
+ i
;
959 if (im
->internal_name
960 && (!im
->name
|| strcmp (im
->internal_name
, im
->name
)))
962 quoteput (im
->internal_name
, out
, 0);
963 fprintf (out
, " = ");
965 quoteput (im
->module
->name
, out
, 0);
968 quoteput (im
->name
, out
, 0);
970 fprintf (out
, "%d", im
->ordinal
);
976 fprintf (out
, _("; no contents available\n"));
978 if (fclose (out
) == EOF
)
980 /* xgettext:c-format */
981 einfo (_("%P: Error closing file `%s'\n"), pe_out_def_filename
);
985 /************************************************************************
987 Generate the import library
989 ************************************************************************/
991 static asymbol
**symtab
;
994 static const char *dll_filename
;
995 static char *dll_symname
;
997 #define UNDSEC (asection *) &bfd_und_section
1000 quick_section(abfd
, name
, flags
, align
)
1009 sec
= bfd_make_section_old_way (abfd
, name
);
1010 bfd_set_section_flags (abfd
, sec
, flags
1015 bfd_set_section_alignment (abfd
, sec
, align
);
1016 /* remember to undo this before trying to link internally! */
1017 sec
->output_section
= sec
;
1019 sym
= bfd_make_empty_symbol (abfd
);
1020 symtab
[symptr
++] = sym
;
1021 sym
->name
= sec
->name
;
1023 sym
->flags
= BSF_LOCAL
;
1030 quick_symbol (abfd
, n1
, n2
, n3
, sec
, flags
, addr
)
1040 char *name
= (char *) xmalloc (strlen (n1
) + strlen (n2
) + strlen (n3
) + 1);
1044 sym
= bfd_make_empty_symbol (abfd
);
1049 symtab
[symptr
++] = sym
;
1052 static arelent
*reltab
= 0;
1053 static int relcount
= 0, relsize
= 0;
1056 quick_reloc (abfd
, address
, which_howto
, symidx
)
1062 if (relcount
>= (relsize
-1))
1066 reltab
= (arelent
*) xrealloc (reltab
, relsize
* sizeof (arelent
));
1068 reltab
= (arelent
*) xmalloc (relsize
* sizeof (arelent
));
1070 reltab
[relcount
].address
= address
;
1071 reltab
[relcount
].addend
= 0;
1072 reltab
[relcount
].howto
= bfd_reloc_type_lookup (abfd
, which_howto
);
1073 reltab
[relcount
].sym_ptr_ptr
= symtab
+ symidx
;
1078 save_relocs (asection
*sec
)
1081 sec
->relocation
= reltab
;
1082 sec
->reloc_count
= relcount
;
1083 sec
->orelocation
= (arelent
**) xmalloc ((relcount
+1) * sizeof (arelent
*));
1084 for (i
=0; i
<relcount
; i
++)
1085 sec
->orelocation
[i
] = sec
->relocation
+ i
;
1086 sec
->orelocation
[relcount
] = 0;
1087 sec
->flags
|= SEC_RELOC
;
1089 relcount
= relsize
= 0;
1094 * .global __head_my_dll
1099 * .rva __my_dll_iname
1115 asection
*id2
, *id5
, *id4
;
1116 unsigned char *d2
, *d5
, *d4
;
1120 oname
= (char *) xmalloc (20);
1121 sprintf (oname
, "d%06d.o", tmp_seq
);
1124 abfd
= bfd_create (oname
, parent
);
1125 bfd_find_target (pe_details
->object_target
, abfd
);
1126 bfd_make_writable (abfd
);
1128 bfd_set_format (abfd
, bfd_object
);
1129 bfd_set_arch_mach (abfd
, pe_details
->bfd_arch
, 0);
1132 symtab
= (asymbol
**) xmalloc (6 * sizeof (asymbol
*));
1133 id2
= quick_section (abfd
, ".idata$2", SEC_HAS_CONTENTS
, 2);
1134 id5
= quick_section (abfd
, ".idata$5", SEC_HAS_CONTENTS
, 2);
1135 id4
= quick_section (abfd
, ".idata$4", SEC_HAS_CONTENTS
, 2);
1136 quick_symbol (abfd
, U("_head_"), dll_symname
, "", id2
, BSF_GLOBAL
, 0);
1137 quick_symbol (abfd
, U(""), dll_symname
, "_iname", UNDSEC
, BSF_GLOBAL
, 0);
1139 /* OK, pay attention here. I got confused myself looking back at
1140 it. We create a four-byte section to mark the beginning of the
1141 list, and we include an offset of 4 in the section, so that the
1142 pointer to the list points to the *end* of this section, which is
1143 the start of the list of sections from other objects. */
1145 bfd_set_section_size (abfd
, id2
, 20);
1146 d2
= (unsigned char *) xmalloc (20);
1149 d2
[0] = d2
[16] = 4; /* reloc addend */
1150 quick_reloc (abfd
, 0, BFD_RELOC_RVA
, 2);
1151 quick_reloc (abfd
, 12, BFD_RELOC_RVA
, 4);
1152 quick_reloc (abfd
, 16, BFD_RELOC_RVA
, 1);
1155 bfd_set_section_size (abfd
, id5
, 4);
1156 d5
= (unsigned char *) xmalloc (4);
1160 bfd_set_section_size (abfd
, id4
, 4);
1161 d4
= (unsigned char *) xmalloc (4);
1165 bfd_set_symtab (abfd
, symtab
, symptr
);
1167 bfd_set_section_contents (abfd
, id2
, d2
, 0, 20);
1168 bfd_set_section_contents (abfd
, id5
, d5
, 0, 4);
1169 bfd_set_section_contents (abfd
, id4
, d4
, 0, 4);
1171 bfd_make_readable (abfd
);
1181 * .global __my_dll_iname
1190 asection
*id4
, *id5
, *id7
;
1191 unsigned char *d4
, *d5
, *d7
;
1196 oname
= (char *) xmalloc (20);
1197 sprintf (oname
, "d%06d.o", tmp_seq
);
1200 abfd
= bfd_create (oname
, parent
);
1201 bfd_find_target (pe_details
->object_target
, abfd
);
1202 bfd_make_writable (abfd
);
1204 bfd_set_format (abfd
, bfd_object
);
1205 bfd_set_arch_mach (abfd
, pe_details
->bfd_arch
, 0);
1208 symtab
= (asymbol
**) xmalloc (5 * sizeof (asymbol
*));
1209 id4
= quick_section (abfd
, ".idata$4", SEC_HAS_CONTENTS
, 2);
1210 id5
= quick_section (abfd
, ".idata$5", SEC_HAS_CONTENTS
, 2);
1211 id7
= quick_section (abfd
, ".idata$7", SEC_HAS_CONTENTS
, 2);
1212 quick_symbol (abfd
, U(""), dll_symname
, "_iname", id7
, BSF_GLOBAL
, 0);
1214 bfd_set_section_size (abfd
, id4
, 4);
1215 d4
= (unsigned char *) xmalloc (4);
1219 bfd_set_section_size (abfd
, id5
, 4);
1220 d5
= (unsigned char *) xmalloc (4);
1224 len
= strlen (dll_filename
)+1;
1227 bfd_set_section_size (abfd
, id7
, len
);
1228 d7
= (unsigned char *) xmalloc (len
);
1230 strcpy (d7
, dll_filename
);
1232 bfd_set_symtab (abfd
, symtab
, symptr
);
1234 bfd_set_section_contents (abfd
, id4
, d4
, 0, 4);
1235 bfd_set_section_contents (abfd
, id5
, d5
, 0, 4);
1236 bfd_set_section_contents (abfd
, id7
, d7
, 0, len
);
1238 bfd_make_readable (abfd
);
1245 * .global ___imp_function
1246 * .global __imp__function
1248 * jmp *__imp__function:
1251 * .long __head_my_dll
1262 * .asciz "function" xlate? (add underscore, kill at)
1265 static unsigned char jmp_ix86_bytes
[] = {
1266 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x90, 0x90
1271 make_one (exp
, parent
)
1272 def_file_export
*exp
;
1275 asection
*tx
, *id7
, *id5
, *id4
, *id6
;
1276 unsigned char *td
, *d7
, *d5
, *d4
, *d6
;
1280 unsigned char *jmp_bytes
;
1283 switch (pe_details
->pe_arch
)
1286 jmp_bytes
= jmp_ix86_bytes
;
1287 jmp_byte_count
= sizeof (jmp_ix86_bytes
);
1291 oname
= (char *) xmalloc (20);
1292 sprintf (oname
, "d%06d.o", tmp_seq
);
1295 abfd
= bfd_create (oname
, parent
);
1296 bfd_find_target (pe_details
->object_target
, abfd
);
1297 bfd_make_writable (abfd
);
1299 bfd_set_format (abfd
, bfd_object
);
1300 bfd_set_arch_mach (abfd
, pe_details
->bfd_arch
, 0);
1303 symtab
= (asymbol
**) xmalloc (10 * sizeof (asymbol
*));
1304 tx
= quick_section (abfd
, ".text", SEC_CODE
|SEC_HAS_CONTENTS
, 2);
1305 id7
= quick_section (abfd
, ".idata$7", SEC_HAS_CONTENTS
, 2);
1306 id5
= quick_section (abfd
, ".idata$5", SEC_HAS_CONTENTS
, 2);
1307 id4
= quick_section (abfd
, ".idata$4", SEC_HAS_CONTENTS
, 2);
1308 id6
= quick_section (abfd
, ".idata$6", SEC_HAS_CONTENTS
, 2);
1309 quick_symbol (abfd
, U(""), exp
->internal_name
, "", tx
, BSF_GLOBAL
, 0);
1310 quick_symbol (abfd
, U("_head_"), dll_symname
, "", UNDSEC
, BSF_GLOBAL
, 0);
1311 quick_symbol (abfd
, U("__imp_"), exp
->internal_name
, "", id5
, BSF_GLOBAL
, 0);
1312 quick_symbol (abfd
, U("_imp__"), exp
->internal_name
, "", id5
, BSF_GLOBAL
, 0);
1314 bfd_set_section_size (abfd
, tx
, jmp_byte_count
);
1315 td
= (unsigned char *) xmalloc (jmp_byte_count
);
1317 memcpy (td
, jmp_bytes
, jmp_byte_count
);
1318 switch (pe_details
->pe_arch
)
1321 quick_reloc (abfd
, 2, BFD_RELOC_32
, 2);
1326 bfd_set_section_size (abfd
, id7
, 4);
1327 d7
= (unsigned char *) xmalloc (4);
1330 quick_reloc (abfd
, 0, BFD_RELOC_RVA
, 6);
1333 bfd_set_section_size (abfd
, id5
, 4);
1334 d5
= (unsigned char *) xmalloc (4);
1337 if (exp
->flag_noname
)
1339 d5
[0] = exp
->ordinal
;
1340 d5
[1] = exp
->ordinal
>> 8;
1345 quick_reloc (abfd
, 0, BFD_RELOC_RVA
, 4);
1349 bfd_set_section_size (abfd
, id4
, 4);
1350 d4
= (unsigned char *) xmalloc (4);
1353 if (exp
->flag_noname
)
1355 d5
[0] = exp
->ordinal
;
1356 d5
[1] = exp
->ordinal
>> 8;
1361 quick_reloc (abfd
, 0, BFD_RELOC_RVA
, 4);
1365 if (exp
->flag_noname
)
1368 bfd_set_section_size (abfd
, id6
, 0);
1372 len
= strlen (exp
->name
) + 3;
1375 bfd_set_section_size (abfd
, id6
, len
);
1376 d6
= (unsigned char *) xmalloc (len
);
1378 memset (d6
, 0, len
);
1379 d6
[0] = exp
->hint
& 0xff;
1380 d6
[1] = exp
->hint
>> 8;
1381 strcpy (d6
+2, exp
->name
);
1384 bfd_set_symtab (abfd
, symtab
, symptr
);
1386 bfd_set_section_contents (abfd
, tx
, td
, 0, jmp_byte_count
);
1387 bfd_set_section_contents (abfd
, id7
, d7
, 0, 4);
1388 bfd_set_section_contents (abfd
, id5
, d5
, 0, 4);
1389 bfd_set_section_contents (abfd
, id4
, d4
, 0, 4);
1390 if (!exp
->flag_noname
)
1391 bfd_set_section_contents (abfd
, id6
, d6
, 0, len
);
1393 bfd_make_readable (abfd
);
1398 pe_dll_generate_implib (def
, impfilename
)
1408 dll_filename
= def
->name
;
1409 if (dll_filename
== 0)
1411 dll_filename
= dll_name
;
1412 for (i
=0; impfilename
[i
]; i
++)
1413 if (impfilename
[i
] == '/' || impfilename
[i
] == '\\')
1414 dll_filename
= impfilename
+1;
1416 dll_symname
= xstrdup (dll_filename
);
1417 for (i
=0; dll_symname
[i
]; i
++)
1418 if (!isalnum ((unsigned char) dll_symname
[i
]))
1419 dll_symname
[i
] = '_';
1421 unlink (impfilename
);
1423 outarch
= bfd_openw (impfilename
, 0);
1427 /* xgettext:c-format */
1428 einfo (_("%XCan't open .lib file: %s\n"), impfilename
);
1432 /* xgettext:c-format */
1433 einfo (_("Creating library file: %s\n"), impfilename
);
1435 bfd_set_format (outarch
, bfd_archive
);
1436 outarch
->has_armap
= 1;
1438 /* Work out a reasonable size of things to put onto one line. */
1440 ar_head
= make_head (outarch
);
1442 for (i
= 0; i
<def
->num_exports
; i
++)
1444 /* The import library doesn't know about the internal name */
1445 char *internal
= def
->exports
[i
].internal_name
;
1447 def
->exports
[i
].internal_name
= def
->exports
[i
].name
;
1448 n
= make_one (def
->exports
+i
, outarch
);
1451 def
->exports
[i
].internal_name
= internal
;
1454 ar_tail
= make_tail (outarch
);
1456 if (ar_head
== NULL
|| ar_tail
== NULL
)
1459 /* Now stick them all into the archive */
1461 ar_head
->next
= head
;
1462 ar_tail
->next
= ar_head
;
1465 if (! bfd_set_archive_head (outarch
, head
))
1466 einfo ("%Xbfd_set_archive_head: %s\n", bfd_errmsg (bfd_get_error ()));
1468 if (! bfd_close (outarch
))
1469 einfo ("%Xbfd_close %s: %s\n", impfilename
, bfd_errmsg (bfd_get_error ()));
1471 while (head
!= NULL
)
1473 bfd
*n
= head
->next
;
1480 add_bfd_to_link (abfd
, name
, link_info
)
1483 struct bfd_link_info
*link_info
;
1485 lang_input_statement_type
*fake_file
;
1486 fake_file
= lang_add_input_file (name
,
1487 lang_input_file_is_fake_enum
,
1489 fake_file
->the_bfd
= abfd
;
1490 ldlang_add_file (fake_file
);
1491 if (!bfd_link_add_symbols (abfd
, link_info
))
1492 einfo ("%Xaddsym %s: %s\n", name
, bfd_errmsg (bfd_get_error ()));
1496 pe_process_import_defs (output_bfd
, link_info
)
1498 struct bfd_link_info
*link_info
;
1500 def_file_module
*module
;
1501 pe_dll_id_target(bfd_get_target (output_bfd
));
1506 for (module
= pe_def_file
->modules
; module
; module
= module
->next
)
1510 dll_filename
= module
->name
;
1511 dll_symname
= xstrdup (module
->name
);
1512 for (i
=0; dll_symname
[i
]; i
++)
1513 if (!isalnum (dll_symname
[i
]))
1514 dll_symname
[i
] = '_';
1518 for (i
=0; i
<pe_def_file
->num_imports
; i
++)
1519 if (pe_def_file
->imports
[i
].module
== module
)
1521 def_file_export exp
;
1522 struct bfd_link_hash_entry
*blhe
;
1524 /* see if we need this import */
1525 char *name
= (char *) xmalloc (strlen (pe_def_file
->imports
[i
].internal_name
) + 2);
1526 sprintf (name
, "%s%s", U(""), pe_def_file
->imports
[i
].internal_name
);
1527 blhe
= bfd_link_hash_lookup (link_info
->hash
, name
,
1528 false, false, false);
1530 if (blhe
&& blhe
->type
== bfd_link_hash_undefined
)
1536 bfd
*ar_head
= make_head (output_bfd
);
1537 add_bfd_to_link (ar_head
, ar_head
->filename
, link_info
);
1540 exp
.internal_name
= pe_def_file
->imports
[i
].internal_name
;
1541 exp
.name
= pe_def_file
->imports
[i
].name
;
1542 exp
.ordinal
= pe_def_file
->imports
[i
].ordinal
;
1543 exp
.hint
= exp
.ordinal
>= 0 ? exp
.ordinal
: 0;
1544 exp
.flag_private
= 0;
1545 exp
.flag_constant
= 0;
1547 exp
.flag_noname
= exp
.name
? 0 : 1;
1548 one
= make_one (&exp
, output_bfd
);
1549 add_bfd_to_link (one
, one
->filename
, link_info
);
1554 bfd
*ar_tail
= make_tail (output_bfd
);
1555 add_bfd_to_link (ar_tail
, ar_tail
->filename
, link_info
);
1562 /************************************************************************
1564 We were handed a *.DLL file. Parse it and turn it into a set of
1565 IMPORTS directives in the def file. Return true if the file was
1566 handled, false if not.
1568 ************************************************************************/
1571 pe_get16 (abfd
, where
)
1576 bfd_seek (abfd
, where
, SEEK_SET
);
1577 bfd_read (b
, 1, 2, abfd
);
1578 return b
[0] + (b
[1]<<8);
1582 pe_get32 (abfd
, where
)
1587 bfd_seek (abfd
, where
, SEEK_SET
);
1588 bfd_read (b
, 1, 4, abfd
);
1589 return b
[0] + (b
[1]<<8) + (b
[2]<<16) + (b
[3]<<24);
1592 #if 0 /* This is not currently used. */
1598 unsigned char *b
= ptr
;
1599 return b
[0] + (b
[1]<<8);
1608 unsigned char *b
= ptr
;
1609 return b
[0] + (b
[1]<<8) + (b
[2]<<16) + (b
[3]<<24);
1613 pe_implied_import_dll (filename
)
1617 unsigned long pe_header_offset
, opthdr_ofs
, num_entries
, i
;
1618 unsigned long export_rva
, export_size
, nsections
, secptr
, expptr
;
1619 unsigned char *expdata
, *erva
;
1620 unsigned long name_rvas
, ordinals
, nexp
, ordbase
;
1623 /* No, I can't use bfd here. kernel32.dll puts its export table in
1624 the middle of the .rdata section. */
1626 dll
= bfd_openr (filename
, pe_details
->target_name
);
1629 einfo ("%Xopen %s: %s\n", filename
, bfd_errmsg (bfd_get_error ()));
1632 /* PEI dlls seem to be bfd_objects */
1633 if (!bfd_check_format (dll
, bfd_object
))
1635 einfo ("%X%s: this doesn't appear to be a DLL\n", filename
);
1639 dll_name
= filename
;
1640 for (i
=0; filename
[i
]; i
++)
1641 if (filename
[i
] == '/' || filename
[i
] == '\\' || filename
[i
] == ':')
1642 dll_name
= filename
+ i
+ 1;
1644 pe_header_offset
= pe_get32 (dll
, 0x3c);
1645 opthdr_ofs
= pe_header_offset
+ 4 + 20;
1646 num_entries
= pe_get32 (dll
, opthdr_ofs
+ 92);
1647 if (num_entries
< 1) /* no exports */
1649 export_rva
= pe_get32 (dll
, opthdr_ofs
+ 96);
1650 export_size
= pe_get32 (dll
, opthdr_ofs
+ 100);
1651 nsections
= pe_get16 (dll
, pe_header_offset
+ 4 + 2);
1652 secptr
= (pe_header_offset
+ 4 + 20 +
1653 pe_get16 (dll
, pe_header_offset
+ 4 + 16));
1655 for (i
=0; i
<nsections
; i
++)
1658 unsigned long secptr1
= secptr
+ 40 * i
;
1659 unsigned long vaddr
= pe_get32 (dll
, secptr1
+ 12);
1660 unsigned long vsize
= pe_get32 (dll
, secptr1
+ 16);
1661 unsigned long fptr
= pe_get32 (dll
, secptr1
+ 20);
1662 bfd_seek(dll
, secptr1
, SEEK_SET
);
1663 bfd_read(sname
, 1, 8, dll
);
1664 if (vaddr
<= export_rva
&& vaddr
+vsize
> export_rva
)
1666 expptr
= fptr
+ (export_rva
- vaddr
);
1667 if (export_rva
+ export_size
> vaddr
+ vsize
)
1668 export_size
= vsize
- (export_rva
- vaddr
);
1673 expdata
= (unsigned char *) xmalloc (export_size
);
1674 bfd_seek (dll
, expptr
, SEEK_SET
);
1675 bfd_read (expdata
, 1, export_size
, dll
);
1676 erva
= expdata
- export_rva
;
1678 if (pe_def_file
== 0)
1679 pe_def_file
= def_file_empty();
1681 nexp
= pe_as32 (expdata
+24);
1682 name_rvas
= pe_as32 (expdata
+32);
1683 ordinals
= pe_as32 (expdata
+36);
1684 ordbase
= pe_as32 (expdata
+16);
1685 for (i
=0; i
<nexp
; i
++)
1687 unsigned long name_rva
= pe_as32 (erva
+name_rvas
+i
*4);
1688 def_file_import
*imp
;
1689 imp
= def_file_add_import (pe_def_file
, erva
+name_rva
, dll_name
,
1696 /************************************************************************
1698 These are the main functions, called from the emulation. The first
1699 is called after the bfds are read, so we can guess at how much space
1700 we need. The second is called after everything is placed, so we
1701 can put the right values in place.
1703 ************************************************************************/
1706 pe_dll_build_sections (abfd
, info
)
1708 struct bfd_link_info
*info
;
1710 pe_dll_id_target (bfd_get_target (abfd
));
1711 process_def_file (abfd
, info
);
1713 generate_edata (abfd
, info
);
1714 build_filler_bfd (1);
1718 pe_exe_build_sections (abfd
, info
)
1720 struct bfd_link_info
*info
;
1722 pe_dll_id_target (bfd_get_target (abfd
));
1723 build_filler_bfd (0);
1727 pe_dll_fill_sections (abfd
, info
)
1729 struct bfd_link_info
*info
;
1731 pe_dll_id_target (bfd_get_target (abfd
));
1732 image_base
= pe_data (abfd
)->pe_opthdr
.ImageBase
;
1734 generate_reloc (abfd
, info
);
1737 bfd_set_section_size (filler_bfd
, reloc_s
, reloc_sz
);
1739 /* Resize the sections. */
1740 lang_size_sections (stat_ptr
->head
, abs_output_section
,
1741 &stat_ptr
->head
, 0, (bfd_vma
) 0, false);
1743 /* Redo special stuff. */
1744 ldemul_after_allocation ();
1746 /* Do the assignments again. */
1747 lang_do_assignments (stat_ptr
->head
,
1749 (fill_type
) 0, (bfd_vma
) 0);
1752 fill_edata (abfd
, info
);
1754 pe_data (abfd
)->dll
= 1;
1756 edata_s
->contents
= edata_d
;
1757 reloc_s
->contents
= reloc_d
;
1761 pe_exe_fill_sections (abfd
, info
)
1763 struct bfd_link_info
*info
;
1765 pe_dll_id_target (bfd_get_target (abfd
));
1766 image_base
= pe_data (abfd
)->pe_opthdr
.ImageBase
;
1768 generate_reloc (abfd
, info
);
1771 bfd_set_section_size (filler_bfd
, reloc_s
, reloc_sz
);
1773 /* Resize the sections. */
1774 lang_size_sections (stat_ptr
->head
, abs_output_section
,
1775 &stat_ptr
->head
, 0, (bfd_vma
) 0, false);
1777 /* Redo special stuff. */
1778 ldemul_after_allocation ();
1780 /* Do the assignments again. */
1781 lang_do_assignments (stat_ptr
->head
,
1783 (fill_type
) 0, (bfd_vma
) 0);
1785 reloc_s
->contents
= reloc_d
;