public inbox for binutils@sourceware.org
 help / color / mirror / Atom feed
From: Nick Clifton <nickc@cygnus.com>
To: binutils@sourceware.cygnus.com
Subject: Fixes to dlltool
Date: Fri, 22 Oct 1999 08:54:00 -0000	[thread overview]
Message-ID: <199910221554.QAA13123@pathia.cygnus.co.uk> (raw)

Hi Guys,

  I have applied the patch below to dlltool.  It fixes a bug whereby
  if the --machine command line switch was used to select a target
  other than the default target, the tool would still create output
  files in the default target format.

  The patch also adds an extra field to the mac structure to allow
  target machine formats to specify default switches to be passed to
  the assembler when creating files for that format.  This is then
  used by the little endian mcore target to pass the -EL switch on to
  the asembler and by the thumb target to pass on
  -mthumb-interworking.  These switches can still be overridden by the
  --as-flags command line switch, if necessary.

Cheers
	Nick


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.

Index: dlltool.c
===================================================================
RCS file: /cvs/binutils/binutils/binutils/dlltool.c,v
retrieving revision 1.12
diff -p -r1.12 dlltool.c
*** dlltool.c	1999/09/28 20:08:37	1.12
--- dlltool.c	1999/10/22 15:42:07
*************** struct mac
*** 497,502 ****
--- 497,503 ----
      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;
*************** mtable[] =
*** 511,537 ****
  #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,
      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
    }
    ,
    {
  #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
    }
    ,
    {
  #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,
      thumb_jtab, sizeof (thumb_jtab), 12
    }
    ,
--- 512,544 ----
  #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,
      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
    }
    ,
    {
  #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
    }
    ,
    {
  #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", "=mthumb-interwork",
!     "pe-arm-little", bfd_arch_arm,
      thumb_jtab, sizeof (thumb_jtab), 12
    }
    ,
*************** mtable[] =
*** 539,545 ****
    {
      "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,
      arm_interwork_jtab, sizeof (arm_interwork_jtab), 12
    }
    ,
--- 546,553 ----
    {
      "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", "-mthumb-interwork",
!     "pe-arm-little", bfd_arch_arm,
      arm_interwork_jtab, sizeof (arm_interwork_jtab), 12
    }
    ,
*************** mtable[] =
*** 547,553 ****
  #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,
      mcore_be_jtab, sizeof (mcore_be_jtab), 8
    }
    ,
--- 555,562 ----
  #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,
      mcore_be_jtab, sizeof (mcore_be_jtab), 8
    }
    ,
*************** mtable[] =
*** 555,561 ****
  #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,
      mcore_le_jtab, sizeof (mcore_le_jtab), 8
    }
    ,
--- 564,571 ----
  #define MMCORE_LE 6
      "mcore-le", ".byte", ".short", ".long", ".asciz", "//",
      "jmpi\t1\n\tnop\n\t.long",
!     ".global", ".space", ".align\t2",".align\t4", "-EL",
!     "pe-mcore-little", bfd_arch_mcore,
      mcore_le_jtab, sizeof (mcore_le_jtab), 8
    }
    ,
*************** mtable[] =
*** 563,569 ****
  #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,
      mcore_be_jtab, sizeof (mcore_be_jtab), 8
    }
    ,
--- 573,580 ----
  #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,
      mcore_be_jtab, sizeof (mcore_be_jtab), 8
    }
    ,
*************** mtable[] =
*** 571,581 ****
  #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,
      mcore_le_jtab, sizeof (mcore_le_jtab), 8
    }
    ,
!  {    0}
  };
  
  typedef struct dlist
--- 582,593 ----
  #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", "-EL",
!     "elf32-mcore-little", bfd_arch_mcore,
      mcore_le_jtab, sizeof (mcore_le_jtab), 8
    }
    ,
!   { 0 }
  };
  
  typedef struct dlist
*************** asm_prefix (machine)
*** 798,808 ****
  #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_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
  static char **oav;
  
  void
--- 810,823 ----
  #define ASM_RVA_AFTER  	rvaafter(machine)
  #define ASM_PREFIX	asm_prefix(machine)
  #define ASM_ALIGN_LONG  mtable[machine].how_align_long
! #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
*************** generate_idata_ofile (filvar)
*** 1716,1729 ****
      }
  }
  
  static void
  gen_exp_file ()
  {
    FILE *f;
    int i;
    export_type *exp;
    dlist_type *dl;
-   char *cmd;
  
    /* xgettext:c-format */
    inform (_("Generating export file: %s\n"), exp_name);
--- 1731,1760 ----
      }
  }
  
