X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=binutils%2Fdlltool.c;h=e116e6bf9c2e3beaee9b0de3c1be72365112af55;hb=59f48f5a45d2300da401f1fccab31ba436217469;hp=be08227e9dc35a376994e0422548818117d88067;hpb=81fb971a3d8626d7e051ff5df807442c8d233329;p=deliverable%2Fbinutils-gdb.git diff --git a/binutils/dlltool.c b/binutils/dlltool.c index be08227e9d..e116e6bf9c 100644 --- a/binutils/dlltool.c +++ b/binutils/dlltool.c @@ -1,5 +1,5 @@ /* dlltool.c -- tool to generate stuff for PE style DLLs - Copyright (C) 1995-2015 Free Software Foundation, Inc. + Copyright (C) 1995-2016 Free Software Foundation, Inc. This file is part of GNU Binutils. @@ -370,7 +370,7 @@ typedef struct dll_name_list_t { dll_name_list_node_type * head; dll_name_list_node_type * tail; -} dll_name_list_type; +} dll_name_list_type; /* Types used to pass data to iterator functions. */ typedef struct symname_search_data_t @@ -383,7 +383,7 @@ typedef struct identify_data_t { dll_name_list_type * list; bfd_boolean ms_style_implib; -} identify_data_type; +} identify_data_type; static char *head_label; @@ -482,7 +482,7 @@ static char * mcore_elf_linker_flags = NULL; #endif /* What's the right name for this ? */ -#define PATHMAX 250 +#define PATHMAX 250 /* External name alias numbering starts here. */ #define PREFIX_ALIAS_BASE 20000 @@ -588,7 +588,7 @@ static const unsigned char ppc_jtab[] = static bfd_vma ppc_glue_insn = 0x80410004; #endif -static const char i386_trampoline[] = +static const char i386_trampoline[] = "\tpushl %%ecx\n" "\tpushl %%edx\n" "\tpushl %%eax\n" @@ -598,7 +598,7 @@ static const char i386_trampoline[] = "\tpopl %%ecx\n" "\tjmp *%%eax\n"; -static const char i386_x64_trampoline[] = +static const char i386_x64_trampoline[] = "\tpushq %%rcx\n" "\tpushq %%rdx\n" "\tpushq %%r8\n" @@ -1084,7 +1084,7 @@ set_dll_name_from_def (const char *name, char is_dll) if (image_basename != name) non_fatal (_("%s: Path components stripped from image name, '%s'."), def_file, name); - /* Append the default suffix, if none specified. */ + /* Append the default suffix, if none specified. */ if (strchr (image_basename, '.') == 0) { const char * suffix = is_dll ? ".dll" : ".exe"; @@ -1253,7 +1253,7 @@ def_import (const char *app_name, const char *module, const char *dllext, const char *entry, int ord_val, const char *its_name) { const char *application_name; - char *buf; + char *buf = NULL; if (entry != NULL) application_name = entry; @@ -1266,13 +1266,12 @@ def_import (const char *app_name, const char *module, const char *dllext, } if (dllext != NULL) - { - buf = (char *) alloca (strlen (module) + strlen (dllext) + 2); - sprintf (buf, "%s.%s", module, dllext); - module = buf; - } + module = buf = concat (module, ".", dllext, NULL); append_import (application_name, module, ord_val, its_name); + + if (buf) + free (buf); } void @@ -1334,7 +1333,7 @@ run (const char *what, char *args) if (*s == ' ') i++; i++; - argv = alloca (sizeof (char *) * (i + 3)); + argv = xmalloc (sizeof (char *) * (i + 3)); i = 0; argv[i++] = what; s = args; @@ -1353,6 +1352,7 @@ run (const char *what, char *args) pid = pexecute (argv[0], (char * const *) argv, program_name, temp_base, &errmsg_fmt, &errmsg_arg, PEXECUTE_ONE | PEXECUTE_SEARCH); + free(argv); if (pid == -1) { @@ -1986,12 +1986,13 @@ assemble_file (const char * source, const char * dest) { char * cmd; - cmd = (char *) alloca (strlen (ASM_SWITCHES) + strlen (as_flags) - + strlen (source) + strlen (dest) + 50); + cmd = xmalloc (strlen (ASM_SWITCHES) + strlen (as_flags) + + strlen (source) + strlen (dest) + 50); sprintf (cmd, "%s %s -o %s %s", ASM_SWITCHES, as_flags, dest, source); run (as_name, cmd); + free (cmd); } static const char * temp_file_to_remove[5]; @@ -2036,7 +2037,7 @@ gen_exp_file (void) fatal (_("Unable to open temporary assembler file: %s"), TMP_ASM); temp_file_to_remove[TEMP_EXPORT_FILE] = TMP_ASM; - + /* xgettext:c-format */ inform (_("Opened temporary file: %s"), TMP_ASM); @@ -2746,7 +2747,7 @@ make_one_lib_file (export_type *exp, int i, int delay) { si->data = xmalloc (4); si->size = 4; - + if (exp->noname) { si->data[0] = exp->ordinal ; @@ -2783,6 +2784,7 @@ make_one_lib_file (export_type *exp, int i, int delay) else si->size = strlen (xlate (exp->import_name)) + 3; si->data = xmalloc (si->size); + memset (si->data, 0, si->size); si->data[0] = idx & 0xff; si->data[1] = idx >> 8; if (exp->its_name) @@ -2952,7 +2954,7 @@ make_one_lib_file (export_type *exp, int i, int delay) /* xgettext:c-format */ fatal (_("bfd_open failed reopen stub file: %s: %s"), outname, bfd_get_errmsg ()); - + return abfd; } @@ -3218,7 +3220,7 @@ gen_lib_file (int delay) inform (_("Creating library file: %s"), imp_name); xatexit (unlink_temp_files); - + bfd_set_format (outarch, bfd_archive); outarch->has_armap = 1; outarch->is_thin_archive = 0; @@ -3294,7 +3296,7 @@ gen_lib_file (int delay) { char *name; - name = (char *) alloca (strlen (TMP_STUB) + 10); + name = xmalloc (strlen (TMP_STUB) + 10); for (i = 0; (exp = d_exports_lexically[i]); i++) { /* Don't delete non-existent stubs for PRIVATE entries. */ @@ -3312,6 +3314,7 @@ gen_lib_file (int delay) non_fatal (_("cannot delete %s: %s"), name, strerror (errno)); } } + free (name); } inform (_("Created lib file")); @@ -3343,7 +3346,7 @@ dll_name_list_append (dll_name_list_type * list, bfd_byte * data) /* Count the number of entries in list. */ -static int +static int dll_name_list_count (dll_name_list_type * list) { dll_name_list_node_type * p; @@ -3365,7 +3368,7 @@ dll_name_list_count (dll_name_list_type * list) /* Print each entry in list to stdout. */ -static void +static void dll_name_list_print (dll_name_list_type * list) { dll_name_list_node_type * p; @@ -3400,7 +3403,7 @@ dll_name_list_free (dll_name_list_type * list) /* Recursive function to free all nodes entry->next->next... as well as entry itself. */ -static void +static void dll_name_list_free_contents (dll_name_list_node_type * entry) { if (entry) @@ -3421,7 +3424,7 @@ dll_name_list_free_contents (dll_name_list_node_type * entry) /* Allocate and initialize a dll_name_list_type object, including its sentinel node. Caller is responsible - for calling dll_name_list_free when finished with + for calling dll_name_list_free when finished with the list. */ static dll_name_list_type * @@ -3445,9 +3448,9 @@ dll_name_list_create (void) OBJ (where obj is cast to const char *). If found, set global variable identify_member_contains_symname_result TRUE. It is the caller's responsibility to set the result variable FALSE before iterating with - this function. */ + this function. */ -static void +static void identify_member_contains_symname (bfd * abfd, bfd * archive_bfd ATTRIBUTE_UNUSED, void * obj) @@ -3503,9 +3506,9 @@ identify_member_contains_symname (bfd * abfd, of all sections which meet the criteria to a linked list of dll names. Finally, print them all to stdout. (If --identify-strict, an error is - reported if more than one match was found). */ + reported if more than one match was found). */ -static void +static void identify_dll_for_implib (void) { bfd * abfd = NULL; @@ -3543,7 +3546,7 @@ identify_dll_for_implib (void) (void *)(& search_data)); if (search_data.found) identify_data.ms_style_implib = TRUE; - + /* Rewind the bfd. */ if (! bfd_close (abfd)) bfd_fatal (identify_imp_name); @@ -3558,7 +3561,7 @@ identify_dll_for_implib (void) fatal (_("%s is not a library"), identify_imp_name); } - + /* Now search for the dll name. */ identify_search_archive (abfd, identify_search_member, @@ -3592,10 +3595,10 @@ identify_dll_for_implib (void) /* Loop over all members of the archive, applying the supplied function to each member that is a bfd_object. The function will be called as if: - func (member_bfd, abfd, user_storage) */ + func (member_bfd, abfd, user_storage) */ static void -identify_search_archive (bfd * abfd, +identify_search_archive (bfd * abfd, void (* operation) (bfd *, bfd *, void *), void * user_storage) { @@ -3643,7 +3646,7 @@ identify_search_archive (bfd * abfd, } /* Call the identify_search_section() function for each section of this - archive member. */ + archive member. */ static void identify_search_member (bfd *abfd, @@ -3655,7 +3658,7 @@ identify_search_member (bfd *abfd, /* This predicate returns true if section->name matches the desired value. By default, this is .idata$7 (.idata$6 on PPC, or if the import - library is ms-style). */ + library is ms-style). */ static bfd_boolean identify_process_section_p (asection * section, bfd_boolean ms_style_implib) @@ -3668,10 +3671,10 @@ identify_process_section_p (asection * section, bfd_boolean ms_style_implib) ".idata$7"; #endif static const char * MS_SECTION_NAME = ".idata$6"; - + const char * section_name = (ms_style_implib ? MS_SECTION_NAME : SECTION_NAME); - + if (strcmp (section_name, section->name) == 0) return TRUE; return FALSE; @@ -3718,7 +3721,7 @@ identify_search_section (bfd * abfd, asection * section, void * obj) /* Use a heuristic to determine if data is a dll name. Possible to defeat this if (a) the library has MANY - (more than 0x302f) imports, (b) it is an ms-style + (more than 0x302f) imports, (b) it is an ms-style import library, but (c) it is buggy, in that the SEC_DATA flag is set on the "wrong" sections. This heuristic might also fail to record a valid dll name if the dllname uses @@ -4091,9 +4094,9 @@ main (int ac, char **av) while ((c = getopt_long (ac, av, #ifdef DLLTOOL_MCORE_ELF - "m:e:l:aD:d:z:b:xp:cCuUkAS:f:nI:vVHhM:L:F:", + "m:e:l:aD:d:z:b:xp:cCuUkAS:t:f:nI:vVHhM:L:F:", #else - "m:e:l:y:aD:d:z:b:xp:cCuUkAS:f:nI:vVHh", + "m:e:l:y:aD:d:z:b:xp:cCuUkAS:t:f:nI:vVHh", #endif long_options, 0)) != EOF) @@ -4151,6 +4154,9 @@ main (int ac, char **av) break; case 'z': output_def = fopen (optarg, FOPEN_WT); + if (!output_def) + /* xgettext:c-format */ + fatal (_("Unable to open def-file: %s"), optarg); break; case 'D': dll_name = (char*) lbasename (optarg); @@ -4259,8 +4265,8 @@ main (int ac, char **av) { /* If we are inferring dll_name from exp_name, strip off any path components, without emitting - a warning. */ - const char* exp_basename = lbasename (exp_name); + a warning. */ + const char* exp_basename = lbasename (exp_name); const int len = strlen (exp_basename) + 5; dll_name = xmalloc (len); strcpy (dll_name, exp_basename);