diff options
-rw-r--r-- | binutils/ChangeLog | 23 | ||||
-rw-r--r-- | binutils/dlltool.c | 119 |
2 files changed, 80 insertions, 62 deletions
diff --git a/binutils/ChangeLog b/binutils/ChangeLog index a5cf84c..9b925ca 100644 --- a/binutils/ChangeLog +++ b/binutils/ChangeLog @@ -1,3 +1,26 @@ +1999-10-22 Nick Clifton <nickc@cygnus.com> + + * dlltool.c (struct mac): Add new field 'how_default_as_switches'. + (mtable): Initialise new field. Some machines have a non empty + string for this field. + (HOW_BFD_TARGET): Undefine and replace with... + (HOW_BFD_READ_TARGET): New macro: bfd target to use when opening a + file for reading. This is set to 0 so that any recognisable bfd + format can be read. + (HOW_BFD_WRITE_TARGET): New macro: bfd target to use when opening + a file for writing. This is set to the target machine type. + (ASM_SWITCHES): New macro: default switches to use when assembling + a file. + (assemble_file): New function: Assemble a source file into a + destination object file. + (gen_exp_file): Use assemble_file to create the exp file. + (make_one_lib_file): Use assemble_file to create the lib file. + Open output file use HOW_BFD_WRITE_TARGET and input files using + HOW_BFD_READ_TARGET. + (make_head): Use assemble_file to create the head file. + (make_tail): Use assemble_file to create the tail file. + (gen_lib_file): Open output file use HOW_BFD_WRITE_TARGET. + 1999-10-15 Ian Lance Taylor <ian@zembu.com> * ar.c (normalize): Fix full_pathname code. diff --git a/binutils/dlltool.c b/binutils/dlltool.c index 0bd6a0e..7ccedbc 100644 --- a/binutils/dlltool.c +++ b/binutils/dlltool.c @@ -497,6 +497,7 @@ struct mac const char *how_space; const char *how_align_short; const char *how_align_long; + const char *how_default_as_switches; const char *how_bfd_target; enum bfd_architecture how_bfd_arch; const unsigned char *how_jtab; @@ -511,27 +512,33 @@ mtable[] = #define MARM 0 "arm", ".byte", ".short", ".long", ".asciz", "@", "ldr\tip,[pc]\n\tldr\tpc,[ip]\n\t.long", - ".global", ".space", ".align\t2",".align\t4","pe-arm-little", bfd_arch_arm, + ".global", ".space", ".align\t2",".align\t4", "", + "pe-arm-little", bfd_arch_arm, arm_jtab, sizeof (arm_jtab), 8 } , { #define M386 1 - "i386", ".byte", ".short", ".long", ".asciz", "#", "jmp *", ".global", ".space", ".align\t2",".align\t4","pe-i386",bfd_arch_i386, - i386_jtab, sizeof (i386_jtab), 2 + "i386", ".byte", ".short", ".long", ".asciz", "#", + "jmp *", ".global", ".space", ".align\t2",".align\t4", "", + "pe-i386",bfd_arch_i386, + i386_jtab, sizeof (i386_jtab), 2 } , { #define MPPC 2 - "ppc", ".byte", ".short", ".long", ".asciz", "#", "jmp *", ".global", ".space", ".align\t2",".align\t4","pe-powerpcle",bfd_arch_powerpc, - ppc_jtab, sizeof (ppc_jtab), 0 + "ppc", ".byte", ".short", ".long", ".asciz", "#", + "jmp *", ".global", ".space", ".align\t2",".align\t4", "", + "pe-powerpcle",bfd_arch_powerpc, + ppc_jtab, sizeof (ppc_jtab), 0 } , { #define MTHUMB 3 "thumb", ".byte", ".short", ".long", ".asciz", "@", "push\t{r6}\n\tldr\tr6, [pc, #8]\n\tldr\tr6, [r6]\n\tmov\tip, r6\n\tpop\t{r6}\n\tbx\tip", - ".global", ".space", ".align\t2",".align\t4","pe-arm-little", bfd_arch_arm, + ".global", ".space", ".align\t2",".align\t4", "=mthumb-interwork", + "pe-arm-little", bfd_arch_arm, thumb_jtab, sizeof (thumb_jtab), 12 } , @@ -539,7 +546,8 @@ mtable[] = { "arm_interwork", ".byte", ".short", ".long", ".asciz", "@", "ldr\tip,[pc]\n\tldr\tip,[ip]\n\tbx\tip\n\t.long", - ".global", ".space", ".align\t2",".align\t4","pe-arm-little", bfd_arch_arm, + ".global", ".space", ".align\t2",".align\t4", "-mthumb-interwork", + "pe-arm-little", bfd_arch_arm, arm_interwork_jtab, sizeof (arm_interwork_jtab), 12 } , @@ -547,7 +555,8 @@ mtable[] = #define MMCORE_BE 5 "mcore", ".byte", ".short", ".long", ".asciz", "//", "jmpi\t1\n\tnop\n\t.long", - ".global", ".space", ".align\t2",".align\t4","pe-mcore-big", bfd_arch_mcore, + ".global", ".space", ".align\t2",".align\t4", "", + "pe-mcore-big", bfd_arch_mcore, mcore_be_jtab, sizeof (mcore_be_jtab), 8 } , @@ -555,7 +564,8 @@ mtable[] = #define MMCORE_LE 6 "mcore-le", ".byte", ".short", ".long", ".asciz", "//", "jmpi\t1\n\tnop\n\t.long", - ".global", ".space", ".align\t2",".align\t4","pe-mcore-little", bfd_arch_mcore, + ".global", ".space", ".align\t2",".align\t4", "-EL", + "pe-mcore-little", bfd_arch_mcore, mcore_le_jtab, sizeof (mcore_le_jtab), 8 } , @@ -563,7 +573,8 @@ mtable[] = #define MMCORE_ELF 7 "mcore-elf", ".byte", ".short", ".long", ".asciz", "//", "jmpi\t1\n\tnop\n\t.long", - ".global", ".space", ".align\t2",".align\t4","elf32-mcore-big", bfd_arch_mcore, + ".global", ".space", ".align\t2",".align\t4", "", + "elf32-mcore-big", bfd_arch_mcore, mcore_be_jtab, sizeof (mcore_be_jtab), 8 } , @@ -571,11 +582,12 @@ mtable[] = #define MMCORE_ELF_LE 8 "mcore-elf-le", ".byte", ".short", ".long", ".asciz", "//", "jmpi\t1\n\tnop\n\t.long", - ".global", ".space", ".align\t2",".align\t4","elf32-mcore-little", bfd_arch_mcore, + ".global", ".space", ".align\t2",".align\t4", "-EL", + "elf32-mcore-little", bfd_arch_mcore, mcore_le_jtab, sizeof (mcore_le_jtab), 8 } , - { 0} + { 0 } }; typedef struct dlist @@ -798,11 +810,14 @@ asm_prefix (machine) #define ASM_RVA_AFTER rvaafter(machine) #define ASM_PREFIX asm_prefix(machine) #define ASM_ALIGN_LONG mtable[machine].how_align_long -#define HOW_BFD_TARGET 0 /* always default*/ +#define HOW_BFD_READ_TARGET 0 /* always default*/ +#define HOW_BFD_WRITE_TARGET mtable[machine].how_bfd_target #define HOW_BFD_ARCH mtable[machine].how_bfd_arch #define HOW_JTAB mtable[machine].how_jtab #define HOW_JTAB_SIZE mtable[machine].how_jtab_size #define HOW_JTAB_ROFF mtable[machine].how_jtab_roff +#define ASM_SWITCHES mtable[machine].how_default_as_switches + static char **oav; void @@ -1716,6 +1731,23 @@ generate_idata_ofile (filvar) } } +/* Assemble the specified file. */ +static void +assemble_file (source, dest) + const char * source; + const char * dest; +{ + char * cmd; + + cmd = (char *) alloca (strlen (ASM_SWITCHES) + strlen (as_flags) + + strlen (exp_name) + strlen (source) + + strlen (dest) + 50); + + sprintf (cmd, "%s %s -o %s %s", ASM_SWITCHES, as_flags, dest, source); + + run (as_name, cmd); +} + static void gen_exp_file () { @@ -1723,7 +1755,6 @@ gen_exp_file () int i; export_type *exp; dlist_type *dl; - char *cmd; /* xgettext:c-format */ inform (_("Generating export file: %s\n"), exp_name); @@ -1941,16 +1972,7 @@ gen_exp_file () fclose (f); /* assemble the file */ - cmd = (char *) alloca (strlen (as_flags) + strlen (exp_name) - + sizeof TMP_ASM + 50); - sprintf (cmd, "%s -o %s %s", as_flags, exp_name, TMP_ASM); - -#ifdef DLLTOOL_ARM - if (machine == MARM_INTERWORK || machine == MTHUMB) - strcat (cmd, " -mthumb-interwork"); -#endif - - run (as_name, cmd); + assemble_file (TMP_ASM, exp_name); if (dontdeltemps == 0) unlink (TMP_ASM); @@ -2134,7 +2156,7 @@ make_one_lib_file (exp, i) char *name; FILE *f; const char *prefix = "d"; - char *cmd; + char *dest; name = (char *) alloca (strlen (prefix) + 10); sprintf (name, "%ss%05d.s", prefix, i); @@ -2173,16 +2195,9 @@ make_one_lib_file (exp, i) fclose (f); - cmd = (char *) alloca (strlen (as_flags) + 2 * strlen (prefix) + 50); - sprintf (cmd, "%s -o %ss%05d.o %ss%d.s", - as_flags, prefix, i, prefix, i); - -#ifdef DLLTOOL_ARM - if (machine == MARM_INTERWORK || machine == MTHUMB) - strcat (cmd, " -mthumb-interwork"); -#endif - - run (as_name, cmd); + dest = (char *) alloca (strlen (prefix) + 10); + sprintf (dest, "%ss%05d.o", prefix, i); + assemble_file (name, dest); } #else /* if 0 */ { @@ -2209,7 +2224,7 @@ make_one_lib_file (exp, i) sprintf (outname, "%s%05d.o", TMP_STUB, i); - abfd = bfd_openw (outname, HOW_BFD_TARGET); + abfd = bfd_openw (outname, HOW_BFD_WRITE_TARGET); if (!abfd) /* xgettext:c-format */ @@ -2586,7 +2601,7 @@ make_one_lib_file (exp, i) bfd_set_symtab (abfd, ptrs, oidx); bfd_close (abfd); - abfd = bfd_openr (outname, HOW_BFD_TARGET); + abfd = bfd_openr (outname, HOW_BFD_READ_TARGET); return abfd; } #endif @@ -2596,7 +2611,6 @@ static bfd * make_head () { FILE *f = fopen (TMP_HEAD_S, FOPEN_WT); - char *cmd; if (f == NULL) { @@ -2647,25 +2661,15 @@ make_head () fclose (f); - cmd = (char *) alloca (strlen (as_flags) + sizeof TMP_HEAD_O - + sizeof TMP_HEAD_S + 50); - sprintf (cmd, "%s -o %s %s", as_flags, TMP_HEAD_O, TMP_HEAD_S); - -#ifdef DLLTOOL_ARM - if (machine == MARM_INTERWORK || machine == MTHUMB) - strcat (cmd, " -mthumb-interwork"); -#endif - - run (as_name, cmd); + assemble_file (TMP_HEAD_S, TMP_HEAD_O); - return bfd_openr (TMP_HEAD_O, HOW_BFD_TARGET); + return bfd_openr (TMP_HEAD_O, HOW_BFD_READ_TARGET); } static bfd * make_tail () { FILE *f = fopen (TMP_TAIL_S, FOPEN_WT); - char *cmd; if (f == NULL) { @@ -2716,18 +2720,9 @@ make_tail () fclose (f); - cmd = (char *) alloca (strlen (as_flags) + sizeof TMP_TAIL_O - + sizeof TMP_TAIL_S + 50); - sprintf (cmd, "%s -o %s %s", as_flags, TMP_TAIL_O, TMP_TAIL_S); - -#ifdef DLLTOOL_ARM - if (machine == MARM_INTERWORK || machine == MTHUMB) - strcat (cmd, " -mthumb-interwork"); -#endif - - run (as_name, cmd); + assemble_file (TMP_TAIL_S, TMP_TAIL_O); - return bfd_openr (TMP_TAIL_O, HOW_BFD_TARGET); + return bfd_openr (TMP_TAIL_O, HOW_BFD_READ_TARGET); } static void @@ -2742,7 +2737,7 @@ gen_lib_file () unlink (imp_name); - outarch = bfd_openw (imp_name, HOW_BFD_TARGET); + outarch = bfd_openw (imp_name, HOW_BFD_WRITE_TARGET); if (!outarch) /* xgettext:c-format */ |