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 287

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

powered by: WebSVN 2.1.0

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