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