1 /* Routines to help build PEI-format DLLs (Win32 etc)
2 Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004
3 Free Software Foundation, Inc.
4 Written by DJ Delorie <dj@cygnus.com>
5
6 This file is part of GLD, the Gnu Linker.
7
8 GLD is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2, or (at your option)
11 any later version.
12
13 GLD is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with GLD; see the file COPYING. If not, write to the Free
20 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
21 02111-1307, USA. */
22
23 #include "bfd.h"
24 #include "sysdep.h"
25 #include "bfdlink.h"
26 #include "libiberty.h"
27 #include "safe-ctype.h"
28
29 #include <time.h>
30
31 #include "ld.h"
32 #include "ldexp.h"
33 #include "ldlang.h"
34 #include "ldwrite.h"
35 #include "ldmisc.h"
36 #include <ldgram.h>
37 #include "ldmain.h"
38 #include "ldfile.h"
39 #include "ldemul.h"
40 #include "coff/internal.h"
41 #include "../bfd/libcoff.h"
42 #include "deffile.h"
43 #include "pe-dll.h"
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 /* Auto-import feature by Paul Sokolovsky
55
56 Quick facts:
57
58 1. With this feature on, DLL clients can import variables from DLL
59 without any concern from their side (for example, without any source
60 code modifications).
61
62 2. This is done completely in bounds of the PE specification (to be fair,
63 there's a place where it pokes nose out of, but in practice it works).
64 So, resulting module can be used with any other PE compiler/linker.
65
66 3. Auto-import is fully compatible with standard import method and they
67 can be mixed together.
68
69 4. Overheads: space: 8 bytes per imported symbol, plus 20 for each
70 reference to it; load time: negligible; virtual/physical memory: should be
71 less than effect of DLL relocation, and I sincerely hope it doesn't affect
72 DLL sharability (too much).
73
74 Idea
75
76 The obvious and only way to get rid of dllimport insanity is to make client
77 access variable directly in the DLL, bypassing extra dereference. I.e.,
78 whenever client contains something like
79
80 mov dll_var,%eax,
81
82 address of dll_var in the command should be relocated to point into loaded
83 DLL. The aim is to make OS loader do so, and than make ld help with that.
84 Import section of PE made following way: there's a vector of structures
85 each describing imports from particular DLL. Each such structure points
86 to two other parallel vectors: one holding imported names, and one which
87 will hold address of corresponding imported name. So, the solution is
88 de-vectorize these structures, making import locations be sparse and
89 pointing directly into code. Before continuing, it is worth a note that,
90 while authors strives to make PE act ELF-like, there're some other people
91 make ELF act PE-like: elfvector, ;-) .
92
93 Implementation
94
95 For each reference of data symbol to be imported from DLL (to set of which
96 belong symbols with name <sym>, if __imp_<sym> is found in implib), the
97 import fixup entry is generated. That entry is of type
98 IMAGE_IMPORT_DESCRIPTOR and stored in .idata$3 subsection. Each
99 fixup entry contains pointer to symbol's address within .text section
100 (marked with __fuN_<sym> symbol, where N is integer), pointer to DLL name
101 (so, DLL name is referenced by multiple entries), and pointer to symbol
102 name thunk. Symbol name thunk is singleton vector (__nm_th_<symbol>)
103 pointing to IMAGE_IMPORT_BY_NAME structure (__nm_<symbol>) directly
104 containing imported name. Here comes that "om the edge" problem mentioned
105 above: PE specification rambles that name vector (OriginalFirstThunk)
106 should run in parallel with addresses vector (FirstThunk), i.e. that they
107 should have same number of elements and terminated with zero. We violate
108 this, since FirstThunk points directly into machine code. But in practice,
109 OS loader implemented the sane way: it goes thru OriginalFirstThunk and
110 puts addresses to FirstThunk, not something else. It once again should be
111 noted that dll and symbol name structures are reused across fixup entries
112 and should be there anyway to support standard import stuff, so sustained
113 overhead is 20 bytes per reference. Other question is whether having several
114 IMAGE_IMPORT_DESCRIPTORS for the same DLL is possible. Answer is yes, it is
115 done even by native compiler/linker (libth32's functions are in fact reside
116 in windows9x kernel32.dll, so if you use it, you have two
117 IMAGE_IMPORT_DESCRIPTORS for kernel32.dll). Yet other question is whether
118 referencing the same PE structures several times is valid. The answer is why
119 not, prohibiting that (detecting violation) would require more work on
120 behalf of loader than not doing it.
121
122 See also: ld/emultempl/pe.em. */
123
124 static void add_bfd_to_link (bfd *, const char *, struct bfd_link_info *);
125
126 /* For emultempl/pe.em. */
127
128 def_file * pe_def_file = 0;
129 int pe_dll_export_everything = 0;
130 int pe_dll_do_default_excludes = 1;
131 int pe_dll_kill_ats = 0;
132 int pe_dll_stdcall_aliases = 0;
133 int pe_dll_warn_dup_exports = 0;
134 int pe_dll_compat_implib = 0;
135 int pe_dll_extra_pe_debug = 0;
136
137 /* Static variables and types. */
138
139 static bfd_vma image_base;
140 static bfd *filler_bfd;
141 static struct bfd_section *edata_s, *reloc_s;
142 static unsigned char *edata_d, *reloc_d;
143 static size_t edata_sz, reloc_sz;
144 static int runtime_pseudo_relocs_created = 0;
145
146 typedef struct
147 {
148 char *target_name;
149 char *object_target;
150 unsigned int imagebase_reloc;
151 int pe_arch;
152 int bfd_arch;
153 int underscored;
154 }
155 pe_details_type;
156
157 typedef struct
158 {
159 char *name;
160 int len;
161 }
162 autofilter_entry_type;
163
164 #define PE_ARCH_i386 1
165 #define PE_ARCH_sh 2
166 #define PE_ARCH_mips 3
167 #define PE_ARCH_arm 4
168 #define PE_ARCH_arm_epoc 5
169
170 static pe_details_type pe_detail_list[] =
171 {
172 {
173 "pei-i386",
174 "pe-i386",
175 7 /* R_IMAGEBASE */,
176 PE_ARCH_i386,
177 bfd_arch_i386,
178 1
179 },
180 {
181 "pei-shl",
182 "pe-shl",
183 16 /* R_SH_IMAGEBASE */,
184 PE_ARCH_sh,
185 bfd_arch_sh,
186 1
187 },
188 {
189 "pei-mips",
190 "pe-mips",
191 34 /* MIPS_R_RVA */,
192 PE_ARCH_mips,
193 bfd_arch_mips,
194 0
195 },
196 {
197 "pei-arm-little",
198 "pe-arm-little",
199 11 /* ARM_RVA32 */,
200 PE_ARCH_arm,
201 bfd_arch_arm,
202 1
203 },
204 {
205 "epoc-pei-arm-little",
206 "epoc-pe-arm-little",
207 11 /* ARM_RVA32 */,
208 PE_ARCH_arm_epoc,
209 bfd_arch_arm,
210 0
211 },
212 { NULL, NULL, 0, 0, 0, 0 }
213 };
214
215 static pe_details_type *pe_details;
216
217 static autofilter_entry_type autofilter_symbollist[] =
218 {
219 { "DllMain@12", 10 },
220 { "DllEntryPoint@0", 15 },
221 { "DllMainCRTStartup@12", 20 },
222 { "_cygwin_dll_entry@12", 20 },
223 { "_cygwin_crt0_common@8", 21 },
224 { "_cygwin_noncygwin_dll_entry@12", 30 },
225 { "impure_ptr", 10 },
226 { "_pei386_runtime_relocator", 25 },
227 { "do_pseudo_reloc", 15 },
228 { "cygwin_crt0", 11 },
229 { NULL, 0 }
230 };
231
232 /* Do not specify library suffix explicitly, to allow for dllized versions. */
233 static autofilter_entry_type autofilter_liblist[] =
234 {
235 { "libcygwin", 9 },
236 { "libgcc", 6 },
237 { "libstdc++", 9 },
238 { "libmingw32", 10 },
239 { "libmingwex", 10 },
240 { "libg2c", 6 },
241 { "libsupc++", 9 },
242 { "libobjc", 7 },
243 { "libgcj", 6 },
244 { NULL, 0 }
245 };
246
247 static autofilter_entry_type autofilter_objlist[] =
248 {
249 { "crt0.o", 6 },
250 { "crt1.o", 6 },
251 { "crt2.o", 6 },
252 { "dllcrt1.o", 9 },
253 { "dllcrt2.o", 9 },
254 { "gcrt0.o", 7 },
255 { "gcrt1.o", 7 },
256 { "gcrt2.o", 7 },
257 { "crtbegin.o", 10 },
258 { "crtend.o", 8 },
259 { NULL, 0 }
260 };
261
262 static autofilter_entry_type autofilter_symbolprefixlist[] =
263 {
264 /* { "__imp_", 6 }, */
265 /* Do __imp_ explicitly to save time. */
266 { "__rtti_", 7 },
267 /* Don't re-export auto-imported symbols. */
268 { "_nm_", 4 },
269 { "__builtin_", 10 },
270 /* Don't export symbols specifying internal DLL layout. */
271 { "_head_", 6 },
272 { "_fmode", 6 },
273 { "_impure_ptr", 11 },
274 { "cygwin_attach_dll", 17 },
275 { "cygwin_premain0", 15 },
276 { "cygwin_premain1", 15 },
277 { "cygwin_premain2", 15 },
278 { "cygwin_premain3", 15 },
279 { "environ", 7 },
280 { NULL, 0 }
281 };
282
283 static autofilter_entry_type autofilter_symbolsuffixlist[] =
284 {
285 { "_iname", 6 },
286 { NULL, 0 }
287 };
288
289 #define U(str) (pe_details->underscored ? "_" str : str)
290
291 void
pe_dll_id_target(const char * target)292 pe_dll_id_target (const char *target)
293 {
294 int i;
295
296 for (i = 0; pe_detail_list[i].target_name; i++)
297 if (strcmp (pe_detail_list[i].target_name, target) == 0
298 || strcmp (pe_detail_list[i].object_target, target) == 0)
299 {
300 pe_details = pe_detail_list + i;
301 return;
302 }
303 einfo (_("%XUnsupported PEI architecture: %s\n"), target);
304 exit (1);
305 }
306
307 /* Helper functions for qsort. Relocs must be sorted so that we can write
308 them out by pages. */
309
310 typedef struct
311 {
312 bfd_vma vma;
313 char type;
314 short extra;
315 }
316 reloc_data_type;
317
318 static int
reloc_sort(const void * va,const void * vb)319 reloc_sort (const void *va, const void *vb)
320 {
321 bfd_vma a = ((const reloc_data_type *) va)->vma;
322 bfd_vma b = ((const reloc_data_type *) vb)->vma;
323
324 return (a > b) ? 1 : ((a < b) ? -1 : 0);
325 }
326
327 static int
pe_export_sort(const void * va,const void * vb)328 pe_export_sort (const void *va, const void *vb)
329 {
330 const def_file_export *a = va;
331 const def_file_export *b = vb;
332
333 return strcmp (a->name, b->name);
334 }
335
336 /* Read and process the .DEF file. */
337
338 /* These correspond to the entries in pe_def_file->exports[]. I use
339 exported_symbol_sections[i] to tag whether or not the symbol was
340 defined, since we can't export symbols we don't have. */
341
342 static bfd_vma *exported_symbol_offsets;
343 static struct bfd_section **exported_symbol_sections;
344 static int export_table_size;
345 static int count_exported;
346 static int count_exported_byname;
347 static int count_with_ordinals;
348 static const char *dll_name;
349 static int min_ordinal, max_ordinal;
350 static int *exported_symbols;
351
352 typedef struct exclude_list_struct
353 {
354 char *string;
355 struct exclude_list_struct *next;
356 int type;
357 }
358 exclude_list_struct;
359
360 static struct exclude_list_struct *excludes = 0;
361
362 void
pe_dll_add_excludes(const char * new_excludes,const int type)363 pe_dll_add_excludes (const char *new_excludes, const int type)
364 {
365 char *local_copy;
366 char *exclude_string;
367
368 local_copy = xstrdup (new_excludes);
369
370 exclude_string = strtok (local_copy, ",:");
371 for (; exclude_string; exclude_string = strtok (NULL, ",:"))
372 {
373 struct exclude_list_struct *new_exclude;
374
375 new_exclude = xmalloc (sizeof (struct exclude_list_struct));
376 new_exclude->string = xmalloc (strlen (exclude_string) + 1);
377 strcpy (new_exclude->string, exclude_string);
378 new_exclude->type = type;
379 new_exclude->next = excludes;
380 excludes = new_exclude;
381 }
382
383 free (local_copy);
384 }
385
386
387 /* abfd is a bfd containing n (or NULL)
388 It can be used for contextual checks. */
389
390 static int
auto_export(bfd * abfd,def_file * d,const char * n)391 auto_export (bfd *abfd, def_file *d, const char *n)
392 {
393 int i;
394 struct exclude_list_struct *ex;
395 autofilter_entry_type *afptr;
396 const char * libname = 0;
397 if (abfd && abfd->my_archive)
398 libname = lbasename (abfd->my_archive->filename);
399
400 /* We should not re-export imported stuff. */
401 if (strncmp (n, "_imp__", 6) == 0)
402 return 0;
403
404 for (i = 0; i < d->num_exports; i++)
405 if (strcmp (d->exports[i].name, n) == 0)
406 return 0;
407
408 if (pe_dll_do_default_excludes)
409 {
410 const char * p;
411 int len;
412
413 if (pe_dll_extra_pe_debug)
414 printf ("considering exporting: %s, abfd=%p, abfd->my_arc=%p\n",
415 n, abfd, abfd->my_archive);
416
417 /* First of all, make context checks:
418 Don't export anything from standard libs. */
419 if (libname)
420 {
421 afptr = autofilter_liblist;
422
423 while (afptr->name)
424 {
425 if (strncmp (libname, afptr->name, afptr->len) == 0 )
426 return 0;
427 afptr++;
428 }
429 }
430
431 /* Next, exclude symbols from certain startup objects. */
432
433 if (abfd && (p = lbasename (abfd->filename)))
434 {
435 afptr = autofilter_objlist;
436 while (afptr->name)
437 {
438 if (strcmp (p, afptr->name) == 0)
439 return 0;
440 afptr++;
441 }
442 }
443
444 /* Don't try to blindly exclude all symbols
445 that begin with '__'; this was tried and
446 it is too restrictive. */
447
448 /* Then, exclude specific symbols. */
449 afptr = autofilter_symbollist;
450 while (afptr->name)
451 {
452 if (strcmp (n, afptr->name) == 0)
453 return 0;
454
455 afptr++;
456 }
457
458 /* Next, exclude symbols starting with ... */
459 afptr = autofilter_symbolprefixlist;
460 while (afptr->name)
461 {
462 if (strncmp (n, afptr->name, afptr->len) == 0)
463 return 0;
464
465 afptr++;
466 }
467
468 /* Finally, exclude symbols ending with ... */
469 len = strlen (n);
470 afptr = autofilter_symbolsuffixlist;
471 while (afptr->name)
472 {
473 if ((len >= afptr->len)
474 /* Add 1 to insure match with trailing '\0'. */
475 && strncmp (n + len - afptr->len, afptr->name,
476 afptr->len + 1) == 0)
477 return 0;
478
479 afptr++;
480 }
481 }
482
483 for (ex = excludes; ex; ex = ex->next)
484 {
485 if (ex->type == 1) /* exclude-libs */
486 {
487 if (libname
488 && ((strcmp (libname, ex->string) == 0)
489 || (strcasecmp ("ALL", ex->string) == 0)))
490 return 0;
491 }
492 else if (strcmp (n, ex->string) == 0)
493 return 0;
494 }
495
496 return 1;
497 }
498
499 static void
process_def_file(bfd * abfd ATTRIBUTE_UNUSED,struct bfd_link_info * info)500 process_def_file (bfd *abfd ATTRIBUTE_UNUSED, struct bfd_link_info *info)
501 {
502 int i, j;
503 struct bfd_link_hash_entry *blhe;
504 bfd *b;
505 struct bfd_section *s;
506 def_file_export *e = 0;
507
508 if (!pe_def_file)
509 pe_def_file = def_file_empty ();
510
511 /* First, run around to all the objects looking for the .drectve
512 sections, and push those into the def file too. */
513 for (b = info->input_bfds; b; b = b->link_next)
514 {
515 s = bfd_get_section_by_name (b, ".drectve");
516 if (s)
517 {
518 int size = bfd_get_section_size_before_reloc (s);
519 char *buf = xmalloc (size);
520
521 bfd_get_section_contents (b, s, buf, 0, size);
522 def_file_add_directive (pe_def_file, buf, size);
523 free (buf);
524 }
525 }
526
527 /* If we are not building a DLL, when there are no exports
528 we do not build an export table at all. */
529 if (!pe_dll_export_everything && pe_def_file->num_exports == 0
530 && !info->shared)
531 return;
532
533 /* Now, maybe export everything else the default way. */
534 if (pe_dll_export_everything || pe_def_file->num_exports == 0)
535 {
536 for (b = info->input_bfds; b; b = b->link_next)
537 {
538 asymbol **symbols;
539 int nsyms, symsize;
540
541 symsize = bfd_get_symtab_upper_bound (b);
542 symbols = xmalloc (symsize);
543 nsyms = bfd_canonicalize_symtab (b, symbols);
544
545 for (j = 0; j < nsyms; j++)
546 {
547 /* We should export symbols which are either global or not
548 anything at all. (.bss data is the latter)
549 We should not export undefined symbols. */
550 if (symbols[j]->section != &bfd_und_section
551 && ((symbols[j]->flags & BSF_GLOBAL)
552 || (symbols[j]->flags == BFD_FORT_COMM_DEFAULT_VALUE)))
553 {
554 const char *sn = symbols[j]->name;
555
556 /* We should not re-export imported stuff. */
557 {
558 char *name = xmalloc (strlen (sn) + 2 + 6);
559 sprintf (name, "%s%s", U("_imp_"), sn);
560
561 blhe = bfd_link_hash_lookup (info->hash, name,
562 FALSE, FALSE, FALSE);
563 free (name);
564
565 if (blhe && blhe->type == bfd_link_hash_defined)
566 continue;
567 }
568
569 if (*sn == '_')
570 sn++;
571
572 if (auto_export (b, pe_def_file, sn))
573 {
574 def_file_export *p;
575 p=def_file_add_export (pe_def_file, sn, 0, -1);
576 /* Fill data flag properly, from dlltool.c. */
577 p->flag_data = !(symbols[j]->flags & BSF_FUNCTION);
578 }
579 }
580 }
581 }
582 }
583
584 #undef NE
585 #define NE pe_def_file->num_exports
586
587 /* Canonicalize the export list. */
588 if (pe_dll_kill_ats)
589 {
590 for (i = 0; i < NE; i++)
591 {
592 if (strchr (pe_def_file->exports[i].name, '@'))
593 {
594 /* This will preserve internal_name, which may have been
595 pointing to the same memory as name, or might not
596 have. */
597 int lead_at = (*pe_def_file->exports[i].name == '@');
598 char *tmp = xstrdup (pe_def_file->exports[i].name + lead_at);
599
600 *(strchr (tmp, '@')) = 0;
601 pe_def_file->exports[i].name = tmp;
602 }
603 }
604 }
605
606 if (pe_dll_stdcall_aliases)
607 {
608 for (i = 0; i < NE; i++)
609 {
610 if (strchr (pe_def_file->exports[i].name, '@'))
611 {
612 int lead_at = (*pe_def_file->exports[i].name == '@');
613 char *tmp = xstrdup (pe_def_file->exports[i].name + lead_at);
614
615 *(strchr (tmp, '@')) = 0;
616 if (auto_export (NULL, pe_def_file, tmp))
617 def_file_add_export (pe_def_file, tmp,
618 pe_def_file->exports[i].internal_name,
619 -1);
620 else
621 free (tmp);
622 }
623 }
624 }
625
626 /* Convenience, but watch out for it changing. */
627 e = pe_def_file->exports;
628
629 exported_symbol_offsets = xmalloc (NE * sizeof (bfd_vma));
630 exported_symbol_sections = xmalloc (NE * sizeof (struct bfd_section *));
631
632 memset (exported_symbol_sections, 0, NE * sizeof (struct bfd_section *));
633 max_ordinal = 0;
634 min_ordinal = 65536;
635 count_exported = 0;
636 count_exported_byname = 0;
637 count_with_ordinals = 0;
638
639 qsort (pe_def_file->exports, NE, sizeof (pe_def_file->exports[0]),
640 pe_export_sort);
641 for (i = 0, j = 0; i < NE; i++)
642 {
643 if (i > 0 && strcmp (e[i].name, e[i - 1].name) == 0)
644 {
645 /* This is a duplicate. */
646 if (e[j - 1].ordinal != -1
647 && e[i].ordinal != -1
648 && e[j - 1].ordinal != e[i].ordinal)
649 {
650 if (pe_dll_warn_dup_exports)
651 /* xgettext:c-format */
652 einfo (_("%XError, duplicate EXPORT with ordinals: %s (%d vs %d)\n"),
653 e[j - 1].name, e[j - 1].ordinal, e[i].ordinal);
654 }
655 else
656 {
657 if (pe_dll_warn_dup_exports)
658 /* xgettext:c-format */
659 einfo (_("Warning, duplicate EXPORT: %s\n"),
660 e[j - 1].name);
661 }
662
663 if (e[i].ordinal != -1)
664 e[j - 1].ordinal = e[i].ordinal;
665 e[j - 1].flag_private |= e[i].flag_private;
666 e[j - 1].flag_constant |= e[i].flag_constant;
667 e[j - 1].flag_noname |= e[i].flag_noname;
668 e[j - 1].flag_data |= e[i].flag_data;
669 }
670 else
671 {
672 if (i != j)
673 e[j] = e[i];
674 j++;
675 }
676 }
677 pe_def_file->num_exports = j; /* == NE */
678
679 for (i = 0; i < NE; i++)
680 {
681 char *name;
682
683 name = xmalloc (strlen (pe_def_file->exports[i].internal_name) + 2);
684 if (pe_details->underscored
685 && (*pe_def_file->exports[i].internal_name != '@'))
686 {
687 *name = '_';
688 strcpy (name + 1, pe_def_file->exports[i].internal_name);
689 }
690 else
691 strcpy (name, pe_def_file->exports[i].internal_name);
692
693 blhe = bfd_link_hash_lookup (info->hash,
694 name,
695 FALSE, FALSE, TRUE);
696
697 if (blhe
698 && (blhe->type == bfd_link_hash_defined
699 || (blhe->type == bfd_link_hash_common)))
700 {
701 count_exported++;
702 if (!pe_def_file->exports[i].flag_noname)
703 count_exported_byname++;
704
705 /* Only fill in the sections. The actual offsets are computed
706 in fill_exported_offsets() after common symbols are laid
707 out. */
708 if (blhe->type == bfd_link_hash_defined)
709 exported_symbol_sections[i] = blhe->u.def.section;
710 else
711 exported_symbol_sections[i] = blhe->u.c.p->section;
712
713 if (pe_def_file->exports[i].ordinal != -1)
714 {
715 if (max_ordinal < pe_def_file->exports[i].ordinal)
716 max_ordinal = pe_def_file->exports[i].ordinal;
717 if (min_ordinal > pe_def_file->exports[i].ordinal)
718 min_ordinal = pe_def_file->exports[i].ordinal;
719 count_with_ordinals++;
720 }
721 }
722 else if (blhe && blhe->type == bfd_link_hash_undefined)
723 {
724 /* xgettext:c-format */
725 einfo (_("%XCannot export %s: symbol not defined\n"),
726 pe_def_file->exports[i].internal_name);
727 }
728 else if (blhe)
729 {
730 /* xgettext:c-format */
731 einfo (_("%XCannot export %s: symbol wrong type (%d vs %d)\n"),
732 pe_def_file->exports[i].internal_name,
733 blhe->type, bfd_link_hash_defined);
734 }
735 else
736 {
737 /* xgettext:c-format */
738 einfo (_("%XCannot export %s: symbol not found\n"),
739 pe_def_file->exports[i].internal_name);
740 }
741 free (name);
742 }
743 }
744
745 /* Build the bfd that will contain .edata and .reloc sections. */
746
747 static void
build_filler_bfd(int include_edata)748 build_filler_bfd (int include_edata)
749 {
750 lang_input_statement_type *filler_file;
751 filler_file = lang_add_input_file ("dll stuff",
752 lang_input_file_is_fake_enum,
753 NULL);
754 filler_file->the_bfd = filler_bfd = bfd_create ("dll stuff", output_bfd);
755 if (filler_bfd == NULL
756 || !bfd_set_arch_mach (filler_bfd,
757 bfd_get_arch (output_bfd),
758 bfd_get_mach (output_bfd)))
759 {
760 einfo ("%X%P: can not create BFD %E\n");
761 return;
762 }
763
764 if (include_edata)
765 {
766 edata_s = bfd_make_section_old_way (filler_bfd, ".edata");
767 if (edata_s == NULL
768 || !bfd_set_section_flags (filler_bfd, edata_s,
769 (SEC_HAS_CONTENTS
770 | SEC_ALLOC
771 | SEC_LOAD
772 | SEC_KEEP
773 | SEC_IN_MEMORY)))
774 {
775 einfo ("%X%P: can not create .edata section: %E\n");
776 return;
777 }
778 bfd_set_section_size (filler_bfd, edata_s, edata_sz);
779 }
780
781 reloc_s = bfd_make_section_old_way (filler_bfd, ".reloc");
782 if (reloc_s == NULL
783 || !bfd_set_section_flags (filler_bfd, reloc_s,
784 (SEC_HAS_CONTENTS
785 | SEC_ALLOC
786 | SEC_LOAD
787 | SEC_KEEP
788 | SEC_IN_MEMORY)))
789 {
790 einfo ("%X%P: can not create .reloc section: %E\n");
791 return;
792 }
793
794 bfd_set_section_size (filler_bfd, reloc_s, 0);
795
796 ldlang_add_file (filler_file);
797 }
798
799 /* Gather all the exported symbols and build the .edata section. */
800
801 static void
generate_edata(bfd * abfd,struct bfd_link_info * info ATTRIBUTE_UNUSED)802 generate_edata (bfd *abfd, struct bfd_link_info *info ATTRIBUTE_UNUSED)
803 {
804 int i, next_ordinal;
805 int name_table_size = 0;
806 const char *dlnp;
807
808 /* First, we need to know how many exported symbols there are,
809 and what the range of ordinals is. */
810 if (pe_def_file->name)
811 dll_name = pe_def_file->name;
812 else
813 {
814 dll_name = abfd->filename;
815
816 for (dlnp = dll_name; *dlnp; dlnp++)
817 if (*dlnp == '\\' || *dlnp == '/' || *dlnp == ':')
818 dll_name = dlnp + 1;
819 }
820
821 if (count_with_ordinals && max_ordinal > count_exported)
822 {
823 if (min_ordinal > max_ordinal - count_exported + 1)
824 min_ordinal = max_ordinal - count_exported + 1;
825 }
826 else
827 {
828 min_ordinal = 1;
829 max_ordinal = count_exported;
830 }
831
832 export_table_size = max_ordinal - min_ordinal + 1;
833 exported_symbols = xmalloc (export_table_size * sizeof (int));
834 for (i = 0; i < export_table_size; i++)
835 exported_symbols[i] = -1;
836
837 /* Now we need to assign ordinals to those that don't have them. */
838 for (i = 0; i < NE; i++)
839 {
840 if (exported_symbol_sections[i])
841 {
842 if (pe_def_file->exports[i].ordinal != -1)
843 {
844 int ei = pe_def_file->exports[i].ordinal - min_ordinal;
845 int pi = exported_symbols[ei];
846
847 if (pi != -1)
848 {
849 /* xgettext:c-format */
850 einfo (_("%XError, ordinal used twice: %d (%s vs %s)\n"),
851 pe_def_file->exports[i].ordinal,
852 pe_def_file->exports[i].name,
853 pe_def_file->exports[pi].name);
854 }
855 exported_symbols[ei] = i;
856 }
857 name_table_size += strlen (pe_def_file->exports[i].name) + 1;
858 }
859 }
860
861 next_ordinal = min_ordinal;
862 for (i = 0; i < NE; i++)
863 if (exported_symbol_sections[i])
864 if (pe_def_file->exports[i].ordinal == -1)
865 {
866 while (exported_symbols[next_ordinal - min_ordinal] != -1)
867 next_ordinal++;
868
869 exported_symbols[next_ordinal - min_ordinal] = i;
870 pe_def_file->exports[i].ordinal = next_ordinal;
871 }
872
873 /* OK, now we can allocate some memory. */
874 edata_sz = (40 /* directory */
875 + 4 * export_table_size /* addresses */
876 + 4 * count_exported_byname /* name ptrs */
877 + 2 * count_exported_byname /* ordinals */
878 + name_table_size + strlen (dll_name) + 1);
879 }
880
881 /* Fill the exported symbol offsets. The preliminary work has already
882 been done in process_def_file(). */
883
884 static void
fill_exported_offsets(bfd * abfd ATTRIBUTE_UNUSED,struct bfd_link_info * info)885 fill_exported_offsets (bfd *abfd ATTRIBUTE_UNUSED, struct bfd_link_info *info)
886 {
887 int i;
888 struct bfd_link_hash_entry *blhe;
889
890 for (i = 0; i < pe_def_file->num_exports; i++)
891 {
892 char *name;
893
894 name = xmalloc (strlen (pe_def_file->exports[i].internal_name) + 2);
895 if (pe_details->underscored
896 && *pe_def_file->exports[i].internal_name != '@')
897 {
898 *name = '_';
899 strcpy (name + 1, pe_def_file->exports[i].internal_name);
900 }
901 else
902 strcpy (name, pe_def_file->exports[i].internal_name);
903
904 blhe = bfd_link_hash_lookup (info->hash,
905 name,
906 FALSE, FALSE, TRUE);
907
908 if (blhe && blhe->type == bfd_link_hash_defined)
909 exported_symbol_offsets[i] = blhe->u.def.value;
910
911 free (name);
912 }
913 }
914
915 static void
fill_edata(bfd * abfd,struct bfd_link_info * info ATTRIBUTE_UNUSED)916 fill_edata (bfd *abfd, struct bfd_link_info *info ATTRIBUTE_UNUSED)
917 {
918 int s, hint;
919 unsigned char *edirectory;
920 unsigned char *eaddresses;
921 unsigned char *enameptrs;
922 unsigned char *eordinals;
923 unsigned char *enamestr;
924 time_t now;
925
926 time (&now);
927
928 edata_d = xmalloc (edata_sz);
929
930 /* Note use of array pointer math here. */
931 edirectory = edata_d;
932 eaddresses = edata_d + 40;
933 enameptrs = eaddresses + 4 * export_table_size;
934 eordinals = enameptrs + 4 * count_exported_byname;
935 enamestr = eordinals + 2 * count_exported_byname;
936
937 #define ERVA(ptr) (((unsigned char *)(ptr) - edata_d) \
938 + edata_s->output_section->vma - image_base)
939
940 memset (edata_d, 0, edata_sz);
941 bfd_put_32 (abfd, now, edata_d + 4);
942 if (pe_def_file->version_major != -1)
943 {
944 bfd_put_16 (abfd, pe_def_file->version_major, edata_d + 8);
945 bfd_put_16 (abfd, pe_def_file->version_minor, edata_d + 10);
946 }
947
948 bfd_put_32 (abfd, ERVA (enamestr), edata_d + 12);
949 strcpy (enamestr, dll_name);
950 enamestr += strlen (enamestr) + 1;
951 bfd_put_32 (abfd, min_ordinal, edata_d + 16);
952 bfd_put_32 (abfd, export_table_size, edata_d + 20);
953 bfd_put_32 (abfd, count_exported_byname, edata_d + 24);
954 bfd_put_32 (abfd, ERVA (eaddresses), edata_d + 28);
955 bfd_put_32 (abfd, ERVA (enameptrs), edata_d + 32);
956 bfd_put_32 (abfd, ERVA (eordinals), edata_d + 36);
957
958 fill_exported_offsets (abfd, info);
959
960 /* Ok, now for the filling in part.
961 Scan alphabetically - ie the ordering in the exports[] table,
962 rather than by ordinal - the ordering in the exported_symbol[]
963 table. See dlltool.c and:
964 http://sources.redhat.com/ml/binutils/2003-04/msg00379.html
965 for more information. */
966 hint = 0;
967 for (s = 0; s < NE; s++)
968 {
969 struct bfd_section *ssec = exported_symbol_sections[s];
970 if (ssec && pe_def_file->exports[s].ordinal != -1)
971 {
972 unsigned long srva = (exported_symbol_offsets[s]
973 + ssec->output_section->vma
974 + ssec->output_offset);
975 int ord = pe_def_file->exports[s].ordinal;
976
977 bfd_put_32 (abfd, srva - image_base,
978 eaddresses + 4 * (ord - min_ordinal));
979
980 if (!pe_def_file->exports[s].flag_noname)
981 {
982 char *ename = pe_def_file->exports[s].name;
983
984 bfd_put_32 (abfd, ERVA (enamestr), enameptrs);
985 enameptrs += 4;
986 strcpy (enamestr, ename);
987 enamestr += strlen (enamestr) + 1;
988 bfd_put_16 (abfd, ord - min_ordinal, eordinals);
989 eordinals += 2;
990 pe_def_file->exports[s].hint = hint++;
991 }
992 }
993 }
994 }
995
996
997 static struct bfd_section *current_sec;
998
999 void
pe_walk_relocs_of_symbol(struct bfd_link_info * info,const char * name,int (* cb)(arelent *,asection *))1000 pe_walk_relocs_of_symbol (struct bfd_link_info *info,
1001 const char *name,
1002 int (*cb) (arelent *, asection *))
1003 {
1004 bfd *b;
1005 asection *s;
1006
1007 for (b = info->input_bfds; b; b = b->link_next)
1008 {
1009 asymbol **symbols;
1010 int nsyms, symsize;
1011
1012 symsize = bfd_get_symtab_upper_bound (b);
1013 symbols = xmalloc (symsize);
1014 nsyms = bfd_canonicalize_symtab (b, symbols);
1015
1016 for (s = b->sections; s; s = s->next)
1017 {
1018 arelent **relocs;
1019 int relsize, nrelocs, i;
1020 int flags = bfd_get_section_flags (b, s);
1021
1022 /* Skip discarded linkonce sections. */
1023 if (flags & SEC_LINK_ONCE
1024 && s->output_section == bfd_abs_section_ptr)
1025 continue;
1026
1027 current_sec = s;
1028
1029 relsize = bfd_get_reloc_upper_bound (b, s);
1030 relocs = xmalloc (relsize);
1031 nrelocs = bfd_canonicalize_reloc (b, s, relocs, symbols);
1032
1033 for (i = 0; i < nrelocs; i++)
1034 {
1035 struct bfd_symbol *sym = *relocs[i]->sym_ptr_ptr;
1036
1037 if (!strcmp (name, sym->name))
1038 cb (relocs[i], s);
1039 }
1040
1041 free (relocs);
1042
1043 /* Warning: the allocated symbols are remembered in BFD and reused
1044 later, so don't free them! */
1045 /* free (symbols); */
1046 }
1047 }
1048 }
1049
1050 /* Gather all the relocations and build the .reloc section. */
1051
1052 static void
generate_reloc(bfd * abfd,struct bfd_link_info * info)1053 generate_reloc (bfd *abfd, struct bfd_link_info *info)
1054 {
1055
1056 /* For .reloc stuff. */
1057 reloc_data_type *reloc_data;
1058 int total_relocs = 0;
1059 int i;
1060 unsigned long sec_page = (unsigned long) -1;
1061 unsigned long page_ptr, page_count;
1062 int bi;
1063 bfd *b;
1064 struct bfd_section *s;
1065
1066 total_relocs = 0;
1067 for (b = info->input_bfds; b; b = b->link_next)
1068 for (s = b->sections; s; s = s->next)
1069 total_relocs += s->reloc_count;
1070
1071 reloc_data = xmalloc (total_relocs * sizeof (reloc_data_type));
1072
1073 total_relocs = 0;
1074 bi = 0;
1075 for (bi = 0, b = info->input_bfds; b; bi++, b = b->link_next)
1076 {
1077 arelent **relocs;
1078 int relsize, nrelocs, i;
1079
1080 for (s = b->sections; s; s = s->next)
1081 {
1082 unsigned long sec_vma = s->output_section->vma + s->output_offset;
1083 asymbol **symbols;
1084 int nsyms, symsize;
1085
1086 /* If it's not loaded, we don't need to relocate it this way. */
1087 if (!(s->output_section->flags & SEC_LOAD))
1088 continue;
1089
1090 /* I don't know why there would be a reloc for these, but I've
1091 seen it happen - DJ */
1092 if (s->output_section == &bfd_abs_section)
1093 continue;
1094
1095 if (s->output_section->vma == 0)
1096 {
1097 /* Huh? Shouldn't happen, but punt if it does. */
1098 einfo ("DJ: zero vma section reloc detected: `%s' #%d f=%d\n",
1099 s->output_section->name, s->output_section->index,
1100 s->output_section->flags);
1101 continue;
1102 }
1103
1104 symsize = bfd_get_symtab_upper_bound (b);
1105 symbols = xmalloc (symsize);
1106 nsyms = bfd_canonicalize_symtab (b, symbols);
1107
1108 relsize = bfd_get_reloc_upper_bound (b, s);
1109 relocs = xmalloc (relsize);
1110 nrelocs = bfd_canonicalize_reloc (b, s, relocs, symbols);
1111
1112 for (i = 0; i < nrelocs; i++)
1113 {
1114 if (pe_dll_extra_pe_debug)
1115 {
1116 struct bfd_symbol *sym = *relocs[i]->sym_ptr_ptr;
1117 printf ("rel: %s\n", sym->name);
1118 }
1119 if (!relocs[i]->howto->pc_relative
1120 && relocs[i]->howto->type != pe_details->imagebase_reloc)
1121 {
1122 bfd_vma sym_vma;
1123 struct bfd_symbol *sym = *relocs[i]->sym_ptr_ptr;
1124
1125 sym_vma = (relocs[i]->addend
1126 + sym->value
1127 + sym->section->vma
1128 + sym->section->output_offset
1129 + sym->section->output_section->vma);
1130 reloc_data[total_relocs].vma = sec_vma + relocs[i]->address;
1131
1132 #define BITS_AND_SHIFT(bits, shift) (bits * 1000 | shift)
1133
1134 switch BITS_AND_SHIFT (relocs[i]->howto->bitsize,
1135 relocs[i]->howto->rightshift)
1136 {
1137 case BITS_AND_SHIFT (32, 0):
1138 reloc_data[total_relocs].type = 3;
1139 total_relocs++;
1140 break;
1141 case BITS_AND_SHIFT (16, 0):
1142 reloc_data[total_relocs].type = 2;
1143 total_relocs++;
1144 break;
1145 case BITS_AND_SHIFT (16, 16):
1146 reloc_data[total_relocs].type = 4;
1147 /* FIXME: we can't know the symbol's right value
1148 yet, but we probably can safely assume that
1149 CE will relocate us in 64k blocks, so leaving
1150 it zero is safe. */
1151 reloc_data[total_relocs].extra = 0;
1152 total_relocs++;
1153 break;
1154 case BITS_AND_SHIFT (26, 2):
1155 reloc_data[total_relocs].type = 5;
1156 total_relocs++;
1157 break;
1158 case BITS_AND_SHIFT (24, 2):
1159 /* FIXME: 0 is ARM_26D, it is defined in bfd/coff-arm.c
1160 Those ARM_xxx definitions should go in proper
1161 header someday. */
1162 if (relocs[i]->howto->type == 0
1163 /* Older GNU linkers used 5 instead of 0 for this reloc. */
1164 || relocs[i]->howto->type == 5)
1165 /* This is an ARM_26D reloc, which is an ARM_26 reloc
1166 that has already been fully processed during a
1167 previous link stage, so ignore it here. */
1168 break;
1169 /* Fall through. */
1170 default:
1171 /* xgettext:c-format */
1172 einfo (_("%XError: %d-bit reloc in dll\n"),
1173 relocs[i]->howto->bitsize);
1174 break;
1175 }
1176 }
1177 }
1178 free (relocs);
1179 /* Warning: the allocated symbols are remembered in BFD and
1180 reused later, so don't free them! */
1181 #if 0
1182 free (symbol);
1183 #endif
1184 }
1185 }
1186
1187 /* At this point, we have total_relocs relocation addresses in
1188 reloc_addresses, which are all suitable for the .reloc section.
1189 We must now create the new sections. */
1190 qsort (reloc_data, total_relocs, sizeof (*reloc_data), reloc_sort);
1191
1192 for (i = 0; i < total_relocs; i++)
1193 {
1194 unsigned long this_page = (reloc_data[i].vma >> 12);
1195
1196 if (this_page != sec_page)
1197 {
1198 reloc_sz = (reloc_sz + 3) & ~3; /* 4-byte align. */
1199 reloc_sz += 8;
1200 sec_page = this_page;
1201 }
1202
1203 reloc_sz += 2;
1204
1205 if (reloc_data[i].type == 4)
1206 reloc_sz += 2;
1207 }
1208
1209 reloc_sz = (reloc_sz + 3) & ~3; /* 4-byte align. */
1210 reloc_d = xmalloc (reloc_sz);
1211 sec_page = (unsigned long) -1;
1212 reloc_sz = 0;
1213 page_ptr = (unsigned long) -1;
1214 page_count = 0;
1215
1216 for (i = 0; i < total_relocs; i++)
1217 {
1218 unsigned long rva = reloc_data[i].vma - image_base;
1219 unsigned long this_page = (rva & ~0xfff);
1220
1221 if (this_page != sec_page)
1222 {
1223 while (reloc_sz & 3)
1224 reloc_d[reloc_sz++] = 0;
1225
1226 if (page_ptr != (unsigned long) -1)
1227 bfd_put_32 (abfd, reloc_sz - page_ptr, reloc_d + page_ptr + 4);
1228
1229 bfd_put_32 (abfd, this_page, reloc_d + reloc_sz);
1230 page_ptr = reloc_sz;
1231 reloc_sz += 8;
1232 sec_page = this_page;
1233 page_count = 0;
1234 }
1235
1236 bfd_put_16 (abfd, (rva & 0xfff) + (reloc_data[i].type << 12),
1237 reloc_d + reloc_sz);
1238 reloc_sz += 2;
1239
1240 if (reloc_data[i].type == 4)
1241 {
1242 bfd_put_16 (abfd, reloc_data[i].extra, reloc_d + reloc_sz);
1243 reloc_sz += 2;
1244 }
1245
1246 page_count++;
1247 }
1248
1249 while (reloc_sz & 3)
1250 reloc_d[reloc_sz++] = 0;
1251
1252 if (page_ptr != (unsigned long) -1)
1253 bfd_put_32 (abfd, reloc_sz - page_ptr, reloc_d + page_ptr + 4);
1254
1255 while (reloc_sz < reloc_s->_raw_size)
1256 reloc_d[reloc_sz++] = 0;
1257 }
1258
1259 /* Given the exiting def_file structure, print out a .DEF file that
1260 corresponds to it. */
1261
1262 static void
quoteput(char * s,FILE * f,int needs_quotes)1263 quoteput (char *s, FILE *f, int needs_quotes)
1264 {
1265 char *cp;
1266
1267 for (cp = s; *cp; cp++)
1268 if (*cp == '\''
1269 || *cp == '"'
1270 || *cp == '\\'
1271 || ISSPACE (*cp)
1272 || *cp == ','
1273 || *cp == ';')
1274 needs_quotes = 1;
1275
1276 if (needs_quotes)
1277 {
1278 putc ('"', f);
1279
1280 while (*s)
1281 {
1282 if (*s == '"' || *s == '\\')
1283 putc ('\\', f);
1284
1285 putc (*s, f);
1286 s++;
1287 }
1288
1289 putc ('"', f);
1290 }
1291 else
1292 fputs (s, f);
1293 }
1294
1295 void
pe_dll_generate_def_file(const char * pe_out_def_filename)1296 pe_dll_generate_def_file (const char *pe_out_def_filename)
1297 {
1298 int i;
1299 FILE *out = fopen (pe_out_def_filename, "w");
1300
1301 if (out == NULL)
1302 /* xgettext:c-format */
1303 einfo (_("%s: Can't open output def file %s\n"),
1304 program_name, pe_out_def_filename);
1305
1306 if (pe_def_file)
1307 {
1308 if (pe_def_file->name)
1309 {
1310 if (pe_def_file->is_dll)
1311 fprintf (out, "LIBRARY ");
1312 else
1313 fprintf (out, "NAME ");
1314
1315 quoteput (pe_def_file->name, out, 1);
1316
1317 if (pe_data (output_bfd)->pe_opthdr.ImageBase)
1318 fprintf (out, " BASE=0x%lx",
1319 (unsigned long) pe_data (output_bfd)->pe_opthdr.ImageBase);
1320 fprintf (out, "\n");
1321 }
1322
1323 if (pe_def_file->description)
1324 {
1325 fprintf (out, "DESCRIPTION ");
1326 quoteput (pe_def_file->description, out, 1);
1327 fprintf (out, "\n");
1328 }
1329
1330 if (pe_def_file->version_minor != -1)
1331 fprintf (out, "VERSION %d.%d\n", pe_def_file->version_major,
1332 pe_def_file->version_minor);
1333 else if (pe_def_file->version_major != -1)
1334 fprintf (out, "VERSION %d\n", pe_def_file->version_major);
1335
1336 if (pe_def_file->stack_reserve != -1 || pe_def_file->heap_reserve != -1)
1337 fprintf (out, "\n");
1338
1339 if (pe_def_file->stack_commit != -1)
1340 fprintf (out, "STACKSIZE 0x%x,0x%x\n",
1341 pe_def_file->stack_reserve, pe_def_file->stack_commit);
1342 else if (pe_def_file->stack_reserve != -1)
1343 fprintf (out, "STACKSIZE 0x%x\n", pe_def_file->stack_reserve);
1344
1345 if (pe_def_file->heap_commit != -1)
1346 fprintf (out, "HEAPSIZE 0x%x,0x%x\n",
1347 pe_def_file->heap_reserve, pe_def_file->heap_commit);
1348 else if (pe_def_file->heap_reserve != -1)
1349 fprintf (out, "HEAPSIZE 0x%x\n", pe_def_file->heap_reserve);
1350
1351 if (pe_def_file->num_section_defs > 0)
1352 {
1353 fprintf (out, "\nSECTIONS\n\n");
1354
1355 for (i = 0; i < pe_def_file->num_section_defs; i++)
1356 {
1357 fprintf (out, " ");
1358 quoteput (pe_def_file->section_defs[i].name, out, 0);
1359
1360 if (pe_def_file->section_defs[i].class)
1361 {
1362 fprintf (out, " CLASS ");
1363 quoteput (pe_def_file->section_defs[i].class, out, 0);
1364 }
1365
1366 if (pe_def_file->section_defs[i].flag_read)
1367 fprintf (out, " READ");
1368
1369 if (pe_def_file->section_defs[i].flag_write)
1370 fprintf (out, " WRITE");
1371
1372 if (pe_def_file->section_defs[i].flag_execute)
1373 fprintf (out, " EXECUTE");
1374
1375 if (pe_def_file->section_defs[i].flag_shared)
1376 fprintf (out, " SHARED");
1377
1378 fprintf (out, "\n");
1379 }
1380 }
1381
1382 if (pe_def_file->num_exports > 0)
1383 {
1384 fprintf (out, "EXPORTS\n");
1385
1386 for (i = 0; i < pe_def_file->num_exports; i++)
1387 {
1388 def_file_export *e = pe_def_file->exports + i;
1389 fprintf (out, " ");
1390 quoteput (e->name, out, 0);
1391
1392 if (e->internal_name && strcmp (e->internal_name, e->name))
1393 {
1394 fprintf (out, " = ");
1395 quoteput (e->internal_name, out, 0);
1396 }
1397
1398 if (e->ordinal != -1)
1399 fprintf (out, " @%d", e->ordinal);
1400
1401 if (e->flag_private)
1402 fprintf (out, " PRIVATE");
1403
1404 if (e->flag_constant)
1405 fprintf (out, " CONSTANT");
1406
1407 if (e->flag_noname)
1408 fprintf (out, " NONAME");
1409
1410 if (e->flag_data)
1411 fprintf (out, " DATA");
1412
1413 fprintf (out, "\n");
1414 }
1415 }
1416
1417 if (pe_def_file->num_imports > 0)
1418 {
1419 fprintf (out, "\nIMPORTS\n\n");
1420
1421 for (i = 0; i < pe_def_file->num_imports; i++)
1422 {
1423 def_file_import *im = pe_def_file->imports + i;
1424 fprintf (out, " ");
1425
1426 if (im->internal_name
1427 && (!im->name || strcmp (im->internal_name, im->name)))
1428 {
1429 quoteput (im->internal_name, out, 0);
1430 fprintf (out, " = ");
1431 }
1432
1433 quoteput (im->module->name, out, 0);
1434 fprintf (out, ".");
1435
1436 if (im->name)
1437 quoteput (im->name, out, 0);
1438 else
1439 fprintf (out, "%d", im->ordinal);
1440
1441 fprintf (out, "\n");
1442 }
1443 }
1444 }
1445 else
1446 fprintf (out, _("; no contents available\n"));
1447
1448 if (fclose (out) == EOF)
1449 /* xgettext:c-format */
1450 einfo (_("%P: Error closing file `%s'\n"), pe_out_def_filename);
1451 }
1452
1453 /* Generate the import library. */
1454
1455 static asymbol **symtab;
1456 static int symptr;
1457 static int tmp_seq;
1458 static const char *dll_filename;
1459 static char *dll_symname;
1460
1461 #define UNDSEC (asection *) &bfd_und_section
1462
1463 static asection *
quick_section(bfd * abfd,const char * name,int flags,int align)1464 quick_section (bfd *abfd, const char *name, int flags, int align)
1465 {
1466 asection *sec;
1467 asymbol *sym;
1468
1469 sec = bfd_make_section_old_way (abfd, name);
1470 bfd_set_section_flags (abfd, sec, flags | SEC_ALLOC | SEC_LOAD | SEC_KEEP);
1471 bfd_set_section_alignment (abfd, sec, align);
1472 /* Remember to undo this before trying to link internally! */
1473 sec->output_section = sec;
1474
1475 sym = bfd_make_empty_symbol (abfd);
1476 symtab[symptr++] = sym;
1477 sym->name = sec->name;
1478 sym->section = sec;
1479 sym->flags = BSF_LOCAL;
1480 sym->value = 0;
1481
1482 return sec;
1483 }
1484
1485 static void
quick_symbol(bfd * abfd,const char * n1,const char * n2,const char * n3,asection * sec,int flags,int addr)1486 quick_symbol (bfd *abfd,
1487 const char *n1,
1488 const char *n2,
1489 const char *n3,
1490 asection *sec,
1491 int flags,
1492 int addr)
1493 {
1494 asymbol *sym;
1495 char *name = xmalloc (strlen (n1) + strlen (n2) + strlen (n3) + 1);
1496
1497 strcpy (name, n1);
1498 strcat (name, n2);
1499 strcat (name, n3);
1500 sym = bfd_make_empty_symbol (abfd);
1501 sym->name = name;
1502 sym->section = sec;
1503 sym->flags = flags;
1504 sym->value = addr;
1505 symtab[symptr++] = sym;
1506 }
1507
1508 static arelent *reltab = 0;
1509 static int relcount = 0, relsize = 0;
1510
1511 static void
quick_reloc(bfd * abfd,int address,int which_howto,int symidx)1512 quick_reloc (bfd *abfd, int address, int which_howto, int symidx)
1513 {
1514 if (relcount >= relsize - 1)
1515 {
1516 relsize += 10;
1517 if (reltab)
1518 reltab = xrealloc (reltab, relsize * sizeof (arelent));
1519 else
1520 reltab = xmalloc (relsize * sizeof (arelent));
1521 }
1522 reltab[relcount].address = address;
1523 reltab[relcount].addend = 0;
1524 reltab[relcount].howto = bfd_reloc_type_lookup (abfd, which_howto);
1525 reltab[relcount].sym_ptr_ptr = symtab + symidx;
1526 relcount++;
1527 }
1528
1529 static void
save_relocs(asection * sec)1530 save_relocs (asection *sec)
1531 {
1532 int i;
1533
1534 sec->relocation = reltab;
1535 sec->reloc_count = relcount;
1536 sec->orelocation = xmalloc ((relcount + 1) * sizeof (arelent *));
1537 for (i = 0; i < relcount; i++)
1538 sec->orelocation[i] = sec->relocation + i;
1539 sec->orelocation[relcount] = 0;
1540 sec->flags |= SEC_RELOC;
1541 reltab = 0;
1542 relcount = relsize = 0;
1543 }
1544
1545 /* .section .idata$2
1546 .global __head_my_dll
1547 __head_my_dll:
1548 .rva hname
1549 .long 0
1550 .long 0
1551 .rva __my_dll_iname
1552 .rva fthunk
1553
1554 .section .idata$5
1555 .long 0
1556 fthunk:
1557
1558 .section .idata$4
1559 .long 0
1560 hname: */
1561
1562 static bfd *
make_head(bfd * parent)1563 make_head (bfd *parent)
1564 {
1565 asection *id2, *id5, *id4;
1566 unsigned char *d2, *d5, *d4;
1567 char *oname;
1568 bfd *abfd;
1569
1570 oname = xmalloc (20);
1571 sprintf (oname, "d%06d.o", tmp_seq);
1572 tmp_seq++;
1573
1574 abfd = bfd_create (oname, parent);
1575 bfd_find_target (pe_details->object_target, abfd);
1576 bfd_make_writable (abfd);
1577
1578 bfd_set_format (abfd, bfd_object);
1579 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
1580
1581 symptr = 0;
1582 symtab = xmalloc (6 * sizeof (asymbol *));
1583 id2 = quick_section (abfd, ".idata$2", SEC_HAS_CONTENTS, 2);
1584 id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
1585 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
1586 quick_symbol (abfd, U ("_head_"), dll_symname, "", id2, BSF_GLOBAL, 0);
1587 quick_symbol (abfd, U (""), dll_symname, "_iname", UNDSEC, BSF_GLOBAL, 0);
1588
1589 /* OK, pay attention here. I got confused myself looking back at
1590 it. We create a four-byte section to mark the beginning of the
1591 list, and we include an offset of 4 in the section, so that the
1592 pointer to the list points to the *end* of this section, which is
1593 the start of the list of sections from other objects. */
1594
1595 bfd_set_section_size (abfd, id2, 20);
1596 d2 = xmalloc (20);
1597 id2->contents = d2;
1598 memset (d2, 0, 20);
1599 d2[0] = d2[16] = 4; /* Reloc addend. */
1600 quick_reloc (abfd, 0, BFD_RELOC_RVA, 2);
1601 quick_reloc (abfd, 12, BFD_RELOC_RVA, 4);
1602 quick_reloc (abfd, 16, BFD_RELOC_RVA, 1);
1603 save_relocs (id2);
1604
1605 bfd_set_section_size (abfd, id5, 4);
1606 d5 = xmalloc (4);
1607 id5->contents = d5;
1608 memset (d5, 0, 4);
1609
1610 bfd_set_section_size (abfd, id4, 4);
1611 d4 = xmalloc (4);
1612 id4->contents = d4;
1613 memset (d4, 0, 4);
1614
1615 bfd_set_symtab (abfd, symtab, symptr);
1616
1617 bfd_set_section_contents (abfd, id2, d2, 0, 20);
1618 bfd_set_section_contents (abfd, id5, d5, 0, 4);
1619 bfd_set_section_contents (abfd, id4, d4, 0, 4);
1620
1621 bfd_make_readable (abfd);
1622 return abfd;
1623 }
1624
1625 /* .section .idata$4
1626 .long 0
1627 .section .idata$5
1628 .long 0
1629 .section idata$7
1630 .global __my_dll_iname
1631 __my_dll_iname:
1632 .asciz "my.dll" */
1633
1634 static bfd *
make_tail(bfd * parent)1635 make_tail (bfd *parent)
1636 {
1637 asection *id4, *id5, *id7;
1638 unsigned char *d4, *d5, *d7;
1639 int len;
1640 char *oname;
1641 bfd *abfd;
1642
1643 oname = xmalloc (20);
1644 sprintf (oname, "d%06d.o", tmp_seq);
1645 tmp_seq++;
1646
1647 abfd = bfd_create (oname, parent);
1648 bfd_find_target (pe_details->object_target, abfd);
1649 bfd_make_writable (abfd);
1650
1651 bfd_set_format (abfd, bfd_object);
1652 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
1653
1654 symptr = 0;
1655 symtab = xmalloc (5 * sizeof (asymbol *));
1656 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
1657 id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
1658 id7 = quick_section (abfd, ".idata$7", SEC_HAS_CONTENTS, 2);
1659 quick_symbol (abfd, U (""), dll_symname, "_iname", id7, BSF_GLOBAL, 0);
1660
1661 bfd_set_section_size (abfd, id4, 4);
1662 d4 = xmalloc (4);
1663 id4->contents = d4;
1664 memset (d4, 0, 4);
1665
1666 bfd_set_section_size (abfd, id5, 4);
1667 d5 = xmalloc (4);
1668 id5->contents = d5;
1669 memset (d5, 0, 4);
1670
1671 len = strlen (dll_filename) + 1;
1672 if (len & 1)
1673 len++;
1674 bfd_set_section_size (abfd, id7, len);
1675 d7 = xmalloc (len);
1676 id7->contents = d7;
1677 strcpy (d7, dll_filename);
1678
1679 bfd_set_symtab (abfd, symtab, symptr);
1680
1681 bfd_set_section_contents (abfd, id4, d4, 0, 4);
1682 bfd_set_section_contents (abfd, id5, d5, 0, 4);
1683 bfd_set_section_contents (abfd, id7, d7, 0, len);
1684
1685 bfd_make_readable (abfd);
1686 return abfd;
1687 }
1688
1689 /* .text
1690 .global _function
1691 .global ___imp_function
1692 .global __imp__function
1693 _function:
1694 jmp *__imp__function:
1695
1696 .section idata$7
1697 .long __head_my_dll
1698
1699 .section .idata$5
1700 ___imp_function:
1701 __imp__function:
1702 iat?
1703 .section .idata$4
1704 iat?
1705 .section .idata$6
1706 ID<ordinal>:
1707 .short <hint>
1708 .asciz "function" xlate? (add underscore, kill at) */
1709
1710 static unsigned char jmp_ix86_bytes[] =
1711 {
1712 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x90, 0x90
1713 };
1714
1715 /* _function:
1716 mov.l ip+8,r0
1717 mov.l @r0,r0
1718 jmp @r0
1719 nop
1720 .dw __imp_function */
1721
1722 static unsigned char jmp_sh_bytes[] =
1723 {
1724 0x01, 0xd0, 0x02, 0x60, 0x2b, 0x40, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00
1725 };
1726
1727 /* _function:
1728 lui $t0,<high:__imp_function>
1729 lw $t0,<low:__imp_function>
1730 jr $t0
1731 nop */
1732
1733 static unsigned char jmp_mips_bytes[] =
1734 {
1735 0x00, 0x00, 0x08, 0x3c, 0x00, 0x00, 0x08, 0x8d,
1736 0x08, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00
1737 };
1738
1739 static bfd *
make_one(def_file_export * exp,bfd * parent)1740 make_one (def_file_export *exp, bfd *parent)
1741 {
1742 asection *tx, *id7, *id5, *id4, *id6;
1743 unsigned char *td = NULL, *d7, *d5, *d4, *d6 = NULL;
1744 int len;
1745 char *oname;
1746 bfd *abfd;
1747 unsigned char *jmp_bytes = NULL;
1748 int jmp_byte_count = 0;
1749
1750 switch (pe_details->pe_arch)
1751 {
1752 case PE_ARCH_i386:
1753 jmp_bytes = jmp_ix86_bytes;
1754 jmp_byte_count = sizeof (jmp_ix86_bytes);
1755 break;
1756 case PE_ARCH_sh:
1757 jmp_bytes = jmp_sh_bytes;
1758 jmp_byte_count = sizeof (jmp_sh_bytes);
1759 break;
1760 case PE_ARCH_mips:
1761 jmp_bytes = jmp_mips_bytes;
1762 jmp_byte_count = sizeof (jmp_mips_bytes);
1763 break;
1764 default:
1765 abort ();
1766 }
1767
1768 oname = xmalloc (20);
1769 sprintf (oname, "d%06d.o", tmp_seq);
1770 tmp_seq++;
1771
1772 abfd = bfd_create (oname, parent);
1773 bfd_find_target (pe_details->object_target, abfd);
1774 bfd_make_writable (abfd);
1775
1776 bfd_set_format (abfd, bfd_object);
1777 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
1778
1779 symptr = 0;
1780 symtab = xmalloc (11 * sizeof (asymbol *));
1781 tx = quick_section (abfd, ".text", SEC_CODE|SEC_HAS_CONTENTS, 2);
1782 id7 = quick_section (abfd, ".idata$7", SEC_HAS_CONTENTS, 2);
1783 id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
1784 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
1785 id6 = quick_section (abfd, ".idata$6", SEC_HAS_CONTENTS, 2);
1786
1787 if (*exp->internal_name == '@')
1788 {
1789 quick_symbol (abfd, U ("_head_"), dll_symname, "", UNDSEC,
1790 BSF_GLOBAL, 0);
1791 if (! exp->flag_data)
1792 quick_symbol (abfd, "", exp->internal_name, "", tx, BSF_GLOBAL, 0);
1793 quick_symbol (abfd, U ("_imp_"), exp->internal_name, "", id5,
1794 BSF_GLOBAL, 0);
1795 /* Fastcall applies only to functions,
1796 so no need for auto-import symbol. */
1797 }
1798 else
1799 {
1800 quick_symbol (abfd, U ("_head_"), dll_symname, "", UNDSEC,
1801 BSF_GLOBAL, 0);
1802 if (! exp->flag_data)
1803 quick_symbol (abfd, U (""), exp->internal_name, "", tx,
1804 BSF_GLOBAL, 0);
1805 quick_symbol (abfd, U ("_imp__"), exp->internal_name, "", id5,
1806 BSF_GLOBAL, 0);
1807 /* Symbol to reference ord/name of imported
1808 data symbol, used to implement auto-import. */
1809 if (exp->flag_data)
1810 quick_symbol (abfd, U("_nm__"), exp->internal_name, "", id6,
1811 BSF_GLOBAL,0);
1812 }
1813 if (pe_dll_compat_implib)
1814 quick_symbol (abfd, U ("__imp_"), exp->internal_name, "", id5,
1815 BSF_GLOBAL, 0);
1816
1817 if (! exp->flag_data)
1818 {
1819 bfd_set_section_size (abfd, tx, jmp_byte_count);
1820 td = xmalloc (jmp_byte_count);
1821 tx->contents = td;
1822 memcpy (td, jmp_bytes, jmp_byte_count);
1823
1824 switch (pe_details->pe_arch)
1825 {
1826 case PE_ARCH_i386:
1827 quick_reloc (abfd, 2, BFD_RELOC_32, 2);
1828 break;
1829 case PE_ARCH_sh:
1830 quick_reloc (abfd, 8, BFD_RELOC_32, 2);
1831 break;
1832 case PE_ARCH_mips:
1833 quick_reloc (abfd, 0, BFD_RELOC_HI16_S, 2);
1834 quick_reloc (abfd, 0, BFD_RELOC_LO16, 0); /* MIPS_R_PAIR */
1835 quick_reloc (abfd, 4, BFD_RELOC_LO16, 2);
1836 break;
1837 default:
1838 abort ();
1839 }
1840 save_relocs (tx);
1841 }
1842
1843 bfd_set_section_size (abfd, id7, 4);
1844 d7 = xmalloc (4);
1845 id7->contents = d7;
1846 memset (d7, 0, 4);
1847 quick_reloc (abfd, 0, BFD_RELOC_RVA, 5);
1848 save_relocs (id7);
1849
1850 bfd_set_section_size (abfd, id5, 4);
1851 d5 = xmalloc (4);
1852 id5->contents = d5;
1853 memset (d5, 0, 4);
1854
1855 if (exp->flag_noname)
1856 {
1857 d5[0] = exp->ordinal;
1858 d5[1] = exp->ordinal >> 8;
1859 d5[3] = 0x80;
1860 }
1861 else
1862 {
1863 quick_reloc (abfd, 0, BFD_RELOC_RVA, 4);
1864 save_relocs (id5);
1865 }
1866
1867 bfd_set_section_size (abfd, id4, 4);
1868 d4 = xmalloc (4);
1869 id4->contents = d4;
1870 memset (d4, 0, 4);
1871
1872 if (exp->flag_noname)
1873 {
1874 d4[0] = exp->ordinal;
1875 d4[1] = exp->ordinal >> 8;
1876 d4[3] = 0x80;
1877 }
1878 else
1879 {
1880 quick_reloc (abfd, 0, BFD_RELOC_RVA, 4);
1881 save_relocs (id4);
1882 }
1883
1884 if (exp->flag_noname)
1885 {
1886 len = 0;
1887 bfd_set_section_size (abfd, id6, 0);
1888 }
1889 else
1890 {
1891 len = strlen (exp->name) + 3;
1892 if (len & 1)
1893 len++;
1894 bfd_set_section_size (abfd, id6, len);
1895 d6 = xmalloc (len);
1896 id6->contents = d6;
1897 memset (d6, 0, len);
1898 d6[0] = exp->hint & 0xff;
1899 d6[1] = exp->hint >> 8;
1900 strcpy (d6 + 2, exp->name);
1901 }
1902
1903 bfd_set_symtab (abfd, symtab, symptr);
1904
1905 bfd_set_section_contents (abfd, tx, td, 0, jmp_byte_count);
1906 bfd_set_section_contents (abfd, id7, d7, 0, 4);
1907 bfd_set_section_contents (abfd, id5, d5, 0, 4);
1908 bfd_set_section_contents (abfd, id4, d4, 0, 4);
1909 if (!exp->flag_noname)
1910 bfd_set_section_contents (abfd, id6, d6, 0, len);
1911
1912 bfd_make_readable (abfd);
1913 return abfd;
1914 }
1915
1916 static bfd *
make_singleton_name_thunk(const char * import,bfd * parent)1917 make_singleton_name_thunk (const char *import, bfd *parent)
1918 {
1919 /* Name thunks go to idata$4. */
1920 asection *id4;
1921 unsigned char *d4;
1922 char *oname;
1923 bfd *abfd;
1924
1925 oname = xmalloc (20);
1926 sprintf (oname, "nmth%06d.o", tmp_seq);
1927 tmp_seq++;
1928
1929 abfd = bfd_create (oname, parent);
1930 bfd_find_target (pe_details->object_target, abfd);
1931 bfd_make_writable (abfd);
1932
1933 bfd_set_format (abfd, bfd_object);
1934 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
1935
1936 symptr = 0;
1937 symtab = xmalloc (3 * sizeof (asymbol *));
1938 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
1939 quick_symbol (abfd, U ("_nm_thnk_"), import, "", id4, BSF_GLOBAL, 0);
1940 quick_symbol (abfd, U ("_nm_"), import, "", UNDSEC, BSF_GLOBAL, 0);
1941
1942 bfd_set_section_size (abfd, id4, 8);
1943 d4 = xmalloc (4);
1944 id4->contents = d4;
1945 memset (d4, 0, 8);
1946 quick_reloc (abfd, 0, BFD_RELOC_RVA, 2);
1947 save_relocs (id4);
1948
1949 bfd_set_symtab (abfd, symtab, symptr);
1950
1951 bfd_set_section_contents (abfd, id4, d4, 0, 8);
1952
1953 bfd_make_readable (abfd);
1954 return abfd;
1955 }
1956
1957 static char *
make_import_fixup_mark(arelent * rel)1958 make_import_fixup_mark (arelent *rel)
1959 {
1960 /* We convert reloc to symbol, for later reference. */
1961 static int counter;
1962 static char *fixup_name = NULL;
1963 static size_t buffer_len = 0;
1964
1965 struct bfd_symbol *sym = *rel->sym_ptr_ptr;
1966
1967 bfd *abfd = bfd_asymbol_bfd (sym);
1968 struct bfd_link_hash_entry *bh;
1969
1970 if (!fixup_name)
1971 {
1972 fixup_name = xmalloc (384);
1973 buffer_len = 384;
1974 }
1975
1976 if (strlen (sym->name) + 25 > buffer_len)
1977 /* Assume 25 chars for "__fu" + counter + "_". If counter is
1978 bigger than 20 digits long, we've got worse problems than
1979 overflowing this buffer... */
1980 {
1981 free (fixup_name);
1982 /* New buffer size is length of symbol, plus 25, but
1983 then rounded up to the nearest multiple of 128. */
1984 buffer_len = ((strlen (sym->name) + 25) + 127) & ~127;
1985 fixup_name = xmalloc (buffer_len);
1986 }
1987
1988 sprintf (fixup_name, "__fu%d_%s", counter++, sym->name);
1989
1990 bh = NULL;
1991 bfd_coff_link_add_one_symbol (&link_info, abfd, fixup_name, BSF_GLOBAL,
1992 current_sec, /* sym->section, */
1993 rel->address, NULL, TRUE, FALSE, &bh);
1994
1995 if (0)
1996 {
1997 struct coff_link_hash_entry *myh;
1998
1999 myh = (struct coff_link_hash_entry *) bh;
2000 printf ("type:%d\n", myh->type);
2001 printf ("%s\n", myh->root.u.def.section->name);
2002 }
2003
2004 return fixup_name;
2005 }
2006
2007 /* .section .idata$3
2008 .rva __nm_thnk_SYM (singleton thunk with name of func)
2009 .long 0
2010 .long 0
2011 .rva __my_dll_iname (name of dll)
2012 .rva __fuNN_SYM (pointer to reference (address) in text) */
2013
2014 static bfd *
make_import_fixup_entry(const char * name,const char * fixup_name,const char * dll_symname,bfd * parent)2015 make_import_fixup_entry (const char *name,
2016 const char *fixup_name,
2017 const char *dll_symname,
2018 bfd *parent)
2019 {
2020 asection *id3;
2021 unsigned char *d3;
2022 char *oname;
2023 bfd *abfd;
2024
2025 oname = xmalloc (20);
2026 sprintf (oname, "fu%06d.o", tmp_seq);
2027 tmp_seq++;
2028
2029 abfd = bfd_create (oname, parent);
2030 bfd_find_target (pe_details->object_target, abfd);
2031 bfd_make_writable (abfd);
2032
2033 bfd_set_format (abfd, bfd_object);
2034 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2035
2036 symptr = 0;
2037 symtab = xmalloc (6 * sizeof (asymbol *));
2038 id3 = quick_section (abfd, ".idata$3", SEC_HAS_CONTENTS, 2);
2039
2040 #if 0
2041 quick_symbol (abfd, U ("_head_"), dll_symname, "", id2, BSF_GLOBAL, 0);
2042 #endif
2043 quick_symbol (abfd, U ("_nm_thnk_"), name, "", UNDSEC, BSF_GLOBAL, 0);
2044 quick_symbol (abfd, U (""), dll_symname, "_iname", UNDSEC, BSF_GLOBAL, 0);
2045 quick_symbol (abfd, "", fixup_name, "", UNDSEC, BSF_GLOBAL, 0);
2046
2047 bfd_set_section_size (abfd, id3, 20);
2048 d3 = xmalloc (20);
2049 id3->contents = d3;
2050 memset (d3, 0, 20);
2051
2052 quick_reloc (abfd, 0, BFD_RELOC_RVA, 1);
2053 quick_reloc (abfd, 12, BFD_RELOC_RVA, 2);
2054 quick_reloc (abfd, 16, BFD_RELOC_RVA, 3);
2055 save_relocs (id3);
2056
2057 bfd_set_symtab (abfd, symtab, symptr);
2058
2059 bfd_set_section_contents (abfd, id3, d3, 0, 20);
2060
2061 bfd_make_readable (abfd);
2062 return abfd;
2063 }
2064
2065 /* .section .rdata_runtime_pseudo_reloc
2066 .long addend
2067 .rva __fuNN_SYM (pointer to reference (address) in text) */
2068
2069 static bfd *
make_runtime_pseudo_reloc(const char * name ATTRIBUTE_UNUSED,const char * fixup_name,int addend,bfd * parent)2070 make_runtime_pseudo_reloc (const char *name ATTRIBUTE_UNUSED,
2071 const char *fixup_name,
2072 int addend,
2073 bfd *parent)
2074 {
2075 asection *rt_rel;
2076 unsigned char *rt_rel_d;
2077 char *oname;
2078 bfd *abfd;
2079
2080 oname = xmalloc (20);
2081 sprintf (oname, "rtr%06d.o", tmp_seq);
2082 tmp_seq++;
2083
2084 abfd = bfd_create (oname, parent);
2085 bfd_find_target (pe_details->object_target, abfd);
2086 bfd_make_writable (abfd);
2087
2088 bfd_set_format (abfd, bfd_object);
2089 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2090
2091 symptr = 0;
2092 symtab = xmalloc (2 * sizeof (asymbol *));
2093 rt_rel = quick_section (abfd, ".rdata_runtime_pseudo_reloc",
2094 SEC_HAS_CONTENTS, 2);
2095
2096 quick_symbol (abfd, "", fixup_name, "", UNDSEC, BSF_GLOBAL, 0);
2097
2098 bfd_set_section_size (abfd, rt_rel, 8);
2099 rt_rel_d = xmalloc (8);
2100 rt_rel->contents = rt_rel_d;
2101 memset (rt_rel_d, 0, 8);
2102 bfd_put_32 (abfd, addend, rt_rel_d);
2103
2104 quick_reloc (abfd, 4, BFD_RELOC_RVA, 1);
2105 save_relocs (rt_rel);
2106
2107 bfd_set_symtab (abfd, symtab, symptr);
2108
2109 bfd_set_section_contents (abfd, rt_rel, rt_rel_d, 0, 8);
2110
2111 bfd_make_readable (abfd);
2112 return abfd;
2113 }
2114
2115 /* .section .rdata
2116 .rva __pei386_runtime_relocator */
2117
2118 static bfd *
pe_create_runtime_relocator_reference(bfd * parent)2119 pe_create_runtime_relocator_reference (bfd *parent)
2120 {
2121 asection *extern_rt_rel;
2122 unsigned char *extern_rt_rel_d;
2123 char *oname;
2124 bfd *abfd;
2125
2126 oname = xmalloc (20);
2127 sprintf (oname, "ertr%06d.o", tmp_seq);
2128 tmp_seq++;
2129
2130 abfd = bfd_create (oname, parent);
2131 bfd_find_target (pe_details->object_target, abfd);
2132 bfd_make_writable (abfd);
2133
2134 bfd_set_format (abfd, bfd_object);
2135 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2136
2137 symptr = 0;
2138 symtab = xmalloc (2 * sizeof (asymbol *));
2139 extern_rt_rel = quick_section (abfd, ".rdata", SEC_HAS_CONTENTS, 2);
2140
2141 quick_symbol (abfd, "", "__pei386_runtime_relocator", "", UNDSEC,
2142 BSF_NO_FLAGS, 0);
2143
2144 bfd_set_section_size (abfd, extern_rt_rel, 4);
2145 extern_rt_rel_d = xmalloc (4);
2146 extern_rt_rel->contents = extern_rt_rel_d;
2147
2148 quick_reloc (abfd, 0, BFD_RELOC_RVA, 1);
2149 save_relocs (extern_rt_rel);
2150
2151 bfd_set_symtab (abfd, symtab, symptr);
2152
2153 bfd_set_section_contents (abfd, extern_rt_rel, extern_rt_rel_d, 0, 4);
2154
2155 bfd_make_readable (abfd);
2156 return abfd;
2157 }
2158
2159 void
pe_create_import_fixup(arelent * rel,asection * s,int addend)2160 pe_create_import_fixup (arelent *rel, asection *s, int addend)
2161 {
2162 char buf[300];
2163 struct bfd_symbol *sym = *rel->sym_ptr_ptr;
2164 struct bfd_link_hash_entry *name_thunk_sym;
2165 const char *name = sym->name;
2166 char *fixup_name = make_import_fixup_mark (rel);
2167 bfd *b;
2168
2169 sprintf (buf, U ("_nm_thnk_%s"), name);
2170
2171 name_thunk_sym = bfd_link_hash_lookup (link_info.hash, buf, 0, 0, 1);
2172
2173 if (!name_thunk_sym || name_thunk_sym->type != bfd_link_hash_defined)
2174 {
2175 bfd *b = make_singleton_name_thunk (name, output_bfd);
2176 add_bfd_to_link (b, b->filename, &link_info);
2177
2178 /* If we ever use autoimport, we have to cast text section writable. */
2179 config.text_read_only = FALSE;
2180 output_bfd->flags &= ~WP_TEXT;
2181 }
2182
2183 if (addend == 0 || link_info.pei386_runtime_pseudo_reloc)
2184 {
2185 extern char * pe_data_import_dll;
2186 char * dll_symname = pe_data_import_dll ? pe_data_import_dll : "unknown";
2187
2188 b = make_import_fixup_entry (name, fixup_name, dll_symname, output_bfd);
2189 add_bfd_to_link (b, b->filename, &link_info);
2190 }
2191
2192 if (addend != 0)
2193 {
2194 if (link_info.pei386_runtime_pseudo_reloc)
2195 {
2196 if (pe_dll_extra_pe_debug)
2197 printf ("creating runtime pseudo-reloc entry for %s (addend=%d)\n",
2198 fixup_name, addend);
2199 b = make_runtime_pseudo_reloc (name, fixup_name, addend, output_bfd);
2200 add_bfd_to_link (b, b->filename, &link_info);
2201
2202 if (runtime_pseudo_relocs_created == 0)
2203 {
2204 b = pe_create_runtime_relocator_reference (output_bfd);
2205 add_bfd_to_link (b, b->filename, &link_info);
2206 }
2207 runtime_pseudo_relocs_created++;
2208 }
2209 else
2210 {
2211 einfo (_("%C: variable '%T' can't be auto-imported. Please read the documentation for ld's --enable-auto-import for details.\n"),
2212 s->owner, s, rel->address, sym->name);
2213 einfo ("%X");
2214 }
2215 }
2216 }
2217
2218
2219 void
pe_dll_generate_implib(def_file * def,const char * impfilename)2220 pe_dll_generate_implib (def_file *def, const char *impfilename)
2221 {
2222 int i;
2223 bfd *ar_head;
2224 bfd *ar_tail;
2225 bfd *outarch;
2226 bfd *head = 0;
2227
2228 dll_filename = (def->name) ? def->name : dll_name;
2229 dll_symname = xstrdup (dll_filename);
2230 for (i = 0; dll_symname[i]; i++)
2231 if (!ISALNUM (dll_symname[i]))
2232 dll_symname[i] = '_';
2233
2234 unlink (impfilename);
2235
2236 outarch = bfd_openw (impfilename, 0);
2237
2238 if (!outarch)
2239 {
2240 /* xgettext:c-format */
2241 einfo (_("%XCan't open .lib file: %s\n"), impfilename);
2242 return;
2243 }
2244
2245 /* xgettext:c-format */
2246 einfo (_("Creating library file: %s\n"), impfilename);
2247
2248 bfd_set_format (outarch, bfd_archive);
2249 outarch->has_armap = 1;
2250
2251 /* Work out a reasonable size of things to put onto one line. */
2252 ar_head = make_head (outarch);
2253
2254 for (i = 0; i < def->num_exports; i++)
2255 {
2256 /* The import library doesn't know about the internal name. */
2257 char *internal = def->exports[i].internal_name;
2258 bfd *n;
2259
2260 /* Don't add PRIVATE entries to import lib. */
2261 if (pe_def_file->exports[i].flag_private)
2262 continue;
2263 def->exports[i].internal_name = def->exports[i].name;
2264 n = make_one (def->exports + i, outarch);
2265 n->next = head;
2266 head = n;
2267 def->exports[i].internal_name = internal;
2268 }
2269
2270 ar_tail = make_tail (outarch);
2271
2272 if (ar_head == NULL || ar_tail == NULL)
2273 return;
2274
2275 /* Now stick them all into the archive. */
2276 ar_head->next = head;
2277 ar_tail->next = ar_head;
2278 head = ar_tail;
2279
2280 if (! bfd_set_archive_head (outarch, head))
2281 einfo ("%Xbfd_set_archive_head: %s\n", bfd_errmsg (bfd_get_error ()));
2282
2283 if (! bfd_close (outarch))
2284 einfo ("%Xbfd_close %s: %s\n", impfilename, bfd_errmsg (bfd_get_error ()));
2285
2286 while (head != NULL)
2287 {
2288 bfd *n = head->next;
2289 bfd_close (head);
2290 head = n;
2291 }
2292 }
2293
2294 static void
add_bfd_to_link(bfd * abfd,const char * name,struct bfd_link_info * link_info)2295 add_bfd_to_link (bfd *abfd, const char *name, struct bfd_link_info *link_info)
2296 {
2297 lang_input_statement_type *fake_file;
2298
2299 fake_file = lang_add_input_file (name,
2300 lang_input_file_is_fake_enum,
2301 NULL);
2302 fake_file->the_bfd = abfd;
2303 ldlang_add_file (fake_file);
2304
2305 if (!bfd_link_add_symbols (abfd, link_info))
2306 einfo ("%Xaddsym %s: %s\n", name, bfd_errmsg (bfd_get_error ()));
2307 }
2308
2309 void
pe_process_import_defs(bfd * output_bfd,struct bfd_link_info * link_info)2310 pe_process_import_defs (bfd *output_bfd, struct bfd_link_info *link_info)
2311 {
2312 def_file_module *module;
2313
2314 pe_dll_id_target (bfd_get_target (output_bfd));
2315
2316 if (!pe_def_file)
2317 return;
2318
2319 for (module = pe_def_file->modules; module; module = module->next)
2320 {
2321 int i, do_this_dll;
2322
2323 dll_filename = module->name;
2324 dll_symname = xstrdup (module->name);
2325 for (i = 0; dll_symname[i]; i++)
2326 if (!ISALNUM (dll_symname[i]))
2327 dll_symname[i] = '_';
2328
2329 do_this_dll = 0;
2330
2331 for (i = 0; i < pe_def_file->num_imports; i++)
2332 if (pe_def_file->imports[i].module == module)
2333 {
2334 def_file_export exp;
2335 struct bfd_link_hash_entry *blhe;
2336 int lead_at = (*pe_def_file->imports[i].internal_name == '@');
2337 /* See if we need this import. */
2338 size_t len = strlen (pe_def_file->imports[i].internal_name);
2339 char *name = xmalloc (len + 2 + 6);
2340
2341 if (lead_at)
2342 sprintf (name, "%s%s", "",
2343 pe_def_file->imports[i].internal_name);
2344 else
2345 sprintf (name, "%s%s",U (""),
2346 pe_def_file->imports[i].internal_name);
2347
2348 blhe = bfd_link_hash_lookup (link_info->hash, name,
2349 FALSE, FALSE, FALSE);
2350
2351 if (!blhe || (blhe && blhe->type != bfd_link_hash_undefined))
2352 {
2353 if (lead_at)
2354 sprintf (name, "%s%s", U ("_imp_"),
2355 pe_def_file->imports[i].internal_name);
2356 else
2357 sprintf (name, "%s%s", U ("_imp__"),
2358 pe_def_file->imports[i].internal_name);
2359
2360 blhe = bfd_link_hash_lookup (link_info->hash, name,
2361 FALSE, FALSE, FALSE);
2362 }
2363 free (name);
2364
2365 if (blhe && blhe->type == bfd_link_hash_undefined)
2366 {
2367 bfd *one;
2368 /* We do. */
2369 if (!do_this_dll)
2370 {
2371 bfd *ar_head = make_head (output_bfd);
2372 add_bfd_to_link (ar_head, ar_head->filename, link_info);
2373 do_this_dll = 1;
2374 }
2375 exp.internal_name = pe_def_file->imports[i].internal_name;
2376 exp.name = pe_def_file->imports[i].name;
2377 exp.ordinal = pe_def_file->imports[i].ordinal;
2378 exp.hint = exp.ordinal >= 0 ? exp.ordinal : 0;
2379 exp.flag_private = 0;
2380 exp.flag_constant = 0;
2381 exp.flag_data = pe_def_file->imports[i].data;
2382 exp.flag_noname = exp.name ? 0 : 1;
2383 one = make_one (&exp, output_bfd);
2384 add_bfd_to_link (one, one->filename, link_info);
2385 }
2386 }
2387 if (do_this_dll)
2388 {
2389 bfd *ar_tail = make_tail (output_bfd);
2390 add_bfd_to_link (ar_tail, ar_tail->filename, link_info);
2391 }
2392
2393 free (dll_symname);
2394 }
2395 }
2396
2397 /* We were handed a *.DLL file. Parse it and turn it into a set of
2398 IMPORTS directives in the def file. Return TRUE if the file was
2399 handled, FALSE if not. */
2400
2401 static unsigned int
pe_get16(bfd * abfd,int where)2402 pe_get16 (bfd *abfd, int where)
2403 {
2404 unsigned char b[2];
2405
2406 bfd_seek (abfd, (file_ptr) where, SEEK_SET);
2407 bfd_bread (b, (bfd_size_type) 2, abfd);
2408 return b[0] + (b[1] << 8);
2409 }
2410
2411 static unsigned int
pe_get32(bfd * abfd,int where)2412 pe_get32 (bfd *abfd, int where)
2413 {
2414 unsigned char b[4];
2415
2416 bfd_seek (abfd, (file_ptr) where, SEEK_SET);
2417 bfd_bread (b, (bfd_size_type) 4, abfd);
2418 return b[0] + (b[1] << 8) + (b[2] << 16) + (b[3] << 24);
2419 }
2420
2421 #if 0 /* This is not currently used. */
2422
2423 static unsigned int
2424 pe_as16 (void *ptr)
2425 {
2426 unsigned char *b = ptr;
2427
2428 return b[0] + (b[1] << 8);
2429 }
2430
2431 #endif
2432
2433 static unsigned int
pe_as32(void * ptr)2434 pe_as32 (void *ptr)
2435 {
2436 unsigned char *b = ptr;
2437
2438 return b[0] + (b[1] << 8) + (b[2] << 16) + (b[3] << 24);
2439 }
2440
2441 bfd_boolean
pe_implied_import_dll(const char * filename)2442 pe_implied_import_dll (const char *filename)
2443 {
2444 bfd *dll;
2445 unsigned long pe_header_offset, opthdr_ofs, num_entries, i;
2446 unsigned long export_rva, export_size, nsections, secptr, expptr;
2447 unsigned long exp_funcbase;
2448 unsigned char *expdata, *erva;
2449 unsigned long name_rvas, ordinals, nexp, ordbase;
2450 const char *dll_name;
2451 /* Initialization with start > end guarantees that is_data
2452 will not be set by mistake, and avoids compiler warning. */
2453 unsigned long data_start = 1;
2454 unsigned long data_end = 0;
2455 unsigned long rdata_start = 1;
2456 unsigned long rdata_end = 0;
2457 unsigned long bss_start = 1;
2458 unsigned long bss_end = 0;
2459
2460 /* No, I can't use bfd here. kernel32.dll puts its export table in
2461 the middle of the .rdata section. */
2462 dll = bfd_openr (filename, pe_details->target_name);
2463 if (!dll)
2464 {
2465 einfo ("%Xopen %s: %s\n", filename, bfd_errmsg (bfd_get_error ()));
2466 return FALSE;
2467 }
2468
2469 /* PEI dlls seem to be bfd_objects. */
2470 if (!bfd_check_format (dll, bfd_object))
2471 {
2472 einfo ("%X%s: this doesn't appear to be a DLL\n", filename);
2473 return FALSE;
2474 }
2475
2476 /* Get pe_header, optional header and numbers of export entries. */
2477 pe_header_offset = pe_get32 (dll, 0x3c);
2478 opthdr_ofs = pe_header_offset + 4 + 20;
2479 num_entries = pe_get32 (dll, opthdr_ofs + 92);
2480
2481 if (num_entries < 1) /* No exports. */
2482 return FALSE;
2483
2484 export_rva = pe_get32 (dll, opthdr_ofs + 96);
2485 export_size = pe_get32 (dll, opthdr_ofs + 100);
2486 nsections = pe_get16 (dll, pe_header_offset + 4 + 2);
2487 secptr = (pe_header_offset + 4 + 20 +
2488 pe_get16 (dll, pe_header_offset + 4 + 16));
2489 expptr = 0;
2490
2491 /* Get the rva and size of the export section. */
2492 for (i = 0; i < nsections; i++)
2493 {
2494 char sname[8];
2495 unsigned long secptr1 = secptr + 40 * i;
2496 unsigned long vaddr = pe_get32 (dll, secptr1 + 12);
2497 unsigned long vsize = pe_get32 (dll, secptr1 + 16);
2498 unsigned long fptr = pe_get32 (dll, secptr1 + 20);
2499
2500 bfd_seek (dll, (file_ptr) secptr1, SEEK_SET);
2501 bfd_bread (sname, (bfd_size_type) 8, dll);
2502
2503 if (vaddr <= export_rva && vaddr + vsize > export_rva)
2504 {
2505 expptr = fptr + (export_rva - vaddr);
2506 if (export_rva + export_size > vaddr + vsize)
2507 export_size = vsize - (export_rva - vaddr);
2508 break;
2509 }
2510 }
2511
2512 /* Scan sections and store the base and size of the
2513 data and bss segments in data/base_start/end. */
2514 for (i = 0; i < nsections; i++)
2515 {
2516 unsigned long secptr1 = secptr + 40 * i;
2517 unsigned long vsize = pe_get32 (dll, secptr1 + 8);
2518 unsigned long vaddr = pe_get32 (dll, secptr1 + 12);
2519 unsigned long flags = pe_get32 (dll, secptr1 + 36);
2520 char sec_name[9];
2521
2522 sec_name[8] = '\0';
2523 bfd_seek (dll, (file_ptr) secptr1 + 0, SEEK_SET);
2524 bfd_bread (sec_name, (bfd_size_type) 8, dll);
2525
2526 if (strcmp(sec_name,".data") == 0)
2527 {
2528 data_start = vaddr;
2529 data_end = vaddr + vsize;
2530
2531 if (pe_dll_extra_pe_debug)
2532 printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n",
2533 __FUNCTION__, sec_name, vaddr, vaddr + vsize, flags);
2534 }
2535 else if (strcmp(sec_name,".rdata") == 0)
2536 {
2537 rdata_start = vaddr;
2538 rdata_end = vaddr + vsize;
2539
2540 if (pe_dll_extra_pe_debug)
2541 printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n",
2542 __FUNCTION__, sec_name, vaddr, vaddr + vsize, flags);
2543 }
2544 else if (strcmp (sec_name,".bss") == 0)
2545 {
2546 bss_start = vaddr;
2547 bss_end = vaddr + vsize;
2548
2549 if (pe_dll_extra_pe_debug)
2550 printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n",
2551 __FUNCTION__, sec_name, vaddr, vaddr + vsize, flags);
2552 }
2553 }
2554
2555 expdata = xmalloc (export_size);
2556 bfd_seek (dll, (file_ptr) expptr, SEEK_SET);
2557 bfd_bread (expdata, (bfd_size_type) export_size, dll);
2558 erva = expdata - export_rva;
2559
2560 if (pe_def_file == 0)
2561 pe_def_file = def_file_empty ();
2562
2563 nexp = pe_as32 (expdata + 24);
2564 name_rvas = pe_as32 (expdata + 32);
2565 ordinals = pe_as32 (expdata + 36);
2566 ordbase = pe_as32 (expdata + 16);
2567 exp_funcbase = pe_as32 (expdata + 28);
2568
2569 /* Use internal dll name instead of filename
2570 to enable symbolic dll linking. */
2571 dll_name = pe_as32 (expdata + 12) + erva;
2572
2573 /* Check to see if the dll has already been added to
2574 the definition list and if so return without error.
2575 This avoids multiple symbol definitions. */
2576 if (def_get_module (pe_def_file, dll_name))
2577 {
2578 if (pe_dll_extra_pe_debug)
2579 printf ("%s is already loaded\n", dll_name);
2580 return TRUE;
2581 }
2582
2583 /* Iterate through the list of symbols. */
2584 for (i = 0; i < nexp; i++)
2585 {
2586 /* Pointer to the names vector. */
2587 unsigned long name_rva = pe_as32 (erva + name_rvas + i * 4);
2588 def_file_import *imp;
2589 /* Pointer to the function address vector. */
2590 unsigned long func_rva = pe_as32 (erva + exp_funcbase + i * 4);
2591 int is_data = 0;
2592
2593 /* Skip unwanted symbols, which are
2594 exported in buggy auto-import releases. */
2595 if (strncmp (erva + name_rva, "_nm_", 4) != 0)
2596 {
2597 /* is_data is true if the address is in the data, rdata or bss
2598 segment. */
2599 is_data =
2600 (func_rva >= data_start && func_rva < data_end)
2601 || (func_rva >= rdata_start && func_rva < rdata_end)
2602 || (func_rva >= bss_start && func_rva < bss_end);
2603
2604 imp = def_file_add_import (pe_def_file, erva + name_rva,
2605 dll_name, i, 0);
2606 /* Mark symbol type. */
2607 imp->data = is_data;
2608
2609 if (pe_dll_extra_pe_debug)
2610 printf ("%s dll-name: %s sym: %s addr: 0x%lx %s\n",
2611 __FUNCTION__, dll_name, erva + name_rva,
2612 func_rva, is_data ? "(data)" : "");
2613 }
2614 }
2615
2616 return TRUE;
2617 }
2618
2619 /* These are the main functions, called from the emulation. The first
2620 is called after the bfds are read, so we can guess at how much space
2621 we need. The second is called after everything is placed, so we
2622 can put the right values in place. */
2623
2624 void
pe_dll_build_sections(bfd * abfd,struct bfd_link_info * info)2625 pe_dll_build_sections (bfd *abfd, struct bfd_link_info *info)
2626 {
2627 pe_dll_id_target (bfd_get_target (abfd));
2628 process_def_file (abfd, info);
2629
2630 if (pe_def_file->num_exports == 0 && !info->shared)
2631 return;
2632
2633 generate_edata (abfd, info);
2634 build_filler_bfd (1);
2635 }
2636
2637 void
pe_exe_build_sections(bfd * abfd,struct bfd_link_info * info ATTRIBUTE_UNUSED)2638 pe_exe_build_sections (bfd *abfd, struct bfd_link_info *info ATTRIBUTE_UNUSED)
2639 {
2640 pe_dll_id_target (bfd_get_target (abfd));
2641 build_filler_bfd (0);
2642 }
2643
2644 void
pe_dll_fill_sections(bfd * abfd,struct bfd_link_info * info)2645 pe_dll_fill_sections (bfd *abfd, struct bfd_link_info *info)
2646 {
2647 pe_dll_id_target (bfd_get_target (abfd));
2648 image_base = pe_data (abfd)->pe_opthdr.ImageBase;
2649
2650 generate_reloc (abfd, info);
2651 if (reloc_sz > 0)
2652 {
2653 bfd_set_section_size (filler_bfd, reloc_s, reloc_sz);
2654
2655 /* Resize the sections. */
2656 lang_size_sections (stat_ptr->head, abs_output_section,
2657 &stat_ptr->head, 0, 0, NULL, TRUE);
2658
2659 /* Redo special stuff. */
2660 ldemul_after_allocation ();
2661
2662 /* Do the assignments again. */
2663 lang_do_assignments (stat_ptr->head, abs_output_section, NULL, 0);
2664 }
2665
2666 fill_edata (abfd, info);
2667
2668 if (info->shared)
2669 pe_data (abfd)->dll = 1;
2670
2671 edata_s->contents = edata_d;
2672 reloc_s->contents = reloc_d;
2673 }
2674
2675 void
pe_exe_fill_sections(bfd * abfd,struct bfd_link_info * info)2676 pe_exe_fill_sections (bfd *abfd, struct bfd_link_info *info)
2677 {
2678 pe_dll_id_target (bfd_get_target (abfd));
2679 image_base = pe_data (abfd)->pe_opthdr.ImageBase;
2680
2681 generate_reloc (abfd, info);
2682 if (reloc_sz > 0)
2683 {
2684 bfd_set_section_size (filler_bfd, reloc_s, reloc_sz);
2685
2686 /* Resize the sections. */
2687 lang_size_sections (stat_ptr->head, abs_output_section,
2688 &stat_ptr->head, 0, 0, NULL, TRUE);
2689
2690 /* Redo special stuff. */
2691 ldemul_after_allocation ();
2692
2693 /* Do the assignments again. */
2694 lang_do_assignments (stat_ptr->head, abs_output_section, NULL, 0);
2695 }
2696 reloc_s->contents = reloc_d;
2697 }
2698