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