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