Tue Aug 29 13:25:21 1995 steve chamberlain <sac@slash.cygnus.com>

* dlltool.c (rva): Deleted.
	(rvaafter, rva_before): Use new assembler pseudo.
	(flush_page, gen_exp_file, gen_lib_file): Use new way of RVAing.
	(gen_exp_file): Don't generate .edata if no need.
	(gen_lib_file): Don't make timestamp.
	(workout_prefix): Fix memory initialization bug.
	(usage): Tidy up, delete many single char options.
	(main): rva option is gone.
This commit is contained in:
Steve Chamberlain 1995-08-29 20:29:04 +00:00
parent 8c5560f25e
commit f88ebc6861
2 changed files with 161 additions and 152 deletions

View File

@ -1,6 +1,18 @@
Tue Aug 29 13:25:21 1995 steve chamberlain <sac@slash.cygnus.com>
* dlltool.c (rva): Deleted.
(rvaafter, rva_before): Use new assembler pseudo.
(flush_page, gen_exp_file, gen_lib_file): Use new way of RVAing.
(gen_exp_file): Don't generate .edata if no need.
(gen_lib_file): Don't make timestamp.
(workout_prefix): Fix memory initialization bug.
(usage): Tidy up, delete many single char options.
(main): rva option is gone.
Mon Aug 21 18:41:28 1995 steve chamberlain <sac@slash.cygnus.com>
* dlltool.c (options): image-base is a synonym for rva.
(gen_lib_file): Put dll name into ibase$7.
Sun Aug 20 09:59:00 1995 steve chamberlain <sac@slash.cygnus.com>

View File

