* parse.c (target_map_name_to_register): Include pseudo-regs.
[deliverable/binutils-gdb.git] / ld / pe-dll.c
CommitLineData
252b5132 1/* Routines to help build PEI-format DLLs (Win32 etc)
a6483292 2 Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc.
252b5132
RH
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 <time.h>
28#include <ctype.h>
29
30#include "ld.h"
31#include "ldexp.h"
32#include "ldlang.h"
33#include "ldwrite.h"
34#include "ldmisc.h"
35#include "ldgram.h"
36#include "ldmain.h"
b71e2778 37#include "ldfile.h"
252b5132
RH
38#include "ldemul.h"
39#include "coff/internal.h"
40#include "../bfd/libcoff.h"
41#include "deffile.h"
1069dd8d 42#include "pe-dll.h"
252b5132
RH
43
44/************************************************************************
45
46 This file turns a regular Windows PE image into a DLL. Because of
47 the complexity of this operation, it has been broken down into a
48 number of separate modules which are all called by the main function
49 at the end of this file. This function is not re-entrant and is
50 normally only called once, so static variables are used to reduce
51 the number of parameters and return values required.
52
53 See also: ld/emultempl/pe.em
54
55 ************************************************************************/
56
57/* for emultempl/pe.em */
58
59def_file *pe_def_file = 0;
60int pe_dll_export_everything = 0;
61int pe_dll_do_default_excludes = 1;
62int pe_dll_kill_ats = 0;
63int pe_dll_stdcall_aliases = 0;
870df5dc
NC
64int pe_dll_warn_dup_exports = 0;
65int pe_dll_compat_implib = 0;
252b5132
RH
66
67/************************************************************************
68
69 static variables and types
70
71 ************************************************************************/
72
73static bfd_vma image_base;
74
75static bfd *filler_bfd;
76static struct sec *edata_s, *reloc_s;
77static unsigned char *edata_d, *reloc_d;
1069dd8d 78static size_t edata_sz, reloc_sz;
252b5132 79
c6c37250
DD
80typedef struct {
81 char *target_name;
82 char *object_target;
1069dd8d 83 unsigned int imagebase_reloc;
c6c37250
DD
84 int pe_arch;
85 int bfd_arch;
86 int underscored;
87} pe_details_type;
88
89#define PE_ARCH_i386 1
344a211f
NC
90#define PE_ARCH_sh 2
91#define PE_ARCH_mips 3
92#define PE_ARCH_arm 4
c6c37250
DD
93
94static pe_details_type pe_detail_list[] = {
95 {
96 "pei-i386",
97 "pe-i386",
98 7 /* R_IMAGEBASE */,
99 PE_ARCH_i386,
100 bfd_arch_i386,
101 1
102 },
344a211f
NC
103 {
104 "pei-shl",
105 "pe-shl",
106 16 /* R_SH_IMAGEBASE */,
107 PE_ARCH_sh,
108 bfd_arch_sh,
109 1
110 },
111 {
112 "pei-mips",
113 "pe-mips",
114 34 /* MIPS_R_RVA */,
115 PE_ARCH_mips,
116 bfd_arch_mips,
117 0
118 },
119 {
120 "pei-arm-little",
121 "pe-arm-little",
122 11 /* ARM_RVA32 */,
123 PE_ARCH_arm,
124 bfd_arch_arm,
125 0
126 },
1069dd8d 127 { NULL, NULL, 0, 0, 0, 0 }
c6c37250
DD
128};
129
130static pe_details_type *pe_details;
131
132#define U(str) (pe_details->underscored ? "_" str : str)
133
134void
135pe_dll_id_target (target)
1069dd8d 136 const char *target;
c6c37250
DD
137{
138 int i;
139 for (i=0; pe_detail_list[i].target_name; i++)
140 if (strcmp (pe_detail_list[i].target_name, target) == 0)
141 {
142 pe_details = pe_detail_list+i;
143 return;
144 }
145 einfo (_("%XUnsupported PEI architecture: %s\n"), target);
146 exit (1);
147}
148
252b5132
RH
149/************************************************************************
150
151 Helper functions for qsort. Relocs must be sorted so that we can write
152 them out by pages.
153
154 ************************************************************************/
155
c6c37250
DD
156typedef struct {
157 bfd_vma vma;
158 char type;
159 short extra;
160} reloc_data_type;
161
252b5132
RH
162static int
163reloc_sort (va, vb)
164 const void *va, *vb;
165{
c6c37250
DD
166 bfd_vma a = ((reloc_data_type *) va)->vma;
167 bfd_vma b = ((reloc_data_type *) vb)->vma;
168 return (a > b) ? 1 : ((a < b) ? -1 : 0);
252b5132
RH
169}
170
171static int
172pe_export_sort (va, vb)
173 const void *va, *vb;
174{
175 def_file_export *a = (def_file_export *) va;
176 def_file_export *b = (def_file_export *) vb;
177 return strcmp (a->name, b->name);
178}
179
180/************************************************************************
181
182 Read and process the .DEF file
183
184 ************************************************************************/
185
186/* These correspond to the entries in pe_def_file->exports[]. I use
187 exported_symbol_sections[i] to tag whether or not the symbol was
188 defined, since we can't export symbols we don't have. */
189
190static bfd_vma *exported_symbol_offsets;
191static struct sec **exported_symbol_sections;
192
193static int export_table_size;
194static int count_exported;
195static int count_exported_byname;
196static int count_with_ordinals;
197static const char *dll_name;
198static int min_ordinal, max_ordinal;
199static int *exported_symbols;
200
201typedef struct exclude_list_struct
202 {
203 char *string;
204 struct exclude_list_struct *next;
205 }
206exclude_list_struct;
207static struct exclude_list_struct *excludes = 0;
208
209void
210pe_dll_add_excludes (new_excludes)
211 const char *new_excludes;
212{
213 char *local_copy;
214 char *exclude_string;
215
216 local_copy = xstrdup (new_excludes);
217
218 exclude_string = strtok (local_copy, ",:");
219 for (; exclude_string; exclude_string = strtok (NULL, ",:"))
220 {
221 struct exclude_list_struct *new_exclude;
222
223 new_exclude = ((struct exclude_list_struct *)
224 xmalloc (sizeof (struct exclude_list_struct)));
225 new_exclude->string = (char *) xmalloc (strlen (exclude_string) + 1);
226 strcpy (new_exclude->string, exclude_string);
227 new_exclude->next = excludes;
228 excludes = new_exclude;
229 }
230
231 free (local_copy);
232}
233
234static int
235auto_export (d, n)
236 def_file *d;
237 const char *n;
238{
239 int i;
240 struct exclude_list_struct *ex;
241 for (i = 0; i < d->num_exports; i++)
242 if (strcmp (d->exports[i].name, n) == 0)
243 return 0;
244 if (pe_dll_do_default_excludes)
245 {
246 if (strcmp (n, "DllMain@12") == 0)
247 return 0;
248 if (strcmp (n, "DllEntryPoint@0") == 0)
249 return 0;
250 if (strcmp (n, "impure_ptr") == 0)
251 return 0;
252 }
253 for (ex = excludes; ex; ex = ex->next)
254 if (strcmp (n, ex->string) == 0)
255 return 0;
256 return 1;
257}
258
259static void
260process_def_file (abfd, info)
1069dd8d 261 bfd *abfd ATTRIBUTE_UNUSED;
252b5132
RH
262 struct bfd_link_info *info;
263{
264 int i, j;
265 struct bfd_link_hash_entry *blhe;
266 bfd *b;
267 struct sec *s;
268 def_file_export *e=0;
269
270 if (!pe_def_file)
271 pe_def_file = def_file_empty ();
272
273 /* First, run around to all the objects looking for the .drectve
274 sections, and push those into the def file too */
275
276 for (b = info->input_bfds; b; b = b->link_next)
277 {
278 s = bfd_get_section_by_name (b, ".drectve");
279 if (s)
280 {
281 int size = bfd_get_section_size_before_reloc (s);
282 char *buf = xmalloc (size);
283 bfd_get_section_contents (b, s, buf, 0, size);
284 def_file_add_directive (pe_def_file, buf, size);
285 free (buf);
286 }
287 }
288
289 /* Now, maybe export everything else the default way */
290
291 if (pe_dll_export_everything || pe_def_file->num_exports == 0)
292 {
293 for (b = info->input_bfds; b; b = b->link_next)
294 {
295 asymbol **symbols;
296 int nsyms, symsize;
297
298 symsize = bfd_get_symtab_upper_bound (b);
299 symbols = (asymbol **) xmalloc (symsize);
300 nsyms = bfd_canonicalize_symtab (b, symbols);
301
302 for (j = 0; j < nsyms; j++)
303 {
304 if ((symbols[j]->flags & (BSF_FUNCTION | BSF_GLOBAL))
305 == (BSF_FUNCTION | BSF_GLOBAL))
306 {
307 const char *sn = symbols[j]->name;
308 if (*sn == '_')
309 sn++;
310 if (auto_export (pe_def_file, sn))
311 def_file_add_export (pe_def_file, sn, 0, -1);
312 }
313 }
314 }
315 }
316
317#undef NE
318#define NE pe_def_file->num_exports
319
320 /* Canonicalize the export list */
321
322 if (pe_dll_kill_ats)
323 {
324 for (i = 0; i < NE; i++)
325 {
326 if (strchr (pe_def_file->exports[i].name, '@'))
327 {
328 /* This will preserve internal_name, which may have been pointing
329 to the same memory as name, or might not have */
330 char *tmp = xstrdup (pe_def_file->exports[i].name);
331 *(strchr (tmp, '@')) = 0;
332 pe_def_file->exports[i].name = tmp;
333 }
334 }
335 }
336
337 if (pe_dll_stdcall_aliases)
338 {
339 for (i = 0; i < NE; i++)
340 {
341 if (strchr (pe_def_file->exports[i].name, '@'))
342 {
343 char *tmp = xstrdup (pe_def_file->exports[i].name);
344 *(strchr (tmp, '@')) = 0;
345 if (auto_export (pe_def_file, tmp))
346 def_file_add_export (pe_def_file, tmp,
347 pe_def_file->exports[i].internal_name, -1);
348 else
349 free (tmp);
350 }
351 }
352 }
353
354 e = pe_def_file->exports; /* convenience, but watch out for it changing */
355
356 exported_symbol_offsets = (bfd_vma *) xmalloc (NE * sizeof (bfd_vma));
357 exported_symbol_sections = (struct sec **) xmalloc (NE * sizeof (struct sec *));
358
359 memset (exported_symbol_sections, 0, NE * sizeof (struct sec *));
360 max_ordinal = 0;
361 min_ordinal = 65536;
362 count_exported = 0;
363 count_exported_byname = 0;
364 count_with_ordinals = 0;
365
366 qsort (pe_def_file->exports, NE, sizeof (pe_def_file->exports[0]), pe_export_sort);
367 for (i = 0, j = 0; i < NE; i++)
368 {
369 if (i > 0 && strcmp (e[i].name, e[i - 1].name) == 0)
370 {
870df5dc 371 /* This is a duplicate. */
252b5132
RH
372 if (e[j - 1].ordinal != -1
373 && e[i].ordinal != -1
374 && e[j - 1].ordinal != e[i].ordinal)
375 {
870df5dc
NC
376 if (pe_dll_warn_dup_exports)
377 /* xgettext:c-format */
378 einfo (_("%XError, duplicate EXPORT with oridinals: %s (%d vs %d)\n"),
379 e[j - 1].name, e[j - 1].ordinal, e[i].ordinal);
252b5132
RH
380 }
381 else
382 {
870df5dc
NC
383 if (pe_dll_warn_dup_exports)
384 /* xgettext:c-format */
385 einfo (_("Warning, duplicate EXPORT: %s\n"),
386 e[j - 1].name);
252b5132
RH
387 }
388 if (e[i].ordinal)
389 e[j - 1].ordinal = e[i].ordinal;
390 e[j - 1].flag_private |= e[i].flag_private;
391 e[j - 1].flag_constant |= e[i].flag_constant;
392 e[j - 1].flag_noname |= e[i].flag_noname;
393 e[j - 1].flag_data |= e[i].flag_data;
394 }
395 else
396 {
397 if (i != j)
398 e[j] = e[i];
399 j++;
400 }
401 }
402 pe_def_file->num_exports = j; /* == NE */
403
404 for (i = 0; i < NE; i++)
405 {
406 char *name = (char *) xmalloc (strlen (pe_def_file->exports[i].internal_name) + 2);
c6c37250
DD
407 if (pe_details->underscored)
408 {
409 *name = '_';
410 strcpy (name + 1, pe_def_file->exports[i].internal_name);
411 }
412 else
413 strcpy (name, pe_def_file->exports[i].internal_name);
252b5132
RH
414
415 blhe = bfd_link_hash_lookup (info->hash,
416 name,
417 false, false, true);
418
8a5b676c
DD
419 if (blhe
420 && (blhe->type == bfd_link_hash_defined
421 || (blhe->type == bfd_link_hash_common)))
252b5132
RH
422 {
423 count_exported++;
424 if (!pe_def_file->exports[i].flag_noname)
425 count_exported_byname++;
8a5b676c
DD
426
427 /* Only fill in the sections. The actual offsets are computed
428 in fill_exported_offsets() after common symbols are laid
429 out. */
430 if (blhe->type == bfd_link_hash_defined)
431 exported_symbol_sections[i] = blhe->u.def.section;
432 else
433 exported_symbol_sections[i] = blhe->u.c.p->section;
344a211f 434
252b5132
RH
435 if (pe_def_file->exports[i].ordinal != -1)
436 {
437 if (max_ordinal < pe_def_file->exports[i].ordinal)
438 max_ordinal = pe_def_file->exports[i].ordinal;
439 if (min_ordinal > pe_def_file->exports[i].ordinal)
440 min_ordinal = pe_def_file->exports[i].ordinal;
441 count_with_ordinals++;
442 }
443 }
444 else if (blhe && blhe->type == bfd_link_hash_undefined)
445 {
446 /* xgettext:c-format */
447 einfo (_("%XCannot export %s: symbol not defined\n"),
448 pe_def_file->exports[i].internal_name);
449 }
450 else if (blhe)
451 {
452 /* xgettext:c-format */
453 einfo (_("%XCannot export %s: symbol wrong type (%d vs %d)\n"),
454 pe_def_file->exports[i].internal_name,
455 blhe->type, bfd_link_hash_defined);
456 }
457 else
458 {
459 /* xgettext:c-format */
460 einfo (_("%XCannot export %s: symbol not found\n"),
461 pe_def_file->exports[i].internal_name);
462 }
463 free (name);
464 }
465}
466
467/************************************************************************
468
469 Build the bfd that will contain .edata and .reloc sections
470
471 ************************************************************************/
472
473static void
c6c37250
DD
474build_filler_bfd (include_edata)
475 int include_edata;
252b5132
RH
476{
477 lang_input_statement_type *filler_file;
478 filler_file = lang_add_input_file ("dll stuff",
479 lang_input_file_is_fake_enum,
480 NULL);
481 filler_file->the_bfd = filler_bfd = bfd_create ("dll stuff", output_bfd);
482 if (filler_bfd == NULL
483 || !bfd_set_arch_mach (filler_bfd,
484 bfd_get_arch (output_bfd),
485 bfd_get_mach (output_bfd)))
486 {
487 einfo ("%X%P: can not create BFD %E\n");
488 return;
489 }
490
c6c37250 491 if (include_edata)
252b5132 492 {
c6c37250
DD
493 edata_s = bfd_make_section_old_way (filler_bfd, ".edata");
494 if (edata_s == NULL
495 || !bfd_set_section_flags (filler_bfd, edata_s,
496 (SEC_HAS_CONTENTS
497 | SEC_ALLOC
498 | SEC_LOAD
499 | SEC_KEEP
500 | SEC_IN_MEMORY)))
501 {
502 einfo ("%X%P: can not create .edata section: %E\n");
503 return;
504 }
505 bfd_set_section_size (filler_bfd, edata_s, edata_sz);
252b5132 506 }
252b5132
RH
507
508 reloc_s = bfd_make_section_old_way (filler_bfd, ".reloc");
509 if (reloc_s == NULL
510 || !bfd_set_section_flags (filler_bfd, reloc_s,
511 (SEC_HAS_CONTENTS
512 | SEC_ALLOC
513 | SEC_LOAD
514 | SEC_KEEP
515 | SEC_IN_MEMORY)))
516 {
517 einfo ("%X%P: can not create .reloc section: %E\n");
518 return;
519 }
520 bfd_set_section_size (filler_bfd, reloc_s, 0);
521
522 ldlang_add_file (filler_file);
523}
524
525/************************************************************************
526
527 Gather all the exported symbols and build the .edata section
528
529 ************************************************************************/
530
531static void
532generate_edata (abfd, info)
533 bfd *abfd;
1069dd8d 534 struct bfd_link_info *info ATTRIBUTE_UNUSED;
252b5132
RH
535{
536 int i, next_ordinal;
537 int name_table_size = 0;
538 const char *dlnp;
539
540 /* First, we need to know how many exported symbols there are,
541 and what the range of ordinals is. */
542
543 if (pe_def_file->name)
544 {
545 dll_name = pe_def_file->name;
546 }
547 else
548 {
549 dll_name = abfd->filename;
550 for (dlnp = dll_name; *dlnp; dlnp++)
551 {
552 if (*dlnp == '\\' || *dlnp == '/' || *dlnp == ':')
553 dll_name = dlnp + 1;
554 }
555 }
556
557 if (count_with_ordinals && max_ordinal > count_exported)
558 {
559 if (min_ordinal > max_ordinal - count_exported + 1)
560 min_ordinal = max_ordinal - count_exported + 1;
561 }
562 else
563 {
564 min_ordinal = 1;
565 max_ordinal = count_exported;
566 }
567 export_table_size = max_ordinal - min_ordinal + 1;
568
569 exported_symbols = (int *) xmalloc (export_table_size * sizeof (int));
570 for (i = 0; i < export_table_size; i++)
571 exported_symbols[i] = -1;
572
573 /* Now we need to assign ordinals to those that don't have them */
574 for (i = 0; i < NE; i++)
575 {
576 if (exported_symbol_sections[i])
577 {
578 if (pe_def_file->exports[i].ordinal != -1)
579 {
580 int ei = pe_def_file->exports[i].ordinal - min_ordinal;
581 int pi = exported_symbols[ei];
582 if (pi != -1)
583 {
584 /* xgettext:c-format */
585 einfo (_("%XError, oridinal used twice: %d (%s vs %s)\n"),
586 pe_def_file->exports[i].ordinal,
587 pe_def_file->exports[i].name,
588 pe_def_file->exports[pi].name);
589 }
590 exported_symbols[ei] = i;
591 }
592 name_table_size += strlen (pe_def_file->exports[i].name) + 1;
593 }
594 }
595
596 next_ordinal = min_ordinal;
597 for (i = 0; i < NE; i++)
598 if (exported_symbol_sections[i])
599 if (pe_def_file->exports[i].ordinal == -1)
600 {
601 while (exported_symbols[next_ordinal - min_ordinal] != -1)
602 next_ordinal++;
603 exported_symbols[next_ordinal - min_ordinal] = i;
604 pe_def_file->exports[i].ordinal = next_ordinal;
605 }
606
607 /* OK, now we can allocate some memory */
608
609 edata_sz = (40 /* directory */
610 + 4 * export_table_size /* addresses */
611 + 4 * count_exported_byname /* name ptrs */
612 + 2 * count_exported_byname /* ordinals */
613 + name_table_size + strlen (dll_name) + 1);
614}
615
8a5b676c
DD
616/* Fill the exported symbol offsets. The preliminary work has already
617 been done in process_def_file(). */
618
619static void
620fill_exported_offsets (abfd, info)
f0c87f88 621 bfd *abfd ATTRIBUTE_UNUSED;
8a5b676c
DD
622 struct bfd_link_info *info;
623{
f0c87f88 624 int i;
8a5b676c 625 struct bfd_link_hash_entry *blhe;
f0c87f88 626
8a5b676c
DD
627 for (i = 0; i < pe_def_file->num_exports; i++)
628 {
629 char *name = (char *) xmalloc (strlen (pe_def_file->exports[i].internal_name) + 2);
630 if (pe_details->underscored)
631 {
632 *name = '_';
633 strcpy (name + 1, pe_def_file->exports[i].internal_name);
634 }
635 else
636 strcpy (name, pe_def_file->exports[i].internal_name);
637
638 blhe = bfd_link_hash_lookup (info->hash,
639 name,
640 false, false, true);
641
642 if (blhe && (blhe->type == bfd_link_hash_defined))
643 {
644 exported_symbol_offsets[i] = blhe->u.def.value;
645 }
646 free (name);
647 }
648}
649
252b5132
RH
650static void
651fill_edata (abfd, info)
652 bfd *abfd;
1069dd8d 653 struct bfd_link_info *info ATTRIBUTE_UNUSED;
252b5132
RH
654{
655 int i, hint;
656 unsigned char *edirectory;
657 unsigned long *eaddresses;
658 unsigned long *enameptrs;
659 unsigned short *eordinals;
660 unsigned char *enamestr;
661 time_t now;
662
663 time (&now);
664
665 edata_d = (unsigned char *) xmalloc (edata_sz);
666
667 /* Note use of array pointer math here */
668 edirectory = edata_d;
669 eaddresses = (unsigned long *) (edata_d + 40);
670 enameptrs = eaddresses + export_table_size;
671 eordinals = (unsigned short *) (enameptrs + count_exported_byname);
672 enamestr = (char *) (eordinals + count_exported_byname);
673
674#define ERVA(ptr) (((unsigned char *)(ptr) - edata_d) + edata_s->output_section->vma - image_base)
675
676 memset (edata_d, 0, 40);
677 bfd_put_32 (abfd, now, edata_d + 4);
678 if (pe_def_file->version_major != -1)
679 {
680 bfd_put_16 (abfd, pe_def_file->version_major, edata_d + 8);
681 bfd_put_16 (abfd, pe_def_file->version_minor, edata_d + 10);
682 }
683 bfd_put_32 (abfd, ERVA (enamestr), edata_d + 12);
684 strcpy (enamestr, dll_name);
685 enamestr += strlen (enamestr) + 1;
686 bfd_put_32 (abfd, min_ordinal, edata_d + 16);
687 bfd_put_32 (abfd, export_table_size, edata_d + 20);
688 bfd_put_32 (abfd, count_exported_byname, edata_d + 24);
689 bfd_put_32 (abfd, ERVA (eaddresses), edata_d + 28);
690 bfd_put_32 (abfd, ERVA (enameptrs), edata_d + 32);
691 bfd_put_32 (abfd, ERVA (eordinals), edata_d + 36);
692
8a5b676c
DD
693 fill_exported_offsets (abfd, info);
694
252b5132
RH
695 /* Ok, now for the filling in part */
696 hint = 0;
697 for (i = 0; i < export_table_size; i++)
698 {
699 int s = exported_symbols[i];
700 if (s != -1)
701 {
702 struct sec *ssec = exported_symbol_sections[s];
703 unsigned long srva = (exported_symbol_offsets[s]
704 + ssec->output_section->vma
705 + ssec->output_offset);
706
707 bfd_put_32 (abfd, srva - image_base, (void *) (eaddresses + i));
708 if (!pe_def_file->exports[s].flag_noname)
709 {
710 char *ename = pe_def_file->exports[s].name;
711 bfd_put_32 (abfd, ERVA (enamestr), (void *) enameptrs);
712 strcpy (enamestr, ename);
713 enamestr += strlen (enamestr) + 1;
714 bfd_put_16 (abfd, i, (void *) eordinals);
715 enameptrs++;
716 pe_def_file->exports[s].hint = hint++;
717 }
718 eordinals++;
719 }
720 }
721}
722
723/************************************************************************
724
725 Gather all the relocations and build the .reloc section
726
727 ************************************************************************/
728
729static void
730generate_reloc (abfd, info)
731 bfd *abfd;
732 struct bfd_link_info *info;
733{
734
735 /* for .reloc stuff */
c6c37250 736 reloc_data_type *reloc_data;
252b5132
RH
737 int total_relocs = 0;
738 int i;
739 unsigned long sec_page = (unsigned long) (-1);
740 unsigned long page_ptr, page_count;
741 int bi;
742 bfd *b;
743 struct sec *s;
744
745 total_relocs = 0;
746 for (b = info->input_bfds; b; b = b->link_next)
747 for (s = b->sections; s; s = s->next)
748 total_relocs += s->reloc_count;
749
c6c37250 750 reloc_data = (reloc_data_type *) xmalloc (total_relocs * sizeof (reloc_data_type));
252b5132
RH
751
752 total_relocs = 0;
753 bi = 0;
754 for (bi = 0, b = info->input_bfds; b; bi++, b = b->link_next)
755 {
756 arelent **relocs;
757 int relsize, nrelocs, i;
758
759 for (s = b->sections; s; s = s->next)
760 {
761 unsigned long sec_vma = s->output_section->vma + s->output_offset;
762 asymbol **symbols;
763 int nsyms, symsize;
764
765 /* if it's not loaded, we don't need to relocate it this way */
766 if (!(s->output_section->flags & SEC_LOAD))
767 continue;
768
769 /* I don't know why there would be a reloc for these, but I've
770 seen it happen - DJ */
771 if (s->output_section == &bfd_abs_section)
772 continue;
773
774 if (s->output_section->vma == 0)
775 {
776 /* Huh? Shouldn't happen, but punt if it does */
777 einfo ("DJ: zero vma section reloc detected: `%s' #%d f=%d\n",
778 s->output_section->name, s->output_section->index,
779 s->output_section->flags);
780 continue;
781 }
782
783 symsize = bfd_get_symtab_upper_bound (b);
784 symbols = (asymbol **) xmalloc (symsize);
785 nsyms = bfd_canonicalize_symtab (b, symbols);
786
787 relsize = bfd_get_reloc_upper_bound (b, s);
788 relocs = (arelent **) xmalloc ((size_t) relsize);
789 nrelocs = bfd_canonicalize_reloc (b, s, relocs, symbols);
790
791 for (i = 0; i < nrelocs; i++)
792 {
793 if (!relocs[i]->howto->pc_relative
c6c37250 794 && relocs[i]->howto->type != pe_details->imagebase_reloc)
252b5132 795 {
c6c37250
DD
796 bfd_vma sym_vma;
797 struct symbol_cache_entry *sym = *relocs[i]->sym_ptr_ptr;
798 sym_vma = (relocs[i]->addend
799 + sym->value
800 + sym->section->vma
801 + sym->section->output_offset
802 + sym->section->output_section->vma);
803 reloc_data[total_relocs].vma = sec_vma + relocs[i]->address;
344a211f
NC
804
805#define BITS_AND_SHIFT(bits, shift) (bits * 1000 | shift)
806
807 switch BITS_AND_SHIFT (relocs[i]->howto->bitsize,
808 relocs[i]->howto->rightshift)
252b5132 809 {
344a211f 810 case BITS_AND_SHIFT (32, 0):
c6c37250
DD
811 reloc_data[total_relocs].type = 3;
812 total_relocs++;
252b5132 813 break;
344a211f
NC
814 case BITS_AND_SHIFT (16, 0):
815 reloc_data[total_relocs].type = 2;
816 total_relocs++;
817 break;
818 case BITS_AND_SHIFT (16, 16):
819 reloc_data[total_relocs].type = 4;
820 /* FIXME: we can't know the symbol's right value yet,
821 but we probably can safely assume that CE will relocate
822 us in 64k blocks, so leaving it zero is safe. */
823 reloc_data[total_relocs].extra = 0;
824 total_relocs++;
825 break;
826 case BITS_AND_SHIFT (26, 2):
827 reloc_data[total_relocs].type = 5;
828 total_relocs++;
829 break;
252b5132
RH
830 default:
831 /* xgettext:c-format */
832 einfo (_("%XError: %d-bit reloc in dll\n"),
833 relocs[i]->howto->bitsize);
834 break;
835 }
836 }
837 }
838 free (relocs);
839 /* Warning: the allocated symbols are remembered in BFD and reused
840 later, so don't free them! */
841 /* free (symbols); */
842 }
843 }
844
845 /* At this point, we have total_relocs relocation addresses in
846 reloc_addresses, which are all suitable for the .reloc section.
847 We must now create the new sections. */
848
c6c37250 849 qsort (reloc_data, total_relocs, sizeof (*reloc_data), reloc_sort);
252b5132
RH
850
851 for (i = 0; i < total_relocs; i++)
852 {
c6c37250 853 unsigned long this_page = (reloc_data[i].vma >> 12);
344a211f 854
252b5132
RH
855 if (this_page != sec_page)
856 {
857 reloc_sz = (reloc_sz + 3) & ~3; /* 4-byte align */
858 reloc_sz += 8;
859 sec_page = this_page;
860 }
344a211f 861
252b5132 862 reloc_sz += 2;
344a211f
NC
863
864 if (reloc_data[i].type == 4)
865 reloc_sz += 2;
252b5132
RH
866 }
867 reloc_sz = (reloc_sz + 3) & ~3; /* 4-byte align */
868
869 reloc_d = (unsigned char *) xmalloc (reloc_sz);
870
871 sec_page = (unsigned long) (-1);
872 reloc_sz = 0;
873 page_ptr = (unsigned long) (-1);
874 page_count = 0;
875 for (i = 0; i < total_relocs; i++)
876 {
c6c37250 877 unsigned long rva = reloc_data[i].vma - image_base;
252b5132
RH
878 unsigned long this_page = (rva & ~0xfff);
879 if (this_page != sec_page)
880 {
881 while (reloc_sz & 3)
882 reloc_d[reloc_sz++] = 0;
883 if (page_ptr != (unsigned long) (-1))
884 bfd_put_32 (abfd, reloc_sz - page_ptr, reloc_d + page_ptr + 4);
885 bfd_put_32 (abfd, this_page, reloc_d + reloc_sz);
886 page_ptr = reloc_sz;
887 reloc_sz += 8;
888 sec_page = this_page;
889 page_count = 0;
890 }
c6c37250
DD
891 bfd_put_16 (abfd, (rva & 0xfff) + (reloc_data[i].type<<12),
892 reloc_d + reloc_sz);
252b5132 893 reloc_sz += 2;
c6c37250
DD
894 if (reloc_data[i].type == 4)
895 {
896 bfd_put_16 (abfd, reloc_data[i].extra, reloc_d + reloc_sz);
897 reloc_sz += 2;
898 }
252b5132
RH
899 page_count++;
900 }
901 while (reloc_sz & 3)
902 reloc_d[reloc_sz++] = 0;
903 if (page_ptr != (unsigned long) (-1))
904 bfd_put_32 (abfd, reloc_sz - page_ptr, reloc_d + page_ptr + 4);
905 while (reloc_sz < reloc_s->_raw_size)
906 reloc_d[reloc_sz++] = 0;
907}
908
909/************************************************************************
910
911 Given the exiting def_file structure, print out a .DEF file that
912 corresponds to it.
913
914 ************************************************************************/
915
916static void
917quoteput (s, f, needs_quotes)
918 char *s;
919 FILE * f;
920 int needs_quotes;
921{
922 char *cp;
923 for (cp = s; *cp; cp++)
924 if (*cp == '\''
925 || *cp == '"'
926 || *cp == '\\'
927 || isspace ((unsigned char) *cp)
928 || *cp == ','
929 || *cp == ';')
930 needs_quotes = 1;
931 if (needs_quotes)
932 {
933 putc ('"', f);
934 while (*s)
935 {
936 if (*s == '"' || *s == '\\')
937 putc ('\\', f);
938 putc (*s, f);
939 s++;
940 }
941 putc ('"', f);
942 }
943 else
944 fputs (s, f);
945}
946
947void
948pe_dll_generate_def_file (pe_out_def_filename)
1069dd8d 949 const char *pe_out_def_filename;
252b5132
RH
950{
951 int i;
952 FILE *out = fopen (pe_out_def_filename, "w");
953 if (out == NULL)
954 {
955 /* xgettext:c-format */
956 einfo (_("%s: Can't open output def file %s\n"),
957 program_name, pe_out_def_filename);
958 }
959
960 if (pe_def_file)
961 {
962 if (pe_def_file->name)
963 {
964 if (pe_def_file->is_dll)
965 fprintf (out, "LIBRARY ");
966 else
967 fprintf (out, "NAME ");
968 quoteput (pe_def_file->name, out, 1);
969 if (pe_data (output_bfd)->pe_opthdr.ImageBase)
970 fprintf (out, " BASE=0x%lx",
971 (unsigned long) pe_data (output_bfd)->pe_opthdr.ImageBase);
972 fprintf (out, "\n");
973 }
974
975 if (pe_def_file->description)
976 {
977 fprintf (out, "DESCRIPTION ");
978 quoteput (pe_def_file->description, out, 1);
979 fprintf (out, "\n");
980 }
981
982 if (pe_def_file->version_minor != -1)
983 fprintf (out, "VERSION %d.%d\n", pe_def_file->version_major,
984 pe_def_file->version_minor);
985 else if (pe_def_file->version_major != -1)
986 fprintf (out, "VERSION %d\n", pe_def_file->version_major);
987
988 if (pe_def_file->stack_reserve != -1 || pe_def_file->heap_reserve != -1)
989 fprintf (out, "\n");
990
991 if (pe_def_file->stack_commit != -1)
992 fprintf (out, "STACKSIZE 0x%x,0x%x\n",
993 pe_def_file->stack_reserve, pe_def_file->stack_commit);
994 else if (pe_def_file->stack_reserve != -1)
995 fprintf (out, "STACKSIZE 0x%x\n", pe_def_file->stack_reserve);
996 if (pe_def_file->heap_commit != -1)
997 fprintf (out, "HEAPSIZE 0x%x,0x%x\n",
998 pe_def_file->heap_reserve, pe_def_file->heap_commit);
999 else if (pe_def_file->heap_reserve != -1)
1000 fprintf (out, "HEAPSIZE 0x%x\n", pe_def_file->heap_reserve);
1001
1002 if (pe_def_file->num_section_defs > 0)
1003 {
1004 fprintf (out, "\nSECTIONS\n\n");
1005 for (i = 0; i < pe_def_file->num_section_defs; i++)
1006 {
1007 fprintf (out, " ");
1008 quoteput (pe_def_file->section_defs[i].name, out, 0);
1009 if (pe_def_file->section_defs[i].class)
1010 {
1011 fprintf (out, " CLASS ");
1012 quoteput (pe_def_file->section_defs[i].class, out, 0);
1013 }
1014 if (pe_def_file->section_defs[i].flag_read)
1015 fprintf (out, " READ");
1016 if (pe_def_file->section_defs[i].flag_write)
1017 fprintf (out, " WRITE");
1018 if (pe_def_file->section_defs[i].flag_execute)
1019 fprintf (out, " EXECUTE");
1020 if (pe_def_file->section_defs[i].flag_shared)
1021 fprintf (out, " SHARED");
1022 fprintf (out, "\n");
1023 }
1024 }
1025
1026 if (pe_def_file->num_exports > 0)
1027 {
1028 fprintf (out, "\nEXPORTS\n\n");
1029 for (i = 0; i < pe_def_file->num_exports; i++)
1030 {
1031 def_file_export *e = pe_def_file->exports + i;
1032 fprintf (out, " ");
1033 quoteput (e->name, out, 0);
1034 if (e->internal_name && strcmp (e->internal_name, e->name))
1035 {
1036 fprintf (out, " = ");
1037 quoteput (e->internal_name, out, 0);
1038 }
1039 if (e->ordinal != -1)
1040 fprintf (out, " @%d", e->ordinal);
1041 if (e->flag_private)
1042 fprintf (out, " PRIVATE");
1043 if (e->flag_constant)
1044 fprintf (out, " CONSTANT");
1045 if (e->flag_noname)
1046 fprintf (out, " NONAME");
1047 if (e->flag_data)
1048 fprintf (out, " DATA");
1049
1050 fprintf (out, "\n");
1051 }
1052 }
1053
1054 if (pe_def_file->num_imports > 0)
1055 {
1056 fprintf (out, "\nIMPORTS\n\n");
1057 for (i = 0; i < pe_def_file->num_imports; i++)
1058 {
1059 def_file_import *im = pe_def_file->imports + i;
1060 fprintf (out, " ");
1061 if (im->internal_name
1062 && (!im->name || strcmp (im->internal_name, im->name)))
1063 {
1064 quoteput (im->internal_name, out, 0);
1065 fprintf (out, " = ");
1066 }
1067 quoteput (im->module->name, out, 0);
1068 fprintf (out, ".");
1069 if (im->name)
1070 quoteput (im->name, out, 0);
1071 else
1072 fprintf (out, "%d", im->ordinal);
1073 fprintf (out, "\n");
1074 }
1075 }
1076 }
1077 else
1078 fprintf (out, _("; no contents available\n"));
1079
1080 if (fclose (out) == EOF)
1081 {
1082 /* xgettext:c-format */
1083 einfo (_("%P: Error closing file `%s'\n"), pe_out_def_filename);
1084 }
1085}
1086
1087/************************************************************************
1088
1089 Generate the import library
1090
1091 ************************************************************************/
1092
1093static asymbol **symtab;
1094static int symptr;
1095static int tmp_seq;
1096static const char *dll_filename;
1097static char *dll_symname;
1098
1099#define UNDSEC (asection *) &bfd_und_section
1100
1101static asection *
1102quick_section(abfd, name, flags, align)
1103 bfd *abfd;
1104 const char *name;
1105 int flags;
1106 int align;
1107{
1108 asection *sec;
1109 asymbol *sym;
1110
1111 sec = bfd_make_section_old_way (abfd, name);
1112 bfd_set_section_flags (abfd, sec, flags
1113 | SEC_ALLOC
1114 | SEC_LOAD
1115 | SEC_KEEP
1116 );
1117 bfd_set_section_alignment (abfd, sec, align);
1118 /* remember to undo this before trying to link internally! */
1119 sec->output_section = sec;
1120
1121 sym = bfd_make_empty_symbol (abfd);
1122 symtab[symptr++] = sym;
1123 sym->name = sec->name;
1124 sym->section = sec;
1125 sym->flags = BSF_LOCAL;
1126 sym->value = 0;
1127
1128 return sec;
1129}
1130
1131static void
1132quick_symbol (abfd, n1, n2, n3, sec, flags, addr)
1133 bfd *abfd;
1134 char *n1;
1135 char *n2;
1136 char *n3;
1137 asection *sec;
1138 int flags;
1139 int addr;
1140{
1141 asymbol *sym;
1142 char *name = (char *) xmalloc (strlen (n1) + strlen (n2) + strlen (n3) + 1);
1143 strcpy (name, n1);
1144 strcat (name, n2);
1145 strcat (name, n3);
1146 sym = bfd_make_empty_symbol (abfd);
1147 sym->name = name;
1148 sym->section = sec;
1149 sym->flags = flags;
1150 sym->value = addr;
1151 symtab[symptr++] = sym;
1152}
1153
1154static arelent *reltab = 0;
1155static int relcount = 0, relsize = 0;
1156
1157static void
1158quick_reloc (abfd, address, which_howto, symidx)
1159 bfd *abfd;
1160 int address;
1161 int which_howto;
1162 int symidx;
1163{
1164 if (relcount >= (relsize-1))
1165 {
1166 relsize += 10;
1167 if (reltab)
1168 reltab = (arelent *) xrealloc (reltab, relsize * sizeof (arelent));
1169 else
1170 reltab = (arelent *) xmalloc (relsize * sizeof (arelent));
1171 }
1172 reltab[relcount].address = address;
1173 reltab[relcount].addend = 0;
1174 reltab[relcount].howto = bfd_reloc_type_lookup (abfd, which_howto);
1175 reltab[relcount].sym_ptr_ptr = symtab + symidx;
1176 relcount++;
1177}
1178
1179static void
1180save_relocs (asection *sec)
1181{
1182 int i;
1183 sec->relocation = reltab;
1184 sec->reloc_count = relcount;
1185 sec->orelocation = (arelent **) xmalloc ((relcount+1) * sizeof (arelent *));
1186 for (i=0; i<relcount; i++)
1187 sec->orelocation[i] = sec->relocation + i;
1188 sec->orelocation[relcount] = 0;
1189 sec->flags |= SEC_RELOC;
1190 reltab = 0;
1191 relcount = relsize = 0;
1192}
1193
1194/*
1195 * .section .idata$2
1196 * .global __head_my_dll
1197 * __head_my_dll:
1198 * .rva hname
1199 * .long 0
1200 * .long 0
1201 * .rva __my_dll_iname
1202 * .rva fthunk
1203 *
1204 * .section .idata$5
1205 * .long 0
1206 * fthunk:
1207 *
1208 * .section .idata$4
1209 * .long 0
1210 * hname:
1211 */
1212
1213static bfd *
1214make_head (parent)
1215 bfd *parent;
1216{
1217 asection *id2, *id5, *id4;
1218 unsigned char *d2, *d5, *d4;
1219 char *oname;
1220 bfd *abfd;
1221
1222 oname = (char *) xmalloc (20);
1223 sprintf (oname, "d%06d.o", tmp_seq);
1224 tmp_seq++;
1225
1226 abfd = bfd_create (oname, parent);
c6c37250 1227 bfd_find_target (pe_details->object_target, abfd);
252b5132
RH
1228 bfd_make_writable (abfd);
1229
1230 bfd_set_format (abfd, bfd_object);
c6c37250 1231 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
252b5132
RH
1232
1233 symptr = 0;
1234 symtab = (asymbol **) xmalloc (6 * sizeof (asymbol *));
1235 id2 = quick_section (abfd, ".idata$2", SEC_HAS_CONTENTS, 2);
1236 id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
1237 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
c6c37250
DD
1238 quick_symbol (abfd, U("_head_"), dll_symname, "", id2, BSF_GLOBAL, 0);
1239 quick_symbol (abfd, U(""), dll_symname, "_iname", UNDSEC, BSF_GLOBAL, 0);
1240
1241 /* OK, pay attention here. I got confused myself looking back at
1242 it. We create a four-byte section to mark the beginning of the
1243 list, and we include an offset of 4 in the section, so that the
1244 pointer to the list points to the *end* of this section, which is
1245 the start of the list of sections from other objects. */
252b5132
RH
1246
1247 bfd_set_section_size (abfd, id2, 20);
1248 d2 = (unsigned char *) xmalloc (20);
1249 id2->contents = d2;
1250 memset (d2, 0, 20);
1251 d2[0] = d2[16] = 4; /* reloc addend */
1252 quick_reloc (abfd, 0, BFD_RELOC_RVA, 2);
1253 quick_reloc (abfd, 12, BFD_RELOC_RVA, 4);
1254 quick_reloc (abfd, 16, BFD_RELOC_RVA, 1);
1255 save_relocs (id2);
1256
1257 bfd_set_section_size (abfd, id5, 4);
1258 d5 = (unsigned char *) xmalloc (4);
1259 id5->contents = d5;
1260 memset (d5, 0, 4);
1261
1262 bfd_set_section_size (abfd, id4, 4);
1263 d4 = (unsigned char *) xmalloc (4);
1264 id4->contents = d4;
1265 memset (d4, 0, 4);
1266
1267 bfd_set_symtab (abfd, symtab, symptr);
1268
1269 bfd_set_section_contents (abfd, id2, d2, 0, 20);
1270 bfd_set_section_contents (abfd, id5, d5, 0, 4);
1271 bfd_set_section_contents (abfd, id4, d4, 0, 4);
1272
1273 bfd_make_readable (abfd);
1274 return abfd;
1275}
1276
1277/*
1278 * .section .idata$4
1279 * .long 0
1280 * .section .idata$5
1281 * .long 0
1282 * .section idata$7
1283 * .global __my_dll_iname
1284 *__my_dll_iname:
1285 * .asciz "my.dll"
1286 */
1287
1288static bfd *
1289make_tail (parent)
1290 bfd *parent;
1291{
1292 asection *id4, *id5, *id7;
1293 unsigned char *d4, *d5, *d7;
1294 int len;
1295 char *oname;
1296 bfd *abfd;
1297
1298 oname = (char *) xmalloc (20);
1299 sprintf (oname, "d%06d.o", tmp_seq);
1300 tmp_seq++;
1301
1302 abfd = bfd_create (oname, parent);
c6c37250 1303 bfd_find_target (pe_details->object_target, abfd);
252b5132
RH
1304 bfd_make_writable (abfd);
1305
1306 bfd_set_format (abfd, bfd_object);
c6c37250 1307 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
252b5132
RH
1308
1309 symptr = 0;
1310 symtab = (asymbol **) xmalloc (5 * sizeof (asymbol *));
1311 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
1312 id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
1313 id7 = quick_section (abfd, ".idata$7", SEC_HAS_CONTENTS, 2);
c6c37250 1314 quick_symbol (abfd, U(""), dll_symname, "_iname", id7, BSF_GLOBAL, 0);
252b5132
RH
1315
1316 bfd_set_section_size (abfd, id4, 4);
1317 d4 = (unsigned char *) xmalloc (4);
1318 id4->contents = d4;
1319 memset (d4, 0, 4);
1320
1321 bfd_set_section_size (abfd, id5, 4);
1322 d5 = (unsigned char *) xmalloc (4);
1323 id5->contents = d5;
1324 memset (d5, 0, 4);
1325
1326 len = strlen (dll_filename)+1;
1327 if (len & 1)
1328 len ++;
1329 bfd_set_section_size (abfd, id7, len);
1330 d7 = (unsigned char *) xmalloc (len);
1331 id7->contents = d7;
1332 strcpy (d7, dll_filename);
1333
1334 bfd_set_symtab (abfd, symtab, symptr);
1335
1336 bfd_set_section_contents (abfd, id4, d4, 0, 4);
1337 bfd_set_section_contents (abfd, id5, d5, 0, 4);
1338 bfd_set_section_contents (abfd, id7, d7, 0, len);
1339
1340 bfd_make_readable (abfd);
1341 return abfd;
1342}
1343
1344/*
1345 * .text
1346 * .global _function
1347 * .global ___imp_function
1348 * .global __imp__function
1349 *_function:
1350 * jmp *__imp__function:
1351 *
1352 * .section idata$7
1353 * .long __head_my_dll
1354 *
1355 * .section .idata$5
1356 *___imp_function:
1357 *__imp__function:
1358 *iat?
1359 * .section .idata$4
1360 *iat?
1361 * .section .idata$6
1362 *ID<ordinal>:
1363 * .short <hint>
1364 * .asciz "function" xlate? (add underscore, kill at)
1365 */
1366
1367static unsigned char jmp_ix86_bytes[] = {
1368 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x90, 0x90
1369};
1370
344a211f
NC
1371/*
1372 *_function:
1373 * mov.l ip+8,r0
1374 * mov.l @r0,r0
1375 * jmp @r0
1376 * nop
1377 * .dw __imp_function
1378 */
1379
1380static unsigned char jmp_sh_bytes[] = {
1381 0x01, 0xd0, 0x02, 0x60, 0x2b, 0x40, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00
1382};
1383
1384/*
1385 *_function:
1386 * lui $t0,<high:__imp_function>
1387 * lw $t0,<low:__imp_function>
1388 * jr $t0
1389 * nop
1390 */
1391
1392static unsigned char jmp_mips_bytes[] = {
1393 0x00, 0x00, 0x08, 0x3c, 0x00, 0x00, 0x08, 0x8d,
1394 0x08, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00
1395};
252b5132
RH
1396
1397static bfd *
1398make_one (exp, parent)
1399 def_file_export *exp;
1400 bfd *parent;
1401{
1402 asection *tx, *id7, *id5, *id4, *id6;
f0c87f88 1403 unsigned char *td, *d7, *d5, *d4, *d6 = NULL;
252b5132
RH
1404 int len;
1405 char *oname;
1406 bfd *abfd;
f0c87f88
NC
1407 unsigned char *jmp_bytes = NULL;
1408 int jmp_byte_count = 0;
c6c37250
DD
1409
1410 switch (pe_details->pe_arch)
1411 {
1412 case PE_ARCH_i386:
1413 jmp_bytes = jmp_ix86_bytes;
1414 jmp_byte_count = sizeof (jmp_ix86_bytes);
1415 break;
344a211f
NC
1416 case PE_ARCH_sh:
1417 jmp_bytes = jmp_sh_bytes;
1418 jmp_byte_count = sizeof (jmp_sh_bytes);
1419 break;
1420 case PE_ARCH_mips:
1421 jmp_bytes = jmp_mips_bytes;
1422 jmp_byte_count = sizeof (jmp_mips_bytes);
1423 break;
c6c37250 1424 }
252b5132
RH
1425
1426 oname = (char *) xmalloc (20);
1427 sprintf (oname, "d%06d.o", tmp_seq);
1428 tmp_seq++;
1429
1430 abfd = bfd_create (oname, parent);
c6c37250 1431 bfd_find_target (pe_details->object_target, abfd);
252b5132
RH
1432 bfd_make_writable (abfd);
1433
1434 bfd_set_format (abfd, bfd_object);
c6c37250 1435 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
252b5132
RH
1436
1437 symptr = 0;
1438 symtab = (asymbol **) xmalloc (10 * sizeof (asymbol *));
1439 tx = quick_section (abfd, ".text", SEC_CODE|SEC_HAS_CONTENTS, 2);
1440 id7 = quick_section (abfd, ".idata$7", SEC_HAS_CONTENTS, 2);
1441 id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
1442 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
1443 id6 = quick_section (abfd, ".idata$6", SEC_HAS_CONTENTS, 2);
7c9e78f8
DD
1444 if (! exp->flag_data)
1445 quick_symbol (abfd, U(""), exp->internal_name, "", tx, BSF_GLOBAL, 0);
c6c37250
DD
1446 quick_symbol (abfd, U("_head_"), dll_symname, "", UNDSEC, BSF_GLOBAL, 0);
1447 quick_symbol (abfd, U("__imp_"), exp->internal_name, "", id5, BSF_GLOBAL, 0);
870df5dc
NC
1448 if (pe_dll_compat_implib)
1449 quick_symbol (abfd, U("__imp_"), exp->internal_name, "",
1450 id5, BSF_GLOBAL, 0);
252b5132 1451
c6c37250
DD
1452 bfd_set_section_size (abfd, tx, jmp_byte_count);
1453 td = (unsigned char *) xmalloc (jmp_byte_count);
252b5132 1454 tx->contents = td;
c6c37250
DD
1455 memcpy (td, jmp_bytes, jmp_byte_count);
1456 switch (pe_details->pe_arch)
1457 {
1458 case PE_ARCH_i386:
1459 quick_reloc (abfd, 2, BFD_RELOC_32, 2);
1460 break;
344a211f
NC
1461 case PE_ARCH_sh:
1462 quick_reloc (abfd, 8, BFD_RELOC_32, 2);
1463 break;
1464 case PE_ARCH_mips:
1465 quick_reloc (abfd, 0, BFD_RELOC_HI16_S, 2);
1466 quick_reloc (abfd, 0, BFD_RELOC_LO16, 0); /* MIPS_R_PAIR */
1467 quick_reloc (abfd, 4, BFD_RELOC_LO16, 2);
1468 break;
c6c37250 1469 }
252b5132
RH
1470 save_relocs (tx);
1471
1472 bfd_set_section_size (abfd, id7, 4);
1473 d7 = (unsigned char *) xmalloc (4);
1474 id7->contents = d7;
1475 memset (d7, 0, 4);
1476 quick_reloc (abfd, 0, BFD_RELOC_RVA, 6);
1477 save_relocs (id7);
1478
1479 bfd_set_section_size (abfd, id5, 4);
1480 d5 = (unsigned char *) xmalloc (4);
1481 id5->contents = d5;
1482 memset (d5, 0, 4);
1483 if (exp->flag_noname)
1484 {
1485 d5[0] = exp->ordinal;
1486 d5[1] = exp->ordinal >> 8;
1487 d5[3] = 0x80;
1488 }
1489 else
1490 {
1491 quick_reloc (abfd, 0, BFD_RELOC_RVA, 4);
1492 save_relocs (id5);
1493 }
1494
1495 bfd_set_section_size (abfd, id4, 4);
1496 d4 = (unsigned char *) xmalloc (4);
1497 id4->contents = d4;
1498 memset (d4, 0, 4);
1499 if (exp->flag_noname)
1500 {
1501 d5[0] = exp->ordinal;
1502 d5[1] = exp->ordinal >> 8;
1503 d5[3] = 0x80;
1504 }
1505 else
1506 {
1507 quick_reloc (abfd, 0, BFD_RELOC_RVA, 4);
1508 save_relocs (id4);
1509 }
1510
1511 if (exp->flag_noname)
1512 {
1513 len = 0;
1514 bfd_set_section_size (abfd, id6, 0);
1515 }
1516 else
1517 {
1518 len = strlen (exp->name) + 3;
1519 if (len & 1)
1520 len++;
1521 bfd_set_section_size (abfd, id6, len);
1522 d6 = (unsigned char *) xmalloc (len);
1523 id6->contents = d6;
1524 memset (d6, 0, len);
1525 d6[0] = exp->hint & 0xff;
1526 d6[1] = exp->hint >> 8;
1527 strcpy (d6+2, exp->name);
1528 }
1529
1530 bfd_set_symtab (abfd, symtab, symptr);
1531
c6c37250 1532 bfd_set_section_contents (abfd, tx, td, 0, jmp_byte_count);
252b5132
RH
1533 bfd_set_section_contents (abfd, id7, d7, 0, 4);
1534 bfd_set_section_contents (abfd, id5, d5, 0, 4);
1535 bfd_set_section_contents (abfd, id4, d4, 0, 4);
1536 if (!exp->flag_noname)
1537 bfd_set_section_contents (abfd, id6, d6, 0, len);
1538
1539 bfd_make_readable (abfd);
1540 return abfd;
1541}
1542
1543void
1544pe_dll_generate_implib (def, impfilename)
1545 def_file *def;
1069dd8d 1546 const char *impfilename;
252b5132
RH
1547{
1548 int i;
1549 bfd *ar_head;
1550 bfd *ar_tail;
1551 bfd *outarch;
1552 bfd *head = 0;
1553
5aaace27 1554 dll_filename = (def->name) ? def->name : dll_name;
252b5132
RH
1555 dll_symname = xstrdup (dll_filename);
1556 for (i=0; dll_symname[i]; i++)
1557 if (!isalnum ((unsigned char) dll_symname[i]))
1558 dll_symname[i] = '_';
1559
1560 unlink (impfilename);
1561
1562 outarch = bfd_openw (impfilename, 0);
1563
1564 if (!outarch)
1565 {
1566 /* xgettext:c-format */
1567 einfo (_("%XCan't open .lib file: %s\n"), impfilename);
1568 return;
1569 }
1570
1571 /* xgettext:c-format */
1572 einfo (_("Creating library file: %s\n"), impfilename);
1573
1574 bfd_set_format (outarch, bfd_archive);
1575 outarch->has_armap = 1;
1576
1577 /* Work out a reasonable size of things to put onto one line. */
1578
1579 ar_head = make_head (outarch);
252b5132
RH
1580
1581 for (i = 0; i<def->num_exports; i++)
1582 {
1583 /* The import library doesn't know about the internal name */
1584 char *internal = def->exports[i].internal_name;
1585 bfd *n;
1586 def->exports[i].internal_name = def->exports[i].name;
1587 n = make_one (def->exports+i, outarch);
1588 n->next = head;
1589 head = n;
1590 def->exports[i].internal_name = internal;
1591 }
1592
c6c37250
DD
1593 ar_tail = make_tail (outarch);
1594
1595 if (ar_head == NULL || ar_tail == NULL)
1596 return;
1597
252b5132
RH
1598 /* Now stick them all into the archive */
1599
1600 ar_head->next = head;
1601 ar_tail->next = ar_head;
1602 head = ar_tail;
1603
1604 if (! bfd_set_archive_head (outarch, head))
1605 einfo ("%Xbfd_set_archive_head: %s\n", bfd_errmsg (bfd_get_error ()));
1606
1607 if (! bfd_close (outarch))
1608 einfo ("%Xbfd_close %s: %s\n", impfilename, bfd_errmsg (bfd_get_error ()));
1609
1610 while (head != NULL)
1611 {
1612 bfd *n = head->next;
1613 bfd_close (head);
1614 head = n;
1615 }
1616}
1617
1618static void
1619add_bfd_to_link (abfd, name, link_info)
1620 bfd *abfd;
1621 char *name;
1622 struct bfd_link_info *link_info;
1623{
1624 lang_input_statement_type *fake_file;
1625 fake_file = lang_add_input_file (name,
1626 lang_input_file_is_fake_enum,
1627 NULL);
1628 fake_file->the_bfd = abfd;
1629 ldlang_add_file (fake_file);
1630 if (!bfd_link_add_symbols (abfd, link_info))
1631 einfo ("%Xaddsym %s: %s\n", name, bfd_errmsg (bfd_get_error ()));
1632}
1633
1634void
1635pe_process_import_defs (output_bfd, link_info)
1636 bfd *output_bfd;
1637 struct bfd_link_info *link_info;
1638{
1639 def_file_module *module;
c6c37250 1640 pe_dll_id_target(bfd_get_target (output_bfd));
252b5132
RH
1641
1642 if (!pe_def_file)
1643 return;
1644
1645 for (module = pe_def_file->modules; module; module = module->next)
1646 {
1647 int i, do_this_dll;
1648
1649 dll_filename = module->name;
1650 dll_symname = xstrdup (module->name);
1651 for (i=0; dll_symname[i]; i++)
1652 if (!isalnum (dll_symname[i]))
1653 dll_symname[i] = '_';
1654
1655 do_this_dll = 0;
1656
1657 for (i=0; i<pe_def_file->num_imports; i++)
1658 if (pe_def_file->imports[i].module == module)
1659 {
1660 def_file_export exp;
1661 struct bfd_link_hash_entry *blhe;
1662
1663 /* see if we need this import */
1664 char *name = (char *) xmalloc (strlen (pe_def_file->imports[i].internal_name) + 2);
c6c37250 1665 sprintf (name, "%s%s", U(""), pe_def_file->imports[i].internal_name);
252b5132
RH
1666 blhe = bfd_link_hash_lookup (link_info->hash, name,
1667 false, false, false);
1668 free (name);
1669 if (blhe && blhe->type == bfd_link_hash_undefined)
1670 {
1671 bfd *one;
1672 /* we do */
1673 if (!do_this_dll)
1674 {
1675 bfd *ar_head = make_head (output_bfd);
1676 add_bfd_to_link (ar_head, ar_head->filename, link_info);
1677 do_this_dll = 1;
1678 }
1679 exp.internal_name = pe_def_file->imports[i].internal_name;
1680 exp.name = pe_def_file->imports[i].name;
1681 exp.ordinal = pe_def_file->imports[i].ordinal;
1682 exp.hint = exp.ordinal >= 0 ? exp.ordinal : 0;
1683 exp.flag_private = 0;
1684 exp.flag_constant = 0;
1685 exp.flag_data = 0;
1686 exp.flag_noname = exp.name ? 0 : 1;
1687 one = make_one (&exp, output_bfd);
1688 add_bfd_to_link (one, one->filename, link_info);
1689 }
1690 }
1691 if (do_this_dll)
1692 {
1693 bfd *ar_tail = make_tail (output_bfd);
1694 add_bfd_to_link (ar_tail, ar_tail->filename, link_info);
1695 }
1696
1697 free (dll_symname);
1698 }
1699}
1700
1701/************************************************************************
1702
1703 We were handed a *.DLL file. Parse it and turn it into a set of
1704 IMPORTS directives in the def file. Return true if the file was
1705 handled, false if not.
1706
1707 ************************************************************************/
1708
1709static unsigned int
1710pe_get16 (abfd, where)
1711 bfd *abfd;
1712 int where;
1713{
1714 unsigned char b[2];
1715 bfd_seek (abfd, where, SEEK_SET);
1716 bfd_read (b, 1, 2, abfd);
1717 return b[0] + (b[1]<<8);
1718}
1719
1720static unsigned int
1721pe_get32 (abfd, where)
1722 bfd *abfd;
1723 int where;
1724{
1725 unsigned char b[4];
1726 bfd_seek (abfd, where, SEEK_SET);
1727 bfd_read (b, 1, 4, abfd);
1728 return b[0] + (b[1]<<8) + (b[2]<<16) + (b[3]<<24);
1729}
1730
1731#if 0 /* This is not currently used. */
1732
1733static unsigned int
1734pe_as16 (ptr)
1735 void *ptr;
1736{
1737 unsigned char *b = ptr;
1738 return b[0] + (b[1]<<8);
1739}
1740
1741#endif
1742
1743static unsigned int
1744pe_as32 (ptr)
1745 void *ptr;
1746{
1747 unsigned char *b = ptr;
1748 return b[0] + (b[1]<<8) + (b[2]<<16) + (b[3]<<24);
1749}
1750
1751boolean
1752pe_implied_import_dll (filename)
1069dd8d 1753 const char *filename;
252b5132
RH
1754{
1755 bfd *dll;
1756 unsigned long pe_header_offset, opthdr_ofs, num_entries, i;
1757 unsigned long export_rva, export_size, nsections, secptr, expptr;
1758 unsigned char *expdata, *erva;
1759 unsigned long name_rvas, ordinals, nexp, ordbase;
1069dd8d 1760 const char *dll_name;
252b5132
RH
1761
1762 /* No, I can't use bfd here. kernel32.dll puts its export table in
1763 the middle of the .rdata section. */
1764
c6c37250 1765 dll = bfd_openr (filename, pe_details->target_name);
252b5132
RH
1766 if (!dll)
1767 {
1768 einfo ("%Xopen %s: %s\n", filename, bfd_errmsg (bfd_get_error ()));
1769 return false;
1770 }
1771 /* PEI dlls seem to be bfd_objects */
1772 if (!bfd_check_format (dll, bfd_object))
1773 {
1774 einfo ("%X%s: this doesn't appear to be a DLL\n", filename);
1775 return false;
1776 }
1777
1778 dll_name = filename;
1779 for (i=0; filename[i]; i++)
1780 if (filename[i] == '/' || filename[i] == '\\' || filename[i] == ':')
1781 dll_name = filename + i + 1;
1782
1783 pe_header_offset = pe_get32 (dll, 0x3c);
1784 opthdr_ofs = pe_header_offset + 4 + 20;
1785 num_entries = pe_get32 (dll, opthdr_ofs + 92);
1786 if (num_entries < 1) /* no exports */
1787 return false;
1788 export_rva = pe_get32 (dll, opthdr_ofs + 96);
1789 export_size = pe_get32 (dll, opthdr_ofs + 100);
1790 nsections = pe_get16 (dll, pe_header_offset + 4 + 2);
1791 secptr = (pe_header_offset + 4 + 20 +
1792 pe_get16 (dll, pe_header_offset + 4 + 16));
1793 expptr = 0;
1794 for (i=0; i<nsections; i++)
1795 {
1796 char sname[8];
1797 unsigned long secptr1 = secptr + 40 * i;
1798 unsigned long vaddr = pe_get32 (dll, secptr1 + 12);
1799 unsigned long vsize = pe_get32 (dll, secptr1 + 16);
1800 unsigned long fptr = pe_get32 (dll, secptr1 + 20);
1801 bfd_seek(dll, secptr1, SEEK_SET);
1802 bfd_read(sname, 1, 8, dll);
1803 if (vaddr <= export_rva && vaddr+vsize > export_rva)
1804 {
1805 expptr = fptr + (export_rva - vaddr);
1806 if (export_rva + export_size > vaddr + vsize)
1807 export_size = vsize - (export_rva - vaddr);
1808 break;
1809 }
1810 }
1811
1812 expdata = (unsigned char *) xmalloc (export_size);
1813 bfd_seek (dll, expptr, SEEK_SET);
1814 bfd_read (expdata, 1, export_size, dll);
1815 erva = expdata - export_rva;
1816
1817 if (pe_def_file == 0)
1818 pe_def_file = def_file_empty();
1819
1820 nexp = pe_as32 (expdata+24);
1821 name_rvas = pe_as32 (expdata+32);
1822 ordinals = pe_as32 (expdata+36);
1823 ordbase = pe_as32 (expdata+16);
1824 for (i=0; i<nexp; i++)
1825 {
1826 unsigned long name_rva = pe_as32 (erva+name_rvas+i*4);
1827 def_file_import *imp;
1828 imp = def_file_add_import (pe_def_file, erva+name_rva, dll_name,
1829 i, 0);
1830 }
1831
1832 return true;
1833}
1834
1835/************************************************************************
1836
1837 These are the main functions, called from the emulation. The first
1838 is called after the bfds are read, so we can guess at how much space
1839 we need. The second is called after everything is placed, so we
1840 can put the right values in place.
1841
1842 ************************************************************************/
1843
1844void
1845pe_dll_build_sections (abfd, info)
1846 bfd *abfd;
1847 struct bfd_link_info *info;
1848{
c6c37250 1849 pe_dll_id_target (bfd_get_target (abfd));
252b5132
RH
1850 process_def_file (abfd, info);
1851
1852 generate_edata (abfd, info);
c6c37250
DD
1853 build_filler_bfd (1);
1854}
1855
1856void
1857pe_exe_build_sections (abfd, info)
1858 bfd *abfd;
1069dd8d 1859 struct bfd_link_info *info ATTRIBUTE_UNUSED;
c6c37250
DD
1860{
1861 pe_dll_id_target (bfd_get_target (abfd));
1862 build_filler_bfd (0);
252b5132
RH
1863}
1864
1865void
1866pe_dll_fill_sections (abfd, info)
1867 bfd *abfd;
1868 struct bfd_link_info *info;
1869{
c6c37250 1870 pe_dll_id_target (bfd_get_target (abfd));
252b5132
RH
1871 image_base = pe_data (abfd)->pe_opthdr.ImageBase;
1872
1873 generate_reloc (abfd, info);
1874 if (reloc_sz > 0)
1875 {
1876 bfd_set_section_size (filler_bfd, reloc_s, reloc_sz);
1877
1878 /* Resize the sections. */
1879 lang_size_sections (stat_ptr->head, abs_output_section,
1880 &stat_ptr->head, 0, (bfd_vma) 0, false);
1881
1882 /* Redo special stuff. */
1883 ldemul_after_allocation ();
1884
1885 /* Do the assignments again. */
1886 lang_do_assignments (stat_ptr->head,
1887 abs_output_section,
1888 (fill_type) 0, (bfd_vma) 0);
1889 }
1890
1891 fill_edata (abfd, info);
1892
1893 pe_data (abfd)->dll = 1;
1894
1895 edata_s->contents = edata_d;
1896 reloc_s->contents = reloc_d;
1897}
c6c37250
DD
1898
1899void
1900pe_exe_fill_sections (abfd, info)
1901 bfd *abfd;
1902 struct bfd_link_info *info;
1903{
1904 pe_dll_id_target (bfd_get_target (abfd));
1905 image_base = pe_data (abfd)->pe_opthdr.ImageBase;
1906
1907 generate_reloc (abfd, info);
1908 if (reloc_sz > 0)
1909 {
1910 bfd_set_section_size (filler_bfd, reloc_s, reloc_sz);
1911
1912 /* Resize the sections. */
1913 lang_size_sections (stat_ptr->head, abs_output_section,
1914 &stat_ptr->head, 0, (bfd_vma) 0, false);
1915
1916 /* Redo special stuff. */
1917 ldemul_after_allocation ();
1918
1919 /* Do the assignments again. */
1920 lang_do_assignments (stat_ptr->head,
1921 abs_output_section,
1922 (fill_type) 0, (bfd_vma) 0);
1923 }
1924 reloc_s->contents = reloc_d;
1925}
This page took 0.134054 seconds and 4 git commands to generate.