* pe-dll.c: New file; direct support for PE DLLs
[deliverable/binutils-gdb.git] / ld / pe-dll.c
CommitLineData
eb8061bf
DD
1/* Routines to help build PEI-format DLLs (Win32 etc)
2 Copyright (C) 1998 Free Software Foundation, Inc.
3 Written by DJ Delorie <dj@cygnus.com>
4
5 This file is part of GLD, the Gnu Linker.
6
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)
10 any later version.
11
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.
16
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
20 02111-1307, USA. */
21
22#include "bfd.h"
23#include "sysdep.h"
24#include "bfdlink.h"
25#include "libiberty.h"
26
27#include "ld.h"
28#include "ldexp.h"
29#include "ldlang.h"
30#include "ldwrite.h"
31#include "ldmisc.h"
32#include "ldgram.h"
33#include "ldmain.h"
34#include "coff/internal.h"
35#include "../bfd/libcoff.h"
36#include "deffile.h"
37
38/************************************************************************
39
40 This file turns a regular Windows PE image into a DLL. Because of
41 the complexity of this operation, it has been broken down into a
42 number of separate modules which are all called by the main function
43 at the end of this file. This function is not re-entrant and is
44 normally only called once, so static variables are used to reduce
45 the number of parameters and return values required.
46
47 See also: ld/emultempl/pe.em
48
49 ************************************************************************/
50
51/* from emultempl/pe.em */
52
53extern def_file *pe_def_file;
54extern int pe_dll_export_everything;
55extern int pe_dll_do_default_excludes;
56extern int pe_dll_kill_ats;
57extern int pe_dll_stdcall_aliases;
58
59/************************************************************************
60
61 static variables and types
62
63 ************************************************************************/
64
65static bfd_vma image_base;
66
67static bfd *filler_bfd;
68static struct sec *edata_s, *reloc_s;
69static unsigned char *edata_d, *reloc_d;
70static int edata_sz, reloc_sz;
71
72/************************************************************************
73
74 Helper functions for qsort. Relocs must be sorted so that we can write
75 them out by pages.
76
77 ************************************************************************/
78
79static int
80reloc_sort (va, vb)
81 const void *va, *vb;
82{
83 unsigned long a = *(unsigned long *) va;
84 unsigned long b = *(unsigned long *) vb;
85 return a - b;
86}
87
88static int
89pe_export_sort (va, vb)
90 const void *va, *vb;
91{
92 def_file_export *a = (def_file_export *) va;
93 def_file_export *b = (def_file_export *) vb;
94 return strcmp (a->name, b->name);
95}
96
97/************************************************************************
98
99 Read and process the .DEF file
100
101 ************************************************************************/
102
103/* These correspond to the entries in pe_def_file->exports[]. I use
104 exported_symbol_sections[i] to tag whether or not the symbol was
105 defined, since we can't export symbols we don't have. */
106
107static bfd_vma *exported_symbol_offsets;
108static struct sec **exported_symbol_sections;
109
110static int export_table_size;
111static int count_exported;
112static int count_exported_byname;
113static int count_with_ordinals;
114static const char *dll_name;
115static int min_ordinal, max_ordinal;
116static int *exported_symbols;
117
118typedef struct exclude_list_struct
119 {
120 char *string;
121 struct exclude_list_struct *next;
122 }
123exclude_list_struct;
124static struct exclude_list_struct *excludes = 0;
125
126void
127pe_dll_add_excludes (new_excludes)
128 const char *new_excludes;
129{
130 char *local_copy;
131 char *exclude_string;
132
133 local_copy = xstrdup (new_excludes);
134
135 exclude_string = strtok (local_copy, ",:");
136 for (; exclude_string; exclude_string = strtok (NULL, ",:"))
137 {
138 struct exclude_list_struct *new_exclude;
139
140 new_exclude = ((struct exclude_list_struct *)
141 xmalloc (sizeof (struct exclude_list_struct)));
142 new_exclude->string = (char *) xmalloc (strlen (exclude_string) + 1);
143 strcpy (new_exclude->string, exclude_string);
144 new_exclude->next = excludes;
145 excludes = new_exclude;
146 }
147
148 free (local_copy);
149}
150
151static int
152auto_export (d, n)
153 def_file *d;
154 const char *n;
155{
156 int i;
157 struct exclude_list_struct *ex;
158 for (i = 0; i < d->num_exports; i++)
159 if (strcmp (d->exports[i].name, n) == 0)
160 return 0;
161 if (pe_dll_do_default_excludes)
162 {
163 if (strcmp (n, "DllMain@12") == 0)
164 return 0;
165 if (strcmp (n, "DllEntryPoint@0") == 0)
166 return 0;
167 if (strcmp (n, "impure_ptr") == 0)
168 return 0;
169 }
170 for (ex = excludes; ex; ex = ex->next)
171 if (strcmp (n, ex->string) == 0)
172 return 0;
173 return 1;
174}
175
176static void
177process_def_file (abfd, info)
178 bfd *abfd;
179 struct bfd_link_info *info;
180{
181 int i, j;
182 struct bfd_link_hash_entry *blhe;
183 bfd *b;
184 struct sec *s;
185 def_file_export *e;
186
187 if (!pe_def_file)
188 pe_def_file = def_file_empty ();
189
190 /* First, run around to all the objects looking for the .drectve
191 sections, and push those into the def file too */
192
193 for (b = info->input_bfds; b; b = b->link_next)
194 {
195 s = bfd_get_section_by_name (b, ".drectve");
196 if (s)
197 {
198 int size = bfd_get_section_size_before_reloc (s);
199 char *buf = xmalloc (size);
200 bfd_get_section_contents (b, s, buf, 0, size);
201 def_file_add_directive (pe_def_file, buf, size);
202 free (buf);
203 }
204 }
205
206 /* Now, maybe export everything else the default way */
207
208 if (pe_dll_export_everything)
209 {
210 for (b = info->input_bfds; b; b = b->link_next)
211 {
212 asymbol **symbols;
213 int nsyms, symsize;
214
215 symsize = bfd_get_symtab_upper_bound (b);
216 symbols = (asymbol **) xmalloc (symsize);
217 nsyms = bfd_canonicalize_symtab (b, symbols);
218
219 for (j = 0; j < nsyms; j++)
220 {
221 if ((symbols[j]->flags & (BSF_FUNCTION | BSF_GLOBAL))
222 == (BSF_FUNCTION | BSF_GLOBAL))
223 {
224 const char *sn = symbols[j]->name;
225 if (*sn == '_')
226 sn++;
227 if (auto_export (pe_def_file, sn))
228 def_file_add_export (pe_def_file, sn, 0, -1);
229 }
230 }
231 }
232 }
233
234#undef NE
235#define NE pe_def_file->num_exports
236 e = pe_def_file->exports; /* convenience */
237
238 /* Canonicalize the export list */
239
240 if (pe_dll_kill_ats)
241 {
242 for (i = 0; i < NE; i++)
243 {
244 if (strchr (e[i].name, '@'))
245 {
246 /* This will preserve internal_name, which may have been pointing
247 to the same memory as name, or might not have */
248 char *tmp = xstrdup (e[i].name);
249 *(strchr (tmp, '@')) = 0;
250 e[i].name = tmp;
251 }
252 }
253 }
254
255 if (pe_dll_stdcall_aliases)
256 {
257 for (i = 0; i < NE; i++)
258 {
259 if (strchr (e[i].name, '@'))
260 {
261 char *tmp = xstrdup (e[i].name);
262 *(strchr (tmp, '@')) = 0;
263 if (auto_export (pe_def_file, tmp))
264 def_file_add_export (pe_def_file, tmp, e[i].internal_name, -1);
265 else
266 free (tmp);
267 }
268 }
269 }
270
271 exported_symbol_offsets = (bfd_vma *) xmalloc (NE * sizeof (bfd_vma));
272 exported_symbol_sections = (struct sec **) xmalloc (NE * sizeof (struct sec *));
273
274 memset (exported_symbol_sections, 0, NE * sizeof (struct sec *));
275 max_ordinal = 0;
276 min_ordinal = 65536;
277 count_exported = 0;
278 count_exported_byname = 0;
279 count_with_ordinals = 0;
280
281 qsort (pe_def_file->exports, NE, sizeof (pe_def_file->exports[0]), pe_export_sort);
282 for (i = 0, j = 0; i < NE; i++)
283 {
284 if (i > 0 && strcmp (e[i].name, e[i - 1].name) == 0)
285 {
286 /* This is a duplicate */
287 if (e[j - 1].ordinal != -1
288 && e[i].ordinal != -1
289 && e[j - 1].ordinal != e[i].ordinal)
290 {
291 /* xgettext:c-format */
292 einfo (_("%XError, duplicate EXPORT with oridinals: %s (%d vs %d)\n"),
293 e[j - 1].name, e[j - 1].ordinal, e[i].ordinal);
294 }
295 else
296 {
297 /* xgettext:c-format */
298 einfo (_("Warning, duplicate EXPORT: %s\n"),
299 e[j - 1].name);
300 }
301 if (e[i].ordinal)
302 e[j - 1].ordinal = e[i].ordinal;
303 e[j - 1].flag_private |= e[i].flag_private;
304 e[j - 1].flag_constant |= e[i].flag_constant;
305 e[j - 1].flag_noname |= e[i].flag_noname;
306 e[j - 1].flag_data |= e[i].flag_data;
307 }
308 else
309 {
310 if (i != j)
311 e[j] = e[i];
312 j++;
313 }
314 }
315 pe_def_file->num_exports = j; /* == NE */
316
317 for (i = 0; i < NE; i++)
318 {
319 char *name = (char *) xmalloc (strlen (pe_def_file->exports[i].internal_name) + 2);
320 *name = '_';
321 strcpy (name + 1, pe_def_file->exports[i].internal_name);
322
323 blhe = bfd_link_hash_lookup (info->hash,
324 name,
325 false, false, true);
326
327 if (blhe && (blhe->type == bfd_link_hash_defined))
328 {
329 count_exported++;
330 if (!pe_def_file->exports[i].flag_noname)
331 count_exported_byname++;
332 exported_symbol_offsets[i] = blhe->u.def.value;
333 exported_symbol_sections[i] = blhe->u.def.section;
334 if (pe_def_file->exports[i].ordinal != -1)
335 {
336 if (max_ordinal < pe_def_file->exports[i].ordinal)
337 max_ordinal = pe_def_file->exports[i].ordinal;
338 if (min_ordinal > pe_def_file->exports[i].ordinal)
339 min_ordinal = pe_def_file->exports[i].ordinal;
340 count_with_ordinals++;
341 }
342 }
343 else if (blhe)
344 {
345 /* xgettext:c-format */
346 einfo (_("%XCannot export %s: symbol wrong type\n"),
347 pe_def_file->exports[i].internal_name);
348 }
349 else
350 {
351 /* xgettext:c-format */
352 einfo (_("%XCannot export %s: symbol not found\n"),
353 pe_def_file->exports[i].internal_name);
354 }
355 free(name);
356 }
357
358#if 0
359 /* For now, just export all global functions. Read DEF files later */
360 for (i = 0; i < num_input_bfds; i++)
361 {
362 for (j = 0; j < symtab[i].nsyms; j++)
363 {
364 if ((symtab[i].symbols[j]->flags & (BSF_FUNCTION | BSF_GLOBAL))
365 == (BSF_FUNCTION | BSF_GLOBAL))
366 symtab[i].exported[j] = 1;
367 }
368 }
369#endif
370}
371
372/************************************************************************
373
374 Build the bfd that will contain .edata and .reloc sections
375
376 ************************************************************************/
377
378static void
379build_filler_bfd ()
380{
381 static lang_input_statement_type *filler_file;
382 filler_file = lang_add_input_file ("dll stuff",
383 lang_input_file_is_fake_enum,
384 NULL);
385 filler_file->the_bfd = filler_bfd = bfd_create ("dll stuff", output_bfd);
386 if (filler_bfd == NULL
387 || !bfd_set_arch_mach (filler_bfd,
388 bfd_get_arch (output_bfd),
389 bfd_get_mach (output_bfd)))
390 {
391 einfo ("%X%P: can not create BFD %E\n");
392 return;
393 }
394
395 edata_s = bfd_make_section_old_way (filler_bfd, ".edata");
396 if (edata_s == NULL
397 || !bfd_set_section_flags (filler_bfd, edata_s,
398 (SEC_HAS_CONTENTS
399 | SEC_ALLOC
400 | SEC_LOAD
401 | SEC_KEEP
402 | SEC_IN_MEMORY)))
403 {
404 einfo ("%X%P: can not create .edata section: %E\n");
405 return;
406 }
407 bfd_set_section_size (filler_bfd, edata_s, edata_sz);
408
409 reloc_s = bfd_make_section_old_way (filler_bfd, ".reloc");
410 if (reloc_s == NULL
411 || !bfd_set_section_flags (filler_bfd, reloc_s,
412 (SEC_HAS_CONTENTS
413 | SEC_ALLOC
414 | SEC_LOAD
415 | SEC_KEEP
416 | SEC_IN_MEMORY)))
417 {
418 einfo ("%X%P: can not create .reloc section: %E\n");
419 return;
420 }
421 bfd_set_section_size (filler_bfd, reloc_s, 0);
422
423 ldlang_add_file (filler_file);
424}
425
426/************************************************************************
427
428 Gather all the exported symbols and build the .edata section
429
430 ************************************************************************/
431
432static void
433generate_edata (abfd, info)
434 bfd *abfd;
435 struct bfd_link_info *info;
436{
437 int i, j, next_ordinal;
438 int name_table_size = 0;
439 const char *dlnp;
440
441 /* First, we need to know how many exported symbols there are,
442 and what the range of ordinals is. */
443
444 if (pe_def_file->name)
445 {
446 dll_name = pe_def_file->name;
447 }
448 else
449 {
450 dll_name = abfd->filename;
451 for (dlnp = dll_name; *dlnp; dlnp++)
452 {
453 if (*dlnp == '\\' || *dlnp == '/' || *dlnp == ':')
454 dll_name = dlnp + 1;
455 }
456 }
457
458 if (count_with_ordinals && max_ordinal > count_exported)
459 {
460 if (min_ordinal > max_ordinal - count_exported + 1)
461 min_ordinal = max_ordinal - count_exported + 1;
462 }
463 else
464 {
465 min_ordinal = 1;
466 max_ordinal = count_exported;
467 }
468 export_table_size = max_ordinal - min_ordinal + 1;
469
470 exported_symbols = (int *) xmalloc (export_table_size * sizeof (int));
471 for (i = 0; i < export_table_size; i++)
472 exported_symbols[i] = -1;
473
474 /* Now we need to assign ordinals to those that don't have them */
475 for (i = 0; i < NE; i++)
476 {
477 if (exported_symbol_sections[i])
478 {
479 if (pe_def_file->exports[i].ordinal != -1)
480 {
481 int ei = pe_def_file->exports[i].ordinal - min_ordinal;
482 int pi = exported_symbols[ei];
483 if (pi != -1)
484 {
485 /* xgettext:c-format */
486 einfo (_("%XError, oridinal used twice: %d (%s vs %s)\n"),
487 pe_def_file->exports[i].ordinal,
488 pe_def_file->exports[i].name,
489 pe_def_file->exports[pi].name);
490 }
491 exported_symbols[ei] = i;
492 }
493 name_table_size += strlen (pe_def_file->exports[i].name) + 1;
494 }
495 }
496
497 next_ordinal = min_ordinal;
498 for (i = 0; i < NE; i++)
499 if (exported_symbol_sections[i])
500 if (pe_def_file->exports[i].ordinal == -1)
501 {
502 while (exported_symbols[next_ordinal - min_ordinal] != -1)
503 next_ordinal++;
504 exported_symbols[next_ordinal - min_ordinal] = i;
505 pe_def_file->exports[i].ordinal = next_ordinal;
506 }
507
508 /* OK, now we can allocate some memory */
509
510 edata_sz = (40 /* directory */
511 + 4 * export_table_size /* addresses */
512 + 4 * count_exported_byname /* name ptrs */
513 + 2 * count_exported_byname /* ordinals */
514 + name_table_size + strlen (dll_name) + 1);
515}
516
517static void
518fill_edata (abfd, info)
519 bfd *abfd;
520 struct bfd_link_info *info;
521{
522 int i;
523 unsigned char *edirectory;
524 unsigned long *eaddresses;
525 unsigned long *enameptrs;
526 unsigned short *eordinals;
527 unsigned char *enamestr;
528
529 edata_d = (unsigned char *) xmalloc (edata_sz);
530
531 /* Note use of array pointer math here */
532 edirectory = edata_d;
533 eaddresses = (unsigned long *) (edata_d + 40);
534 enameptrs = eaddresses + export_table_size;
535 eordinals = (unsigned short *) (enameptrs + count_exported_byname);
536 enamestr = (char *) (eordinals + count_exported_byname);
537
538#define ERVA(ptr) (((unsigned char *)(ptr) - edata_d) + edata_s->output_section->vma - image_base)
539
540 memset (edata_d, 0, 40);
541 if (pe_def_file->version_major != -1)
542 {
543 bfd_put_16 (abfd, pe_def_file->version_major, edata_d + 8);
544 bfd_put_16 (abfd, pe_def_file->version_minor, edata_d + 10);
545 }
546 bfd_put_32 (abfd, ERVA (enamestr), edata_d + 12);
547 strcpy (enamestr, dll_name);
548 enamestr += strlen (enamestr) + 1;
549 bfd_put_32 (abfd, min_ordinal, edata_d + 16);
550 bfd_put_32 (abfd, export_table_size, edata_d + 20);
551 bfd_put_32 (abfd, count_exported_byname, edata_d + 24);
552 bfd_put_32 (abfd, ERVA (eaddresses), edata_d + 28);
553 bfd_put_32 (abfd, ERVA (enameptrs), edata_d + 32);
554 bfd_put_32 (abfd, ERVA (eordinals), edata_d + 36);
555
556 /* Ok, now for the filling in part */
557 for (i = 0; i < export_table_size; i++)
558 {
559 int s = exported_symbols[i];
560 if (s != -1)
561 {
562 struct sec *ssec = exported_symbol_sections[s];
563 unsigned long srva = (exported_symbol_offsets[s]
564 + ssec->output_section->vma
565 + ssec->output_offset);
566
567 bfd_put_32 (abfd, srva - image_base, (void *) (eaddresses + i));
568 if (!pe_def_file->exports[s].flag_noname)
569 {
570 char *ename = pe_def_file->exports[s].name;
571 bfd_put_32 (abfd, ERVA (enamestr), (void *) enameptrs);
572 strcpy (enamestr, ename[0] == '_' ? ename + 1 : ename);
573 enamestr += strlen (enamestr) + 1;
574 bfd_put_16 (abfd, i, (void *) eordinals);
575 enameptrs++;
576 }
577 eordinals++;
578 }
579 }
580}
581
582/************************************************************************
583
584 Gather all the relocations and build the .reloc section
585
586 ************************************************************************/
587
588static void
589generate_reloc (abfd, info)
590 bfd *abfd;
591 struct bfd_link_info *info;
592{
593
594 /* for .reloc stuff */
595 bfd_vma *reloc_addresses;
596 int total_relocs = 0;
597 int i, j;
598 unsigned long sec_page = (unsigned long) (-1);
599 unsigned long page_ptr, page_count;
600 int bi;
601 bfd *b;
602 struct sec *s;
603
604 total_relocs = 0;
605 for (b = info->input_bfds; b; b = b->link_next)
606 for (s = b->sections; s; s = s->next)
607 total_relocs += s->reloc_count;
608
609 reloc_addresses = (unsigned long *) xmalloc (total_relocs * sizeof (unsigned long));
610
611 total_relocs = 0;
612 bi = 0;
613 for (bi = 0, b = info->input_bfds; b; bi++, b = b->link_next)
614 {
615 arelent **relocs;
616 int relsize, nrelocs, i;
617
618 for (s = b->sections; s; s = s->next)
619 {
620 unsigned long sec_vma = s->output_section->vma + s->output_offset;
621 asymbol **symbols;
622 int nsyms, symsize;
623
624 symsize = bfd_get_symtab_upper_bound (b);
625 symbols = (asymbol **) xmalloc (symsize);
626 nsyms = bfd_canonicalize_symtab (b, symbols);
627
628 relsize = bfd_get_reloc_upper_bound (b, s);
629 relocs = (arelent **) xmalloc ((size_t) relsize);
630 nrelocs = bfd_canonicalize_reloc (b, s, relocs, symbols);
631
632 for (i = 0; i < nrelocs; i++)
633 {
634 if (!relocs[i]->howto->pc_relative)
635 {
636 switch (relocs[i]->howto->bitsize)
637 {
638 case 32:
639 reloc_addresses[total_relocs++] = sec_vma + relocs[i]->address;
640 break;
641 default:
642 /* xgettext:c-format */
643 einfo (_("%XError: %d-bit reloc in dll\n"),
644 relocs[i]->howto->bitsize);
645 break;
646 }
647 }
648 }
649 free (relocs);
650 /* Warning: the allocated symbols are remembered in BFD and reused
651 later, so don't free them! */
652 /* free(symbols); */
653 }
654 }
655
656 /* At this point, we have total_relocs relocation addresses in
657 reloc_addresses, which are all suitable for the .reloc section.
658 We must now create the new sections. */
659
660 qsort (reloc_addresses, total_relocs, sizeof (unsigned long), reloc_sort);
661
662 for (i = 0; i < total_relocs; i++)
663 {
664 unsigned long this_page = (reloc_addresses[i] >> 12);
665 if (this_page != sec_page)
666 {
667 reloc_sz = (reloc_sz + 3) & ~3; /* 4-byte align */
668 reloc_sz += 8;
669 sec_page = this_page;
670 }
671 reloc_sz += 2;
672 }
673 reloc_sz = (reloc_sz + 3) & ~3; /* 4-byte align */
674
675 reloc_d = (unsigned char *) xmalloc (reloc_sz);
676
677 sec_page = (unsigned long) (-1);
678 reloc_sz = 0;
679 page_ptr = (unsigned long) (-1);
680 page_count = 0;
681 for (i = 0; i < total_relocs; i++)
682 {
683 unsigned long rva = reloc_addresses[i] - image_base;
684 unsigned long this_page = (rva & ~0xfff);
685 if (this_page != sec_page)
686 {
687 while (reloc_sz & 3)
688 reloc_d[reloc_sz++] = 0;
689 if (page_ptr != (unsigned long) (-1))
690 bfd_put_32 (abfd, reloc_sz - page_ptr, reloc_d + page_ptr + 4);
691 bfd_put_32 (abfd, this_page, reloc_d + reloc_sz);
692 page_ptr = reloc_sz;
693 reloc_sz += 8;
694 sec_page = this_page;
695 page_count = 0;
696 }
697 bfd_put_16 (abfd, (rva & 0xfff) + 0x3000, reloc_d + reloc_sz);
698 reloc_sz += 2;
699 page_count++;
700 }
701 while (reloc_sz & 3)
702 reloc_d[reloc_sz++] = 0;
703 if (page_ptr != (unsigned long) (-1))
704 bfd_put_32 (abfd, reloc_sz - page_ptr, reloc_d + page_ptr + 4);
705 while (reloc_sz < reloc_s->_raw_size)
706 reloc_d[reloc_sz++] = 0;
707}
708
709/************************************************************************
710
711 Given the exiting def_file structure, print out a .DEF file that
712 corresponds to it.
713
714 ************************************************************************/
715
716static void
717quoteput (s, f, needs_quotes)
718 char *s;
719 FILE * f;
720 int needs_quotes;
721{
722 char *cp;
723 for (cp = s; *cp; cp++)
724 if (*cp == '\'' || *cp == '"' || *cp == '\\' || isspace (*cp) || *cp == ','
725 || *cp == ';')
726 needs_quotes = 1;
727 if (needs_quotes)
728 {
729 putc ('"', f);
730 while (*s)
731 {
732 if (*s == '"' || *s == '\\')
733 putc ('\\', f);
734 putc (*s, f);
735 s++;
736 }
737 putc ('"', f);
738 }
739 else
740 fputs (s, f);
741}
742
743void
744pe_dll_generate_def_file (pe_out_def_filename)
745 char *pe_out_def_filename;
746{
747 int i;
748 FILE *out = fopen (pe_out_def_filename, "w");
749 if (out == NULL)
750 {
751 /* xgettext:c-format */
752 einfo (_("%s: Can't open output def file %s\n"),
753 program_name, pe_out_def_filename);
754 }
755
756 if (pe_def_file->name)
757 {
758 if (pe_def_file->is_dll)
759 fprintf (out, "LIBRARY ");
760 else
761 fprintf (out, "NAME ");
762 quoteput (pe_def_file->name, out, 1);
763 if (pe_def_file->base_address != (bfd_vma) (-1))
764 fprintf (out, " BASE=0x%x", pe_def_file->base_address);
765 fprintf (out, "\n");
766 }
767
768 if (pe_def_file->description)
769 {
770 fprintf (out, "DESCRIPTION ");
771 quoteput (pe_def_file->description, out, 1);
772 fprintf (out, "\n");
773 }
774
775 if (pe_def_file->version_minor)
776 fprintf (out, "VERSION %d.%d\n", pe_def_file->version_major,
777 pe_def_file->version_minor);
778 else
779 fprintf (out, "VERSION %d\n", pe_def_file->version_major);
780
781 if (pe_def_file->stack_reserve != -1 || pe_def_file->heap_reserve != -1)
782 fprintf (out, "\n");
783
784 if (pe_def_file->stack_commit != -1)
785 fprintf (out, "STACKSIZE 0x%x,0x%x\n",
786 pe_def_file->stack_reserve, pe_def_file->stack_commit);
787 else if (pe_def_file->stack_reserve != -1)
788 fprintf (out, "STACKSIZE 0x%x\n", pe_def_file->stack_reserve);
789 if (pe_def_file->heap_commit != -1)
790 fprintf (out, "HEAPSIZE 0x%x,0x%x\n",
791 pe_def_file->heap_reserve, pe_def_file->heap_commit);
792 else if (pe_def_file->heap_reserve != -1)
793 fprintf (out, "HEAPSIZE 0x%x\n", pe_def_file->heap_reserve);
794
795 if (pe_def_file->num_section_defs > 0)
796 {
797 fprintf (out, "\nSECTIONS\n\n");
798 for (i = 0; i < pe_def_file->num_section_defs; i++)
799 {
800 fprintf (out, " ");
801 quoteput (pe_def_file->section_defs[i].name, out, 0);
802 if (pe_def_file->section_defs[i].class)
803 {
804 fprintf (out, " CLASS ");
805 quoteput (pe_def_file->section_defs[i].class, out, 0);
806 }
807 if (pe_def_file->section_defs[i].flag_read)
808 fprintf (out, " READ");
809 if (pe_def_file->section_defs[i].flag_write)
810 fprintf (out, " WRITE");
811 if (pe_def_file->section_defs[i].flag_execute)
812 fprintf (out, " EXECUTE");
813 if (pe_def_file->section_defs[i].flag_shared)
814 fprintf (out, " SHARED");
815 fprintf (out, "\n");
816 }
817 }
818
819 if (pe_def_file->num_exports > 0)
820 {
821 fprintf (out, "\nEXPORTS\n\n");
822 for (i = 0; i < pe_def_file->num_exports; i++)
823 {
824 def_file_export *e = pe_def_file->exports + i;
825 fprintf (out, " ");
826 quoteput (e->name, out, 0);
827 if (e->internal_name && strcmp (e->internal_name, e->name))
828 {
829 fprintf (out, " = ");
830 quoteput (e->internal_name, out, 0);
831 }
832 if (e->ordinal != -1)
833 fprintf (out, " @%d", e->ordinal);
834 if (e->flag_private)
835 fprintf (out, " PRIVATE");
836 if (e->flag_constant)
837 fprintf (out, " CONSTANT");
838 if (e->flag_noname)
839 fprintf (out, " NONAME");
840 if (e->flag_data)
841 fprintf (out, " DATA");
842
843 fprintf (out, "\n");
844 }
845 }
846
847 if (pe_def_file->num_imports > 0)
848 {
849 fprintf (out, "\nIMPORTS\n\n");
850 for (i = 0; i < pe_def_file->num_imports; i++)
851 {
852 def_file_import *im = pe_def_file->imports + i;
853 fprintf (out, " ");
854 if (im->internal_name
855 && (!im->name || strcmp (im->internal_name, im->name)))
856 {
857 quoteput (im->internal_name, out, 0);
858 fprintf (out, " = ");
859 }
860 quoteput (im->module, out, 0);
861 fprintf (out, ".");
862 if (im->name)
863 quoteput (im->name, out, 0);
864 else
865 fprintf (out, "%d", im->ordinal);
866 fprintf (out, "\n");
867 }
868 }
869
870 if (fclose (out) == EOF)
871 {
872 /* xgettext:c-format */
873 einfo (_("%P: Error closing file `%s'\n"), pe_out_def_filename);
874 }
875}
876
877/************************************************************************
878
879 These are the main functions, called from the emulation. The first
880 is called after the bfds are read, so we can guess at how much space
881 we need. The second is called after everything is placed, so we
882 can put the right values in place.
883
884 ************************************************************************/
885
886void
887pe_dll_build_sections (abfd, info)
888 bfd *abfd;
889 struct bfd_link_info *info;
890{
891 process_def_file (abfd, info);
892
893 generate_edata (abfd, info);
894 build_filler_bfd ();
895}
896
897void
898pe_dll_fill_sections (abfd, info)
899 bfd *abfd;
900 struct bfd_link_info *info;
901{
902 image_base = pe_data (abfd)->pe_opthdr.ImageBase;
903
904 generate_reloc (abfd, info);
905 if (reloc_sz > 0)
906 {
907 bfd_set_section_size (filler_bfd, reloc_s, reloc_sz);
908
909 /* Resize the sections. */
910 lang_size_sections (stat_ptr->head, abs_output_section,
911 &stat_ptr->head, 0, (bfd_vma) 0, false);
912
913 /* Redo special stuff. */
914 ldemul_after_allocation ();
915
916 /* Do the assignments again. */
917 lang_do_assignments (stat_ptr->head,
918 abs_output_section,
919 (fill_type) 0, (bfd_vma) 0);
920 }
921
922 fill_edata (abfd, info);
923
924 pe_data (abfd)->dll = 1;
925
926 edata_s->contents = edata_d;
927 reloc_s->contents = reloc_d;
928}
This page took 0.055911 seconds and 4 git commands to generate.