diff options
Diffstat (limited to 'ld/pe-dll.c')
-rw-r--r-- | ld/pe-dll.c | 424 |
1 files changed, 167 insertions, 257 deletions
diff --git a/ld/pe-dll.c b/ld/pe-dll.c index b1a3737ad7..d693e303d6 100644 --- a/ld/pe-dll.c +++ b/ld/pe-dll.c @@ -120,8 +120,7 @@ See also: ld/emultempl/pe.em. */ -static void -add_bfd_to_link PARAMS ((bfd *, const char *, struct bfd_link_info *)); +static void add_bfd_to_link (bfd *, const char *, struct bfd_link_info *); /* For emultempl/pe.em. */ @@ -287,39 +286,8 @@ static autofilter_entry_type autofilter_symbolsuffixlist[] = #define U(str) (pe_details->underscored ? "_" str : str) -static int reloc_sort PARAMS ((const void *, const void *)); -static int pe_export_sort PARAMS ((const void *, const void *)); -static int auto_export PARAMS ((bfd *, def_file *, const char *)); -static void process_def_file PARAMS ((bfd *, struct bfd_link_info *)); -static void build_filler_bfd PARAMS ((int)); -static void generate_edata PARAMS ((bfd *, struct bfd_link_info *)); -static void fill_exported_offsets PARAMS ((bfd *, struct bfd_link_info *)); -static void fill_edata PARAMS ((bfd *, struct bfd_link_info *)); -static void generate_reloc PARAMS ((bfd *, struct bfd_link_info *)); -static void quoteput PARAMS ((char *, FILE *, int)); -static asection *quick_section PARAMS ((bfd *, const char *, int, int)); -static void quick_symbol - PARAMS ((bfd *, const char *, const char *, const char *, - asection *, int, int)); -static void quick_reloc PARAMS ((bfd *, int, int, int)); -static bfd *make_head PARAMS ((bfd *)); -static bfd *make_tail PARAMS ((bfd *)); -static bfd *make_one PARAMS ((def_file_export *, bfd *)); -static bfd *make_singleton_name_thunk PARAMS ((const char *, bfd *)); -static char *make_import_fixup_mark PARAMS ((arelent *)); -static bfd *make_import_fixup_entry - PARAMS ((const char *, const char *, const char *, bfd *)); -static bfd *make_runtime_pseudo_reloc - PARAMS ((const char *, const char *, int, bfd *)); -static bfd *pe_create_runtime_relocator_reference - PARAMS ((bfd *)); -static unsigned int pe_get16 PARAMS ((bfd *, int)); -static unsigned int pe_get32 PARAMS ((bfd *, int)); -static unsigned int pe_as32 PARAMS ((void *)); - void -pe_dll_id_target (target) - const char *target; +pe_dll_id_target (const char *target) { int i; @@ -346,21 +314,19 @@ typedef struct reloc_data_type; static int -reloc_sort (va, vb) - const void *va, *vb; +reloc_sort (const void *va, const void *vb) { - bfd_vma a = ((reloc_data_type *) va)->vma; - bfd_vma b = ((reloc_data_type *) vb)->vma; + bfd_vma a = ((const reloc_data_type *) va)->vma; + bfd_vma b = ((const reloc_data_type *) vb)->vma; return (a > b) ? 1 : ((a < b) ? -1 : 0); } static int -pe_export_sort (va, vb) - const void *va, *vb; +pe_export_sort (const void *va, const void *vb) { - def_file_export *a = (def_file_export *) va; - def_file_export *b = (def_file_export *) vb; + const def_file_export *a = va; + const def_file_export *b = vb; return strcmp (a->name, b->name); } @@ -392,9 +358,7 @@ exclude_list_struct; static struct exclude_list_struct *excludes = 0; void -pe_dll_add_excludes (new_excludes, type) - const char *new_excludes; - const int type; +pe_dll_add_excludes (const char *new_excludes, const int type) { char *local_copy; char *exclude_string; @@ -406,9 +370,8 @@ pe_dll_add_excludes (new_excludes, type) { struct exclude_list_struct *new_exclude; - new_exclude = ((struct exclude_list_struct *) - xmalloc (sizeof (struct exclude_list_struct))); - new_exclude->string = (char *) xmalloc (strlen (exclude_string) + 1); + new_exclude = xmalloc (sizeof (struct exclude_list_struct)); + new_exclude->string = xmalloc (strlen (exclude_string) + 1); strcpy (new_exclude->string, exclude_string); new_exclude->type = type; new_exclude->next = excludes; @@ -423,10 +386,7 @@ pe_dll_add_excludes (new_excludes, type) It can be used for contextual checks. */ static int -auto_export (abfd, d, n) - bfd *abfd; - def_file *d; - const char *n; +auto_export (bfd *abfd, def_file *d, const char *n) { int i; struct exclude_list_struct *ex; @@ -453,7 +413,7 @@ auto_export (abfd, d, n) n, abfd, abfd->my_archive); /* First of all, make context checks: - Don't export anything from standard libs. */ + Don't export anything from standard libs. */ if (libname) { afptr = autofilter_liblist; @@ -535,9 +495,7 @@ auto_export (abfd, d, n) } static void -process_def_file (abfd, info) - bfd *abfd ATTRIBUTE_UNUSED; - struct bfd_link_info *info; +process_def_file (bfd *abfd ATTRIBUTE_UNUSED, struct bfd_link_info *info) { int i, j; struct bfd_link_hash_entry *blhe; @@ -567,7 +525,7 @@ process_def_file (abfd, info) /* If we are not building a DLL, when there are no exports we do not build an export table at all. */ if (!pe_dll_export_everything && pe_def_file->num_exports == 0 - && !(info->shared)) + && !info->shared) return; /* Now, maybe export everything else the default way. */ @@ -579,14 +537,14 @@ process_def_file (abfd, info) int nsyms, symsize; symsize = bfd_get_symtab_upper_bound (b); - symbols = (asymbol **) xmalloc (symsize); + symbols = xmalloc (symsize); nsyms = bfd_canonicalize_symtab (b, symbols); for (j = 0; j < nsyms; j++) { /* We should export symbols which are either global or not - anything at all. (.bss data is the latter) - We should not export undefined symbols. */ + anything at all. (.bss data is the latter) + We should not export undefined symbols. */ if (symbols[j]->section != &bfd_und_section && ((symbols[j]->flags & BSF_GLOBAL) || (symbols[j]->flags == BFD_FORT_COMM_DEFAULT_VALUE))) @@ -595,7 +553,7 @@ process_def_file (abfd, info) /* We should not re-export imported stuff. */ { - char *name = (char *) xmalloc (strlen (sn) + 2 + 6); + char *name = xmalloc (strlen (sn) + 2 + 6); sprintf (name, "%s%s", U("_imp_"), sn); blhe = bfd_link_hash_lookup (info->hash, name, @@ -632,9 +590,9 @@ process_def_file (abfd, info) if (strchr (pe_def_file->exports[i].name, '@')) { /* This will preserve internal_name, which may have been - pointing to the same memory as name, or might not - have. */ - int lead_at = (*pe_def_file->exports[i].name =='@'); + pointing to the same memory as name, or might not + have. */ + int lead_at = (*pe_def_file->exports[i].name == '@'); char *tmp = xstrdup (pe_def_file->exports[i].name + lead_at); *(strchr (tmp, '@')) = 0; @@ -649,7 +607,7 @@ process_def_file (abfd, info) { if (strchr (pe_def_file->exports[i].name, '@')) { - int lead_at = (*pe_def_file->exports[i].name == '@' ) ; + int lead_at = (*pe_def_file->exports[i].name == '@'); char *tmp = xstrdup (pe_def_file->exports[i].name + lead_at); *(strchr (tmp, '@')) = 0; @@ -666,8 +624,8 @@ process_def_file (abfd, info) /* Convenience, but watch out for it changing. */ e = pe_def_file->exports; - exported_symbol_offsets = (bfd_vma *) xmalloc (NE * sizeof (bfd_vma)); - exported_symbol_sections = (struct sec **) xmalloc (NE * sizeof (struct sec *)); + exported_symbol_offsets = xmalloc (NE * sizeof (bfd_vma)); + exported_symbol_sections = xmalloc (NE * sizeof (struct sec *)); memset (exported_symbol_sections, 0, NE * sizeof (struct sec *)); max_ordinal = 0; @@ -676,7 +634,8 @@ process_def_file (abfd, info) count_exported_byname = 0; count_with_ordinals = 0; - qsort (pe_def_file->exports, NE, sizeof (pe_def_file->exports[0]), pe_export_sort); + qsort (pe_def_file->exports, NE, sizeof (pe_def_file->exports[0]), + pe_export_sort); for (i = 0, j = 0; i < NE; i++) { if (i > 0 && strcmp (e[i].name, e[i - 1].name) == 0) @@ -717,8 +676,9 @@ process_def_file (abfd, info) for (i = 0; i < NE; i++) { - char *name = (char *) xmalloc (strlen (pe_def_file->exports[i].internal_name) + 2); + char *name; + name = xmalloc (strlen (pe_def_file->exports[i].internal_name) + 2); if (pe_details->underscored && (*pe_def_file->exports[i].internal_name != '@')) { @@ -783,8 +743,7 @@ process_def_file (abfd, info) /* Build the bfd that will contain .edata and .reloc sections. */ static void -build_filler_bfd (include_edata) - int include_edata; +build_filler_bfd (int include_edata) { lang_input_statement_type *filler_file; filler_file = lang_add_input_file ("dll stuff", @@ -838,9 +797,7 @@ build_filler_bfd (include_edata) /* Gather all the exported symbols and build the .edata section. */ static void -generate_edata (abfd, info) - bfd *abfd; - struct bfd_link_info *info ATTRIBUTE_UNUSED; +generate_edata (bfd *abfd, struct bfd_link_info *info ATTRIBUTE_UNUSED) { int i, next_ordinal; int name_table_size = 0; @@ -871,7 +828,7 @@ generate_edata (abfd, info) } export_table_size = max_ordinal - min_ordinal + 1; - exported_symbols = (int *) xmalloc (export_table_size * sizeof (int)); + exported_symbols = xmalloc (export_table_size * sizeof (int)); for (i = 0; i < export_table_size; i++) exported_symbols[i] = -1; @@ -923,19 +880,18 @@ generate_edata (abfd, info) been done in process_def_file(). */ static void -fill_exported_offsets (abfd, info) - bfd *abfd ATTRIBUTE_UNUSED; - struct bfd_link_info *info; +fill_exported_offsets (bfd *abfd ATTRIBUTE_UNUSED, struct bfd_link_info *info) { int i; struct bfd_link_hash_entry *blhe; for (i = 0; i < pe_def_file->num_exports; i++) { - char *name = (char *) xmalloc (strlen (pe_def_file->exports[i].internal_name) + 2); + char *name; + name = xmalloc (strlen (pe_def_file->exports[i].internal_name) + 2); if (pe_details->underscored - && (*pe_def_file->exports[i].internal_name != '@')) + && *pe_def_file->exports[i].internal_name != '@') { *name = '_'; strcpy (name + 1, pe_def_file->exports[i].internal_name); @@ -947,7 +903,7 @@ fill_exported_offsets (abfd, info) name, FALSE, FALSE, TRUE); - if (blhe && (blhe->type == bfd_link_hash_defined)) + if (blhe && blhe->type == bfd_link_hash_defined) exported_symbol_offsets[i] = blhe->u.def.value; free (name); @@ -955,9 +911,7 @@ fill_exported_offsets (abfd, info) } static void -fill_edata (abfd, info) - bfd *abfd; - struct bfd_link_info *info ATTRIBUTE_UNUSED; +fill_edata (bfd *abfd, struct bfd_link_info *info ATTRIBUTE_UNUSED) { int s, hint; unsigned char *edirectory; @@ -969,7 +923,7 @@ fill_edata (abfd, info) time (&now); - edata_d = (unsigned char *) xmalloc (edata_sz); + edata_d = xmalloc (edata_sz); /* Note use of array pointer math here. */ edirectory = edata_d; @@ -978,7 +932,8 @@ fill_edata (abfd, info) eordinals = (unsigned short *) (enameptrs + count_exported_byname); enamestr = (char *) (eordinals + count_exported_byname); -#define ERVA(ptr) (((unsigned char *)(ptr) - edata_d) + edata_s->output_section->vma - image_base) +#define ERVA(ptr) (((unsigned char *)(ptr) - edata_d) \ + + edata_s->output_section->vma - image_base) memset (edata_d, 0, edata_sz); bfd_put_32 (abfd, now, edata_d + 4); @@ -1005,7 +960,7 @@ fill_edata (abfd, info) rather than by ordinal - the ordering in the exported_symbol[] table. See dlltool.c and: http://sources.redhat.com/ml/binutils/2003-04/msg00379.html - for more information. */ + for more information. */ hint = 0; for (s = 0; s < NE; s++) { @@ -1040,10 +995,9 @@ fill_edata (abfd, info) static struct sec *current_sec; void -pe_walk_relocs_of_symbol (info, name, cb) - struct bfd_link_info *info; - const char *name; - int (*cb) (arelent *, asection *); +pe_walk_relocs_of_symbol (struct bfd_link_info *info, + const char *name, + int (*cb) (arelent *, asection *)) { bfd *b; asection *s; @@ -1054,7 +1008,7 @@ pe_walk_relocs_of_symbol (info, name, cb) int nsyms, symsize; symsize = bfd_get_symtab_upper_bound (b); - symbols = (asymbol **) xmalloc (symsize); + symbols = xmalloc (symsize); nsyms = bfd_canonicalize_symtab (b, symbols); for (s = b->sections; s; s = s->next) @@ -1071,7 +1025,7 @@ pe_walk_relocs_of_symbol (info, name, cb) current_sec = s; relsize = bfd_get_reloc_upper_bound (b, s); - relocs = (arelent **) xmalloc ((size_t) relsize); + relocs = xmalloc (relsize); nrelocs = bfd_canonicalize_reloc (b, s, relocs, symbols); for (i = 0; i < nrelocs; i++) @@ -1094,16 +1048,14 @@ pe_walk_relocs_of_symbol (info, name, cb) /* Gather all the relocations and build the .reloc section. */ static void -generate_reloc (abfd, info) - bfd *abfd; - struct bfd_link_info *info; +generate_reloc (bfd *abfd, struct bfd_link_info *info) { /* For .reloc stuff. */ reloc_data_type *reloc_data; int total_relocs = 0; int i; - unsigned long sec_page = (unsigned long) (-1); + unsigned long sec_page = (unsigned long) -1; unsigned long page_ptr, page_count; int bi; bfd *b; @@ -1114,8 +1066,7 @@ generate_reloc (abfd, info) for (s = b->sections; s; s = s->next) total_relocs += s->reloc_count; - reloc_data = - (reloc_data_type *) xmalloc (total_relocs * sizeof (reloc_data_type)); + reloc_data = xmalloc (total_relocs * sizeof (reloc_data_type)); total_relocs = 0; bi = 0; @@ -1149,11 +1100,11 @@ generate_reloc (abfd, info) } symsize = bfd_get_symtab_upper_bound (b); - symbols = (asymbol **) xmalloc (symsize); + symbols = xmalloc (symsize); nsyms = bfd_canonicalize_symtab (b, symbols); relsize = bfd_get_reloc_upper_bound (b, s); - relocs = (arelent **) xmalloc ((size_t) relsize); + relocs = xmalloc (relsize); nrelocs = bfd_canonicalize_reloc (b, s, relocs, symbols); for (i = 0; i < nrelocs; i++) @@ -1249,10 +1200,10 @@ generate_reloc (abfd, info) } reloc_sz = (reloc_sz + 3) & ~3; /* 4-byte align. */ - reloc_d = (unsigned char *) xmalloc (reloc_sz); - sec_page = (unsigned long) (-1); + reloc_d = xmalloc (reloc_sz); + sec_page = (unsigned long) -1; reloc_sz = 0; - page_ptr = (unsigned long) (-1); + page_ptr = (unsigned long) -1; page_count = 0; for (i = 0; i < total_relocs; i++) @@ -1265,7 +1216,7 @@ generate_reloc (abfd, info) while (reloc_sz & 3) reloc_d[reloc_sz++] = 0; - if (page_ptr != (unsigned long) (-1)) + if (page_ptr != (unsigned long) -1) bfd_put_32 (abfd, reloc_sz - page_ptr, reloc_d + page_ptr + 4); bfd_put_32 (abfd, this_page, reloc_d + reloc_sz); @@ -1291,7 +1242,7 @@ generate_reloc (abfd, info) while (reloc_sz & 3) reloc_d[reloc_sz++] = 0; - if (page_ptr != (unsigned long) (-1)) + if (page_ptr != (unsigned long) -1) bfd_put_32 (abfd, reloc_sz - page_ptr, reloc_d + page_ptr + 4); while (reloc_sz < reloc_s->_raw_size) @@ -1302,10 +1253,7 @@ generate_reloc (abfd, info) corresponds to it. */ static void -quoteput (s, f, needs_quotes) - char *s; - FILE *f; - int needs_quotes; +quoteput (char *s, FILE *f, int needs_quotes) { char *cp; @@ -1338,8 +1286,7 @@ quoteput (s, f, needs_quotes) } void -pe_dll_generate_def_file (pe_out_def_filename) - const char *pe_out_def_filename; +pe_dll_generate_def_file (const char *pe_out_def_filename) { int i; FILE *out = fopen (pe_out_def_filename, "w"); @@ -1507,11 +1454,7 @@ static char *dll_symname; #define UNDSEC (asection *) &bfd_und_section static asection * -quick_section (abfd, name, flags, align) - bfd *abfd; - const char *name; - int flags; - int align; +quick_section (bfd *abfd, const char *name, int flags, int align) { asection *sec; asymbol *sym; @@ -1533,17 +1476,16 @@ quick_section (abfd, name, flags, align) } static void -quick_symbol (abfd, n1, n2, n3, sec, flags, addr) - bfd *abfd; - const char *n1; - const char *n2; - const char *n3; - asection *sec; - int flags; - int addr; +quick_symbol (bfd *abfd, + const char *n1, + const char *n2, + const char *n3, + asection *sec, + int flags, + int addr) { asymbol *sym; - char *name = (char *) xmalloc (strlen (n1) + strlen (n2) + strlen (n3) + 1); + char *name = xmalloc (strlen (n1) + strlen (n2) + strlen (n3) + 1); strcpy (name, n1); strcat (name, n2); @@ -1560,19 +1502,15 @@ static arelent *reltab = 0; static int relcount = 0, relsize = 0; static void -quick_reloc (abfd, address, which_howto, symidx) - bfd *abfd; - int address; - int which_howto; - int symidx; +quick_reloc (bfd *abfd, int address, int which_howto, int symidx) { - if (relcount >= (relsize - 1)) + if (relcount >= relsize - 1) { relsize += 10; if (reltab) - reltab = (arelent *) xrealloc (reltab, relsize * sizeof (arelent)); + reltab = xrealloc (reltab, relsize * sizeof (arelent)); else - reltab = (arelent *) xmalloc (relsize * sizeof (arelent)); + reltab = xmalloc (relsize * sizeof (arelent)); } reltab[relcount].address = address; reltab[relcount].addend = 0; @@ -1588,7 +1526,7 @@ save_relocs (asection *sec) sec->relocation = reltab; sec->reloc_count = relcount; - sec->orelocation = (arelent **) xmalloc ((relcount + 1) * sizeof (arelent *)); + sec->orelocation = xmalloc ((relcount + 1) * sizeof (arelent *)); for (i = 0; i < relcount; i++) sec->orelocation[i] = sec->relocation + i; sec->orelocation[relcount] = 0; @@ -1615,15 +1553,14 @@ save_relocs (asection *sec) hname: */ static bfd * -make_head (parent) - bfd *parent; +make_head (bfd *parent) { asection *id2, *id5, *id4; unsigned char *d2, *d5, *d4; char *oname; bfd *abfd; - oname = (char *) xmalloc (20); + oname = xmalloc (20); sprintf (oname, "d%06d.o", tmp_seq); tmp_seq++; @@ -1635,7 +1572,7 @@ make_head (parent) bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0); symptr = 0; - symtab = (asymbol **) xmalloc (6 * sizeof (asymbol *)); + symtab = xmalloc (6 * sizeof (asymbol *)); id2 = quick_section (abfd, ".idata$2", SEC_HAS_CONTENTS, 2); id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2); id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2); @@ -1649,7 +1586,7 @@ make_head (parent) the start of the list of sections from other objects. */ bfd_set_section_size (abfd, id2, 20); - d2 = (unsigned char *) xmalloc (20); + d2 = xmalloc (20); id2->contents = d2; memset (d2, 0, 20); d2[0] = d2[16] = 4; /* Reloc addend. */ @@ -1659,12 +1596,12 @@ make_head (parent) save_relocs (id2); bfd_set_section_size (abfd, id5, 4); - d5 = (unsigned char *) xmalloc (4); + d5 = xmalloc (4); id5->contents = d5; memset (d5, 0, 4); bfd_set_section_size (abfd, id4, 4); - d4 = (unsigned char *) xmalloc (4); + d4 = xmalloc (4); id4->contents = d4; memset (d4, 0, 4); @@ -1688,8 +1625,7 @@ make_head (parent) .asciz "my.dll" */ static bfd * -make_tail (parent) - bfd *parent; +make_tail (bfd *parent) { asection *id4, *id5, *id7; unsigned char *d4, *d5, *d7; @@ -1697,7 +1633,7 @@ make_tail (parent) char *oname; bfd *abfd; - oname = (char *) xmalloc (20); + oname = xmalloc (20); sprintf (oname, "d%06d.o", tmp_seq); tmp_seq++; @@ -1709,19 +1645,19 @@ make_tail (parent) bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0); symptr = 0; - symtab = (asymbol **) xmalloc (5 * sizeof (asymbol *)); + symtab = xmalloc (5 * sizeof (asymbol *)); id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2); id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2); id7 = quick_section (abfd, ".idata$7", SEC_HAS_CONTENTS, 2); quick_symbol (abfd, U (""), dll_symname, "_iname", id7, BSF_GLOBAL, 0); bfd_set_section_size (abfd, id4, 4); - d4 = (unsigned char *) xmalloc (4); + d4 = xmalloc (4); id4->contents = d4; memset (d4, 0, 4); bfd_set_section_size (abfd, id5, 4); - d5 = (unsigned char *) xmalloc (4); + d5 = xmalloc (4); id5->contents = d5; memset (d5, 0, 4); @@ -1729,7 +1665,7 @@ make_tail (parent) if (len & 1) len++; bfd_set_section_size (abfd, id7, len); - d7 = (unsigned char *) xmalloc (len); + d7 = xmalloc (len); id7->contents = d7; strcpy (d7, dll_filename); @@ -1794,9 +1730,7 @@ static unsigned char jmp_mips_bytes[] = }; static bfd * -make_one (exp, parent) - def_file_export *exp; - bfd *parent; +make_one (def_file_export *exp, bfd *parent) { asection *tx, *id7, *id5, *id4, *id6; unsigned char *td = NULL, *d7, *d5, *d4, *d6 = NULL; @@ -1824,7 +1758,7 @@ make_one (exp, parent) abort (); } - oname = (char *) xmalloc (20); + oname = xmalloc (20); sprintf (oname, "d%06d.o", tmp_seq); tmp_seq++; @@ -1836,7 +1770,7 @@ make_one (exp, parent) bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0); symptr = 0; - symtab = (asymbol **) xmalloc (11 * sizeof (asymbol *)); + symtab = xmalloc (11 * sizeof (asymbol *)); tx = quick_section (abfd, ".text", SEC_CODE|SEC_HAS_CONTENTS, 2); id7 = quick_section (abfd, ".idata$7", SEC_HAS_CONTENTS, 2); id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2); @@ -1847,30 +1781,36 @@ make_one (exp, parent) { if (! exp->flag_data) quick_symbol (abfd, "", exp->internal_name, "", tx, BSF_GLOBAL, 0); - quick_symbol (abfd, U ("_head_"), dll_symname, "", UNDSEC, BSF_GLOBAL, 0); - quick_symbol (abfd, U ("_imp_"), exp->internal_name, "", id5, BSF_GLOBAL, 0); + quick_symbol (abfd, U ("_head_"), dll_symname, "", UNDSEC, + BSF_GLOBAL, 0); + quick_symbol (abfd, U ("_imp_"), exp->internal_name, "", id5, + BSF_GLOBAL, 0); /* Fastcall applies only to functions, so no need for auto-import symbol. */ } else { if (! exp->flag_data) - quick_symbol (abfd, U (""), exp->internal_name, "", tx, BSF_GLOBAL, 0); - quick_symbol (abfd, U ("_head_"), dll_symname, "", UNDSEC, BSF_GLOBAL, 0); - quick_symbol (abfd, U ("_imp__"), exp->internal_name, "", id5, BSF_GLOBAL, 0); + quick_symbol (abfd, U (""), exp->internal_name, "", tx, + BSF_GLOBAL, 0); + quick_symbol (abfd, U ("_head_"), dll_symname, "", UNDSEC, + BSF_GLOBAL, 0); + quick_symbol (abfd, U ("_imp__"), exp->internal_name, "", id5, + BSF_GLOBAL, 0); /* Symbol to reference ord/name of imported - data symbol, used to implement auto-import. */ + data symbol, used to implement auto-import. */ if (exp->flag_data) - quick_symbol (abfd, U("_nm__"), exp->internal_name, "", id6, BSF_GLOBAL,0); + quick_symbol (abfd, U("_nm__"), exp->internal_name, "", id6, + BSF_GLOBAL,0); } if (pe_dll_compat_implib) - quick_symbol (abfd, U ("__imp_"), exp->internal_name, "", - id5, BSF_GLOBAL, 0); + quick_symbol (abfd, U ("__imp_"), exp->internal_name, "", id5, + BSF_GLOBAL, 0); if (! exp->flag_data) { bfd_set_section_size (abfd, tx, jmp_byte_count); - td = (unsigned char *) xmalloc (jmp_byte_count); + td = xmalloc (jmp_byte_count); tx->contents = td; memcpy (td, jmp_bytes, jmp_byte_count); @@ -1894,14 +1834,14 @@ make_one (exp, parent) } bfd_set_section_size (abfd, id7, 4); - d7 = (unsigned char *) xmalloc (4); + d7 = xmalloc (4); id7->contents = d7; memset (d7, 0, 4); quick_reloc (abfd, 0, BFD_RELOC_RVA, 6); save_relocs (id7); bfd_set_section_size (abfd, id5, 4); - d5 = (unsigned char *) xmalloc (4); + d5 = xmalloc (4); id5->contents = d5; memset (d5, 0, 4); @@ -1918,7 +1858,7 @@ make_one (exp, parent) } bfd_set_section_size (abfd, id4, 4); - d4 = (unsigned char *) xmalloc (4); + d4 = xmalloc (4); id4->contents = d4; memset (d4, 0, 4); @@ -1945,7 +1885,7 @@ make_one (exp, parent) if (len & 1) len++; bfd_set_section_size (abfd, id6, len); - d6 = (unsigned char *) xmalloc (len); + d6 = xmalloc (len); id6->contents = d6; memset (d6, 0, len); d6[0] = exp->hint & 0xff; @@ -1967,9 +1907,7 @@ make_one (exp, parent) } static bfd * -make_singleton_name_thunk (import, parent) - const char *import; - bfd *parent; +make_singleton_name_thunk (const char *import, bfd *parent) { /* Name thunks go to idata$4. */ asection *id4; @@ -1977,7 +1915,7 @@ make_singleton_name_thunk (import, parent) char *oname; bfd *abfd; - oname = (char *) xmalloc (20); + oname = xmalloc (20); sprintf (oname, "nmth%06d.o", tmp_seq); tmp_seq++; @@ -1989,13 +1927,13 @@ make_singleton_name_thunk (import, parent) bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0); symptr = 0; - symtab = (asymbol **) xmalloc (3 * sizeof (asymbol *)); + symtab = xmalloc (3 * sizeof (asymbol *)); id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2); quick_symbol (abfd, U ("_nm_thnk_"), import, "", id4, BSF_GLOBAL, 0); quick_symbol (abfd, U ("_nm_"), import, "", UNDSEC, BSF_GLOBAL, 0); bfd_set_section_size (abfd, id4, 8); - d4 = (unsigned char *) xmalloc (4); + d4 = xmalloc (4); id4->contents = d4; memset (d4, 0, 8); quick_reloc (abfd, 0, BFD_RELOC_RVA, 2); @@ -2010,8 +1948,7 @@ make_singleton_name_thunk (import, parent) } static char * -make_import_fixup_mark (rel) - arelent *rel; +make_import_fixup_mark (arelent *rel) { /* We convert reloc to symbol, for later reference. */ static int counter; @@ -2025,7 +1962,7 @@ make_import_fixup_mark (rel) if (!fixup_name) { - fixup_name = (char *) xmalloc (384); + fixup_name = xmalloc (384); buffer_len = 384; } @@ -2038,7 +1975,7 @@ make_import_fixup_mark (rel) /* New buffer size is length of symbol, plus 25, but then rounded up to the nearest multiple of 128. */ buffer_len = ((strlen (sym->name) + 25) + 127) & ~127; - fixup_name = (char *) xmalloc (buffer_len); + fixup_name = xmalloc (buffer_len); } sprintf (fixup_name, "__fu%d_%s", counter++, sym->name); @@ -2068,18 +2005,17 @@ make_import_fixup_mark (rel) .rva __fuNN_SYM (pointer to reference (address) in text) */ static bfd * -make_import_fixup_entry (name, fixup_name, dll_symname, parent) - const char *name; - const char *fixup_name; - const char *dll_symname; - bfd *parent; +make_import_fixup_entry (const char *name, + const char *fixup_name, + const char *dll_symname, + bfd *parent) { asection *id3; unsigned char *d3; char *oname; bfd *abfd; - oname = (char *) xmalloc (20); + oname = xmalloc (20); sprintf (oname, "fu%06d.o", tmp_seq); tmp_seq++; @@ -2091,7 +2027,7 @@ make_import_fixup_entry (name, fixup_name, dll_symname, parent) bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0); symptr = 0; - symtab = (asymbol **) xmalloc (6 * sizeof (asymbol *)); + symtab = xmalloc (6 * sizeof (asymbol *)); id3 = quick_section (abfd, ".idata$3", SEC_HAS_CONTENTS, 2); #if 0 @@ -2102,7 +2038,7 @@ make_import_fixup_entry (name, fixup_name, dll_symname, parent) quick_symbol (abfd, "", fixup_name, "", UNDSEC, BSF_GLOBAL, 0); bfd_set_section_size (abfd, id3, 20); - d3 = (unsigned char *) xmalloc (20); + d3 = xmalloc (20); id3->contents = d3; memset (d3, 0, 20); @@ -2124,18 +2060,17 @@ make_import_fixup_entry (name, fixup_name, dll_symname, parent) .rva __fuNN_SYM (pointer to reference (address) in text) */ static bfd * -make_runtime_pseudo_reloc (name, fixup_name, addend, parent) - const char *name ATTRIBUTE_UNUSED; - const char *fixup_name; - int addend; - bfd *parent; +make_runtime_pseudo_reloc (const char *name ATTRIBUTE_UNUSED, + const char *fixup_name, + int addend, + bfd *parent) { asection *rt_rel; unsigned char *rt_rel_d; char *oname; bfd *abfd; - oname = (char *) xmalloc (20); + oname = xmalloc (20); sprintf (oname, "rtr%06d.o", tmp_seq); tmp_seq++; @@ -2147,13 +2082,14 @@ make_runtime_pseudo_reloc (name, fixup_name, addend, parent) bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0); symptr = 0; - symtab = (asymbol **) xmalloc (2 * sizeof (asymbol *)); - rt_rel = quick_section (abfd, ".rdata_runtime_pseudo_reloc", SEC_HAS_CONTENTS, 2); + symtab = xmalloc (2 * sizeof (asymbol *)); + rt_rel = quick_section (abfd, ".rdata_runtime_pseudo_reloc", + SEC_HAS_CONTENTS, 2); quick_symbol (abfd, "", fixup_name, "", UNDSEC, BSF_GLOBAL, 0); bfd_set_section_size (abfd, rt_rel, 8); - rt_rel_d = (unsigned char *) xmalloc (8); + rt_rel_d = xmalloc (8); rt_rel->contents = rt_rel_d; memset (rt_rel_d, 0, 8); bfd_put_32 (abfd, addend, rt_rel_d); @@ -2173,15 +2109,14 @@ make_runtime_pseudo_reloc (name, fixup_name, addend, parent) .rva __pei386_runtime_relocator */ static bfd * -pe_create_runtime_relocator_reference (parent) - bfd *parent; +pe_create_runtime_relocator_reference (bfd *parent) { asection *extern_rt_rel; unsigned char *extern_rt_rel_d; char *oname; bfd *abfd; - oname = (char *) xmalloc (20); + oname = xmalloc (20); sprintf (oname, "ertr%06d.o", tmp_seq); tmp_seq++; @@ -2193,13 +2128,14 @@ pe_create_runtime_relocator_reference (parent) bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0); symptr = 0; - symtab = (asymbol **) xmalloc (2 * sizeof (asymbol *)); + symtab = xmalloc (2 * sizeof (asymbol *)); extern_rt_rel = quick_section (abfd, ".rdata", SEC_HAS_CONTENTS, 2); - quick_symbol (abfd, "", "__pei386_runtime_relocator", "", UNDSEC, BSF_NO_FLAGS, 0); + quick_symbol (abfd, "", "__pei386_runtime_relocator", "", UNDSEC, + BSF_NO_FLAGS, 0); bfd_set_section_size (abfd, extern_rt_rel, 4); - extern_rt_rel_d = (unsigned char *) xmalloc (4); + extern_rt_rel_d = xmalloc (4); extern_rt_rel->contents = extern_rt_rel_d; quick_reloc (abfd, 0, BFD_RELOC_RVA, 1); @@ -2214,10 +2150,7 @@ pe_create_runtime_relocator_reference (parent) } void -pe_create_import_fixup (rel, s, addend) - arelent *rel; - asection *s; - int addend; +pe_create_import_fixup (arelent *rel, asection *s, int addend) { char buf[300]; struct symbol_cache_entry *sym = *rel->sym_ptr_ptr; @@ -2276,9 +2209,7 @@ pe_create_import_fixup (rel, s, addend) void -pe_dll_generate_implib (def, impfilename) - def_file *def; - const char *impfilename; +pe_dll_generate_implib (def_file *def, const char *impfilename) { int i; bfd *ar_head; @@ -2350,10 +2281,7 @@ pe_dll_generate_implib (def, impfilename) } static void -add_bfd_to_link (abfd, name, link_info) - bfd *abfd; - const char *name; - struct bfd_link_info *link_info; +add_bfd_to_link (bfd *abfd, const char *name, struct bfd_link_info *link_info) { lang_input_statement_type *fake_file; @@ -2368,9 +2296,7 @@ add_bfd_to_link (abfd, name, link_info) } void -pe_process_import_defs (output_bfd, link_info) - bfd *output_bfd; - struct bfd_link_info *link_info; +pe_process_import_defs (bfd *output_bfd, struct bfd_link_info *link_info) { def_file_module *module; @@ -2398,12 +2324,15 @@ pe_process_import_defs (output_bfd, link_info) struct bfd_link_hash_entry *blhe; int lead_at = (*pe_def_file->imports[i].internal_name == '@'); /* See if we need this import. */ - char *name = (char *) xmalloc (strlen (pe_def_file->imports[i].internal_name) + 2 + 6); + size_t len = strlen (pe_def_file->imports[i].internal_name); + char *name = xmalloc (len + 2 + 6); if (lead_at) - sprintf (name, "%s%s", "", pe_def_file->imports[i].internal_name); + sprintf (name, "%s%s", "", + pe_def_file->imports[i].internal_name); else - sprintf (name, "%s%s",U (""), pe_def_file->imports[i].internal_name); + sprintf (name, "%s%s",U (""), + pe_def_file->imports[i].internal_name); blhe = bfd_link_hash_lookup (link_info->hash, name, FALSE, FALSE, FALSE); @@ -2459,9 +2388,7 @@ pe_process_import_defs (output_bfd, link_info) handled, FALSE if not. */ static unsigned int -pe_get16 (abfd, where) - bfd *abfd; - int where; +pe_get16 (bfd *abfd, int where) { unsigned char b[2]; @@ -2471,9 +2398,7 @@ pe_get16 (abfd, where) } static unsigned int -pe_get32 (abfd, where) - bfd *abfd; - int where; +pe_get32 (bfd *abfd, int where) { unsigned char b[4]; @@ -2485,8 +2410,7 @@ pe_get32 (abfd, where) #if 0 /* This is not currently used. */ static unsigned int -pe_as16 (ptr) - void *ptr; +pe_as16 (void *ptr) { unsigned char *b = ptr; @@ -2496,8 +2420,7 @@ pe_as16 (ptr) #endif static unsigned int -pe_as32 (ptr) - void *ptr; +pe_as32 (void *ptr) { unsigned char *b = ptr; @@ -2505,8 +2428,7 @@ pe_as32 (ptr) } bfd_boolean -pe_implied_import_dll (filename) - const char *filename; +pe_implied_import_dll (const char *filename) { bfd *dll; unsigned long pe_header_offset, opthdr_ofs, num_entries, i; @@ -2553,7 +2475,7 @@ pe_implied_import_dll (filename) pe_get16 (dll, pe_header_offset + 4 + 16)); expptr = 0; - /* Get the rva and size of the export section. */ + /* Get the rva and size of the export section. */ for (i = 0; i < nsections; i++) { char sname[8]; @@ -2575,7 +2497,7 @@ pe_implied_import_dll (filename) } /* Scan sections and store the base and size of the - data and bss segments in data/base_start/end. */ + data and bss segments in data/base_start/end. */ for (i = 0; i < nsections; i++) { unsigned long secptr1 = secptr + 40 * i; @@ -2596,7 +2518,7 @@ pe_implied_import_dll (filename) if (pe_dll_extra_pe_debug) printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n", __FUNCTION__, sec_name, vaddr, vaddr + vsize, flags); - } + } else if (strcmp (sec_name,".bss") == 0) { bss_start = vaddr; @@ -2608,7 +2530,7 @@ pe_implied_import_dll (filename) } } - expdata = (unsigned char *) xmalloc (export_size); + expdata = xmalloc (export_size); bfd_seek (dll, (file_ptr) expptr, SEEK_SET); bfd_bread (expdata, (bfd_size_type) export_size, dll); erva = expdata - export_rva; @@ -2642,7 +2564,7 @@ pe_implied_import_dll (filename) /* Pointer to the names vector. */ unsigned long name_rva = pe_as32 (erva + name_rvas + i * 4); def_file_import *imp; - /* Pointer to the function address vector. */ + /* Pointer to the function address vector. */ unsigned long func_rva = pe_as32 (erva + exp_funcbase + i * 4); int is_data = 0; @@ -2659,7 +2581,7 @@ pe_implied_import_dll (filename) dll_name, i, 0); /* Mark symbol type. */ imp->data = is_data; - + if (pe_dll_extra_pe_debug) printf ("%s dll-name: %s sym: %s addr: 0x%lx %s\n", __FUNCTION__, dll_name, erva + name_rva, @@ -2676,14 +2598,12 @@ pe_implied_import_dll (filename) can put the right values in place. */ void -pe_dll_build_sections (abfd, info) - bfd *abfd; - struct bfd_link_info *info; +pe_dll_build_sections (bfd *abfd, struct bfd_link_info *info) { pe_dll_id_target (bfd_get_target (abfd)); process_def_file (abfd, info); - if (pe_def_file->num_exports == 0 && !(info->shared)) + if (pe_def_file->num_exports == 0 && !info->shared) return; generate_edata (abfd, info); @@ -2691,18 +2611,14 @@ pe_dll_build_sections (abfd, info) } void -pe_exe_build_sections (abfd, info) - bfd *abfd; - struct bfd_link_info *info ATTRIBUTE_UNUSED; +pe_exe_build_sections (bfd *abfd, struct bfd_link_info *info ATTRIBUTE_UNUSED) { pe_dll_id_target (bfd_get_target (abfd)); build_filler_bfd (0); } void -pe_dll_fill_sections (abfd, info) - bfd *abfd; - struct bfd_link_info *info; +pe_dll_fill_sections (bfd *abfd, struct bfd_link_info *info) { pe_dll_id_target (bfd_get_target (abfd)); image_base = pe_data (abfd)->pe_opthdr.ImageBase; @@ -2714,15 +2630,13 @@ pe_dll_fill_sections (abfd, info) /* Resize the sections. */ lang_size_sections (stat_ptr->head, abs_output_section, - &stat_ptr->head, 0, (bfd_vma) 0, NULL, TRUE); + &stat_ptr->head, 0, 0, NULL, TRUE); /* Redo special stuff. */ ldemul_after_allocation (); /* Do the assignments again. */ - lang_do_assignments (stat_ptr->head, - abs_output_section, - (fill_type *) 0, (bfd_vma) 0); + lang_do_assignments (stat_ptr->head, abs_output_section, NULL, 0); } fill_edata (abfd, info); @@ -2735,9 +2649,7 @@ pe_dll_fill_sections (abfd, info) } void -pe_exe_fill_sections (abfd, info) - bfd *abfd; - struct bfd_link_info *info; +pe_exe_fill_sections (bfd *abfd, struct bfd_link_info *info) { pe_dll_id_target (bfd_get_target (abfd)); image_base = pe_data (abfd)->pe_opthdr.ImageBase; @@ -2749,15 +2661,13 @@ pe_exe_fill_sections (abfd, info) /* Resize the sections. */ lang_size_sections (stat_ptr->head, abs_output_section, - &stat_ptr->head, 0, (bfd_vma) 0, NULL, TRUE); + &stat_ptr->head, 0, 0, NULL, TRUE); /* Redo special stuff. */ ldemul_after_allocation (); /* Do the assignments again. */ - lang_do_assignments (stat_ptr->head, - abs_output_section, - (fill_type *) 0, (bfd_vma) 0); + lang_do_assignments (stat_ptr->head, abs_output_section, NULL, 0); } reloc_s->contents = reloc_d; } |