OpenCores
URL https://opencores.org/ocsvn/open8_urisc/open8_urisc/trunk

Subversion Repositories open8_urisc

[/] [open8_urisc/] [trunk/] [gnu/] [binutils/] [ld/] [pe-dll.c] - Blame information for rev 161

Go to most recent revision | Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.