X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=binutils%2Fdlltool.c;h=734c727a065efb8b4d5cde2c64affac47b7694ff;hb=7c392d1de1400202eb86f7679628c4b7c14f8108;hp=10204b08885340a2a9af958a9eb7a3f6ee2226e5;hpb=d7b24d2941fd7c99ba5843331989e6023075f0d0;p=deliverable%2Fbinutils-gdb.git diff --git a/binutils/dlltool.c b/binutils/dlltool.c index 10204b0888..734c727a06 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-2020 Free Software Foundation, Inc. This file is part of GNU Binutils. @@ -240,6 +240,7 @@ #include "bucomm.h" #include "dlltool.h" #include "safe-ctype.h" +#include "coff-bfd.h" #include #include @@ -370,7 +371,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 +384,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; @@ -436,10 +437,6 @@ static FILE *base_file; static const char *mname = "arm"; #endif -#ifdef DLLTOOL_DEFAULT_ARM_EPOC -static const char *mname = "arm-epoc"; -#endif - #ifdef DLLTOOL_DEFAULT_ARM_WINCE static const char *mname = "arm-wince"; #endif @@ -482,7 +479,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 +585,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 +595,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" @@ -733,17 +730,7 @@ mtable[] = } , { -#define MARM_EPOC 9 - "arm-epoc", ".byte", ".short", ".long", ".asciz", "@", - "ldr\tip,[pc]\n\tldr\tpc,[ip]\n\t.long", - ".global", ".space", ".align\t2",".align\t4", "", - "epoc-pe-arm-little", bfd_arch_arm, - arm_jtab, sizeof (arm_jtab), 8, - 0, 0, 0, 0, 0, 0 - } - , - { -#define MARM_WINCE 10 +#define MARM_WINCE 9 "arm-wince", ".byte", ".short", ".long", ".asciz", "@", "ldr\tip,[pc]\n\tldr\tpc,[ip]\n\t.long", ".global", ".space", ".align\t2",".align\t4", "-mapcs-32", @@ -753,7 +740,7 @@ mtable[] = } , { -#define MX86 11 +#define MX86 10 "i386:x86-64", ".byte", ".short", ".long", ".asciz", "#", "jmp *", ".global", ".space", ".align\t2",".align\t4", "", "pe-x86-64",bfd_arch_i386, @@ -780,10 +767,9 @@ typedef struct export int ordinal; int constant; int noname; /* Don't put name in image file. */ - int private; /* Don't put reference in import lib. */ + int private; /* Don't put reference in import lib. */ int data; - int hint; - int forward; /* Number of forward label, 0 means no forward. */ + int forward; /* Number of forward label, 0 means no forward. */ struct export *next; } export_type; @@ -909,7 +895,6 @@ rvaafter (int mach) case MMCORE_LE: case MMCORE_ELF: case MMCORE_ELF_LE: - case MARM_EPOC: case MARM_WINCE: break; default: @@ -935,7 +920,6 @@ rvabefore (int mach) case MMCORE_LE: case MMCORE_ELF: case MMCORE_ELF_LE: - case MARM_EPOC: case MARM_WINCE: return ".rva\t"; default: @@ -959,7 +943,6 @@ asm_prefix (int mach, const char *name) case MMCORE_LE: case MMCORE_ELF: case MMCORE_ELF_LE: - case MARM_EPOC: case MARM_WINCE: break; case M386: @@ -1084,7 +1067,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 +1236,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 +1249,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 +1316,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 +1335,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) { @@ -1402,7 +1385,7 @@ scan_drectve_symbols (bfd *abfd) if (s == NULL) return; - size = bfd_get_section_size (s); + size = bfd_section_size (s); buf = xmalloc (size); bfd_get_section_contents (abfd, s, buf, 0, size); @@ -1986,12 +1969,38 @@ 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]; +#define TEMP_EXPORT_FILE 0 +#define TEMP_HEAD_FILE 1 +#define TEMP_TAIL_FILE 2 +#define TEMP_HEAD_O_FILE 3 +#define TEMP_TAIL_O_FILE 4 + +static void +unlink_temp_files (void) +{ + unsigned i; + + if (dontdeltemps > 0) + return; + + for (i = 0; i < ARRAY_SIZE (temp_file_to_remove); i++) + { + if (temp_file_to_remove[i]) + { + unlink (temp_file_to_remove[i]); + temp_file_to_remove[i] = NULL; + } + } } static void @@ -2010,6 +2019,8 @@ gen_exp_file (void) /* xgettext:c-format */ 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); @@ -2146,7 +2157,6 @@ gen_exp_file (void) } } - /* Add to the output file a way of getting to the exported names without using the import library. */ if (add_indirect) @@ -2234,7 +2244,10 @@ gen_exp_file (void) assemble_file (TMP_ASM, exp_name); if (dontdeltemps == 0) - unlink (TMP_ASM); + { + temp_file_to_remove[TEMP_EXPORT_FILE] = NULL; + unlink (TMP_ASM); + } inform (_("Generated exports file")); } @@ -2470,11 +2483,9 @@ make_one_lib_file (export_type *exp, int i, int delay) if (si->id != i) abort (); si->sec = bfd_make_section_old_way (abfd, si->name); - bfd_set_section_flags (abfd, - si->sec, - si->flags & applicable); + bfd_set_section_flags (si->sec, si->flags & applicable); - bfd_set_section_alignment(abfd, si->sec, si->align); + bfd_set_section_alignment (si->sec, si->align); si->sec->output_section = si->sec; si->sym = bfd_make_empty_symbol(abfd); si->sym->name = si->sec->name; @@ -2678,7 +2689,8 @@ make_one_lib_file (export_type *exp, int i, int delay) sec->orelocation = rpp; break; } - /* else fall through */ + /* Fall through. */ + case IDATA4: /* An idata$4 or idata$5 is one word long, and has an rva to idata$6. */ @@ -2717,7 +2729,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 ; @@ -2745,15 +2757,14 @@ make_one_lib_file (export_type *exp, int i, int delay) case IDATA6: if (!exp->noname) { - /* This used to add 1 to exp->hint. I don't know - why it did that, and it does not match what I see - in programs compiled with the MS tools. */ - int idx = exp->hint; + int idx = exp->ordinal; + if (exp->its_name) si->size = strlen (exp->its_name) + 3; 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) @@ -2810,7 +2821,7 @@ make_one_lib_file (export_type *exp, int i, int delay) arelent *imglue, *ba_rel, *ea_rel, *pea_rel; /* Alignment must be set to 2**2 or you get extra stuff. */ - bfd_set_section_alignment(abfd, sec, 2); + bfd_set_section_alignment (sec, 2); si->size = 4 * 5; si->data = xmalloc (si->size); @@ -2896,8 +2907,8 @@ make_one_lib_file (export_type *exp, int i, int delay) { sinfo *si = secdata + i; - bfd_set_section_size (abfd, si->sec, si->size); - bfd_set_section_vma (abfd, si->sec, vma); + bfd_set_section_size (si->sec, si->size); + bfd_set_section_vma (si->sec, vma); } } /* Write them out. */ @@ -2923,7 +2934,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; } @@ -2939,6 +2950,8 @@ make_head (void) return NULL; } + temp_file_to_remove[TEMP_HEAD_FILE] = TMP_HEAD_S; + fprintf (f, "%s IMAGE_IMPORT_DESCRIPTOR\n", ASM_C); fprintf (f, "\t.section\t.idata$2\n"); @@ -3000,6 +3013,7 @@ make_head (void) fatal (_("failed to open temporary head file: %s: %s"), TMP_HEAD_O, bfd_get_errmsg ()); + temp_file_to_remove[TEMP_HEAD_O_FILE] = TMP_HEAD_O; return abfd; } @@ -3015,6 +3029,8 @@ make_delay_head (void) return NULL; } + temp_file_to_remove[TEMP_HEAD_FILE] = TMP_HEAD_S; + /* Output the __tailMerge__xxx function */ fprintf (f, "%s Import trampoline\n", ASM_C); fprintf (f, "\t.section\t.text\n"); @@ -3083,6 +3099,7 @@ make_delay_head (void) fatal (_("failed to open temporary head file: %s: %s"), TMP_HEAD_O, bfd_get_errmsg ()); + temp_file_to_remove[TEMP_HEAD_O_FILE] = TMP_HEAD_O; return abfd; } @@ -3098,6 +3115,8 @@ make_tail (void) return NULL; } + temp_file_to_remove[TEMP_TAIL_FILE] = TMP_TAIL_S; + if (!no_idata4) { fprintf (f, "\t.section\t.idata$4\n"); @@ -3154,6 +3173,7 @@ make_tail (void) fatal (_("failed to open temporary tail file: %s: %s"), TMP_TAIL_O, bfd_get_errmsg ()); + temp_file_to_remove[TEMP_TAIL_O_FILE] = TMP_TAIL_O; return abfd; } @@ -3179,6 +3199,8 @@ gen_lib_file (int delay) /* xgettext:c-format */ 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; @@ -3220,7 +3242,6 @@ gen_lib_file (int delay) alias_exp.noname = exp->noname; alias_exp.private = exp->private; alias_exp.data = exp->data; - alias_exp.hint = exp->hint; alias_exp.forward = exp->forward; alias_exp.next = exp->next; n = make_one_lib_file (&alias_exp, i + PREFIX_ALIAS_BASE, delay); @@ -3248,19 +3269,13 @@ gen_lib_file (int delay) } /* Delete all the temp files. */ - if (dontdeltemps == 0) - { - unlink (TMP_HEAD_O); - unlink (TMP_HEAD_S); - unlink (TMP_TAIL_O); - unlink (TMP_TAIL_S); - } + unlink_temp_files (); if (dontdeltemps < 2) { 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. */ @@ -3278,6 +3293,7 @@ gen_lib_file (int delay) non_fatal (_("cannot delete %s: %s"), name, strerror (errno)); } } + free (name); } inform (_("Created lib file")); @@ -3309,7 +3325,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; @@ -3331,7 +3347,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; @@ -3366,7 +3382,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) @@ -3387,7 +3403,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 * @@ -3411,9 +3427,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) @@ -3469,9 +3485,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; @@ -3487,7 +3503,8 @@ identify_dll_for_implib (void) search_data.symname = "__NULL_IMPORT_DESCRIPTOR"; search_data.found = FALSE; - bfd_init (); + if (bfd_init () != BFD_INIT_MAGIC) + fatal (_("fatal error: libbfd ABI mismatch")); abfd = bfd_openr (identify_imp_name, 0); if (abfd == NULL) @@ -3509,7 +3526,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); @@ -3524,7 +3541,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, @@ -3558,10 +3575,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) { @@ -3589,7 +3606,15 @@ identify_search_archive (bfd * abfd, } if (last_arfile != NULL) - bfd_close (last_arfile); + { + bfd_close (last_arfile); + /* PR 17512: file: 8b2168d4. */ + if (last_arfile == arfile) + { + last_arfile = NULL; + break; + } + } last_arfile = arfile; } @@ -3601,7 +3626,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, @@ -3613,7 +3638,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) @@ -3626,10 +3651,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; @@ -3665,7 +3690,7 @@ identify_search_section (bfd * abfd, asection * section, void * obj) if (ms_style && ((section->flags & SEC_DATA) == 0)) return; - if ((datasize = bfd_section_size (abfd, section)) == 0) + if ((datasize = bfd_section_size (section)) == 0) return; data = (bfd_byte *) xmalloc (datasize + 1); @@ -3676,7 +3701,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 @@ -3881,10 +3906,8 @@ mangle_defs (void) { /* First work out the minimum ordinal chosen. */ export_type *exp; - - int i; - int hint = 0; export_type **d_export_vec = xmalloc (sizeof (export_type *) * d_nfuncs); + int i; inform (_("Processing definitions")); @@ -3913,11 +3936,6 @@ mangle_defs (void) qsort (d_exports_lexically, i, sizeof (export_type *), nfunc); - /* Fill exp entries with their hint values. */ - for (i = 0; i < d_nfuncs; i++) - if (!d_exports_lexically[i]->noname || show_allnames) - d_exports_lexically[i]->hint = hint++; - inform (_("Processed definitions")); } @@ -4044,13 +4062,14 @@ main (int ac, char **av) bindtextdomain (PACKAGE, LOCALEDIR); textdomain (PACKAGE); + bfd_set_error_program_name (program_name); expandargv (&ac, &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) @@ -4108,6 +4127,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); @@ -4216,8 +4238,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);