dllwrap.c

来自「基于4个mips核的noc设计」· C语言 代码 · 共 1,250 行 · 第 1/3 页

C
1,250
字号
      in_quote = (*s == '\'' || *s == '"');      sep = (in_quote) ? *s++ : ' ';      argv[i++] = s;      while (*s != sep && *s != 0)	s++;      if (*s == 0)	break;      *s++ = 0;      if (in_quote)        s++;    }  argv[i++] = NULL;  if (dry_run)    return 0;  pid = pexecute (argv[0], (char * const *) argv, program_name, temp_base,		  &errmsg_fmt, &errmsg_arg, PEXECUTE_ONE | PEXECUTE_SEARCH);  if (pid == -1)    {      int errno_val = errno;      fprintf (stderr, "%s: ", program_name);      fprintf (stderr, errmsg_fmt, errmsg_arg);      fprintf (stderr, ": %s\n", strerror (errno_val));      return 1;    }  retcode = 0;  pid = pwait (pid, &wait_status, 0);  if (pid == -1)    {      warn ("wait: %s", strerror (errno));      retcode = 1;    }  else if (WIFSIGNALED (wait_status))    {      warn (_("subprocess got fatal signal %d"), WTERMSIG (wait_status));      retcode = 1;    }  else if (WIFEXITED (wait_status))    {      if (WEXITSTATUS (wait_status) != 0)	{	  warn (_("%s exited with status %d"), what, WEXITSTATUS (wait_status));	  retcode = 1;	}    }  else    retcode = 1;    return retcode;}static char *mybasename (name)     const char *name;{  const char *base = name;  while (*name)    {      if (*name == '/' || *name == '\\')	{	  base = name + 1;	}      ++name;    }  return (char *) base;}static int strhash (const char *str){  const unsigned char *s;  unsigned long hash;  unsigned int c;  unsigned int len;  hash = 0;  len = 0;  s = (const unsigned char *) str;  while ((c = *s++) != '\0')    {      hash += c + (c << 17);      hash ^= hash >> 2;      ++len;    }  hash += len + (len << 17);  hash ^= hash >> 2;  return hash;}/**********************************************************************/static voidusage (file, status)     FILE *file;     int status;{  fprintf (file, _("Usage %s <options> <object-files>\n"), program_name);  fprintf (file, _("  Generic options:\n"));  fprintf (file, _("   --quiet, -q            Work quietly\n"));  fprintf (file, _("   --verbose, -v          Verbose\n"));  fprintf (file, _("   --version              Print dllwrap version\n"));  fprintf (file, _("   --implib <outname>     Synonym for --output-lib\n"));  fprintf (file, _("  Options for %s:\n"), program_name);  fprintf (file, _("   --driver-name <driver> Defaults to \"gcc\"\n"));  fprintf (file, _("   --driver-flags <flags> Override default ld flags\n"));  fprintf (file, _("   --dlltool-name <dlltool> Defaults to \"dlltool\"\n"));  fprintf (file, _("   --entry <entry>        Specify alternate DLL entry point\n"));  fprintf (file, _("   --image-base <base>    Specify image base address\n"));  fprintf (file, _("   --target <machine>     i386-cygwin32 or i386-mingw32\n"));  fprintf (file, _("   --dry-run              Show what needs to be run\n"));  fprintf (file, _("   --mno-cygwin           Create Mingw DLL\n"));  fprintf (file, _("  Options passed to DLLTOOL:\n"));  fprintf (file, _("   --machine <machine>\n"));  fprintf (file, _("   --output-exp <outname> Generate export file.\n"));  fprintf (file, _("   --output-lib <outname> Generate input library.\n"));  fprintf (file, _("   --add-indirect         Add dll indirects to export file.\n"));  fprintf (file, _("   --dllname <name>       Name of input dll to put into output lib.\n"));  fprintf (file, _("   --def <deffile>        Name input .def file\n"));  fprintf (file, _("   --output-def <deffile> Name output .def file\n"));  fprintf (file, _("   --export-all-symbols     Export all symbols to .def\n"));  fprintf (file, _("   --no-export-all-symbols  Only export .drectve symbols\n"));  fprintf (file, _("   --exclude-symbols <list> Exclude <list> from .def\n"));  fprintf (file, _("   --no-default-excludes    Zap default exclude symbols\n"));  fprintf (file, _("   --base-file <basefile> Read linker generated base file\n"));  fprintf (file, _("   --no-idata4           Don't generate idata$4 section\n"));  fprintf (file, _("   --no-idata5           Don't generate idata$5 section\n"));  fprintf (file, _("   -U                     Add underscores to .lib\n"));  fprintf (file, _("   -k                     Kill @<n> from exported names\n"));  fprintf (file, _("   --add-stdcall-alias    Add aliases without @<n>\n"));  fprintf (file, _("   --as <name>            Use <name> for assembler\n"));  fprintf (file, _("   --nodelete             Keep temp files.\n"));  fprintf (file, _("  Rest are passed unmodified to the language driver\n"));  fprintf (file, "\n\n");  exit (status);}#define OPTION_START		149/* GENERIC options. */#define OPTION_QUIET		(OPTION_START + 1)#define OPTION_VERBOSE		(OPTION_QUIET + 1)#define OPTION_VERSION		(OPTION_VERBOSE + 1)/* DLLWRAP options. */#define OPTION_DRY_RUN		(OPTION_VERSION + 1)#define OPTION_DRIVER_NAME	(OPTION_DRY_RUN + 1)#define OPTION_DRIVER_FLAGS	(OPTION_DRIVER_NAME + 1)#define OPTION_DLLTOOL_NAME	(OPTION_DRIVER_FLAGS + 1)#define OPTION_ENTRY		(OPTION_DLLTOOL_NAME + 1)#define OPTION_IMAGE_BASE	(OPTION_ENTRY + 1)#define OPTION_TARGET		(OPTION_IMAGE_BASE + 1)#define OPTION_MNO_CYGWIN	(OPTION_TARGET + 1)/* DLLTOOL options. */#define OPTION_NODELETE		(OPTION_MNO_CYGWIN + 1)#define OPTION_DLLNAME		(OPTION_NODELETE + 1)#define OPTION_NO_IDATA4 	(OPTION_DLLNAME + 1)#define OPTION_NO_IDATA5	(OPTION_NO_IDATA4 + 1)#define OPTION_OUTPUT_EXP	(OPTION_NO_IDATA5 + 1)#define OPTION_OUTPUT_DEF	(OPTION_OUTPUT_EXP + 1)#define OPTION_EXPORT_ALL_SYMS	(OPTION_OUTPUT_DEF + 1)#define OPTION_NO_EXPORT_ALL_SYMS (OPTION_EXPORT_ALL_SYMS + 1)#define OPTION_EXCLUDE_SYMS	(OPTION_NO_EXPORT_ALL_SYMS + 1)#define OPTION_NO_DEFAULT_EXCLUDES (OPTION_EXCLUDE_SYMS + 1)#define OPTION_OUTPUT_LIB	(OPTION_NO_DEFAULT_EXCLUDES + 1)#define OPTION_DEF		(OPTION_OUTPUT_LIB + 1)#define OPTION_ADD_UNDERSCORE	(OPTION_DEF + 1)#define OPTION_KILLAT		(OPTION_ADD_UNDERSCORE + 1)#define OPTION_HELP		(OPTION_KILLAT + 1)#define OPTION_MACHINE		(OPTION_HELP + 1)#define OPTION_ADD_INDIRECT	(OPTION_MACHINE + 1)#define OPTION_BASE_FILE	(OPTION_ADD_INDIRECT + 1)#define OPTION_AS		(OPTION_BASE_FILE + 1)static const struct option long_options[] ={  /* generic options. */  {"quiet", no_argument, NULL, 'q'},  {"verbose", no_argument, NULL, 'v'},  {"version", no_argument, NULL, OPTION_VERSION},  {"implib", required_argument, NULL, OPTION_OUTPUT_LIB},  /* dllwrap options. */  {"dry-run", no_argument, NULL, OPTION_DRY_RUN},  {"driver-name", required_argument, NULL, OPTION_DRIVER_NAME},  {"driver-flags", required_argument, NULL, OPTION_DRIVER_FLAGS},  {"dlltool-name", required_argument, NULL, OPTION_DLLTOOL_NAME},  {"entry", required_argument, NULL, 'e'},  {"image-base", required_argument, NULL, OPTION_IMAGE_BASE},  {"target", required_argument, NULL, OPTION_TARGET},  /* dlltool options. */  {"no-delete", no_argument, NULL, 'n'},  {"dllname", required_argument, NULL, OPTION_DLLNAME},  {"no-idata4", no_argument, NULL, OPTION_NO_IDATA4},  {"no-idata5", no_argument, NULL, OPTION_NO_IDATA5},  {"output-exp", required_argument, NULL, OPTION_OUTPUT_EXP},  {"output-def", required_argument, NULL, OPTION_OUTPUT_DEF},  {"export-all-symbols", no_argument, NULL, OPTION_EXPORT_ALL_SYMS},  {"no-export-all-symbols", no_argument, NULL, OPTION_NO_EXPORT_ALL_SYMS},  {"exclude-symbols", required_argument, NULL, OPTION_EXCLUDE_SYMS},  {"no-default-excludes", no_argument, NULL, OPTION_NO_DEFAULT_EXCLUDES},  {"output-lib", required_argument, NULL, OPTION_OUTPUT_LIB},  {"def", required_argument, NULL, OPTION_DEF},  {"add-underscore", no_argument, NULL, 'U'},  {"killat", no_argument, NULL, 'k'},  {"add-stdcall-alias", no_argument, NULL, 'A'},  {"help", no_argument, NULL, 'h'},  {"machine", required_argument, NULL, OPTION_MACHINE},  {"add-indirect", no_argument, NULL, OPTION_ADD_INDIRECT},  {"base-file", required_argument, NULL, OPTION_BASE_FILE},  {"as", required_argument, NULL, OPTION_AS},  {0, 0, 0, 0}};intmain (argc, argv)     int argc;     char **argv;{  int c;  int i;  char **saved_argv = 0;  int cmdline_len = 0;  int export_all = 0;  int *dlltool_arg_indices;  int *driver_arg_indices;  char *driver_flags = 0;  char *output_lib_file_name = 0;  dyn_string_t dlltool_cmdline;  dyn_string_t driver_cmdline;  int def_file_seen = 0;  char *image_base_str = 0;  program_name = argv[0];  saved_argv = (char **) xmalloc (argc * sizeof (char*));  dlltool_arg_indices = (int *) xmalloc (argc * sizeof (int));  driver_arg_indices = (int *) xmalloc (argc * sizeof (int));  for (i = 0; i < argc; ++i)     {      size_t len = strlen (argv[i]);      char *arg = (char *) xmalloc (len + 1);      strcpy (arg, argv[i]);      cmdline_len += len;      saved_argv[i] = arg;      dlltool_arg_indices[i] = 0;      driver_arg_indices[i] = 1;    }  cmdline_len++;  /* We recognize dllwrap and dlltool options, and everything else is     passed onto the language driver (eg., to GCC). We collect options     to dlltool and driver in dlltool_args and driver_args. */     opterr = 0;  while ((c = getopt_long_only (argc, argv, "nkAqve:Uho:l:L:I:",                                 long_options, (int *) 0)) != EOF)    {      int dlltool_arg;      int driver_arg;      int single_word_option_value_pair;      dlltool_arg = 0;      driver_arg = 1;      single_word_option_value_pair = 0;      if (c != '?')        {	  /* We recognize this option, so it has to be either dllwrap or	     dlltool option. Do not pass to driver unless it's one of the	     generic options that are passed to all the tools (such as -v)	     which are dealt with later. */	  driver_arg = 0;	}      /* deal with generic and dllwrap options first. */      switch (c)	{	case 'h':	  usage (stdout, 0);	  break;	case 'q':	  verbose = 0;	  break;	case 'v':	  verbose = 1;	  break;	case OPTION_VERSION:	  print_version (program_name);	  break;	case 'e':	  entry_point = optarg;	  break;	case OPTION_IMAGE_BASE:	  image_base_str = optarg;	  break;	case OPTION_DEF:	  def_file_name = optarg;	  def_file_seen = 1;	  delete_def_file = 0;	  break;	case 'n':	  dontdeltemps = 1;	  dlltool_arg = 1;	  break;	case 'o':	  dll_file_name = optarg;	  break;	case 'I':	case 'l':	case 'L':	  driver_arg = 1;	  break;	case OPTION_DLLNAME:	  dll_name = optarg;	  break;	case OPTION_DRY_RUN:	  dry_run = 1;	  break;	case OPTION_DRIVER_NAME:	  driver_name = optarg;	  break;	case OPTION_DRIVER_FLAGS:	  driver_flags = optarg;	  break;	case OPTION_DLLTOOL_NAME:	  dlltool_name = optarg;	  break;	case OPTION_TARGET:	  target = optarg;	  break;	case OPTION_MNO_CYGWIN:	  target = "i386-mingw32";	  break;	case OPTION_BASE_FILE:	  base_file_name = optarg;	  delete_base_file = 0;	  break;	case OPTION_OUTPUT_EXP:	  exp_file_name = optarg;	  delete_exp_file = 0;	  break;	case OPTION_EXPORT_ALL_SYMS:	  export_all = 1;	  break;	case OPTION_OUTPUT_LIB:	  output_lib_file_name = optarg;	  break;	case '?':	  break;	default:	  dlltool_arg = 1;	  break;	}            /* Handle passing through --option=value case. */      if (optarg           && saved_argv[optind-1][0] == '-'           && saved_argv[optind-1][1] == '-' 	  && strchr (saved_argv[optind-1], '='))	single_word_option_value_pair = 1;      if (dlltool_arg)        {	  dlltool_arg_indices[optind-1] = 1;	  if (optarg && ! single_word_option_value_pair)	    {	      dlltool_arg_indices[optind-2] = 1;	    } 	}      if (! driver_arg)        {	  driver_arg_indices[optind-1] = 0;	  if (optarg && ! single_word_option_value_pair)	    {	      driver_arg_indices[optind-2] = 0;	    } 	}    }  /* sanity checks. */  if (! dll_name && ! dll_file_name)    {      warn (_("Must provide at least one of -o or --dllname options"));      exit (1);    }  else if (! dll_name)    {      dll_name = xstrdup (mybasename (dll_file_name));    }  else if (! dll_file_name)    {      dll_file_name = xstrdup (dll_name);    }  /* Deduce driver-name and dlltool-name from our own. */  if (driver_name == NULL)    driver_name = deduce_name ("gcc");  if (dlltool_name == NULL)    dlltool_name = deduce_name ("dlltool");

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?