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