1 /* Routines to help build PEI-format DLLs (Win32 etc)
2 Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc.
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"
43 /************************************************************************
45 This file turns a regular Windows PE image into a DLL. Because of
46 the complexity of this operation, it has been broken down into a
47 number of separate modules which are all called by the main function
48 at the end of this file. This function is not re-entrant and is
49 normally only called once, so static variables are used to reduce
50 the number of parameters and return values required.
52 See also: ld/emultempl/pe.em
54 ************************************************************************/
56 /* for emultempl/pe.em */
58 def_file *pe_def_file = 0;
59 int pe_dll_export_everything = 0;
60 int pe_dll_do_default_excludes = 1;
61 int pe_dll_kill_ats = 0;
62 int pe_dll_stdcall_aliases = 0;
63 int pe_dll_warn_dup_exports = 0;
64 int pe_dll_compat_implib = 0;
66 /************************************************************************
68 static variables and types
70 ************************************************************************/
72 static bfd_vma image_base;
74 static bfd *filler_bfd;
75 static struct sec *edata_s, *reloc_s;
76 static unsigned char *edata_d, *reloc_d;
77 static size_t edata_sz, reloc_sz;
82 unsigned int imagebase_reloc;
88 #define PE_ARCH_i386 1
90 #define PE_ARCH_mips 3
93 static pe_details_type pe_detail_list[] = {
105 16 /* R_SH_IMAGEBASE */,
126 { NULL, NULL, 0, 0, 0, 0 }
129 static pe_details_type *pe_details;
131 #define U(str) (pe_details->underscored ? "_" str : str)
134 pe_dll_id_target (target)
138 for (i=0; pe_detail_list[i].target_name; i++)
139 if (strcmp (pe_detail_list[i].target_name, target) == 0)
141 pe_details = pe_detail_list+i;
144 einfo (_("%XUnsupported PEI architecture: %s\n"), target);
148 /************************************************************************
150 Helper functions for qsort. Relocs must be sorted so that we can write
153 ************************************************************************/
165 bfd_vma a = ((reloc_data_type *) va)->vma;
166 bfd_vma b = ((reloc_data_type *) vb)->vma;
167 return (a > b) ? 1 : ((a < b) ? -1 : 0);
171 pe_export_sort (va, vb)
174 def_file_export *a = (def_file_export *) va;
175 def_file_export *b = (def_file_export *) vb;
176 return strcmp (a->name, b->name);
179 /************************************************************************
181 Read and process the .DEF file
183 ************************************************************************/
185 /* These correspond to the entries in pe_def_file->exports[]. I use
186 exported_symbol_sections[i] to tag whether or not the symbol was
187 defined, since we can't export symbols we don't have. */
189 static bfd_vma *exported_symbol_offsets;
190 static struct sec **exported_symbol_sections;
192 static int export_table_size;
193 static int count_exported;
194 static int count_exported_byname;
195 static int count_with_ordinals;
196 static const char *dll_name;
197 static int min_ordinal, max_ordinal;
198 static int *exported_symbols;
200 typedef struct exclude_list_struct
203 struct exclude_list_struct *next;
206 static struct exclude_list_struct *excludes = 0;
209 pe_dll_add_excludes (new_excludes)
210 const char *new_excludes;
213 char *exclude_string;
215 local_copy = xstrdup (new_excludes);
217 exclude_string = strtok (local_copy, ",:");
218 for (; exclude_string; exclude_string = strtok (NULL, ",:"))
220 struct exclude_list_struct *new_exclude;
222 new_exclude = ((struct exclude_list_struct *)
223 xmalloc (sizeof (struct exclude_list_struct)));
224 new_exclude->string = (char *) xmalloc (strlen (exclude_string) + 1);
225 strcpy (new_exclude->string, exclude_string);
226 new_exclude->next = excludes;
227 excludes = new_exclude;
239 struct exclude_list_struct *ex;
240 for (i = 0; i < d->num_exports; i++)
241 if (strcmp (d->exports[i].name, n) == 0)
243 if (pe_dll_do_default_excludes)
245 if (strcmp (n, "DllMain@12") == 0)
247 if (strcmp (n, "DllEntryPoint@0") == 0)
249 if (strcmp (n, "impure_ptr") == 0)
252 for (ex = excludes; ex; ex = ex->next)
253 if (strcmp (n, ex->string) == 0)
259 process_def_file (abfd, info)
260 bfd *abfd ATTRIBUTE_UNUSED;
261 struct bfd_link_info *info;
264 struct bfd_link_hash_entry *blhe;
267 def_file_export *e=0;
270 pe_def_file = def_file_empty ();
272 /* First, run around to all the objects looking for the .drectve
273 sections, and push those into the def file too */
275 for (b = info->input_bfds; b; b = b->link_next)
277 s = bfd_get_section_by_name (b, ".drectve");
280 int size = bfd_get_section_size_before_reloc (s);
281 char *buf = xmalloc (size);
282 bfd_get_section_contents (b, s, buf, 0, size);
283 def_file_add_directive (pe_def_file, buf, size);
288 /* Now, maybe export everything else the default way */
290 if (pe_dll_export_everything || pe_def_file->num_exports == 0)
292 for (b = info->input_bfds; b; b = b->link_next)
297 symsize = bfd_get_symtab_upper_bound (b);
298 symbols = (asymbol **) xmalloc (symsize);
299 nsyms = bfd_canonicalize_symtab (b, symbols);
301 for (j = 0; j < nsyms; j++)
303 if ((symbols[j]->flags & (BSF_FUNCTION | BSF_GLOBAL))
304 == (BSF_FUNCTION | BSF_GLOBAL))
306 const char *sn = symbols[j]->name;
309 if (auto_export (pe_def_file, sn))
310 def_file_add_export (pe_def_file, sn, 0, -1);
317 #define NE pe_def_file->num_exports
319 /* Canonicalize the export list */
323 for (i = 0; i < NE; i++)
325 if (strchr (pe_def_file->exports[i].name, '@'))
327 /* This will preserve internal_name, which may have been pointing
328 to the same memory as name, or might not have */
329 char *tmp = xstrdup (pe_def_file->exports[i].name);
330 *(strchr (tmp, '@')) = 0;
331 pe_def_file->exports[i].name = tmp;
336 if (pe_dll_stdcall_aliases)
338 for (i = 0; i < NE; i++)
340 if (strchr (pe_def_file->exports[i].name, '@'))
342 char *tmp = xstrdup (pe_def_file->exports[i].name);
343 *(strchr (tmp, '@')) = 0;
344 if (auto_export (pe_def_file, tmp))
345 def_file_add_export (pe_def_file, tmp,
346 pe_def_file->exports[i].internal_name, -1);
353 e = pe_def_file->exports; /* convenience, but watch out for it changing */
355 exported_symbol_offsets = (bfd_vma *) xmalloc (NE * sizeof (bfd_vma));
356 exported_symbol_sections = (struct sec **) xmalloc (NE * sizeof (struct sec *));
358 memset (exported_symbol_sections, 0, NE * sizeof (struct sec *));
362 count_exported_byname = 0;
363 count_with_ordinals = 0;
365 qsort (pe_def_file->exports, NE, sizeof (pe_def_file->exports[0]), pe_export_sort);
366 for (i = 0, j = 0; i < NE; i++)
368 if (i > 0 && strcmp (e[i].name, e[i - 1].name) == 0)
370 /* This is a duplicate. */
371 if (e[j - 1].ordinal != -1
372 && e[i].ordinal != -1
373 && e[j - 1].ordinal != e[i].ordinal)
375 if (pe_dll_warn_dup_exports)
376 /* xgettext:c-format */
377 einfo (_("%XError, duplicate EXPORT with oridinals: %s (%d vs %d)\n"),
378 e[j - 1].name, e[j - 1].ordinal, e[i].ordinal);
382 if (pe_dll_warn_dup_exports)
383 /* xgettext:c-format */
384 einfo (_("Warning, duplicate EXPORT: %s\n"),
388 e[j - 1].ordinal = e[i].ordinal;
389 e[j - 1].flag_private |= e[i].flag_private;
390 e[j - 1].flag_constant |= e[i].flag_constant;
391 e[j - 1].flag_noname |= e[i].flag_noname;
392 e[j - 1].flag_data |= e[i].flag_data;
401 pe_def_file->num_exports = j; /* == NE */
403 for (i = 0; i < NE; i++)
405 char *name = (char *) xmalloc (strlen (pe_def_file->exports[i].internal_name) + 2);
406 if (pe_details->underscored)
409 strcpy (name + 1, pe_def_file->exports[i].internal_name);
412 strcpy (name, pe_def_file->exports[i].internal_name);
414 blhe = bfd_link_hash_lookup (info->hash,
419 && (blhe->type == bfd_link_hash_defined
420 || (blhe->type == bfd_link_hash_common)))
423 if (!pe_def_file->exports[i].flag_noname)
424 count_exported_byname++;
426 /* Only fill in the sections. The actual offsets are computed
427 in fill_exported_offsets() after common symbols are laid
429 if (blhe->type == bfd_link_hash_defined)
430 exported_symbol_sections[i] = blhe->u.def.section;
432 exported_symbol_sections[i] = blhe->u.c.p->section;
434 if (pe_def_file->exports[i].ordinal != -1)
436 if (max_ordinal < pe_def_file->exports[i].ordinal)
437 max_ordinal = pe_def_file->exports[i].ordinal;
438 if (min_ordinal > pe_def_file->exports[i].ordinal)
439 min_ordinal = pe_def_file->exports[i].ordinal;
440 count_with_ordinals++;
443 else if (blhe && blhe->type == bfd_link_hash_undefined)
445 /* xgettext:c-format */
446 einfo (_("%XCannot export %s: symbol not defined\n"),
447 pe_def_file->exports[i].internal_name);
451 /* xgettext:c-format */
452 einfo (_("%XCannot export %s: symbol wrong type (%d vs %d)\n"),
453 pe_def_file->exports[i].internal_name,
454 blhe->type, bfd_link_hash_defined);
458 /* xgettext:c-format */
459 einfo (_("%XCannot export %s: symbol not found\n"),
460 pe_def_file->exports[i].internal_name);
466 /************************************************************************
468 Build the bfd that will contain .edata and .reloc sections
470 ************************************************************************/
473 build_filler_bfd (include_edata)
476 lang_input_statement_type *filler_file;
477 filler_file = lang_add_input_file ("dll stuff",
478 lang_input_file_is_fake_enum,
480 filler_file->the_bfd = filler_bfd = bfd_create ("dll stuff", output_bfd);
481 if (filler_bfd == NULL
482 || !bfd_set_arch_mach (filler_bfd,
483 bfd_get_arch (output_bfd),
484 bfd_get_mach (output_bfd)))
486 einfo ("%X%P: can not create BFD %E\n");
492 edata_s = bfd_make_section_old_way (filler_bfd, ".edata");
494 || !bfd_set_section_flags (filler_bfd, edata_s,
501 einfo ("%X%P: can not create .edata section: %E\n");
504 bfd_set_section_size (filler_bfd, edata_s, edata_sz);
507 reloc_s = bfd_make_section_old_way (filler_bfd, ".reloc");
509 || !bfd_set_section_flags (filler_bfd, reloc_s,
516 einfo ("%X%P: can not create .reloc section: %E\n");
519 bfd_set_section_size (filler_bfd, reloc_s, 0);
521 ldlang_add_file (filler_file);
524 /************************************************************************
526 Gather all the exported symbols and build the .edata section
528 ************************************************************************/
531 generate_edata (abfd, info)
533 struct bfd_link_info *info ATTRIBUTE_UNUSED;
536 int name_table_size = 0;
539 /* First, we need to know how many exported symbols there are,
540 and what the range of ordinals is. */
542 if (pe_def_file->name)
544 dll_name = pe_def_file->name;
548 dll_name = abfd->filename;
549 for (dlnp = dll_name; *dlnp; dlnp++)
551 if (*dlnp == '\\' || *dlnp == '/' || *dlnp == ':')
556 if (count_with_ordinals && max_ordinal > count_exported)
558 if (min_ordinal > max_ordinal - count_exported + 1)
559 min_ordinal = max_ordinal - count_exported + 1;
564 max_ordinal = count_exported;
566 export_table_size = max_ordinal - min_ordinal + 1;
568 exported_symbols = (int *) xmalloc (export_table_size * sizeof (int));
569 for (i = 0; i < export_table_size; i++)
570 exported_symbols[i] = -1;
572 /* Now we need to assign ordinals to those that don't have them */
573 for (i = 0; i < NE; i++)
575 if (exported_symbol_sections[i])
577 if (pe_def_file->exports[i].ordinal != -1)
579 int ei = pe_def_file->exports[i].ordinal - min_ordinal;
580 int pi = exported_symbols[ei];
583 /* xgettext:c-format */
584 einfo (_("%XError, oridinal used twice: %d (%s vs %s)\n"),
585 pe_def_file->exports[i].ordinal,
586 pe_def_file->exports[i].name,
587 pe_def_file->exports[pi].name);
589 exported_symbols[ei] = i;
591 name_table_size += strlen (pe_def_file->exports[i].name) + 1;
595 next_ordinal = min_ordinal;
596 for (i = 0; i < NE; i++)
597 if (exported_symbol_sections[i])
598 if (pe_def_file->exports[i].ordinal == -1)
600 while (exported_symbols[next_ordinal - min_ordinal] != -1)
602 exported_symbols[next_ordinal - min_ordinal] = i;
603 pe_def_file->exports[i].ordinal = next_ordinal;
606 /* OK, now we can allocate some memory */
608 edata_sz = (40 /* directory */
609 + 4 * export_table_size /* addresses */
610 + 4 * count_exported_byname /* name ptrs */
611 + 2 * count_exported_byname /* ordinals */
612 + name_table_size + strlen (dll_name) + 1);
615 /* Fill the exported symbol offsets. The preliminary work has already
616 been done in process_def_file(). */
619 fill_exported_offsets (abfd, info)
621 struct bfd_link_info *info;
624 struct bfd_link_hash_entry *blhe;
627 def_file_export *e=0;
629 for (i = 0; i < pe_def_file->num_exports; i++)
631 char *name = (char *) xmalloc (strlen (pe_def_file->exports[i].internal_name) + 2);
632 if (pe_details->underscored)
635 strcpy (name + 1, pe_def_file->exports[i].internal_name);
638 strcpy (name, pe_def_file->exports[i].internal_name);
640 blhe = bfd_link_hash_lookup (info->hash,
644 if (blhe && (blhe->type == bfd_link_hash_defined))
646 exported_symbol_offsets[i] = blhe->u.def.value;
653 fill_edata (abfd, info)
655 struct bfd_link_info *info ATTRIBUTE_UNUSED;
658 unsigned char *edirectory;
659 unsigned long *eaddresses;
660 unsigned long *enameptrs;
661 unsigned short *eordinals;
662 unsigned char *enamestr;
667 edata_d = (unsigned char *) xmalloc (edata_sz);
669 /* Note use of array pointer math here */
670 edirectory = edata_d;
671 eaddresses = (unsigned long *) (edata_d + 40);
672 enameptrs = eaddresses + export_table_size;
673 eordinals = (unsigned short *) (enameptrs + count_exported_byname);
674 enamestr = (char *) (eordinals + count_exported_byname);
676 #define ERVA(ptr) (((unsigned char *)(ptr) - edata_d) + edata_s->output_section->vma - image_base)
678 memset (edata_d, 0, 40);
679 bfd_put_32 (abfd, now, edata_d + 4);
680 if (pe_def_file->version_major != -1)
682 bfd_put_16 (abfd, pe_def_file->version_major, edata_d + 8);
683 bfd_put_16 (abfd, pe_def_file->version_minor, edata_d + 10);
685 bfd_put_32 (abfd, ERVA (enamestr), edata_d + 12);
686 strcpy (enamestr, dll_name);
687 enamestr += strlen (enamestr) + 1;
688 bfd_put_32 (abfd, min_ordinal, edata_d + 16);
689 bfd_put_32 (abfd, export_table_size, edata_d + 20);
690 bfd_put_32 (abfd, count_exported_byname, edata_d + 24);
691 bfd_put_32 (abfd, ERVA (eaddresses), edata_d + 28);
692 bfd_put_32 (abfd, ERVA (enameptrs), edata_d + 32);
693 bfd_put_32 (abfd, ERVA (eordinals), edata_d + 36);
695 fill_exported_offsets (abfd, info);
697 /* Ok, now for the filling in part */
699 for (i = 0; i < export_table_size; i++)
701 int s = exported_symbols[i];
704 struct sec *ssec = exported_symbol_sections[s];
705 unsigned long srva = (exported_symbol_offsets[s]
706 + ssec->output_section->vma
707 + ssec->output_offset);
709 bfd_put_32 (abfd, srva - image_base, (void *) (eaddresses + i));
710 if (!pe_def_file->exports[s].flag_noname)
712 char *ename = pe_def_file->exports[s].name;
713 bfd_put_32 (abfd, ERVA (enamestr), (void *) enameptrs);
714 strcpy (enamestr, ename);
715 enamestr += strlen (enamestr) + 1;
716 bfd_put_16 (abfd, i, (void *) eordinals);
718 pe_def_file->exports[s].hint = hint++;
725 /************************************************************************
727 Gather all the relocations and build the .reloc section
729 ************************************************************************/
732 generate_reloc (abfd, info)
734 struct bfd_link_info *info;
737 /* for .reloc stuff */
738 reloc_data_type *reloc_data;
739 int total_relocs = 0;
741 unsigned long sec_page = (unsigned long) (-1);
742 unsigned long page_ptr, page_count;
748 for (b = info->input_bfds; b; b = b->link_next)
749 for (s = b->sections; s; s = s->next)
750 total_relocs += s->reloc_count;
752 reloc_data = (reloc_data_type *) xmalloc (total_relocs * sizeof (reloc_data_type));
756 for (bi = 0, b = info->input_bfds; b; bi++, b = b->link_next)
759 int relsize, nrelocs, i;
761 for (s = b->sections; s; s = s->next)
763 unsigned long sec_vma = s->output_section->vma + s->output_offset;
767 /* if it's not loaded, we don't need to relocate it this way */
768 if (!(s->output_section->flags & SEC_LOAD))
771 /* I don't know why there would be a reloc for these, but I've
772 seen it happen - DJ */
773 if (s->output_section == &bfd_abs_section)
776 if (s->output_section->vma == 0)
778 /* Huh? Shouldn't happen, but punt if it does */
779 einfo ("DJ: zero vma section reloc detected: `%s' #%d f=%d\n",
780 s->output_section->name, s->output_section->index,
781 s->output_section->flags);
785 symsize = bfd_get_symtab_upper_bound (b);
786 symbols = (asymbol **) xmalloc (symsize);
787 nsyms = bfd_canonicalize_symtab (b, symbols);
789 relsize = bfd_get_reloc_upper_bound (b, s);
790 relocs = (arelent **) xmalloc ((size_t) relsize);
791 nrelocs = bfd_canonicalize_reloc (b, s, relocs, symbols);
793 for (i = 0; i < nrelocs; i++)
795 if (!relocs[i]->howto->pc_relative
796 && relocs[i]->howto->type != pe_details->imagebase_reloc)
799 struct symbol_cache_entry *sym = *relocs[i]->sym_ptr_ptr;
800 sym_vma = (relocs[i]->addend
803 + sym->section->output_offset
804 + sym->section->output_section->vma);
805 reloc_data[total_relocs].vma = sec_vma + relocs[i]->address;
807 #define BITS_AND_SHIFT(bits, shift) (bits * 1000 | shift)
809 switch BITS_AND_SHIFT (relocs[i]->howto->bitsize,
810 relocs[i]->howto->rightshift)
812 case BITS_AND_SHIFT (32, 0):
813 reloc_data[total_relocs].type = 3;
816 case BITS_AND_SHIFT (16, 0):
817 reloc_data[total_relocs].type = 2;
820 case BITS_AND_SHIFT (16, 16):
821 reloc_data[total_relocs].type = 4;
822 /* FIXME: we can't know the symbol's right value yet,
823 but we probably can safely assume that CE will relocate
824 us in 64k blocks, so leaving it zero is safe. */
825 reloc_data[total_relocs].extra = 0;
828 case BITS_AND_SHIFT (26, 2):
829 reloc_data[total_relocs].type = 5;
833 /* xgettext:c-format */
834 einfo (_("%XError: %d-bit reloc in dll\n"),
835 relocs[i]->howto->bitsize);
841 /* Warning: the allocated symbols are remembered in BFD and reused
842 later, so don't free them! */
843 /* free (symbols); */
847 /* At this point, we have total_relocs relocation addresses in
848 reloc_addresses, which are all suitable for the .reloc section.
849 We must now create the new sections. */
851 qsort (reloc_data, total_relocs, sizeof (*reloc_data), reloc_sort);
853 for (i = 0; i < total_relocs; i++)
855 unsigned long this_page = (reloc_data[i].vma >> 12);
857 if (this_page != sec_page)
859 reloc_sz = (reloc_sz + 3) & ~3; /* 4-byte align */
861 sec_page = this_page;
866 if (reloc_data[i].type == 4)
869 reloc_sz = (reloc_sz + 3) & ~3; /* 4-byte align */
871 reloc_d = (unsigned char *) xmalloc (reloc_sz);
873 sec_page = (unsigned long) (-1);
875 page_ptr = (unsigned long) (-1);
877 for (i = 0; i < total_relocs; i++)
879 unsigned long rva = reloc_data[i].vma - image_base;
880 unsigned long this_page = (rva & ~0xfff);
881 if (this_page != sec_page)
884 reloc_d[reloc_sz++] = 0;
885 if (page_ptr != (unsigned long) (-1))
886 bfd_put_32 (abfd, reloc_sz - page_ptr, reloc_d + page_ptr + 4);
887 bfd_put_32 (abfd, this_page, reloc_d + reloc_sz);
890 sec_page = this_page;
893 bfd_put_16 (abfd, (rva & 0xfff) + (reloc_data[i].type<<12),
896 if (reloc_data[i].type == 4)
898 bfd_put_16 (abfd, reloc_data[i].extra, reloc_d + reloc_sz);
904 reloc_d[reloc_sz++] = 0;
905 if (page_ptr != (unsigned long) (-1))
906 bfd_put_32 (abfd, reloc_sz - page_ptr, reloc_d + page_ptr + 4);
907 while (reloc_sz < reloc_s->_raw_size)
908 reloc_d[reloc_sz++] = 0;
911 /************************************************************************
913 Given the exiting def_file structure, print out a .DEF file that
916 ************************************************************************/
919 quoteput (s, f, needs_quotes)
925 for (cp = s; *cp; cp++)
929 || isspace ((unsigned char) *cp)
938 if (*s == '"' || *s == '\\')
950 pe_dll_generate_def_file (pe_out_def_filename)
951 const char *pe_out_def_filename;
954 FILE *out = fopen (pe_out_def_filename, "w");
957 /* xgettext:c-format */
958 einfo (_("%s: Can't open output def file %s\n"),
959 program_name, pe_out_def_filename);
964 if (pe_def_file->name)
966 if (pe_def_file->is_dll)
967 fprintf (out, "LIBRARY ");
969 fprintf (out, "NAME ");
970 quoteput (pe_def_file->name, out, 1);
971 if (pe_data (output_bfd)->pe_opthdr.ImageBase)
972 fprintf (out, " BASE=0x%lx",
973 (unsigned long) pe_data (output_bfd)->pe_opthdr.ImageBase);
977 if (pe_def_file->description)
979 fprintf (out, "DESCRIPTION ");
980 quoteput (pe_def_file->description, out, 1);
984 if (pe_def_file->version_minor != -1)
985 fprintf (out, "VERSION %d.%d\n", pe_def_file->version_major,
986 pe_def_file->version_minor);
987 else if (pe_def_file->version_major != -1)
988 fprintf (out, "VERSION %d\n", pe_def_file->version_major);
990 if (pe_def_file->stack_reserve != -1 || pe_def_file->heap_reserve != -1)
993 if (pe_def_file->stack_commit != -1)
994 fprintf (out, "STACKSIZE 0x%x,0x%x\n",
995 pe_def_file->stack_reserve, pe_def_file->stack_commit);
996 else if (pe_def_file->stack_reserve != -1)
997 fprintf (out, "STACKSIZE 0x%x\n", pe_def_file->stack_reserve);
998 if (pe_def_file->heap_commit != -1)
999 fprintf (out, "HEAPSIZE 0x%x,0x%x\n",
1000 pe_def_file->heap_reserve, pe_def_file->heap_commit);
1001 else if (pe_def_file->heap_reserve != -1)
1002 fprintf (out, "HEAPSIZE 0x%x\n", pe_def_file->heap_reserve);
1004 if (pe_def_file->num_section_defs > 0)
1006 fprintf (out, "\nSECTIONS\n\n");
1007 for (i = 0; i < pe_def_file->num_section_defs; i++)
1010 quoteput (pe_def_file->section_defs[i].name, out, 0);
1011 if (pe_def_file->section_defs[i].class)
1013 fprintf (out, " CLASS ");
1014 quoteput (pe_def_file->section_defs[i].class, out, 0);
1016 if (pe_def_file->section_defs[i].flag_read)
1017 fprintf (out, " READ");
1018 if (pe_def_file->section_defs[i].flag_write)
1019 fprintf (out, " WRITE");
1020 if (pe_def_file->section_defs[i].flag_execute)
1021 fprintf (out, " EXECUTE");
1022 if (pe_def_file->section_defs[i].flag_shared)
1023 fprintf (out, " SHARED");
1024 fprintf (out, "\n");
1028 if (pe_def_file->num_exports > 0)
1030 fprintf (out, "\nEXPORTS\n\n");
1031 for (i = 0; i < pe_def_file->num_exports; i++)
1033 def_file_export *e = pe_def_file->exports + i;
1035 quoteput (e->name, out, 0);
1036 if (e->internal_name && strcmp (e->internal_name, e->name))
1038 fprintf (out, " = ");
1039 quoteput (e->internal_name, out, 0);
1041 if (e->ordinal != -1)
1042 fprintf (out, " @%d", e->ordinal);
1043 if (e->flag_private)
1044 fprintf (out, " PRIVATE");
1045 if (e->flag_constant)
1046 fprintf (out, " CONSTANT");
1048 fprintf (out, " NONAME");
1050 fprintf (out, " DATA");
1052 fprintf (out, "\n");
1056 if (pe_def_file->num_imports > 0)
1058 fprintf (out, "\nIMPORTS\n\n");
1059 for (i = 0; i < pe_def_file->num_imports; i++)
1061 def_file_import *im = pe_def_file->imports + i;
1063 if (im->internal_name
1064 && (!im->name || strcmp (im->internal_name, im->name)))
1066 quoteput (im->internal_name, out, 0);
1067 fprintf (out, " = ");
1069 quoteput (im->module->name, out, 0);
1072 quoteput (im->name, out, 0);
1074 fprintf (out, "%d", im->ordinal);
1075 fprintf (out, "\n");
1080 fprintf (out, _("; no contents available\n"));
1082 if (fclose (out) == EOF)
1084 /* xgettext:c-format */
1085 einfo (_("%P: Error closing file `%s'\n"), pe_out_def_filename);
1089 /************************************************************************
1091 Generate the import library
1093 ************************************************************************/
1095 static asymbol **symtab;
1098 static const char *dll_filename;
1099 static char *dll_symname;
1101 #define UNDSEC (asection *) &bfd_und_section
1104 quick_section(abfd, name, flags, align)
1113 sec = bfd_make_section_old_way (abfd, name);
1114 bfd_set_section_flags (abfd, sec, flags
1119 bfd_set_section_alignment (abfd, sec, align);
1120 /* remember to undo this before trying to link internally! */
1121 sec->output_section = sec;
1123 sym = bfd_make_empty_symbol (abfd);
1124 symtab[symptr++] = sym;
1125 sym->name = sec->name;
1127 sym->flags = BSF_LOCAL;
1134 quick_symbol (abfd, n1, n2, n3, sec, flags, addr)
1144 char *name = (char *) xmalloc (strlen (n1) + strlen (n2) + strlen (n3) + 1);
1148 sym = bfd_make_empty_symbol (abfd);
1153 symtab[symptr++] = sym;
1156 static arelent *reltab = 0;
1157 static int relcount = 0, relsize = 0;
1160 quick_reloc (abfd, address, which_howto, symidx)
1166 if (relcount >= (relsize-1))
1170 reltab = (arelent *) xrealloc (reltab, relsize * sizeof (arelent));
1172 reltab = (arelent *) xmalloc (relsize * sizeof (arelent));
1174 reltab[relcount].address = address;
1175 reltab[relcount].addend = 0;
1176 reltab[relcount].howto = bfd_reloc_type_lookup (abfd, which_howto);
1177 reltab[relcount].sym_ptr_ptr = symtab + symidx;
1182 save_relocs (asection *sec)
1185 sec->relocation = reltab;
1186 sec->reloc_count = relcount;
1187 sec->orelocation = (arelent **) xmalloc ((relcount+1) * sizeof (arelent *));
1188 for (i=0; i<relcount; i++)
1189 sec->orelocation[i] = sec->relocation + i;
1190 sec->orelocation[relcount] = 0;
1191 sec->flags |= SEC_RELOC;
1193 relcount = relsize = 0;
1198 * .global __head_my_dll
1203 * .rva __my_dll_iname
1219 asection *id2, *id5, *id4;
1220 unsigned char *d2, *d5, *d4;
1224 oname = (char *) xmalloc (20);
1225 sprintf (oname, "d%06d.o", tmp_seq);
1228 abfd = bfd_create (oname, parent);
1229 bfd_find_target (pe_details->object_target, abfd);
1230 bfd_make_writable (abfd);
1232 bfd_set_format (abfd, bfd_object);
1233 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
1236 symtab = (asymbol **) xmalloc (6 * sizeof (asymbol *));
1237 id2 = quick_section (abfd, ".idata$2", SEC_HAS_CONTENTS, 2);
1238 id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
1239 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
1240 quick_symbol (abfd, U("_head_"), dll_symname, "", id2, BSF_GLOBAL, 0);
1241 quick_symbol (abfd, U(""), dll_symname, "_iname", UNDSEC, BSF_GLOBAL, 0);
1243 /* OK, pay attention here. I got confused myself looking back at
1244 it. We create a four-byte section to mark the beginning of the
1245 list, and we include an offset of 4 in the section, so that the
1246 pointer to the list points to the *end* of this section, which is
1247 the start of the list of sections from other objects. */
1249 bfd_set_section_size (abfd, id2, 20);
1250 d2 = (unsigned char *) xmalloc (20);
1253 d2[0] = d2[16] = 4; /* reloc addend */
1254 quick_reloc (abfd, 0, BFD_RELOC_RVA, 2);
1255 quick_reloc (abfd, 12, BFD_RELOC_RVA, 4);
1256 quick_reloc (abfd, 16, BFD_RELOC_RVA, 1);
1259 bfd_set_section_size (abfd, id5, 4);
1260 d5 = (unsigned char *) xmalloc (4);
1264 bfd_set_section_size (abfd, id4, 4);
1265 d4 = (unsigned char *) xmalloc (4);
1269 bfd_set_symtab (abfd, symtab, symptr);
1271 bfd_set_section_contents (abfd, id2, d2, 0, 20);
1272 bfd_set_section_contents (abfd, id5, d5, 0, 4);
1273 bfd_set_section_contents (abfd, id4, d4, 0, 4);
1275 bfd_make_readable (abfd);
1285 * .global __my_dll_iname
1294 asection *id4, *id5, *id7;
1295 unsigned char *d4, *d5, *d7;
1300 oname = (char *) xmalloc (20);
1301 sprintf (oname, "d%06d.o", tmp_seq);
1304 abfd = bfd_create (oname, parent);
1305 bfd_find_target (pe_details->object_target, abfd);
1306 bfd_make_writable (abfd);
1308 bfd_set_format (abfd, bfd_object);
1309 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
1312 symtab = (asymbol **) xmalloc (5 * sizeof (asymbol *));
1313 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
1314 id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
1315 id7 = quick_section (abfd, ".idata$7", SEC_HAS_CONTENTS, 2);
1316 quick_symbol (abfd, U(""), dll_symname, "_iname", id7, BSF_GLOBAL, 0);
1318 bfd_set_section_size (abfd, id4, 4);
1319 d4 = (unsigned char *) xmalloc (4);
1323 bfd_set_section_size (abfd, id5, 4);
1324 d5 = (unsigned char *) xmalloc (4);
1328 len = strlen (dll_filename)+1;
1331 bfd_set_section_size (abfd, id7, len);
1332 d7 = (unsigned char *) xmalloc (len);
1334 strcpy (d7, dll_filename);
1336 bfd_set_symtab (abfd, symtab, symptr);
1338 bfd_set_section_contents (abfd, id4, d4, 0, 4);
1339 bfd_set_section_contents (abfd, id5, d5, 0, 4);
1340 bfd_set_section_contents (abfd, id7, d7, 0, len);
1342 bfd_make_readable (abfd);
1349 * .global ___imp_function
1350 * .global __imp__function
1352 * jmp *__imp__function:
1355 * .long __head_my_dll
1366 * .asciz "function" xlate? (add underscore, kill at)
1369 static unsigned char jmp_ix86_bytes[] = {
1370 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x90, 0x90
1379 * .dw __imp_function
1382 static unsigned char jmp_sh_bytes[] = {
1383 0x01, 0xd0, 0x02, 0x60, 0x2b, 0x40, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00
1388 * lui $t0,<high:__imp_function>
1389 * lw $t0,<low:__imp_function>
1394 static unsigned char jmp_mips_bytes[] = {
1395 0x00, 0x00, 0x08, 0x3c, 0x00, 0x00, 0x08, 0x8d,
1396 0x08, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00
1400 make_one (exp, parent)
1401 def_file_export *exp;
1404 asection *tx, *id7, *id5, *id4, *id6;
1405 unsigned char *td, *d7, *d5, *d4, *d6;
1409 unsigned char *jmp_bytes;
1412 switch (pe_details->pe_arch)
1415 jmp_bytes = jmp_ix86_bytes;
1416 jmp_byte_count = sizeof (jmp_ix86_bytes);
1419 jmp_bytes = jmp_sh_bytes;
1420 jmp_byte_count = sizeof (jmp_sh_bytes);
1423 jmp_bytes = jmp_mips_bytes;
1424 jmp_byte_count = sizeof (jmp_mips_bytes);
1428 oname = (char *) xmalloc (20);
1429 sprintf (oname, "d%06d.o", tmp_seq);
1432 abfd = bfd_create (oname, parent);
1433 bfd_find_target (pe_details->object_target, abfd);
1434 bfd_make_writable (abfd);
1436 bfd_set_format (abfd, bfd_object);
1437 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
1440 symtab = (asymbol **) xmalloc (10 * sizeof (asymbol *));
1441 tx = quick_section (abfd, ".text", SEC_CODE|SEC_HAS_CONTENTS, 2);
1442 id7 = quick_section (abfd, ".idata$7", SEC_HAS_CONTENTS, 2);
1443 id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
1444 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
1445 id6 = quick_section (abfd, ".idata$6", SEC_HAS_CONTENTS, 2);
1446 if (! exp->flag_data)
1447 quick_symbol (abfd, U(""), exp->internal_name, "", tx, BSF_GLOBAL, 0);
1448 quick_symbol (abfd, U("_head_"), dll_symname, "", UNDSEC, BSF_GLOBAL, 0);
1449 quick_symbol (abfd, U("__imp_"), exp->internal_name, "", id5, BSF_GLOBAL, 0);
1450 if (pe_dll_compat_implib)
1451 quick_symbol (abfd, U("__imp_"), exp->internal_name, "",
1452 id5, BSF_GLOBAL, 0);
1454 bfd_set_section_size (abfd, tx, jmp_byte_count);
1455 td = (unsigned char *) xmalloc (jmp_byte_count);
1457 memcpy (td, jmp_bytes, jmp_byte_count);
1458 switch (pe_details->pe_arch)
1461 quick_reloc (abfd, 2, BFD_RELOC_32, 2);
1464 quick_reloc (abfd, 8, BFD_RELOC_32, 2);
1467 quick_reloc (abfd, 0, BFD_RELOC_HI16_S, 2);
1468 quick_reloc (abfd, 0, BFD_RELOC_LO16, 0); /* MIPS_R_PAIR */
1469 quick_reloc (abfd, 4, BFD_RELOC_LO16, 2);
1474 bfd_set_section_size (abfd, id7, 4);
1475 d7 = (unsigned char *) xmalloc (4);
1478 quick_reloc (abfd, 0, BFD_RELOC_RVA, 6);
1481 bfd_set_section_size (abfd, id5, 4);
1482 d5 = (unsigned char *) xmalloc (4);
1485 if (exp->flag_noname)
1487 d5[0] = exp->ordinal;
1488 d5[1] = exp->ordinal >> 8;
1493 quick_reloc (abfd, 0, BFD_RELOC_RVA, 4);
1497 bfd_set_section_size (abfd, id4, 4);
1498 d4 = (unsigned char *) xmalloc (4);
1501 if (exp->flag_noname)
1503 d5[0] = exp->ordinal;
1504 d5[1] = exp->ordinal >> 8;
1509 quick_reloc (abfd, 0, BFD_RELOC_RVA, 4);
1513 if (exp->flag_noname)
1516 bfd_set_section_size (abfd, id6, 0);
1520 len = strlen (exp->name) + 3;
1523 bfd_set_section_size (abfd, id6, len);
1524 d6 = (unsigned char *) xmalloc (len);
1526 memset (d6, 0, len);
1527 d6[0] = exp->hint & 0xff;
1528 d6[1] = exp->hint >> 8;
1529 strcpy (d6+2, exp->name);
1532 bfd_set_symtab (abfd, symtab, symptr);
1534 bfd_set_section_contents (abfd, tx, td, 0, jmp_byte_count);
1535 bfd_set_section_contents (abfd, id7, d7, 0, 4);
1536 bfd_set_section_contents (abfd, id5, d5, 0, 4);
1537 bfd_set_section_contents (abfd, id4, d4, 0, 4);
1538 if (!exp->flag_noname)
1539 bfd_set_section_contents (abfd, id6, d6, 0, len);
1541 bfd_make_readable (abfd);
1546 pe_dll_generate_implib (def, impfilename)
1548 const char *impfilename;
1556 dll_filename = (def->name) ? def->name : dll_name;
1557 dll_symname = xstrdup (dll_filename);
1558 for (i=0; dll_symname[i]; i++)
1559 if (!isalnum ((unsigned char) dll_symname[i]))
1560 dll_symname[i] = '_';
1562 unlink (impfilename);
1564 outarch = bfd_openw (impfilename, 0);
1568 /* xgettext:c-format */
1569 einfo (_("%XCan't open .lib file: %s\n"), impfilename);
1573 /* xgettext:c-format */
1574 einfo (_("Creating library file: %s\n"), impfilename);
1576 bfd_set_format (outarch, bfd_archive);
1577 outarch->has_armap = 1;
1579 /* Work out a reasonable size of things to put onto one line. */
1581 ar_head = make_head (outarch);
1583 for (i = 0; i<def->num_exports; i++)
1585 /* The import library doesn't know about the internal name */
1586 char *internal = def->exports[i].internal_name;
1588 def->exports[i].internal_name = def->exports[i].name;
1589 n = make_one (def->exports+i, outarch);
1592 def->exports[i].internal_name = internal;
1595 ar_tail = make_tail (outarch);
1597 if (ar_head == NULL || ar_tail == NULL)
1600 /* Now stick them all into the archive */
1602 ar_head->next = head;
1603 ar_tail->next = ar_head;
1606 if (! bfd_set_archive_head (outarch, head))
1607 einfo ("%Xbfd_set_archive_head: %s\n", bfd_errmsg (bfd_get_error ()));
1609 if (! bfd_close (outarch))
1610 einfo ("%Xbfd_close %s: %s\n", impfilename, bfd_errmsg (bfd_get_error ()));
1612 while (head != NULL)
1614 bfd *n = head->next;
1621 add_bfd_to_link (abfd, name, link_info)
1624 struct bfd_link_info *link_info;
1626 lang_input_statement_type *fake_file;
1627 fake_file = lang_add_input_file (name,
1628 lang_input_file_is_fake_enum,
1630 fake_file->the_bfd = abfd;
1631 ldlang_add_file (fake_file);
1632 if (!bfd_link_add_symbols (abfd, link_info))
1633 einfo ("%Xaddsym %s: %s\n", name, bfd_errmsg (bfd_get_error ()));
1637 pe_process_import_defs (output_bfd, link_info)
1639 struct bfd_link_info *link_info;
1641 def_file_module *module;
1642 pe_dll_id_target(bfd_get_target (output_bfd));
1647 for (module = pe_def_file->modules; module; module = module->next)
1651 dll_filename = module->name;
1652 dll_symname = xstrdup (module->name);
1653 for (i=0; dll_symname[i]; i++)
1654 if (!isalnum (dll_symname[i]))
1655 dll_symname[i] = '_';
1659 for (i=0; i<pe_def_file->num_imports; i++)
1660 if (pe_def_file->imports[i].module == module)
1662 def_file_export exp;
1663 struct bfd_link_hash_entry *blhe;
1665 /* see if we need this import */
1666 char *name = (char *) xmalloc (strlen (pe_def_file->imports[i].internal_name) + 2);
1667 sprintf (name, "%s%s", U(""), pe_def_file->imports[i].internal_name);
1668 blhe = bfd_link_hash_lookup (link_info->hash, name,
1669 false, false, false);
1671 if (blhe && blhe->type == bfd_link_hash_undefined)
1677 bfd *ar_head = make_head (output_bfd);
1678 add_bfd_to_link (ar_head, ar_head->filename, link_info);
1681 exp.internal_name = pe_def_file->imports[i].internal_name;
1682 exp.name = pe_def_file->imports[i].name;
1683 exp.ordinal = pe_def_file->imports[i].ordinal;
1684 exp.hint = exp.ordinal >= 0 ? exp.ordinal : 0;
1685 exp.flag_private = 0;
1686 exp.flag_constant = 0;
1688 exp.flag_noname = exp.name ? 0 : 1;
1689 one = make_one (&exp, output_bfd);
1690 add_bfd_to_link (one, one->filename, link_info);
1695 bfd *ar_tail = make_tail (output_bfd);
1696 add_bfd_to_link (ar_tail, ar_tail->filename, link_info);
1703 /************************************************************************
1705 We were handed a *.DLL file. Parse it and turn it into a set of
1706 IMPORTS directives in the def file. Return true if the file was
1707 handled, false if not.
1709 ************************************************************************/
1712 pe_get16 (abfd, where)
1717 bfd_seek (abfd, where, SEEK_SET);
1718 bfd_read (b, 1, 2, abfd);
1719 return b[0] + (b[1]<<8);
1723 pe_get32 (abfd, where)
1728 bfd_seek (abfd, where, SEEK_SET);
1729 bfd_read (b, 1, 4, abfd);
1730 return b[0] + (b[1]<<8) + (b[2]<<16) + (b[3]<<24);
1733 #if 0 /* This is not currently used. */
1739 unsigned char *b = ptr;
1740 return b[0] + (b[1]<<8);
1749 unsigned char *b = ptr;
1750 return b[0] + (b[1]<<8) + (b[2]<<16) + (b[3]<<24);
1754 pe_implied_import_dll (filename)
1755 const char *filename;
1758 unsigned long pe_header_offset, opthdr_ofs, num_entries, i;
1759 unsigned long export_rva, export_size, nsections, secptr, expptr;
1760 unsigned char *expdata, *erva;
1761 unsigned long name_rvas, ordinals, nexp, ordbase;
1762 const char *dll_name;
1764 /* No, I can't use bfd here. kernel32.dll puts its export table in
1765 the middle of the .rdata section. */
1767 dll = bfd_openr (filename, pe_details->target_name);
1770 einfo ("%Xopen %s: %s\n", filename, bfd_errmsg (bfd_get_error ()));
1773 /* PEI dlls seem to be bfd_objects */
1774 if (!bfd_check_format (dll, bfd_object))
1776 einfo ("%X%s: this doesn't appear to be a DLL\n", filename);
1780 dll_name = filename;
1781 for (i=0; filename[i]; i++)
1782 if (filename[i] == '/' || filename[i] == '\\' || filename[i] == ':')
1783 dll_name = filename + i + 1;
1785 pe_header_offset = pe_get32 (dll, 0x3c);
1786 opthdr_ofs = pe_header_offset + 4 + 20;
1787 num_entries = pe_get32 (dll, opthdr_ofs + 92);
1788 if (num_entries < 1) /* no exports */
1790 export_rva = pe_get32 (dll, opthdr_ofs + 96);
1791 export_size = pe_get32 (dll, opthdr_ofs + 100);
1792 nsections = pe_get16 (dll, pe_header_offset + 4 + 2);
1793 secptr = (pe_header_offset + 4 + 20 +
1794 pe_get16 (dll, pe_header_offset + 4 + 16));
1796 for (i=0; i<nsections; i++)
1799 unsigned long secptr1 = secptr + 40 * i;
1800 unsigned long vaddr = pe_get32 (dll, secptr1 + 12);
1801 unsigned long vsize = pe_get32 (dll, secptr1 + 16);
1802 unsigned long fptr = pe_get32 (dll, secptr1 + 20);
1803 bfd_seek(dll, secptr1, SEEK_SET);
1804 bfd_read(sname, 1, 8, dll);
1805 if (vaddr <= export_rva && vaddr+vsize > export_rva)
1807 expptr = fptr + (export_rva - vaddr);
1808 if (export_rva + export_size > vaddr + vsize)
1809 export_size = vsize - (export_rva - vaddr);
1814 expdata = (unsigned char *) xmalloc (export_size);
1815 bfd_seek (dll, expptr, SEEK_SET);
1816 bfd_read (expdata, 1, export_size, dll);
1817 erva = expdata - export_rva;
1819 if (pe_def_file == 0)
1820 pe_def_file = def_file_empty();
1822 nexp = pe_as32 (expdata+24);
1823 name_rvas = pe_as32 (expdata+32);
1824 ordinals = pe_as32 (expdata+36);
1825 ordbase = pe_as32 (expdata+16);
1826 for (i=0; i<nexp; i++)
1828 unsigned long name_rva = pe_as32 (erva+name_rvas+i*4);
1829 def_file_import *imp;
1830 imp = def_file_add_import (pe_def_file, erva+name_rva, dll_name,
1837 /************************************************************************
1839 These are the main functions, called from the emulation. The first
1840 is called after the bfds are read, so we can guess at how much space
1841 we need. The second is called after everything is placed, so we
1842 can put the right values in place.
1844 ************************************************************************/
1847 pe_dll_build_sections (abfd, info)
1849 struct bfd_link_info *info;
1851 pe_dll_id_target (bfd_get_target (abfd));
1852 process_def_file (abfd, info);
1854 generate_edata (abfd, info);
1855 build_filler_bfd (1);
1859 pe_exe_build_sections (abfd, info)
1861 struct bfd_link_info *info ATTRIBUTE_UNUSED;
1863 pe_dll_id_target (bfd_get_target (abfd));
1864 build_filler_bfd (0);
1868 pe_dll_fill_sections (abfd, info)
1870 struct bfd_link_info *info;
1872 pe_dll_id_target (bfd_get_target (abfd));
1873 image_base = pe_data (abfd)->pe_opthdr.ImageBase;
1875 generate_reloc (abfd, info);
1878 bfd_set_section_size (filler_bfd, reloc_s, reloc_sz);
1880 /* Resize the sections. */
1881 lang_size_sections (stat_ptr->head, abs_output_section,
1882 &stat_ptr->head, 0, (bfd_vma) 0, false);
1884 /* Redo special stuff. */
1885 ldemul_after_allocation ();
1887 /* Do the assignments again. */
1888 lang_do_assignments (stat_ptr->head,
1890 (fill_type) 0, (bfd_vma) 0);
1893 fill_edata (abfd, info);
1895 pe_data (abfd)->dll = 1;
1897 edata_s->contents = edata_d;
1898 reloc_s->contents = reloc_d;
1902 pe_exe_fill_sections (abfd, info)
1904 struct bfd_link_info *info;
1906 pe_dll_id_target (bfd_get_target (abfd));
1907 image_base = pe_data (abfd)->pe_opthdr.ImageBase;
1909 generate_reloc (abfd, info);
1912 bfd_set_section_size (filler_bfd, reloc_s, reloc_sz);
1914 /* Resize the sections. */
1915 lang_size_sections (stat_ptr->head, abs_output_section,
1916 &stat_ptr->head, 0, (bfd_vma) 0, false);
1918 /* Redo special stuff. */
1919 ldemul_after_allocation ();
1921 /* Do the assignments again. */
1922 lang_do_assignments (stat_ptr->head,
1924 (fill_type) 0, (bfd_vma) 0);
1926 reloc_s->contents = reloc_d;