@ -171,13 +171,11 @@ char *ar_name = "ar";
char *as_name = "as";
char *ranlib_name = "ranlib";
long rva = 0x400000;
char *exp_name;
char *imp_name;
char *dll_name;
int deltemps = 1;
int dontdeltemps = 0;
int yydebug;
char *def_file;
@ -219,10 +217,13 @@ mtable[]
=
{
{
#define MARM 0
"arm", ".byte", ".short", ".long", ".asciz", "@", "ldr\tip,[pc]\n\tldr\tpc,[ip]\n\t.long", ".global", ".space", ".align\t2",
}
,
{
#define M386 1
"i386", ".byte", ".short", ".long", ".asciz", "#", "jmp *", ".global", ".space", ".align\t2",
}
@ -234,15 +235,25 @@ mtable[]
char *rvaafter (machine)
int machine;
{
char b[20];
sprintf(b,")-0x%x", rva);
return strdup (b);
switch (machine)
{
case MARM:
return "";
case M386:
return "";
}
}
char *rvabefore (machine)
int machine;
{
return "(";
switch (machine)
{
case MARM:
return ".rva\t";
case M386:
return ".rva\t";
}
}
#define ASM_BYTE mtable[machine].how_byte
#define ASM_SHORT mtable[machine].how_short
@ -697,8 +708,7 @@ flush_page (f, need, page_addr, on_page)
{
int i;
/* Flush this page */
fprintf (f, "\t%s\t%s0x%08x%s\t%s Starting RVA for chunk\n",
ASM_LONG,
fprintf (f, "\t%s0x%08x%s\t%s Starting RVA for chunk\n",
ASM_RVA_BEFORE,
page_addr,
ASM_RVA_AFTER,
@ -746,116 +756,114 @@ gen_exp_file ()
}
dump_def_info (f);
fprintf (f, "\t.section .edata\n\n");
fprintf (f, "\t%s 0 %s Allways 0\n", ASM_LONG, ASM_C);
fprintf (f, "\t%s %d %s Time and date\n", ASM_LONG, time (0), ASM_C);
fprintf (f, "\t%s 0 %s Major and Minor version\n", ASM_LONG, ASM_C);
fprintf (f, "\t%s %sname%s%s Ptr to name of dll\n", ASM_LONG, ASM_RVA_BEFORE,
ASM_RVA_AFTER, ASM_C);
fprintf (f, "\t%s %d %s Starting ordinal of exports\n", ASM_LONG, d_ord, ASM_C);
fprintf (f, "\t%s The next field is documented as being the number of functions\n", ASM_C);
fprintf (f, "\t%s yet it doesn't look like that in real PE dlls\n", ASM_C);
fprintf (f, "\t%s But it shouldn't be a problem, causes there's\n", ASM_C);
fprintf (f, "\t%s always the number of names field\n", ASM_C);
fprintf (f, "\t%s %d %s Number of functions\n", ASM_LONG, d_nfuncs, ASM_C);
fprintf (f, "\t%s %d %s Number of names\n", ASM_LONG, d_nfuncs, ASM_C);
fprintf (f, "\t%s %safuncs%s %s Address of functions\n", ASM_LONG,
ASM_RVA_BEFORE, ASM_RVA_AFTER, ASM_C);
fprintf (f, "\t%s %sanames%s %s Address of names\n", ASM_LONG,
ASM_RVA_BEFORE, ASM_RVA_AFTER, ASM_C);
fprintf (f, "\t%s %sanords%s %s Address of ordinals\n", ASM_LONG,
ASM_RVA_BEFORE, ASM_RVA_AFTER, ASM_C);
if (d_exports) {
fprintf (f, "\t.section .edata\n\n");
fprintf (f, "\t%s 0 %s Allways 0\n", ASM_LONG, ASM_C);
fprintf (f, "\t%s %d %s Time and date\n", ASM_LONG, time (0), ASM_C);
fprintf (f, "\t%s 0 %s Major and Minor version\n", ASM_LONG, ASM_C);
fprintf (f, "\t%sname%s%s Ptr to name of dll\n", ASM_RVA_BEFORE, ASM_RVA_AFTER, ASM_C);
fprintf (f, "\t%s %d %s Starting ordinal of exports\n", ASM_LONG, d_ord, ASM_C);
fprintf (f, "\t%s The next field is documented as being the number of functions\n", ASM_C);
fprintf (f, "\t%s yet it doesn't look like that in real PE dlls\n", ASM_C);
fprintf (f, "\t%s But it shouldn't be a problem, causes there's\n", ASM_C);
fprintf (f, "\t%s always the number of names field\n", ASM_C);
fprintf (f, "\t%s %d %s Number of functions\n", ASM_LONG, d_nfuncs, ASM_C);
fprintf (f, "\t%s %d %s Number of names\n", ASM_LONG, d_nfuncs, ASM_C);
fprintf (f, "\t%safuncs%s %s Address of functions\n", ASM_RVA_BEFORE, ASM_RVA_AFTER, ASM_C);
fprintf (f, "\t%sanames%s %s Address of names\n", ASM_RVA_BEFORE, ASM_RVA_AFTER, ASM_C);
fprintf (f, "\t%sanords%s %s Address of ordinals\n", ASM_RVA_BEFORE, ASM_RVA_AFTER, ASM_C);
fprintf (f, "name: %s \"%s\"\n", ASM_TEXT, dll_name);
fprintf (f, "name: %s \"%s\"\n", ASM_TEXT, dll_name);
fprintf (f, "afuncs:\n");
i = d_ord;
for (exp = d_exports; exp; exp = exp->next)
{
fprintf (f, "afuncs:\n");
i = d_ord;
for (exp = d_exports; exp; exp = exp->next)
{
#if 0
/* This seems necessary in the doc, but in real
life it's not used.. */
if (exp->ordinal != i)
{
fprintf (f, "%s\t%s\t%d\t@ %d..%d missing\n", ASM_C, ASM_SPACE,
(exp->ordinal - i) * 4,
i, exp->ordinal - 1);
i = exp->ordinal;
}
/* This seems necessary in the doc, but in real
life it's not used.. */
if (exp->ordinal != i)
{
fprintf (f, "%s\t%s\t%d\t@ %d..%d missing\n", ASM_C, ASM_SPACE,
(exp->ordinal - i) * 4,
i, exp->ordinal - 1);
i = exp->ordinal;
}
#endif
fprintf (f, "\t%s\t%s%s%s%s %d\n", ASM_LONG, ASM_RVA_BEFORE,
exp->internal_name, ASM_RVA_AFTER, ASM_C, exp->ordinal);
i++;
}
fprintf (f, "\t%s%s%s%s %d\n",ASM_RVA_BEFORE,
exp->internal_name, ASM_RVA_AFTER, ASM_C, exp->ordinal);
i++;
}
fprintf (f, "anames:\n");
for (i = 0, exp = d_exports; exp; i++, exp = exp->next)
{
fprintf (f, "anames:\n");
for (i = 0, exp = d_exports; exp; i++, exp = exp->next)
{
if (exp->noname)
{
had_noname = 1;
fprintf (f, "\t%s nNoname\n", ASM_LONG, ASM_C);
}
else
{
fprintf (f, "\t%sn%d%s\n", ASM_RVA_BEFORE, i, ASM_RVA_AFTER);
}
}
fprintf (f, "anords:\n");
for (exp = d_exports; exp; exp = exp->next)
fprintf (f, "\t%s %d\n", ASM_SHORT, exp->ordinal - d_ord);
for (i = 0, exp = d_exports; exp; i++, exp = exp->next)
if (exp->noname)
{
had_noname = 1;
fprintf (f, "\t%s nNoname\n", ASM_LONG, ASM_C);
}
fprintf (f, "@n%d: %s \"%s\"\n", i, ASM_TEXT, exp->name);
else
{
fprintf (f, "\t%s %sn%d%s\n", ASM_LONG, ASM_RVA_BEFORE, i, ASM_RVA_AFTER);
}
}
fprintf (f, "n%d: %s \"%s\"\n", i, ASM_TEXT, exp->name);
fprintf (f, "anords:\n");
for (exp = d_exports; exp; exp = exp->next)
fprintf (f, "\t%s %d\n", ASM_SHORT, exp->ordinal - d_ord);
if (had_noname)
fprintf (f, "nNoname: %s \"__noname__\"\n", ASM_TEXT);
for (i = 0, exp = d_exports; exp; i++, exp = exp->next)
if (exp->noname)
fprintf (f, "@n%d: %s \"%s\"\n", i, ASM_TEXT, exp->name);
else
fprintf (f, "n%d: %s \"%s\"\n", i, ASM_TEXT, exp->name);
if (a_list)
{
fprintf (f, "\t.section .drectve\n");
for (dl = a_list; dl; dl = dl->next)
{
fprintf (f, "\t%s\t\"%s\"\n", ASM_TEXT, dl->text);
}
}
if (d_list)
{
fprintf (f, "\t.section .rdata\n");
for (dl = d_list; dl; dl = dl->next)
{
char *p;
int l;
/* We dont output as ascii 'cause there can
be quote characters in the string */
if (had_noname)
fprintf (f, "nNoname: %s \"__noname__\"\n", ASM_TEXT);
if (a_list)
{
fprintf (f, "\t.section .drectve\n");
for (dl = a_list; dl; dl = dl->next)
{
fprintf (f, "\t%s\t\"%s\"\n", ASM_TEXT, dl->text);
}
}
if (d_list)
{
fprintf (f, "\t.section .rdata\n");
for (dl = d_list; dl; dl = dl->next)
{
char *p;
int l;
/* We dont output as ascii 'cause there can
be quote characters in the string */
l = 0;
for (p = dl->text; *p; p++)
{
if (l == 0)
fprintf (f, "\t%s\t", ASM_BYTE);
else
fprintf (f, ",");
fprintf (f, "%d", *p);
if (p[1] == 0)
{
fprintf (f, ",0\n");
break;
}
if (++l == 10)
{
fprintf (f, "\n");
l = 0;
}
}
}
}
l = 0;
for (p = dl->text; *p; p++)
{
if (l == 0)
fprintf (f, "\t%s\t", ASM_BYTE);
else
fprintf (f, ",");
fprintf (f, "%d", *p);
if (p[1] == 0)
{
fprintf (f, ",0\n");
break;
}
if (++l == 10)
{
fprintf (f, "\n");
l = 0;
}
}
}
}
}
/* Dump the reloc section if a base file is provided */
if (base_file)
{
@ -867,6 +875,8 @@ gen_exp_file ()
long *copy;
int j;
int on_page;
fprintf (f,"\t.section\t.init\n");
fprintf (f,"lab:\n");
fprintf (f, "\t.section\t.reloc\n");
fseek (base_file, 0, SEEK_END);
numbytes = ftell (base_file);
@ -901,7 +911,7 @@ gen_exp_file ()
/* assemble the file */
sprintf (outfile,"-o %s t%s", exp_name, exp_name);
run (as_name, outfile);
if (deltemps)
if (dontdeltemps==0)
{
sprintf (outfile,"t%s", exp_name);
unlink (outfile);
@ -954,16 +964,18 @@ gen_lib_file ()
fprintf (f, "\t%s\t__%s_head\n", ASM_GLOBAL, imp_name);
fprintf (f, "__%s_head:\n", imp_name);
fprintf (f, "\t%s\t%shname%s\t%sPtr to image import by name list\n", ASM_LONG,
fprintf (f, "\t%shname%s\t%sPtr to image import by name list\n",
ASM_RVA_BEFORE, ASM_RVA_AFTER, ASM_C);
fprintf (f, "\t%s\t%d\t%s time\n", ASM_LONG, time (0), ASM_C);
fprintf (f, "\t%sthis should be the timestamp, but NT sometimes\n", ASM_C);
fprintf (f, "\t%sdoesn't load DLLs when this is set.\n", ASM_C);
fprintf (f, "\t%s\t0\t%s time\n", ASM_LONG, ASM_C);
fprintf (f, "\t%s\t0\t%s Forwarder chain\n", ASM_LONG, ASM_C);
fprintf (f, "\t%s\t%s__%s_iname%s\t%s imported dll's name\n", ASM_LONG,
fprintf (f, "\t%s__%s_iname%s\t%s imported dll's name\n",
ASM_RVA_BEFORE,
imp_name,
ASM_RVA_AFTER,
ASM_C);
fprintf (f, "\t%s\t%sfthunk%s\t%s pointer to firstthunk\n", ASM_LONG,
fprintf (f, "\t%sfthunk%s\t%s pointer to firstthunk\n",
ASM_RVA_BEFORE,
ASM_RVA_AFTER, ASM_C);
@ -988,24 +1000,23 @@ gen_lib_file ()
fprintf (f, "\n\n\n%s ********************* \n", ASM_C);
fprintf (f, "\t.text\n");
fprintf (f, "\t%s\t%s\n", ASM_GLOBAL, exp->name);
fprintf (f, "\t%s\t__imp_%s\n", ASM_GLOBAL, exp->name);
fprintf (f, "%s:\n\t%s\t__imp_%s\n", exp->name, ASM_JUMP, exp->name);
fprintf (f, "\t.section\t.idata$7\t%s To force loading of head and tail\n", ASM_C);
fprintf (f, "\t.section\t.idata$7\t%s To force loading of head\n", ASM_C);
fprintf (f, "\t%s\t__%s_head\n", ASM_LONG, imp_name);
fprintf (f, "\t%s\t__%s_tail\n", ASM_LONG, imp_name);
fprintf (f, "\t.section .idata$5\n");
fprintf (f, "__imp_%s:\n", exp->name);
fprintf (f, "\t%s\t%sID%d%s\n", ASM_LONG,
fprintf (f, "\t%sID%d%s\n",
ASM_RVA_BEFORE,
i,
ASM_RVA_AFTER);
fprintf (f, "\n%s Hint name array\n", ASM_C);
fprintf (f, "\t.section .idata$4\n");
fprintf (f, "\t%s\t%sID%d%s\n", ASM_LONG, ASM_RVA_BEFORE,
fprintf (f, "\t%sID%d%s\n", ASM_RVA_BEFORE,
i,
ASM_RVA_AFTER);
@ -1025,11 +1036,7 @@ gen_lib_file ()
sprintf (outfile, "%st.s", prefix);
f = fopen (outfile, "w");
fprintf (f, "\t%s\t__%s_tail\n", ASM_GLOBAL, imp_name);
fprintf (f, "\t%s\t__%s_iname\n", ASM_GLOBAL, imp_name);
fprintf (f, "__%s_tail:\n", imp_name);
fprintf (f, "\t%s\t0\n", ASM_LONG);
fprintf (f, "__%s_iname:\t%s\t\"%s\"\n",
imp_name, ASM_TEXT, dll_name);
@ -1073,7 +1080,7 @@ gen_lib_file ()
/* Delete all the temp files */
if (deltemps)
if (dontdeltemps == 0)
{
sprintf (outfile, "%sh.o", prefix);
unlink (outfile);
@ -1084,7 +1091,8 @@ gen_lib_file ()
sprintf (outfile, "%st.s", prefix);
unlink (outfile);
}
/* Always delete these */
if (dontdeltemps < 2)
for (i = 0, exp = d_exports; exp; i++, exp = exp->next)
{
sprintf (outfile, "%ss%d.o", prefix, i);
@ -1334,12 +1342,12 @@ workout_prefix ()
ranlib_name = xmalloc (len + strlen ("/binutils/ranlib") + 1);
as_name = xmalloc (len + strlen ("/gas/as.new") + 1);
strncpy (ar_name, program_name, len);
strcat (ar_name, "/binutils/ar");
strncpy (ranlib_name, program_name, len);
strcat (ranlib_name, "/binutils/ranlib");
strncpy (as_name, program_name, len);
strcat (as_name, "/gas/as.new");
memcpy (ar_name, program_name, len);
strcpy (ar_name + len, "/binutils/ar");
memcpy (ranlib_name, program_name, len);
strcpy (ranlib_name + len, "/binutils/ranlib");
memcpy (as_name, program_name, len);
strcpy (as_name + len, "/gas/as.new");
}
else
{
@ -1375,24 +1383,16 @@ usage (file, status)
int status;
{
fprintf (file, "Usage %s <options> <object-files>\n", program_name);
fprintf (file, "\t -m <machine> Generate code for <machine>\n");
fprintf (file, "\t --machine <machine>\n");
fprintf (file, "\t --output-exp <outname> Generate export file.\n");
fprintf (file, "\t -e <outname>\n");
fprintf (file, "\t --output-lib <outname> Generate input library.\n");
fprintf (file, "\t -l <outname>");
fprintf (file, "\t --dllname <name> Name of input dll to put into output lib.\n");
fprintf (file, "\t --def <deffile> Name input .def file\n");
fprintf (file, "\t --base-file <basefile> Read linker generated base file\n");
fprintf (file, "\t -b <basefile> \n");
fprintf (file, "\t -v Verbose\n");
fprintf (file, "\t -u Remove leading underscore from .lib\n");
fprintf (file, "\t -k Kill @<n> from exported names\n");
fprintf (file, "\t --rva <value> Set the RVA from the default of 0x400000\n");
fprintf (file, "\t -image-base <value> ..ditto..\n");
fprintf (file, "\t -r <value>\n");
fprintf (file, "\t --nodelete Keep temp files.\n");
fprintf (file, "\t -n \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, " --dllname <name> Name of input dll to put into output lib.\n");
fprintf (file, " --def <deffile> Name input .def file\n");
fprintf (file, " --base-file <basefile> Read linker generated base file\n");
fprintf (file, " -v Verbose\n");
fprintf (file, " -u Remove leading underscore from .lib\n");
fprintf (file, " -k Kill @<n> from exported names\n");
fprintf (file, " --nodelete Keep temp files.\n");
exit (status);
}
@ -1408,7 +1408,7 @@ static struct option long_options[] =
{"help", no_argument, NULL, 'h'},
{"machine", required_argument, NULL, 'm'},
{"rva", required_argument, NULL, 'r'},
{"image-base", required_argument, NULL, 'r'},
/* {"image-base", required_argument, NULL, 'i'},*/
{"base-file", required_argument, NULL, 'b'},
0
};
@ -1445,9 +1445,6 @@ main (ac, av)
case 'm':
mname = optarg;
break;
case 'r':
rva = strtoul (optarg, 0,0);
break;
case 'v':
verbose = 1;
break;
@ -1464,7 +1461,7 @@ main (ac, av)
def_file = optarg;
break;
case 'n':
deltemps = 0;
dontdeltemps++;
break;
case 'b':
base_file = fopen (optarg, "r");