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