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