+/* generate_idata_ofile() generates the portable assembly source code
+ for the idata sections. It may be passed an open FILE* or a NULL.
+ In the former case it appends the source code to the end of the
+ file and returns NULL. In the latter case it creates a file named
+ doi.s, assembles it to doi.o, opens doi.o as a bfd, and returns the
+ bfd*. generate_idata_ofile() is currently used in the former manner
+ in gen_exp_file().
+ */
+
+bfd *
+generate_idata_ofile ( fd )
+ FILE *fd;
+ {
+ FILE *filvar;
+ int result;
+ iheadtype *headptr;
+ ifunctype *funcptr;
+ int headindex;
+ int funcindex;
+ char as_args[16];
+
+ if (fd != NULL)
+ filvar = fd;
+ else
+ filvar = fopen ("doi.s", "w");
+ if (!filvar)
+ {
+ fprintf (stderr, "%s: Can't open doi.s\n", program_name);
+ return ((bfd*)-1);
+ }
+ fprintf (filvar, "%s Import data sections\n", ASM_C);
+ fprintf (filvar, "\n\t.section\t.idata$2\n");
+ fprintf (filvar, "\t%s\tdoi_idata\n", ASM_GLOBAL);
+ fprintf (filvar, "doi_idata:\n");
+
+ nheads = 0;
+ for (headptr = import_list; headptr != NULL; headptr = headptr->next)
+ {
+ fprintf (filvar, "\t%slistone%d%s\t%s %s\n",
+ ASM_RVA_BEFORE, (int)nheads, ASM_RVA_AFTER,
+ ASM_C, headptr->dllname);
+ fprintf (filvar, "\t%s\t0\n", ASM_LONG);
+ fprintf (filvar, "\t%s\t0\n", ASM_LONG);
+ fprintf (filvar, "\t%sdllname%d%s\n",
+ ASM_RVA_BEFORE, (int)nheads, ASM_RVA_AFTER);
+ fprintf (filvar, "\t%slisttwo%d%s\n\n",
+ ASM_RVA_BEFORE, (int)nheads, ASM_RVA_AFTER);
+ nheads++;
+ } /* END of headptr for-loop */
+
+ fprintf (filvar, "\t%s\t0\n", ASM_LONG); /* NULL record at */
+ fprintf (filvar, "\t%s\t0\n", ASM_LONG); /* end of idata$2 */
+ fprintf (filvar, "\t%s\t0\n", ASM_LONG); /* section */
+ fprintf (filvar, "\t%s\t0\n", ASM_LONG);
+ fprintf (filvar, "\t%s\t0\n", ASM_LONG);
+
+ fprintf (filvar, "\n\t.section\t.idata$4\n");
+ headindex = 0;
+ for (headptr = import_list; headptr != NULL; headptr = headptr->next)
+ {
+ fprintf (filvar, "listone%d:\n", headindex);
+ for ( funcindex = 0; funcindex < headptr->nfuncs; funcindex++ )
+ fprintf (filvar, "\t%sfuncptr%d_%d%s\n",
+ ASM_RVA_BEFORE, headindex, funcindex, ASM_RVA_AFTER);
+ fprintf (filvar,"\t%s\t0\n", ASM_LONG); /* NULL terminating list */
+ headindex++;
+ } /* END of headptr for loop */
+
+ fprintf (filvar, "\n\t.section\t.idata$5\n");
+ headindex = 0;
+ for (headptr = import_list; headptr != NULL; headptr = headptr->next)
+ {
+ fprintf (filvar, "listtwo%d:\n", headindex);
+ for ( funcindex = 0; funcindex < headptr->nfuncs; funcindex++ )
+ fprintf (filvar, "\t%sfuncptr%d_%d%s\n",
+ ASM_RVA_BEFORE, headindex, funcindex, ASM_RVA_AFTER);
+ fprintf (filvar,"\t%s\t0\n", ASM_LONG); /* NULL terminating list */
+ headindex++;
+ } /* END of headptr for-loop */
+
+ fprintf (filvar, "\n\t.section\t.idata$6\n");
+ headindex = 0;
+ for (headptr = import_list; headptr != NULL; headptr = headptr->next)
+ {
+ funcindex = 0;
+ for (funcptr = headptr->funchead; funcptr != NULL;
+ funcptr = funcptr->next)
+ {
+ fprintf (filvar,"funcptr%d_%d:\n",headindex,funcindex);
+ fprintf (filvar,"\t%s\t%d\n",ASM_SHORT,((funcptr->ord) & 0xFFFF));
+ fprintf (filvar,"\t%s\t%c%s%c\n",ASM_TEXT,'"',funcptr->name,'"');
+ fprintf (filvar,"\t%s\t0\n",ASM_BYTE);
+ funcindex++;
+ } /* END of funcptr for loop */
+ headindex++;
+ } /* END of headptr for loop */
+
+ fprintf (filvar, "\n\t.section\t.idata$7\n");
+ headindex = 0;
+ for (headptr = import_list; headptr != NULL; headptr = headptr->next)
+ {
+ fprintf (filvar,"dllname%d:\n",headindex);
+ fprintf (filvar,"\t%s\t%c%s%c\n",ASM_TEXT,'"',headptr->dllname,'"');
+ fprintf (filvar,"\t%s\t0\n",ASM_BYTE);
+ headindex++;
+ } /* END of headptr for loop */
+
+ if (fd == NULL)
+ {
+ result = fclose (filvar);
+ if ( result )
+ {
+ fprintf (stderr, "%s: Can't close doi.s\n", program_name);
+ return ((bfd*) -1);
+ } /* END of if clause */
+ sprintf (as_args, "-o doi.o doi.s");
+ run (as_name, as_args);
+
+ if (dontdeltemps == 0)
+ {
+ sprintf (outfile, "doi.s");
+ unlink (outfile);
+ }
+ return (bfd_openr ("doi.o", HOW_BFD_TARGET));
+ } /* END of if clause */
+ else
+ return NULL;
+ } /* END of function generate_idata_ofile() */
+