+ /* 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 ()
  {
    FILE *f;
    int i;
    export_type *exp;
    dlist_type *dl;
  
    /* xgettext:c-format */
    inform (_("Generating export file: %s\n"), exp_name);
*************** gen_exp_file ()
*** 1941,1957 ****
    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);
- 
    if (dontdeltemps == 0)
      unlink (TMP_ASM);
    
--- 1972,1979 ----
    fclose (f);
  
    /* assemble the file */
!   assemble_file (TMP_ASM, exp_name);
  
    if (dontdeltemps == 0)
      unlink (TMP_ASM);
    
*************** make_one_lib_file (exp, i)
*** 2134,2140 ****
        char *name;
        FILE *f;
        const char *prefix = "d";
!       char *cmd;
  
        name = (char *) alloca (strlen (prefix) + 10);
        sprintf (name, "%ss%05d.s", prefix, i);
--- 2156,2162 ----
        char *name;
        FILE *f;
        const char *prefix = "d";
!       char *dest;
  
        name = (char *) alloca (strlen (prefix) + 10);
        sprintf (name, "%ss%05d.s", prefix, i);
*************** make_one_lib_file (exp, i)
*** 2172,2188 ****
  	}
  
        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);
      }
  #else /* if 0 */
      {
--- 2194,2203 ----
  	}
  
        fclose (f);
  
!       dest = (char *) alloca (strlen (prefix) + 10);
!       sprintf (dest, "%ss%05d.o", prefix, i);
!       assemble_file (name, dest);
      }
  #else /* if 0 */
      {
*************** make_one_lib_file (exp, i)
*** 2209,2215 ****
        
        sprintf (outname, "%s%05d.o", TMP_STUB, i);
        
!       abfd = bfd_openw (outname, HOW_BFD_TARGET);
        
        if (!abfd)
  	/* xgettext:c-format */
--- 2224,2230 ----
        
        sprintf (outname, "%s%05d.o", TMP_STUB, i);
        
!       abfd = bfd_openw (outname, HOW_BFD_WRITE_TARGET);
        
        if (!abfd)
  	/* xgettext:c-format */
*************** make_one_lib_file (exp, i)
*** 2586,2592 ****
  
        bfd_set_symtab (abfd, ptrs, oidx);
        bfd_close (abfd);
!       abfd = bfd_openr (outname, HOW_BFD_TARGET);
        return abfd;
      }
  #endif
--- 2601,2607 ----
  
        bfd_set_symtab (abfd, ptrs, oidx);
        bfd_close (abfd);
!       abfd = bfd_openr (outname, HOW_BFD_READ_TARGET);
        return abfd;
      }
  #endif
*************** static bfd *
*** 2596,2602 ****
  make_head ()
  {
    FILE *f = fopen (TMP_HEAD_S, FOPEN_WT);
-   char *cmd;
  
    if (f == NULL)
      {
--- 2611,2616 ----
*************** make_head ()
*** 2647,2671 ****
    
    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);
  
!   return bfd_openr (TMP_HEAD_O, HOW_BFD_TARGET);
  }
  
  static bfd *
  make_tail ()
  {
    FILE *f = fopen (TMP_TAIL_S, FOPEN_WT);
-   char *cmd;
  
    if (f == NULL)
      {
--- 2661,2675 ----
    
    fclose (f);
  
!   assemble_file (TMP_HEAD_S, TMP_HEAD_O);
  
!   return bfd_openr (TMP_HEAD_O, HOW_BFD_READ_TARGET);
  }
  
  static bfd *
  make_tail ()
  {
    FILE *f = fopen (TMP_TAIL_S, FOPEN_WT);
  
    if (f == NULL)
      {
*************** make_tail ()
*** 2716,2733 ****
  
    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);
    
!   return  bfd_openr (TMP_TAIL_O, HOW_BFD_TARGET);
  }
  
  static void
--- 2720,2728 ----
  
    fclose (f);
  
!   assemble_file (TMP_TAIL_S, TMP_TAIL_O);
    
!   return  bfd_openr (TMP_TAIL_O, HOW_BFD_READ_TARGET);
  }
  
  static void
*************** gen_lib_file ()
*** 2742,2748 ****
  
    unlink (imp_name);
  
!   outarch = bfd_openw (imp_name, HOW_BFD_TARGET);
  
    if (!outarch)
      /* xgettext:c-format */
--- 2737,2743 ----
  
    unlink (imp_name);
  
!   outarch = bfd_openw (imp_name, HOW_BFD_WRITE_TARGET);
  
    if (!outarch)
      /* xgettext:c-format */

                 reply	other threads:[~1999-10-22  8:54 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=199910221554.QAA13123@pathia.cygnus.co.uk \
    --to=nickc@cygnus.com \
    --cc=binutils@sourceware.cygnus.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).