Changeset 609 for branches/GNU/src/binutils/ld/pe-dll.c
- Timestamp:
- Aug 16, 2003, 6:59:22 PM (22 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/GNU/src/binutils/ld/pe-dll.c
-
Property cvs2svn:cvs-rev
changed from
1.1
to1.1.1.2
r608 r609 1 1 /* Routines to help build PEI-format DLLs (Win32 etc) 2 Copyright 1998, 1999, 2000 Free Software Foundation, Inc.2 Copyright 1998, 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc. 3 3 Written by DJ Delorie <dj@cygnus.com> 4 4 … … 24 24 #include "bfdlink.h" 25 25 #include "libiberty.h" 26 #include "safe-ctype.h" 26 27 27 28 #include <time.h> 28 #include <ctype.h>29 29 30 30 #include "ld.h" … … 33 33 #include "ldwrite.h" 34 34 #include "ldmisc.h" 35 #include "ldgram.h"35 #include <ldgram.h> 36 36 #include "ldmain.h" 37 37 #include "ldfile.h" … … 42 42 #include "pe-dll.h" 43 43 44 /************************************************************************ 45 46 This file turns a regular Windows PE image into a DLL. Because of 47 the complexity of this operation, it has been broken down into a 48 number of separate modules which are all called by the main function 49 at the end of this file. This function is not re-entrant and is 50 normally only called once, so static variables are used to reduce 51 the number of parameters and return values required. 52 53 See also: ld/emultempl/pe.em 54 55 ************************************************************************/ 56 57 /* for emultempl/pe.em */ 58 59 def_file *pe_def_file = 0; 44 /* This file turns a regular Windows PE image into a DLL. Because of 45 the complexity of this operation, it has been broken down into a 46 number of separate modules which are all called by the main function 47 at the end of this file. This function is not re-entrant and is 48 normally only called once, so static variables are used to reduce 49 the number of parameters and return values required. 50 51 See also: ld/emultempl/pe.em. */ 52 53 /* Auto-import feature by Paul Sokolovsky 54 55 Quick facts: 56 57 1. With this feature on, DLL clients can import variables from DLL 58 without any concern from their side (for example, without any source 59 code modifications). 60 61 2. This is done completely in bounds of the PE specification (to be fair, 62 there's a place where it pokes nose out of, but in practice it works). 63 So, resulting module can be used with any other PE compiler/linker. 64 65 3. Auto-import is fully compatible with standard import method and they 66 can be mixed together. 67 68 4. Overheads: space: 8 bytes per imported symbol, plus 20 for each 69 reference to it; load time: negligible; virtual/physical memory: should be 70 less than effect of DLL relocation, and I sincerely hope it doesn't affect 71 DLL sharability (too much). 72 73 Idea 74 75 The obvious and only way to get rid of dllimport insanity is to make client 76 access variable directly in the DLL, bypassing extra dereference. I.e., 77 whenever client contains something like 78 79 mov dll_var,%eax, 80 81 address of dll_var in the command should be relocated to point into loaded 82 DLL. The aim is to make OS loader do so, and than make ld help with that. 83 Import section of PE made following way: there's a vector of structures 84 each describing imports from particular DLL. Each such structure points 85 to two other parallel vectors: one holding imported names, and one which 86 will hold address of corresponding imported name. So, the solution is 87 de-vectorize these structures, making import locations be sparse and 88 pointing directly into code. Before continuing, it is worth a note that, 89 while authors strives to make PE act ELF-like, there're some other people 90 make ELF act PE-like: elfvector, ;-) . 91 92 Implementation 93 94 For each reference of data symbol to be imported from DLL (to set of which 95 belong symbols with name <sym>, if __imp_<sym> is found in implib), the 96 import fixup entry is generated. That entry is of type 97 IMAGE_IMPORT_DESCRIPTOR and stored in .idata$3 subsection. Each 98 fixup entry contains pointer to symbol's address within .text section 99 (marked with __fuN_<sym> symbol, where N is integer), pointer to DLL name 100 (so, DLL name is referenced by multiple entries), and pointer to symbol 101 name thunk. Symbol name thunk is singleton vector (__nm_th_<symbol>) 102 pointing to IMAGE_IMPORT_BY_NAME structure (__nm_<symbol>) directly 103 containing imported name. Here comes that "om the edge" problem mentioned 104 above: PE specification rambles that name vector (OriginalFirstThunk) 105 should run in parallel with addresses vector (FirstThunk), i.e. that they 106 should have same number of elements and terminated with zero. We violate 107 this, since FirstThunk points directly into machine code. But in practice, 108 OS loader implemented the sane way: it goes thru OriginalFirstThunk and 109 puts addresses to FirstThunk, not something else. It once again should be 110 noted that dll and symbol name structures are reused across fixup entries 111 and should be there anyway to support standard import stuff, so sustained 112 overhead is 20 bytes per reference. Other question is whether having several 113 IMAGE_IMPORT_DESCRIPTORS for the same DLL is possible. Answer is yes, it is 114 done even by native compiler/linker (libth32's functions are in fact reside 115 in windows9x kernel32.dll, so if you use it, you have two 116 IMAGE_IMPORT_DESCRIPTORS for kernel32.dll). Yet other question is whether 117 referencing the same PE structures several times is valid. The answer is why 118 not, prohibiting that (detecting violation) would require more work on 119 behalf of loader than not doing it. 120 121 See also: ld/emultempl/pe.em. */ 122 123 static void 124 add_bfd_to_link PARAMS ((bfd *, const char *, struct bfd_link_info *)); 125 126 /* For emultempl/pe.em. */ 127 128 def_file * pe_def_file = 0; 60 129 int pe_dll_export_everything = 0; 61 130 int pe_dll_do_default_excludes = 1; … … 64 133 int pe_dll_warn_dup_exports = 0; 65 134 int pe_dll_compat_implib = 0; 66 67 /************************************************************************ 68 69 static variables and types 70 71 ************************************************************************/ 135 int pe_dll_extra_pe_debug = 0; 136 137 /* Static variables and types. */ 72 138 73 139 static bfd_vma image_base; 74 75 140 static bfd *filler_bfd; 76 141 static struct sec *edata_s, *reloc_s; 77 142 static unsigned char *edata_d, *reloc_d; 78 143 static size_t edata_sz, reloc_sz; 79 80 typedef struct { 81 char *target_name; 82 char *object_target; 83 unsigned int imagebase_reloc; 84 int pe_arch; 85 int bfd_arch; 86 int underscored; 87 } pe_details_type; 144 static int runtime_pseudo_relocs_created = 0; 145 146 typedef struct 147 { 148 char *target_name; 149 char *object_target; 150 unsigned int imagebase_reloc; 151 int pe_arch; 152 int bfd_arch; 153 int underscored; 154 } 155 pe_details_type; 156 157 typedef struct 158 { 159 char *name; 160 int len; 161 } 162 autofilter_entry_type; 88 163 89 164 #define PE_ARCH_i386 1 … … 91 166 #define PE_ARCH_mips 3 92 167 #define PE_ARCH_arm 4 93 94 static pe_details_type pe_detail_list[] = { 168 #define PE_ARCH_arm_epoc 5 169 170 static pe_details_type pe_detail_list[] = 171 { 95 172 { 96 173 "pei-i386", … … 123 200 PE_ARCH_arm, 124 201 bfd_arch_arm, 202 1 203 }, 204 { 205 "epoc-pei-arm-little", 206 "epoc-pe-arm-little", 207 11 /* ARM_RVA32 */, 208 PE_ARCH_arm_epoc, 209 bfd_arch_arm, 125 210 0 126 211 }, … … 130 215 static pe_details_type *pe_details; 131 216 217 static autofilter_entry_type autofilter_symbollist[] = 218 { 219 { "DllMain@12", 10 }, 220 { "DllEntryPoint@0", 15 }, 221 { "DllMainCRTStartup@12", 20 }, 222 { "_cygwin_dll_entry@12", 20 }, 223 { "_cygwin_crt0_common@8", 21 }, 224 { "_cygwin_noncygwin_dll_entry@12", 30 }, 225 { "impure_ptr", 10 }, 226 { "_pei386_runtime_relocator", 25 }, 227 { "do_pseudo_reloc", 15 }, 228 { "cygwin_crt0", 11 }, 229 { NULL, 0 } 230 }; 231 232 /* Do not specify library suffix explicitly, to allow for dllized versions. */ 233 static autofilter_entry_type autofilter_liblist[] = 234 { 235 { "libgcc", 6 }, 236 { "libstdc++", 9 }, 237 { "libmingw32", 10 }, 238 { "libmingwex", 10 }, 239 { "libg2c", 6 }, 240 { "libsupc++", 9 }, 241 { "libobjc", 7 }, 242 { "libgcj", 6 }, 243 { NULL, 0 } 244 }; 245 246 static autofilter_entry_type autofilter_objlist[] = 247 { 248 { "crt0.o", 6 }, 249 { "crt1.o", 6 }, 250 { "crt2.o", 6 }, 251 { "dllcrt1.o", 9 }, 252 { "dllcrt2.o", 9 }, 253 { "gcrt0.o", 7 }, 254 { "gcrt1.o", 7 }, 255 { "gcrt2.o", 7 }, 256 { "crtbegin.o", 10 }, 257 { "crtend.o", 8 }, 258 { NULL, 0 } 259 }; 260 261 static autofilter_entry_type autofilter_symbolprefixlist[] = 262 { 263 /* { "__imp_", 6 }, */ 264 /* Do __imp_ explicitly to save time. */ 265 { "__rtti_", 7 }, 266 /* Don't re-export auto-imported symbols. */ 267 { "_nm_", 4 }, 268 { "__builtin_", 10 }, 269 /* Don't export symbols specifying internal DLL layout. */ 270 { "_head_", 6 }, 271 { "_fmode", 6 }, 272 { "_impure_ptr", 11 }, 273 { "cygwin_attach_dll", 17 }, 274 { "cygwin_premain0", 15 }, 275 { "cygwin_premain1", 15 }, 276 { "cygwin_premain2", 15 }, 277 { "cygwin_premain3", 15 }, 278 { "environ", 7 }, 279 { NULL, 0 } 280 }; 281 282 static autofilter_entry_type autofilter_symbolsuffixlist[] = 283 { 284 { "_iname", 6 }, 285 { NULL, 0 } 286 }; 287 132 288 #define U(str) (pe_details->underscored ? "_" str : str) 289 290 static int reloc_sort PARAMS ((const void *, const void *)); 291 static int pe_export_sort PARAMS ((const void *, const void *)); 292 static int auto_export PARAMS ((bfd *, def_file *, const char *)); 293 static void process_def_file PARAMS ((bfd *, struct bfd_link_info *)); 294 static void build_filler_bfd PARAMS ((int)); 295 static void generate_edata PARAMS ((bfd *, struct bfd_link_info *)); 296 static void fill_exported_offsets PARAMS ((bfd *, struct bfd_link_info *)); 297 static void fill_edata PARAMS ((bfd *, struct bfd_link_info *)); 298 static void generate_reloc PARAMS ((bfd *, struct bfd_link_info *)); 299 static void quoteput PARAMS ((char *, FILE *, int)); 300 static asection *quick_section PARAMS ((bfd *, const char *, int, int)); 301 static void quick_symbol 302 PARAMS ((bfd *, const char *, const char *, const char *, 303 asection *, int, int)); 304 static void quick_reloc PARAMS ((bfd *, int, int, int)); 305 static bfd *make_head PARAMS ((bfd *)); 306 static bfd *make_tail PARAMS ((bfd *)); 307 static bfd *make_one PARAMS ((def_file_export *, bfd *)); 308 static bfd *make_singleton_name_thunk PARAMS ((const char *, bfd *)); 309 static char *make_import_fixup_mark PARAMS ((arelent *)); 310 static bfd *make_import_fixup_entry 311 PARAMS ((const char *, const char *, const char *, bfd *)); 312 static bfd *make_runtime_pseudo_reloc 313 PARAMS ((const char *, const char *, int, bfd *)); 314 static bfd *pe_create_runtime_relocator_reference 315 PARAMS ((bfd *)); 316 static unsigned int pe_get16 PARAMS ((bfd *, int)); 317 static unsigned int pe_get32 PARAMS ((bfd *, int)); 318 static unsigned int pe_as32 PARAMS ((void *)); 133 319 134 320 void … … 137 323 { 138 324 int i; 325 139 326 for (i = 0; pe_detail_list[i].target_name; i++) 140 327 if (strcmp (pe_detail_list[i].target_name, target) == 0 … … 148 335 } 149 336 150 /************************************************************************ 151 152 Helper functions for qsort. Relocs must be sorted so that we can write 153 them out by pages. 154 155 ************************************************************************/ 156 157 typedef struct { 158 bfd_vma vma; 159 char type; 160 short extra; 161 } reloc_data_type; 337 /* Helper functions for qsort. Relocs must be sorted so that we can write 338 them out by pages. */ 339 340 typedef struct 341 { 342 bfd_vma vma; 343 char type; 344 short extra; 345 } 346 reloc_data_type; 162 347 163 348 static int … … 167 352 bfd_vma a = ((reloc_data_type *) va)->vma; 168 353 bfd_vma b = ((reloc_data_type *) vb)->vma; 354 169 355 return (a > b) ? 1 : ((a < b) ? -1 : 0); 170 356 } … … 176 362 def_file_export *a = (def_file_export *) va; 177 363 def_file_export *b = (def_file_export *) vb; 364 178 365 return strcmp (a->name, b->name); 179 366 } 180 367 181 /************************************************************************ 182 183 Read and process the .DEF file 184 185 ************************************************************************/ 368 /* Read and process the .DEF file. */ 186 369 187 370 /* These correspond to the entries in pe_def_file->exports[]. I use … … 191 374 static bfd_vma *exported_symbol_offsets; 192 375 static struct sec **exported_symbol_sections; 193 194 376 static int export_table_size; 195 377 static int count_exported; … … 200 382 static int *exported_symbols; 201 383 202 typedef struct exclude_list_struct { 203 char *string; 204 struct exclude_list_struct *next; 205 } exclude_list_struct; 384 typedef struct exclude_list_struct 385 { 386 char *string; 387 struct exclude_list_struct *next; 388 int type; 389 } 390 exclude_list_struct; 206 391 207 392 static struct exclude_list_struct *excludes = 0; 208 393 209 394 void 210 pe_dll_add_excludes (new_excludes )395 pe_dll_add_excludes (new_excludes, type) 211 396 const char *new_excludes; 397 const int type; 212 398 { 213 399 char *local_copy; … … 225 411 new_exclude->string = (char *) xmalloc (strlen (exclude_string) + 1); 226 412 strcpy (new_exclude->string, exclude_string); 413 new_exclude->type = type; 227 414 new_exclude->next = excludes; 228 415 excludes = new_exclude; … … 232 419 } 233 420 421 422 /* abfd is a bfd containing n (or NULL) 423 It can be used for contextual checks. */ 424 234 425 static int 235 auto_export (d, n) 426 auto_export (abfd, d, n) 427 bfd *abfd; 236 428 def_file *d; 237 429 const char *n; … … 239 431 int i; 240 432 struct exclude_list_struct *ex; 433 autofilter_entry_type *afptr; 434 const char * libname = 0; 435 if (abfd && abfd->my_archive) 436 libname = lbasename (abfd->my_archive->filename); 437 438 /* We should not re-export imported stuff. */ 439 if (strncmp (n, "_imp__", 6) == 0) 440 return 0; 441 241 442 for (i = 0; i < d->num_exports; i++) 242 443 if (strcmp (d->exports[i].name, n) == 0) 243 444 return 0; 445 244 446 if (pe_dll_do_default_excludes) 245 447 { 246 if (strcmp (n, "DllMain@12") == 0) 448 const char * p; 449 int len; 450 451 if (pe_dll_extra_pe_debug) 452 printf ("considering exporting: %s, abfd=%p, abfd->my_arc=%p\n", 453 n, abfd, abfd->my_archive); 454 455 /* First of all, make context checks: 456 Don't export anything from standard libs. */ 457 if (libname) 458 { 459 afptr = autofilter_liblist; 460 461 while (afptr->name) 462 { 463 if (strncmp (libname, afptr->name, afptr->len) == 0 ) 464 return 0; 465 afptr++; 466 } 467 } 468 469 /* Next, exclude symbols from certain startup objects. */ 470 471 if (abfd && (p = lbasename (abfd->filename))) 472 { 473 afptr = autofilter_objlist; 474 while (afptr->name) 475 { 476 if (strcmp (p, afptr->name) == 0) 477 return 0; 478 afptr++; 479 } 480 } 481 482 /* Don't try to blindly exclude all symbols 483 that begin with '__'; this was tried and 484 it is too restrictive. */ 485 486 /* Then, exclude specific symbols. */ 487 afptr = autofilter_symbollist; 488 while (afptr->name) 489 { 490 if (strcmp (n, afptr->name) == 0) 491 return 0; 492 493 afptr++; 494 } 495 496 /* Next, exclude symbols starting with ... */ 497 afptr = autofilter_symbolprefixlist; 498 while (afptr->name) 499 { 500 if (strncmp (n, afptr->name, afptr->len) == 0) 501 return 0; 502 503 afptr++; 504 } 505 506 /* Finally, exclude symbols ending with ... */ 507 len = strlen (n); 508 afptr = autofilter_symbolsuffixlist; 509 while (afptr->name) 510 { 511 if ((len >= afptr->len) 512 /* Add 1 to insure match with trailing '\0'. */ 513 && strncmp (n + len - afptr->len, afptr->name, 514 afptr->len + 1) == 0) 515 return 0; 516 517 afptr++; 518 } 519 } 520 521 for (ex = excludes; ex; ex = ex->next) 522 { 523 if (ex->type == 1) /* exclude-libs */ 524 { 525 if (libname 526 && ((strcmp (libname, ex->string) == 0) 527 || (strcasecmp ("ALL", ex->string) == 0))) 528 return 0; 529 } 530 else if (strcmp (n, ex->string) == 0) 247 531 return 0; 248 if (strcmp (n, "DllEntryPoint@0") == 0) 249 return 0; 250 if (strcmp (n, "impure_ptr") == 0) 251 return 0; 252 } 253 for (ex = excludes; ex; ex = ex->next) 254 if (strcmp (n, ex->string) == 0) 255 return 0; 532 } 533 256 534 return 1; 257 535 } … … 273 551 /* First, run around to all the objects looking for the .drectve 274 552 sections, and push those into the def file too. */ 275 276 553 for (b = info->input_bfds; b; b = b->link_next) 277 554 { … … 281 558 int size = bfd_get_section_size_before_reloc (s); 282 559 char *buf = xmalloc (size); 560 283 561 bfd_get_section_contents (b, s, buf, 0, size); 284 562 def_file_add_directive (pe_def_file, buf, size); … … 287 565 } 288 566 567 /* If we are not building a DLL, when there are no exports 568 we do not build an export table at all. */ 569 if (!pe_dll_export_everything && pe_def_file->num_exports == 0 570 && !(info->shared)) 571 return; 572 289 573 /* Now, maybe export everything else the default way. */ 290 291 574 if (pe_dll_export_everything || pe_def_file->num_exports == 0) 292 575 { … … 303 586 { 304 587 /* We should export symbols which are either global or not 305 anything at all. (.bss data is the latter) */ 306 if ((symbols[j]->flags & BSF_GLOBAL) 307 || (symbols[j]->flags == BSF_NO_FLAGS)) 588 anything at all. (.bss data is the latter) 589 We should not export undefined symbols. */ 590 if (symbols[j]->section != &bfd_und_section 591 && ((symbols[j]->flags & BSF_GLOBAL) 592 || (symbols[j]->flags == BFD_FORT_COMM_DEFAULT_VALUE))) 308 593 { 309 594 const char *sn = symbols[j]->name; 595 596 /* We should not re-export imported stuff. */ 597 { 598 char *name = (char *) xmalloc (strlen (sn) + 2 + 6); 599 sprintf (name, "%s%s", U("_imp_"), sn); 600 601 blhe = bfd_link_hash_lookup (info->hash, name, 602 FALSE, FALSE, FALSE); 603 free (name); 604 605 if (blhe && blhe->type == bfd_link_hash_defined) 606 continue; 607 } 608 310 609 if (*sn == '_') 311 610 sn++; 312 if (auto_export (pe_def_file, sn)) 313 { 314 def_file_export *p; 315 p=def_file_add_export (pe_def_file, sn, 0, -1); 316 /* Fill data flag properly, from dlltool.c */ 317 p->flag_data = !(symbols[j]->flags & BSF_FUNCTION); 318 } 611 612 if (auto_export (b, pe_def_file, sn)) 613 { 614 def_file_export *p; 615 p=def_file_add_export (pe_def_file, sn, 0, -1); 616 /* Fill data flag properly, from dlltool.c. */ 617 p->flag_data = !(symbols[j]->flags & BSF_FUNCTION); 618 } 319 619 } 320 620 } … … 326 626 327 627 /* Canonicalize the export list. */ 328 329 628 if (pe_dll_kill_ats) 330 629 { … … 336 635 pointing to the same memory as name, or might not 337 636 have. */ 338 char *tmp = xstrdup (pe_def_file->exports[i].name); 637 int lead_at = (*pe_def_file->exports[i].name =='@'); 638 char *tmp = xstrdup (pe_def_file->exports[i].name + lead_at); 639 339 640 *(strchr (tmp, '@')) = 0; 340 641 pe_def_file->exports[i].name = tmp; … … 349 650 if (strchr (pe_def_file->exports[i].name, '@')) 350 651 { 351 char *tmp = xstrdup (pe_def_file->exports[i].name); 652 int lead_at = (*pe_def_file->exports[i].name == '@' ) ; 653 char *tmp = xstrdup (pe_def_file->exports[i].name + lead_at); 654 352 655 *(strchr (tmp, '@')) = 0; 353 if (auto_export ( pe_def_file, tmp))656 if (auto_export (NULL, pe_def_file, tmp)) 354 657 def_file_add_export (pe_def_file, tmp, 355 pe_def_file->exports[i].internal_name, -1); 658 pe_def_file->exports[i].internal_name, 659 -1); 356 660 else 357 661 free (tmp); … … 395 699 e[j - 1].name); 396 700 } 701 397 702 if (e[i].ordinal != -1) 398 703 e[j - 1].ordinal = e[i].ordinal; … … 414 719 { 415 720 char *name = (char *) xmalloc (strlen (pe_def_file->exports[i].internal_name) + 2); 416 if (pe_details->underscored) 721 722 if (pe_details->underscored 723 && (*pe_def_file->exports[i].internal_name != '@')) 417 724 { 418 725 *name = '_'; … … 424 731 blhe = bfd_link_hash_lookup (info->hash, 425 732 name, 426 false, false, true);733 FALSE, FALSE, TRUE); 427 734 428 735 if (blhe … … 474 781 } 475 782 476 /************************************************************************ 477 478 Build the bfd that will contain .edata and .reloc sections 479 480 ************************************************************************/ 783 /* Build the bfd that will contain .edata and .reloc sections. */ 481 784 482 785 static void … … 527 830 return; 528 831 } 832 529 833 bfd_set_section_size (filler_bfd, reloc_s, 0); 530 834 … … 532 836 } 533 837 534 /************************************************************************ 535 536 Gather all the exported symbols and build the .edata section 537 538 ************************************************************************/ 838 /* Gather all the exported symbols and build the .edata section. */ 539 839 540 840 static void … … 549 849 /* First, we need to know how many exported symbols there are, 550 850 and what the range of ordinals is. */ 551 552 851 if (pe_def_file->name) 553 { 554 dll_name = pe_def_file->name; 555 } 852 dll_name = pe_def_file->name; 556 853 else 557 854 { 558 855 dll_name = abfd->filename; 856 559 857 for (dlnp = dll_name; *dlnp; dlnp++) 560 { 561 if (*dlnp == '\\' || *dlnp == '/' || *dlnp == ':') 562 dll_name = dlnp + 1; 563 } 858 if (*dlnp == '\\' || *dlnp == '/' || *dlnp == ':') 859 dll_name = dlnp + 1; 564 860 } 565 861 … … 574 870 max_ordinal = count_exported; 575 871 } 872 576 873 export_table_size = max_ordinal - min_ordinal + 1; 577 578 874 exported_symbols = (int *) xmalloc (export_table_size * sizeof (int)); 579 875 for (i = 0; i < export_table_size; i++) … … 589 885 int ei = pe_def_file->exports[i].ordinal - min_ordinal; 590 886 int pi = exported_symbols[ei]; 887 591 888 if (pi != -1) 592 889 { … … 610 907 while (exported_symbols[next_ordinal - min_ordinal] != -1) 611 908 next_ordinal++; 909 612 910 exported_symbols[next_ordinal - min_ordinal] = i; 613 911 pe_def_file->exports[i].ordinal = next_ordinal; … … 615 913 616 914 /* OK, now we can allocate some memory. */ 617 618 edata_sz = (40 /* directory */ 619 + 4 * export_table_size /* addresses */ 915 edata_sz = (40 /* directory */ 916 + 4 * export_table_size /* addresses */ 620 917 + 4 * count_exported_byname /* name ptrs */ 621 918 + 2 * count_exported_byname /* ordinals */ … … 637 934 { 638 935 char *name = (char *) xmalloc (strlen (pe_def_file->exports[i].internal_name) + 2); 639 if (pe_details->underscored) 936 937 if (pe_details->underscored 938 && (*pe_def_file->exports[i].internal_name != '@')) 640 939 { 641 940 *name = '_'; … … 647 946 blhe = bfd_link_hash_lookup (info->hash, 648 947 name, 649 false, false, true);948 FALSE, FALSE, TRUE); 650 949 651 950 if (blhe && (blhe->type == bfd_link_hash_defined)) 652 { 653 exported_symbol_offsets[i] = blhe->u.def.value; 654 } 951 exported_symbol_offsets[i] = blhe->u.def.value; 952 655 953 free (name); 656 954 } … … 690 988 bfd_put_16 (abfd, pe_def_file->version_minor, edata_d + 10); 691 989 } 990 692 991 bfd_put_32 (abfd, ERVA (enamestr), edata_d + 12); 693 992 strcpy (enamestr, dll_name); … … 707 1006 { 708 1007 int s = exported_symbols[i]; 1008 709 1009 if (s != -1) 710 1010 { … … 717 1017 bfd_put_32 (abfd, srva - image_base, 718 1018 (void *) (eaddresses + ord - min_ordinal)); 1019 719 1020 if (!pe_def_file->exports[s].flag_noname) 720 1021 { … … 732 1033 } 733 1034 734 /************************************************************************ 735 736 Gather all the relocations and build the .reloc section 737 738 ************************************************************************/ 1035 1036 static struct sec *current_sec; 1037 1038 void 1039 pe_walk_relocs_of_symbol (info, name, cb) 1040 struct bfd_link_info *info; 1041 const char *name; 1042 int (*cb) (arelent *, asection *); 1043 { 1044 bfd *b; 1045 asection *s; 1046 1047 for (b = info->input_bfds; b; b = b->link_next) 1048 { 1049 asymbol **symbols; 1050 int nsyms, symsize; 1051 1052 symsize = bfd_get_symtab_upper_bound (b); 1053 symbols = (asymbol **) xmalloc (symsize); 1054 nsyms = bfd_canonicalize_symtab (b, symbols); 1055 1056 for (s = b->sections; s; s = s->next) 1057 { 1058 arelent **relocs; 1059 int relsize, nrelocs, i; 1060 int flags = bfd_get_section_flags (b, s); 1061 1062 /* Skip discarded linkonce sections. */ 1063 if (flags & SEC_LINK_ONCE 1064 && s->output_section == bfd_abs_section_ptr) 1065 continue; 1066 1067 current_sec = s; 1068 1069 relsize = bfd_get_reloc_upper_bound (b, s); 1070 relocs = (arelent **) xmalloc ((size_t) relsize); 1071 nrelocs = bfd_canonicalize_reloc (b, s, relocs, symbols); 1072 1073 for (i = 0; i < nrelocs; i++) 1074 { 1075 struct symbol_cache_entry *sym = *relocs[i]->sym_ptr_ptr; 1076 1077 if (!strcmp (name, sym->name)) 1078 cb (relocs[i], s); 1079 } 1080 1081 free (relocs); 1082 1083 /* Warning: the allocated symbols are remembered in BFD and reused 1084 later, so don't free them! */ 1085 /* free (symbols); */ 1086 } 1087 } 1088 } 1089 1090 /* Gather all the relocations and build the .reloc section. */ 739 1091 740 1092 static void … … 759 1111 total_relocs += s->reloc_count; 760 1112 761 reloc_data = (reloc_data_type *) xmalloc (total_relocs * sizeof (reloc_data_type)); 1113 reloc_data = 1114 (reloc_data_type *) xmalloc (total_relocs * sizeof (reloc_data_type)); 762 1115 763 1116 total_relocs = 0; … … 802 1155 for (i = 0; i < nrelocs; i++) 803 1156 { 1157 if (pe_dll_extra_pe_debug) 1158 { 1159 struct symbol_cache_entry *sym = *relocs[i]->sym_ptr_ptr; 1160 printf ("rel: %s\n", sym->name); 1161 } 804 1162 if (!relocs[i]->howto->pc_relative 805 1163 && relocs[i]->howto->type != pe_details->imagebase_reloc) … … 807 1165 bfd_vma sym_vma; 808 1166 struct symbol_cache_entry *sym = *relocs[i]->sym_ptr_ptr; 1167 809 1168 sym_vma = (relocs[i]->addend 810 1169 + sym->value … … 860 1219 reloc_addresses, which are all suitable for the .reloc section. 861 1220 We must now create the new sections. */ 862 863 1221 qsort (reloc_data, total_relocs, sizeof (*reloc_data), reloc_sort); 864 1222 … … 869 1227 if (this_page != sec_page) 870 1228 { 871 reloc_sz = (reloc_sz + 3) & ~3; /* 4-byte align */1229 reloc_sz = (reloc_sz + 3) & ~3; /* 4-byte align. */ 872 1230 reloc_sz += 8; 873 1231 sec_page = this_page; … … 879 1237 reloc_sz += 2; 880 1238 } 881 reloc_sz = (reloc_sz + 3) & ~3; /* 4-byte align */ 882 1239 1240 reloc_sz = (reloc_sz + 3) & ~3; /* 4-byte align. */ 883 1241 reloc_d = (unsigned char *) xmalloc (reloc_sz); 884 885 1242 sec_page = (unsigned long) (-1); 886 1243 reloc_sz = 0; 887 1244 page_ptr = (unsigned long) (-1); 888 1245 page_count = 0; 1246 889 1247 for (i = 0; i < total_relocs; i++) 890 1248 { 891 1249 unsigned long rva = reloc_data[i].vma - image_base; 892 1250 unsigned long this_page = (rva & ~0xfff); 1251 893 1252 if (this_page != sec_page) 894 1253 { 895 1254 while (reloc_sz & 3) 896 1255 reloc_d[reloc_sz++] = 0; 1256 897 1257 if (page_ptr != (unsigned long) (-1)) 898 1258 bfd_put_32 (abfd, reloc_sz - page_ptr, reloc_d + page_ptr + 4); 1259 899 1260 bfd_put_32 (abfd, this_page, reloc_d + reloc_sz); 900 1261 page_ptr = reloc_sz; … … 903 1264 page_count = 0; 904 1265 } 1266 905 1267 bfd_put_16 (abfd, (rva & 0xfff) + (reloc_data[i].type << 12), 906 1268 reloc_d + reloc_sz); 907 1269 reloc_sz += 2; 1270 908 1271 if (reloc_data[i].type == 4) 909 1272 { … … 911 1274 reloc_sz += 2; 912 1275 } 1276 913 1277 page_count++; 914 1278 } 1279 915 1280 while (reloc_sz & 3) 916 1281 reloc_d[reloc_sz++] = 0; 1282 917 1283 if (page_ptr != (unsigned long) (-1)) 918 1284 bfd_put_32 (abfd, reloc_sz - page_ptr, reloc_d + page_ptr + 4); 1285 919 1286 while (reloc_sz < reloc_s->_raw_size) 920 1287 reloc_d[reloc_sz++] = 0; 921 1288 } 922 1289 923 /************************************************************************ 924 925 Given the exiting def_file structure, print out a .DEF file that 926 corresponds to it. 927 928 ************************************************************************/ 1290 /* Given the exiting def_file structure, print out a .DEF file that 1291 corresponds to it. */ 929 1292 930 1293 static void … … 935 1298 { 936 1299 char *cp; 1300 937 1301 for (cp = s; *cp; cp++) 938 1302 if (*cp == '\'' 939 1303 || *cp == '"' 940 1304 || *cp == '\\' 941 || isspace ((unsigned char)*cp)1305 || ISSPACE (*cp) 942 1306 || *cp == ',' 943 1307 || *cp == ';') 944 1308 needs_quotes = 1; 1309 945 1310 if (needs_quotes) 946 1311 { 947 1312 putc ('"', f); 1313 948 1314 while (*s) 949 1315 { 950 1316 if (*s == '"' || *s == '\\') 951 1317 putc ('\\', f); 1318 952 1319 putc (*s, f); 953 1320 s++; 954 1321 } 1322 955 1323 putc ('"', f); 956 1324 } … … 965 1333 int i; 966 1334 FILE *out = fopen (pe_out_def_filename, "w"); 1335 967 1336 if (out == NULL) 968 { 969 /* xgettext:c-format */ 970 einfo (_("%s: Can't open output def file %s\n"), 971 program_name, pe_out_def_filename); 972 } 1337 /* xgettext:c-format */ 1338 einfo (_("%s: Can't open output def file %s\n"), 1339 program_name, pe_out_def_filename); 973 1340 974 1341 if (pe_def_file) … … 980 1347 else 981 1348 fprintf (out, "NAME "); 1349 982 1350 quoteput (pe_def_file->name, out, 1); 1351 983 1352 if (pe_data (output_bfd)->pe_opthdr.ImageBase) 984 1353 fprintf (out, " BASE=0x%lx", … … 1008 1377 else if (pe_def_file->stack_reserve != -1) 1009 1378 fprintf (out, "STACKSIZE 0x%x\n", pe_def_file->stack_reserve); 1379 1010 1380 if (pe_def_file->heap_commit != -1) 1011 1381 fprintf (out, "HEAPSIZE 0x%x,0x%x\n", … … 1017 1387 { 1018 1388 fprintf (out, "\nSECTIONS\n\n"); 1389 1019 1390 for (i = 0; i < pe_def_file->num_section_defs; i++) 1020 1391 { 1021 1392 fprintf (out, " "); 1022 1393 quoteput (pe_def_file->section_defs[i].name, out, 0); 1394 1023 1395 if (pe_def_file->section_defs[i].class) 1024 1396 { … … 1026 1398 quoteput (pe_def_file->section_defs[i].class, out, 0); 1027 1399 } 1400 1028 1401 if (pe_def_file->section_defs[i].flag_read) 1029 1402 fprintf (out, " READ"); 1403 1030 1404 if (pe_def_file->section_defs[i].flag_write) 1031 1405 fprintf (out, " WRITE"); 1406 1032 1407 if (pe_def_file->section_defs[i].flag_execute) 1033 1408 fprintf (out, " EXECUTE"); 1409 1034 1410 if (pe_def_file->section_defs[i].flag_shared) 1035 1411 fprintf (out, " SHARED"); 1412 1036 1413 fprintf (out, "\n"); 1037 1414 } … … 1040 1417 if (pe_def_file->num_exports > 0) 1041 1418 { 1042 fprintf (out, "\nEXPORTS\n\n"); 1419 fprintf (out, "EXPORTS\n"); 1420 1043 1421 for (i = 0; i < pe_def_file->num_exports; i++) 1044 1422 { … … 1046 1424 fprintf (out, " "); 1047 1425 quoteput (e->name, out, 0); 1426 1048 1427 if (e->internal_name && strcmp (e->internal_name, e->name)) 1049 1428 { … … 1051 1430 quoteput (e->internal_name, out, 0); 1052 1431 } 1432 1053 1433 if (e->ordinal != -1) 1054 1434 fprintf (out, " @%d", e->ordinal); 1435 1055 1436 if (e->flag_private) 1056 1437 fprintf (out, " PRIVATE"); 1438 1057 1439 if (e->flag_constant) 1058 1440 fprintf (out, " CONSTANT"); 1441 1059 1442 if (e->flag_noname) 1060 1443 fprintf (out, " NONAME"); 1444 1061 1445 if (e->flag_data) 1062 1446 fprintf (out, " DATA"); … … 1069 1453 { 1070 1454 fprintf (out, "\nIMPORTS\n\n"); 1455 1071 1456 for (i = 0; i < pe_def_file->num_imports; i++) 1072 1457 { 1073 1458 def_file_import *im = pe_def_file->imports + i; 1074 1459 fprintf (out, " "); 1460 1075 1461 if (im->internal_name 1076 1462 && (!im->name || strcmp (im->internal_name, im->name))) … … 1079 1465 fprintf (out, " = "); 1080 1466 } 1467 1081 1468 quoteput (im->module->name, out, 0); 1082 1469 fprintf (out, "."); 1470 1083 1471 if (im->name) 1084 1472 quoteput (im->name, out, 0); 1085 1473 else 1086 1474 fprintf (out, "%d", im->ordinal); 1475 1087 1476 fprintf (out, "\n"); 1088 1477 } … … 1093 1482 1094 1483 if (fclose (out) == EOF) 1095 { 1096 /* xgettext:c-format */ 1097 einfo (_("%P: Error closing file `%s'\n"), pe_out_def_filename); 1098 } 1099 } 1100 1101 /************************************************************************ 1102 1103 Generate the import library 1104 1105 ************************************************************************/ 1484 /* xgettext:c-format */ 1485 einfo (_("%P: Error closing file `%s'\n"), pe_out_def_filename); 1486 } 1487 1488 /* Generate the import library. */ 1106 1489 1107 1490 static asymbol **symtab; … … 1142 1525 quick_symbol (abfd, n1, n2, n3, sec, flags, addr) 1143 1526 bfd *abfd; 1144 c har *n1;1145 c har *n2;1146 c har *n3;1527 const char *n1; 1528 const char *n2; 1529 const char *n3; 1147 1530 asection *sec; 1148 1531 int flags; … … 1151 1534 asymbol *sym; 1152 1535 char *name = (char *) xmalloc (strlen (n1) + strlen (n2) + strlen (n3) + 1); 1536 1153 1537 strcpy (name, n1); 1154 1538 strcat (name, n2); … … 1191 1575 { 1192 1576 int i; 1577 1193 1578 sec->relocation = reltab; 1194 1579 sec->reloc_count = relcount; … … 1202 1587 } 1203 1588 1204 /* 1205 * .section .idata$2 1206 * .global __head_my_dll 1207 * __head_my_dll: 1208 * .rva hname 1209 * .long 0 1210 * .long 0 1211 * .rva __my_dll_iname 1212 * .rva fthunk 1213 * 1214 * .section .idata$5 1215 * .long 0 1216 * fthunk: 1217 * 1218 * .section .idata$4 1219 * .long 0 1220 * hname: 1221 */ 1589 /* .section .idata$2 1590 .global __head_my_dll 1591 __head_my_dll: 1592 .rva hname 1593 .long 0 1594 .long 0 1595 .rva __my_dll_iname 1596 .rva fthunk 1597 1598 .section .idata$5 1599 .long 0 1600 fthunk: 1601 1602 .section .idata$4 1603 .long 0 1604 hname: */ 1222 1605 1223 1606 static bfd * … … 1259 1642 id2->contents = d2; 1260 1643 memset (d2, 0, 20); 1261 d2[0] = d2[16] = 4; /* reloc addend*/1644 d2[0] = d2[16] = 4; /* Reloc addend. */ 1262 1645 quick_reloc (abfd, 0, BFD_RELOC_RVA, 2); 1263 1646 quick_reloc (abfd, 12, BFD_RELOC_RVA, 4); … … 1285 1668 } 1286 1669 1287 /* 1288 * .section .idata$4 1289 * .long 0 1290 * .section .idata$5 1291 * .long 0 1292 * .section idata$7 1293 * .global __my_dll_iname 1294 *__my_dll_iname: 1295 * .asciz "my.dll" 1296 */ 1670 /* .section .idata$4 1671 .long 0 1672 .section .idata$5 1673 .long 0 1674 .section idata$7 1675 .global __my_dll_iname 1676 __my_dll_iname: 1677 .asciz "my.dll" */ 1297 1678 1298 1679 static bfd * … … 1352 1733 } 1353 1734 1354 /* 1355 * .text 1356 * .global _function 1357 * .global ___imp_function 1358 * .global __imp__function 1359 *_function: 1360 * jmp *__imp__function: 1361 * 1362 * .section idata$7 1363 * .long __head_my_dll 1364 * 1365 * .section .idata$5 1366 *___imp_function: 1367 *__imp__function: 1368 *iat? 1369 * .section .idata$4 1370 *iat? 1371 * .section .idata$6 1372 *ID<ordinal>: 1373 * .short <hint> 1374 * .asciz "function" xlate? (add underscore, kill at) 1375 */ 1376 1377 static unsigned char jmp_ix86_bytes[] = { 1735 /* .text 1736 .global _function 1737 .global ___imp_function 1738 .global __imp__function 1739 _function: 1740 jmp *__imp__function: 1741 1742 .section idata$7 1743 .long __head_my_dll 1744 1745 .section .idata$5 1746 ___imp_function: 1747 __imp__function: 1748 iat? 1749 .section .idata$4 1750 iat? 1751 .section .idata$6 1752 ID<ordinal>: 1753 .short <hint> 1754 .asciz "function" xlate? (add underscore, kill at) */ 1755 1756 static unsigned char jmp_ix86_bytes[] = 1757 { 1378 1758 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x90, 0x90 1379 1759 }; 1380 1760 1381 /* 1382 *_function: 1383 * mov.l ip+8,r0 1384 * mov.l @r0,r0 1385 * jmp @r0 1386 * nop 1387 * .dw __imp_function 1388 */ 1389 1390 static unsigned char jmp_sh_bytes[] = { 1761 /* _function: 1762 mov.l ip+8,r0 1763 mov.l @r0,r0 1764 jmp @r0 1765 nop 1766 .dw __imp_function */ 1767 1768 static unsigned char jmp_sh_bytes[] = 1769 { 1391 1770 0x01, 0xd0, 0x02, 0x60, 0x2b, 0x40, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00 1392 1771 }; 1393 1772 1394 /* 1395 *_function: 1396 * lui $t0,<high:__imp_function> 1397 * lw $t0,<low:__imp_function> 1398 * jr $t0 1399 * nop 1400 */ 1401 1402 static unsigned char jmp_mips_bytes[] = { 1773 /* _function: 1774 lui $t0,<high:__imp_function> 1775 lw $t0,<low:__imp_function> 1776 jr $t0 1777 nop */ 1778 1779 static unsigned char jmp_mips_bytes[] = 1780 { 1403 1781 0x00, 0x00, 0x08, 0x3c, 0x00, 0x00, 0x08, 0x8d, 1404 1782 0x08, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00 … … 1432 1810 jmp_byte_count = sizeof (jmp_mips_bytes); 1433 1811 break; 1812 default: 1813 abort (); 1434 1814 } 1435 1815 … … 1446 1826 1447 1827 symptr = 0; 1448 symtab = (asymbol **) xmalloc (1 0* sizeof (asymbol *));1828 symtab = (asymbol **) xmalloc (11 * sizeof (asymbol *)); 1449 1829 tx = quick_section (abfd, ".text", SEC_CODE|SEC_HAS_CONTENTS, 2); 1450 1830 id7 = quick_section (abfd, ".idata$7", SEC_HAS_CONTENTS, 2); … … 1452 1832 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2); 1453 1833 id6 = quick_section (abfd, ".idata$6", SEC_HAS_CONTENTS, 2); 1454 if (! exp->flag_data) 1455 quick_symbol (abfd, U (""), exp->internal_name, "", tx, BSF_GLOBAL, 0); 1456 quick_symbol (abfd, U ("_head_"), dll_symname, "", UNDSEC, BSF_GLOBAL, 0); 1457 quick_symbol (abfd, U ("_imp__"), exp->internal_name, "", id5, BSF_GLOBAL, 0); 1834 1835 if (*exp->internal_name == '@') 1836 { 1837 if (! exp->flag_data) 1838 quick_symbol (abfd, "", exp->internal_name, "", tx, BSF_GLOBAL, 0); 1839 quick_symbol (abfd, U ("_head_"), dll_symname, "", UNDSEC, BSF_GLOBAL, 0); 1840 quick_symbol (abfd, U ("_imp_"), exp->internal_name, "", id5, BSF_GLOBAL, 0); 1841 /* Fastcall applies only to functions, 1842 so no need for auto-import symbol. */ 1843 } 1844 else 1845 { 1846 if (! exp->flag_data) 1847 quick_symbol (abfd, U (""), exp->internal_name, "", tx, BSF_GLOBAL, 0); 1848 quick_symbol (abfd, U ("_head_"), dll_symname, "", UNDSEC, BSF_GLOBAL, 0); 1849 quick_symbol (abfd, U ("_imp__"), exp->internal_name, "", id5, BSF_GLOBAL, 0); 1850 /* Symbol to reference ord/name of imported 1851 data symbol, used to implement auto-import. */ 1852 if (exp->flag_data) 1853 quick_symbol (abfd, U("_nm__"), exp->internal_name, "", id6, BSF_GLOBAL,0); 1854 } 1458 1855 if (pe_dll_compat_implib) 1459 1856 quick_symbol (abfd, U ("__imp_"), exp->internal_name, "", … … 1461 1858 1462 1859 if (! exp->flag_data) 1463 { 1464 bfd_set_section_size (abfd, tx, jmp_byte_count); 1465 td = (unsigned char *) xmalloc (jmp_byte_count); 1466 tx->contents = td; 1467 memcpy (td, jmp_bytes, jmp_byte_count); 1468 switch (pe_details->pe_arch) 1469 { 1470 case PE_ARCH_i386: 1471 quick_reloc (abfd, 2, BFD_RELOC_32, 2); 1472 break; 1473 case PE_ARCH_sh: 1474 quick_reloc (abfd, 8, BFD_RELOC_32, 2); 1475 break; 1476 case PE_ARCH_mips: 1477 quick_reloc (abfd, 0, BFD_RELOC_HI16_S, 2); 1478 quick_reloc (abfd, 0, BFD_RELOC_LO16, 0); /* MIPS_R_PAIR */ 1479 quick_reloc (abfd, 4, BFD_RELOC_LO16, 2); 1480 break; 1481 } 1482 save_relocs (tx); 1483 } 1860 { 1861 bfd_set_section_size (abfd, tx, jmp_byte_count); 1862 td = (unsigned char *) xmalloc (jmp_byte_count); 1863 tx->contents = td; 1864 memcpy (td, jmp_bytes, jmp_byte_count); 1865 1866 switch (pe_details->pe_arch) 1867 { 1868 case PE_ARCH_i386: 1869 quick_reloc (abfd, 2, BFD_RELOC_32, 2); 1870 break; 1871 case PE_ARCH_sh: 1872 quick_reloc (abfd, 8, BFD_RELOC_32, 2); 1873 break; 1874 case PE_ARCH_mips: 1875 quick_reloc (abfd, 0, BFD_RELOC_HI16_S, 2); 1876 quick_reloc (abfd, 0, BFD_RELOC_LO16, 0); /* MIPS_R_PAIR */ 1877 quick_reloc (abfd, 4, BFD_RELOC_LO16, 2); 1878 break; 1879 default: 1880 abort (); 1881 } 1882 save_relocs (tx); 1883 } 1484 1884 1485 1885 bfd_set_section_size (abfd, id7, 4); … … 1494 1894 id5->contents = d5; 1495 1895 memset (d5, 0, 4); 1896 1496 1897 if (exp->flag_noname) 1497 1898 { … … 1510 1911 id4->contents = d4; 1511 1912 memset (d4, 0, 4); 1913 1512 1914 if (exp->flag_noname) 1513 1915 { … … 1554 1956 } 1555 1957 1958 static bfd * 1959 make_singleton_name_thunk (import, parent) 1960 const char *import; 1961 bfd *parent; 1962 { 1963 /* Name thunks go to idata$4. */ 1964 asection *id4; 1965 unsigned char *d4; 1966 char *oname; 1967 bfd *abfd; 1968 1969 oname = (char *) xmalloc (20); 1970 sprintf (oname, "nmth%06d.o", tmp_seq); 1971 tmp_seq++; 1972 1973 abfd = bfd_create (oname, parent); 1974 bfd_find_target (pe_details->object_target, abfd); 1975 bfd_make_writable (abfd); 1976 1977 bfd_set_format (abfd, bfd_object); 1978 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0); 1979 1980 symptr = 0; 1981 symtab = (asymbol **) xmalloc (3 * sizeof (asymbol *)); 1982 id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2); 1983 quick_symbol (abfd, U ("_nm_thnk_"), import, "", id4, BSF_GLOBAL, 0); 1984 quick_symbol (abfd, U ("_nm_"), import, "", UNDSEC, BSF_GLOBAL, 0); 1985 1986 bfd_set_section_size (abfd, id4, 8); 1987 d4 = (unsigned char *) xmalloc (4); 1988 id4->contents = d4; 1989 memset (d4, 0, 8); 1990 quick_reloc (abfd, 0, BFD_RELOC_RVA, 2); 1991 save_relocs (id4); 1992 1993 bfd_set_symtab (abfd, symtab, symptr); 1994 1995 bfd_set_section_contents (abfd, id4, d4, 0, 8); 1996 1997 bfd_make_readable (abfd); 1998 return abfd; 1999 } 2000 2001 static char * 2002 make_import_fixup_mark (rel) 2003 arelent *rel; 2004 { 2005 /* We convert reloc to symbol, for later reference. */ 2006 static int counter; 2007 static char *fixup_name = NULL; 2008 static size_t buffer_len = 0; 2009 2010 struct symbol_cache_entry *sym = *rel->sym_ptr_ptr; 2011 2012 bfd *abfd = bfd_asymbol_bfd (sym); 2013 struct bfd_link_hash_entry *bh; 2014 2015 if (!fixup_name) 2016 { 2017 fixup_name = (char *) xmalloc (384); 2018 buffer_len = 384; 2019 } 2020 2021 if (strlen (sym->name) + 25 > buffer_len) 2022 /* Assume 25 chars for "__fu" + counter + "_". If counter is 2023 bigger than 20 digits long, we've got worse problems than 2024 overflowing this buffer... */ 2025 { 2026 free (fixup_name); 2027 /* New buffer size is length of symbol, plus 25, but 2028 then rounded up to the nearest multiple of 128. */ 2029 buffer_len = ((strlen (sym->name) + 25) + 127) & ~127; 2030 fixup_name = (char *) xmalloc (buffer_len); 2031 } 2032 2033 sprintf (fixup_name, "__fu%d_%s", counter++, sym->name); 2034 2035 bh = NULL; 2036 bfd_coff_link_add_one_symbol (&link_info, abfd, fixup_name, BSF_GLOBAL, 2037 current_sec, /* sym->section, */ 2038 rel->address, NULL, TRUE, FALSE, &bh); 2039 2040 if (0) 2041 { 2042 struct coff_link_hash_entry *myh; 2043 2044 myh = (struct coff_link_hash_entry *) bh; 2045 printf ("type:%d\n", myh->type); 2046 printf ("%s\n", myh->root.u.def.section->name); 2047 } 2048 2049 return fixup_name; 2050 } 2051 2052 /* .section .idata$3 2053 .rva __nm_thnk_SYM (singleton thunk with name of func) 2054 .long 0 2055 .long 0 2056 .rva __my_dll_iname (name of dll) 2057 .rva __fuNN_SYM (pointer to reference (address) in text) */ 2058 2059 static bfd * 2060 make_import_fixup_entry (name, fixup_name, dll_symname, parent) 2061 const char *name; 2062 const char *fixup_name; 2063 const char *dll_symname; 2064 bfd *parent; 2065 { 2066 asection *id3; 2067 unsigned char *d3; 2068 char *oname; 2069 bfd *abfd; 2070 2071 oname = (char *) xmalloc (20); 2072 sprintf (oname, "fu%06d.o", tmp_seq); 2073 tmp_seq++; 2074 2075 abfd = bfd_create (oname, parent); 2076 bfd_find_target (pe_details->object_target, abfd); 2077 bfd_make_writable (abfd); 2078 2079 bfd_set_format (abfd, bfd_object); 2080 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0); 2081 2082 symptr = 0; 2083 symtab = (asymbol **) xmalloc (6 * sizeof (asymbol *)); 2084 id3 = quick_section (abfd, ".idata$3", SEC_HAS_CONTENTS, 2); 2085 2086 #if 0 2087 quick_symbol (abfd, U ("_head_"), dll_symname, "", id2, BSF_GLOBAL, 0); 2088 #endif 2089 quick_symbol (abfd, U ("_nm_thnk_"), name, "", UNDSEC, BSF_GLOBAL, 0); 2090 quick_symbol (abfd, U (""), dll_symname, "_iname", UNDSEC, BSF_GLOBAL, 0); 2091 quick_symbol (abfd, "", fixup_name, "", UNDSEC, BSF_GLOBAL, 0); 2092 2093 bfd_set_section_size (abfd, id3, 20); 2094 d3 = (unsigned char *) xmalloc (20); 2095 id3->contents = d3; 2096 memset (d3, 0, 20); 2097 2098 quick_reloc (abfd, 0, BFD_RELOC_RVA, 1); 2099 quick_reloc (abfd, 12, BFD_RELOC_RVA, 2); 2100 quick_reloc (abfd, 16, BFD_RELOC_RVA, 3); 2101 save_relocs (id3); 2102 2103 bfd_set_symtab (abfd, symtab, symptr); 2104 2105 bfd_set_section_contents (abfd, id3, d3, 0, 20); 2106 2107 bfd_make_readable (abfd); 2108 return abfd; 2109 } 2110 2111 /* .section .rdata_runtime_pseudo_reloc 2112 .long addend 2113 .rva __fuNN_SYM (pointer to reference (address) in text) */ 2114 2115 static bfd * 2116 make_runtime_pseudo_reloc (name, fixup_name, addend, parent) 2117 const char *name ATTRIBUTE_UNUSED; 2118 const char *fixup_name; 2119 int addend; 2120 bfd *parent; 2121 { 2122 asection *rt_rel; 2123 unsigned char *rt_rel_d; 2124 char *oname; 2125 bfd *abfd; 2126 2127 oname = (char *) xmalloc (20); 2128 sprintf (oname, "rtr%06d.o", tmp_seq); 2129 tmp_seq++; 2130 2131 abfd = bfd_create (oname, parent); 2132 bfd_find_target (pe_details->object_target, abfd); 2133 bfd_make_writable (abfd); 2134 2135 bfd_set_format (abfd, bfd_object); 2136 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0); 2137 2138 symptr = 0; 2139 symtab = (asymbol **) xmalloc (2 * sizeof (asymbol *)); 2140 rt_rel = quick_section (abfd, ".rdata_runtime_pseudo_reloc", SEC_HAS_CONTENTS, 2); 2141 2142 quick_symbol (abfd, "", fixup_name, "", UNDSEC, BSF_GLOBAL, 0); 2143 2144 bfd_set_section_size (abfd, rt_rel, 8); 2145 rt_rel_d = (unsigned char *) xmalloc (8); 2146 rt_rel->contents = rt_rel_d; 2147 memset (rt_rel_d, 0, 8); 2148 bfd_put_32 (abfd, addend, rt_rel_d); 2149 2150 quick_reloc (abfd, 4, BFD_RELOC_RVA, 1); 2151 save_relocs (rt_rel); 2152 2153 bfd_set_symtab (abfd, symtab, symptr); 2154 2155 bfd_set_section_contents (abfd, rt_rel, rt_rel_d, 0, 8); 2156 2157 bfd_make_readable (abfd); 2158 return abfd; 2159 } 2160 2161 /* .section .rdata 2162 .rva __pei386_runtime_relocator */ 2163 2164 static bfd * 2165 pe_create_runtime_relocator_reference (parent) 2166 bfd *parent; 2167 { 2168 asection *extern_rt_rel; 2169 unsigned char *extern_rt_rel_d; 2170 char *oname; 2171 bfd *abfd; 2172 2173 oname = (char *) xmalloc (20); 2174 sprintf (oname, "ertr%06d.o", tmp_seq); 2175 tmp_seq++; 2176 2177 abfd = bfd_create (oname, parent); 2178 bfd_find_target (pe_details->object_target, abfd); 2179 bfd_make_writable (abfd); 2180 2181 bfd_set_format (abfd, bfd_object); 2182 bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0); 2183 2184 symptr = 0; 2185 symtab = (asymbol **) xmalloc (2 * sizeof (asymbol *)); 2186 extern_rt_rel = quick_section (abfd, ".rdata", SEC_HAS_CONTENTS, 2); 2187 2188 quick_symbol (abfd, "", "__pei386_runtime_relocator", "", UNDSEC, BSF_NO_FLAGS, 0); 2189 2190 bfd_set_section_size (abfd, extern_rt_rel, 4); 2191 extern_rt_rel_d = (unsigned char *) xmalloc (4); 2192 extern_rt_rel->contents = extern_rt_rel_d; 2193 2194 quick_reloc (abfd, 0, BFD_RELOC_RVA, 1); 2195 save_relocs (extern_rt_rel); 2196 2197 bfd_set_symtab (abfd, symtab, symptr); 2198 2199 bfd_set_section_contents (abfd, extern_rt_rel, extern_rt_rel_d, 0, 4); 2200 2201 bfd_make_readable (abfd); 2202 return abfd; 2203 } 2204 2205 void 2206 pe_create_import_fixup (rel, s, addend) 2207 arelent *rel; 2208 asection *s; 2209 int addend; 2210 { 2211 char buf[300]; 2212 struct symbol_cache_entry *sym = *rel->sym_ptr_ptr; 2213 struct bfd_link_hash_entry *name_thunk_sym; 2214 const char *name = sym->name; 2215 char *fixup_name = make_import_fixup_mark (rel); 2216 bfd *b; 2217 2218 sprintf (buf, U ("_nm_thnk_%s"), name); 2219 2220 name_thunk_sym = bfd_link_hash_lookup (link_info.hash, buf, 0, 0, 1); 2221 2222 if (!name_thunk_sym || name_thunk_sym->type != bfd_link_hash_defined) 2223 { 2224 bfd *b = make_singleton_name_thunk (name, output_bfd); 2225 add_bfd_to_link (b, b->filename, &link_info); 2226 2227 /* If we ever use autoimport, we have to cast text section writable. */ 2228 config.text_read_only = FALSE; 2229 } 2230 2231 if (addend == 0 || link_info.pei386_runtime_pseudo_reloc) 2232 { 2233 extern char * pe_data_import_dll; 2234 char * dll_symname = pe_data_import_dll ? pe_data_import_dll : "unknown"; 2235 2236 b = make_import_fixup_entry (name, fixup_name, dll_symname, output_bfd); 2237 add_bfd_to_link (b, b->filename, &link_info); 2238 } 2239 2240 if (addend != 0) 2241 { 2242 if (link_info.pei386_runtime_pseudo_reloc) 2243 { 2244 if (pe_dll_extra_pe_debug) 2245 printf ("creating runtime pseudo-reloc entry for %s (addend=%d)\n", 2246 fixup_name, addend); 2247 b = make_runtime_pseudo_reloc (name, fixup_name, addend, output_bfd); 2248 add_bfd_to_link (b, b->filename, &link_info); 2249 2250 if (runtime_pseudo_relocs_created == 0) 2251 { 2252 b = pe_create_runtime_relocator_reference (output_bfd); 2253 add_bfd_to_link (b, b->filename, &link_info); 2254 } 2255 runtime_pseudo_relocs_created++; 2256 } 2257 else 2258 { 2259 einfo (_("%C: variable '%T' can't be auto-imported. Please read the documentation for ld's --enable-auto-import for details.\n"), 2260 s->owner, s, rel->address, sym->name); 2261 einfo ("%X"); 2262 } 2263 } 2264 } 2265 2266 1556 2267 void 1557 2268 pe_dll_generate_implib (def, impfilename) … … 1568 2279 dll_symname = xstrdup (dll_filename); 1569 2280 for (i = 0; dll_symname[i]; i++) 1570 if (! isalnum ((unsigned char)dll_symname[i]))2281 if (!ISALNUM (dll_symname[i])) 1571 2282 dll_symname[i] = '_'; 1572 2283 … … 1589 2300 1590 2301 /* Work out a reasonable size of things to put onto one line. */ 1591 1592 2302 ar_head = make_head (outarch); 1593 2303 … … 1597 2307 char *internal = def->exports[i].internal_name; 1598 2308 bfd *n; 2309 1599 2310 def->exports[i].internal_name = def->exports[i].name; 1600 2311 n = make_one (def->exports + i, outarch); … … 1610 2321 1611 2322 /* Now stick them all into the archive. */ 1612 1613 2323 ar_head->next = head; 1614 2324 ar_tail->next = ar_head; … … 1632 2342 add_bfd_to_link (abfd, name, link_info) 1633 2343 bfd *abfd; 1634 c har *name;2344 const char *name; 1635 2345 struct bfd_link_info *link_info; 1636 2346 { 1637 2347 lang_input_statement_type *fake_file; 2348 1638 2349 fake_file = lang_add_input_file (name, 1639 2350 lang_input_file_is_fake_enum, … … 1641 2352 fake_file->the_bfd = abfd; 1642 2353 ldlang_add_file (fake_file); 2354 1643 2355 if (!bfd_link_add_symbols (abfd, link_info)) 1644 2356 einfo ("%Xaddsym %s: %s\n", name, bfd_errmsg (bfd_get_error ())); … … 1651 2363 { 1652 2364 def_file_module *module; 2365 1653 2366 pe_dll_id_target (bfd_get_target (output_bfd)); 1654 2367 … … 1663 2376 dll_symname = xstrdup (module->name); 1664 2377 for (i = 0; dll_symname[i]; i++) 1665 if (! isalnum(dll_symname[i]))2378 if (!ISALNUM (dll_symname[i])) 1666 2379 dll_symname[i] = '_'; 1667 2380 … … 1673 2386 def_file_export exp; 1674 2387 struct bfd_link_hash_entry *blhe; 1675 2388 int lead_at = (*pe_def_file->imports[i].internal_name == '@'); 1676 2389 /* See if we need this import. */ 1677 2390 char *name = (char *) xmalloc (strlen (pe_def_file->imports[i].internal_name) + 2 + 6); 1678 sprintf (name, "%s%s", U (""), pe_def_file->imports[i].internal_name); 2391 2392 if (lead_at) 2393 sprintf (name, "%s%s", "", pe_def_file->imports[i].internal_name); 2394 else 2395 sprintf (name, "%s%s",U (""), pe_def_file->imports[i].internal_name); 2396 1679 2397 blhe = bfd_link_hash_lookup (link_info->hash, name, 1680 false, false, false); 2398 FALSE, FALSE, FALSE); 2399 1681 2400 if (!blhe || (blhe && blhe->type != bfd_link_hash_undefined)) 1682 2401 { 1683 sprintf (name, "%s%s", U ("_imp__"), 1684 pe_def_file->imports[i].internal_name); 2402 if (lead_at) 2403 sprintf (name, "%s%s", U ("_imp_"), 2404 pe_def_file->imports[i].internal_name); 2405 else 2406 sprintf (name, "%s%s", U ("_imp__"), 2407 pe_def_file->imports[i].internal_name); 2408 1685 2409 blhe = bfd_link_hash_lookup (link_info->hash, name, 1686 false, false, false);2410 FALSE, FALSE, FALSE); 1687 2411 } 1688 2412 free (name); 2413 1689 2414 if (blhe && blhe->type == bfd_link_hash_undefined) 1690 2415 { … … 1703 2428 exp.flag_private = 0; 1704 2429 exp.flag_constant = 0; 1705 exp.flag_data = 0;2430 exp.flag_data = pe_def_file->imports[i].data; 1706 2431 exp.flag_noname = exp.name ? 0 : 1; 1707 2432 one = make_one (&exp, output_bfd); … … 1719 2444 } 1720 2445 1721 /************************************************************************ 1722 1723 We were handed a *.DLL file. Parse it and turn it into a set of 1724 IMPORTS directives in the def file. Return true if the file was 1725 handled, false if not. 1726 1727 ************************************************************************/ 2446 /* We were handed a *.DLL file. Parse it and turn it into a set of 2447 IMPORTS directives in the def file. Return TRUE if the file was 2448 handled, FALSE if not. */ 1728 2449 1729 2450 static unsigned int … … 1733 2454 { 1734 2455 unsigned char b[2]; 1735 bfd_seek (abfd, where, SEEK_SET); 1736 bfd_read (b, 1, 2, abfd); 2456 2457 bfd_seek (abfd, (file_ptr) where, SEEK_SET); 2458 bfd_bread (b, (bfd_size_type) 2, abfd); 1737 2459 return b[0] + (b[1] << 8); 1738 2460 } … … 1744 2466 { 1745 2467 unsigned char b[4]; 1746 bfd_seek (abfd, where, SEEK_SET); 1747 bfd_read (b, 1, 4, abfd); 2468 2469 bfd_seek (abfd, (file_ptr) where, SEEK_SET); 2470 bfd_bread (b, (bfd_size_type) 4, abfd); 1748 2471 return b[0] + (b[1] << 8) + (b[2] << 16) + (b[3] << 24); 1749 2472 } … … 1756 2479 { 1757 2480 unsigned char *b = ptr; 2481 1758 2482 return b[0] + (b[1] << 8); 1759 2483 } … … 1766 2490 { 1767 2491 unsigned char *b = ptr; 2492 1768 2493 return b[0] + (b[1] << 8) + (b[2] << 16) + (b[3] << 24); 1769 2494 } 1770 2495 1771 b oolean2496 bfd_boolean 1772 2497 pe_implied_import_dll (filename) 1773 2498 const char *filename; … … 1776 2501 unsigned long pe_header_offset, opthdr_ofs, num_entries, i; 1777 2502 unsigned long export_rva, export_size, nsections, secptr, expptr; 2503 unsigned long exp_funcbase; 1778 2504 unsigned char *expdata, *erva; 1779 2505 unsigned long name_rvas, ordinals, nexp, ordbase; 1780 2506 const char *dll_name; 2507 /* Initialization with start > end guarantees that is_data 2508 will not be set by mistake, and avoids compiler warning. */ 2509 unsigned long data_start = 1; 2510 unsigned long data_end = 0; 2511 unsigned long bss_start = 1; 2512 unsigned long bss_end = 0; 1781 2513 1782 2514 /* No, I can't use bfd here. kernel32.dll puts its export table in 1783 2515 the middle of the .rdata section. */ 1784 1785 2516 dll = bfd_openr (filename, pe_details->target_name); 1786 2517 if (!dll) 1787 2518 { 1788 2519 einfo ("%Xopen %s: %s\n", filename, bfd_errmsg (bfd_get_error ())); 1789 return false; 1790 } 2520 return FALSE; 2521 } 2522 1791 2523 /* PEI dlls seem to be bfd_objects. */ 1792 2524 if (!bfd_check_format (dll, bfd_object)) 1793 2525 { 1794 2526 einfo ("%X%s: this doesn't appear to be a DLL\n", filename); 1795 return false; 1796 } 1797 1798 dll_name = filename; 1799 for (i = 0; filename[i]; i++) 1800 if (filename[i] == '/' || filename[i] == '\\' || filename[i] == ':') 1801 dll_name = filename + i + 1; 1802 2527 return FALSE; 2528 } 2529 2530 /* Get pe_header, optional header and numbers of export entries. */ 1803 2531 pe_header_offset = pe_get32 (dll, 0x3c); 1804 2532 opthdr_ofs = pe_header_offset + 4 + 20; 1805 2533 num_entries = pe_get32 (dll, opthdr_ofs + 92); 1806 if (num_entries < 1) /* no exports */ 1807 return false; 2534 2535 if (num_entries < 1) /* No exports. */ 2536 return FALSE; 2537 1808 2538 export_rva = pe_get32 (dll, opthdr_ofs + 96); 1809 2539 export_size = pe_get32 (dll, opthdr_ofs + 100); … … 1812 2542 pe_get16 (dll, pe_header_offset + 4 + 16)); 1813 2543 expptr = 0; 2544 2545 /* Get the rva and size of the export section. */ 1814 2546 for (i = 0; i < nsections; i++) 1815 2547 { … … 1819 2551 unsigned long vsize = pe_get32 (dll, secptr1 + 16); 1820 2552 unsigned long fptr = pe_get32 (dll, secptr1 + 20); 1821 bfd_seek (dll, secptr1, SEEK_SET); 1822 bfd_read (sname, 1, 8, dll); 2553 2554 bfd_seek (dll, (file_ptr) secptr1, SEEK_SET); 2555 bfd_bread (sname, (bfd_size_type) 8, dll); 2556 1823 2557 if (vaddr <= export_rva && vaddr + vsize > export_rva) 1824 2558 { … … 1830 2564 } 1831 2565 2566 /* Scan sections and store the base and size of the 2567 data and bss segments in data/base_start/end. */ 2568 for (i = 0; i < nsections; i++) 2569 { 2570 unsigned long secptr1 = secptr + 40 * i; 2571 unsigned long vsize = pe_get32 (dll, secptr1 + 8); 2572 unsigned long vaddr = pe_get32 (dll, secptr1 + 12); 2573 unsigned long flags = pe_get32 (dll, secptr1 + 36); 2574 char sec_name[9]; 2575 2576 sec_name[8] = '\0'; 2577 bfd_seek (dll, (file_ptr) secptr1 + 0, SEEK_SET); 2578 bfd_bread (sec_name, (bfd_size_type) 8, dll); 2579 2580 if (strcmp(sec_name,".data") == 0) 2581 { 2582 data_start = vaddr; 2583 data_end = vaddr + vsize; 2584 2585 if (pe_dll_extra_pe_debug) 2586 printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n", 2587 __FUNCTION__, sec_name, vaddr, vaddr + vsize, flags); 2588 } 2589 else if (strcmp (sec_name,".bss") == 0) 2590 { 2591 bss_start = vaddr; 2592 bss_end = vaddr + vsize; 2593 2594 if (pe_dll_extra_pe_debug) 2595 printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n", 2596 __FUNCTION__, sec_name, vaddr, vaddr + vsize, flags); 2597 } 2598 } 2599 1832 2600 expdata = (unsigned char *) xmalloc (export_size); 1833 bfd_seek (dll, expptr, SEEK_SET);1834 bfd_ read (expdata, 1,export_size, dll);2601 bfd_seek (dll, (file_ptr) expptr, SEEK_SET); 2602 bfd_bread (expdata, (bfd_size_type) export_size, dll); 1835 2603 erva = expdata - export_rva; 1836 2604 … … 1842 2610 ordinals = pe_as32 (expdata + 36); 1843 2611 ordbase = pe_as32 (expdata + 16); 2612 exp_funcbase = pe_as32 (expdata + 28); 2613 2614 /* Use internal dll name instead of filename 2615 to enable symbolic dll linking. */ 2616 dll_name = pe_as32 (expdata + 12) + erva; 2617 2618 /* Check to see if the dll has already been added to 2619 the definition list and if so return without error. 2620 This avoids multiple symbol definitions. */ 2621 if (def_get_module (pe_def_file, dll_name)) 2622 { 2623 if (pe_dll_extra_pe_debug) 2624 printf ("%s is already loaded\n", dll_name); 2625 return TRUE; 2626 } 2627 2628 /* Iterate through the list of symbols. */ 1844 2629 for (i = 0; i < nexp; i++) 1845 2630 { 2631 /* Pointer to the names vector. */ 1846 2632 unsigned long name_rva = pe_as32 (erva + name_rvas + i * 4); 1847 2633 def_file_import *imp; 1848 imp = def_file_add_import (pe_def_file, erva + name_rva, dll_name, 1849 i, 0); 1850 } 1851 1852 return true; 1853 } 1854 1855 /************************************************************************ 1856 1857 These are the main functions, called from the emulation. The first 1858 is called after the bfds are read, so we can guess at how much space 1859 we need. The second is called after everything is placed, so we 1860 can put the right values in place. 1861 1862 ************************************************************************/ 2634 /* Pointer to the function address vector. */ 2635 unsigned long func_rva = pe_as32 (erva + exp_funcbase + i * 4); 2636 int is_data = 0; 2637 2638 /* Skip unwanted symbols, which are 2639 exported in buggy auto-import releases. */ 2640 if (strncmp (erva + name_rva, "_nm_", 4) != 0) 2641 { 2642 /* is_data is true if the address is in the data or bss segment. */ 2643 is_data = 2644 (func_rva >= data_start && func_rva < data_end) 2645 || (func_rva >= bss_start && func_rva < bss_end); 2646 2647 imp = def_file_add_import (pe_def_file, erva + name_rva, 2648 dll_name, i, 0); 2649 /* Mark symbol type. */ 2650 imp->data = is_data; 2651 2652 if (pe_dll_extra_pe_debug) 2653 printf ("%s dll-name: %s sym: %s addr: 0x%lx %s\n", 2654 __FUNCTION__, dll_name, erva + name_rva, 2655 func_rva, is_data ? "(data)" : ""); 2656 } 2657 } 2658 2659 return TRUE; 2660 } 2661 2662 /* These are the main functions, called from the emulation. The first 2663 is called after the bfds are read, so we can guess at how much space 2664 we need. The second is called after everything is placed, so we 2665 can put the right values in place. */ 1863 2666 1864 2667 void … … 1870 2673 process_def_file (abfd, info); 1871 2674 2675 if (pe_def_file->num_exports == 0 && !(info->shared)) 2676 return; 2677 1872 2678 generate_edata (abfd, info); 1873 2679 build_filler_bfd (1); … … 1898 2704 /* Resize the sections. */ 1899 2705 lang_size_sections (stat_ptr->head, abs_output_section, 1900 &stat_ptr->head, 0, (bfd_vma) 0, false);2706 &stat_ptr->head, 0, (bfd_vma) 0, NULL, TRUE); 1901 2707 1902 2708 /* Redo special stuff. */ … … 1906 2712 lang_do_assignments (stat_ptr->head, 1907 2713 abs_output_section, 1908 (fill_type ) 0, (bfd_vma) 0);2714 (fill_type *) 0, (bfd_vma) 0); 1909 2715 } 1910 2716 1911 2717 fill_edata (abfd, info); 1912 2718 1913 pe_data (abfd)->dll = 1; 2719 if (info->shared) 2720 pe_data (abfd)->dll = 1; 1914 2721 1915 2722 edata_s->contents = edata_d; … … 1932 2739 /* Resize the sections. */ 1933 2740 lang_size_sections (stat_ptr->head, abs_output_section, 1934 &stat_ptr->head, 0, (bfd_vma) 0, false);2741 &stat_ptr->head, 0, (bfd_vma) 0, NULL, TRUE); 1935 2742 1936 2743 /* Redo special stuff. */ … … 1940 2747 lang_do_assignments (stat_ptr->head, 1941 2748 abs_output_section, 1942 (fill_type ) 0, (bfd_vma) 0);2749 (fill_type *) 0, (bfd_vma) 0); 1943 2750 } 1944 2751 reloc_s->contents = reloc_d; -
Property cvs2svn:cvs-rev
changed from
Note:
See TracChangeset
for help on using the changeset viewer.