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