2002-05-01 04:51:32 +08:00
|
|
|
/* rdx.c RDOFF Object File loader program
|
|
|
|
*
|
|
|
|
* The Netwide Assembler is copyright (C) 1996 Simon Tatham and
|
|
|
|
* Julian Hall. All rights reserved. The software is
|
|
|
|
* redistributable under the licence given in the file "Licence"
|
|
|
|
* distributed in the NASM archive.
|
|
|
|
*/
|
|
|
|
|
|
|
|
/* note: most of the actual work of this program is done by the modules
|
|
|
|
"rdfload.c", which loads and relocates the object file, and by "rdoff.c",
|
|
|
|
which contains general purpose routines to manipulate RDOFF object
|
|
|
|
files. You can use these files in your own program to load RDOFF objects
|
|
|
|
and execute the code in them in a similar way to what is shown here. */
|
|
|
|
|
2007-10-03 12:53:51 +08:00
|
|
|
#include "compiler.h"
|
|
|
|
|
2002-05-01 04:51:32 +08:00
|
|
|
#include <stdio.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
|
|
|
|
#include "rdfload.h"
|
|
|
|
#include "symtab.h"
|
|
|
|
|
2007-04-13 00:54:50 +08:00
|
|
|
typedef int (*main_fn) (int, char **); /* Main function prototype */
|
2002-05-01 04:51:32 +08:00
|
|
|
|
2007-04-13 00:54:50 +08:00
|
|
|
int main(int argc, char **argv)
|
2002-05-01 04:51:32 +08:00
|
|
|
{
|
2005-01-16 06:15:51 +08:00
|
|
|
rdfmodule *m;
|
|
|
|
main_fn code;
|
|
|
|
symtabEnt *s;
|
2002-05-01 04:51:32 +08:00
|
|
|
|
2004-09-15 14:54:34 +08:00
|
|
|
if (argc < 2) {
|
2005-01-16 06:15:51 +08:00
|
|
|
puts("usage: rdx <rdoff-executable> [params]\n");
|
|
|
|
exit(255);
|
2002-05-01 04:51:32 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
m = rdfload(argv[1]);
|
|
|
|
|
2005-01-16 06:15:51 +08:00
|
|
|
if (!m) {
|
|
|
|
rdfperror("rdx", argv[1]);
|
|
|
|
exit(255);
|
2002-05-01 04:51:32 +08:00
|
|
|
}
|
|
|
|
|
2005-01-16 06:15:51 +08:00
|
|
|
rdf_relocate(m); /* in this instance, the default relocation
|
|
|
|
values will work fine, but they may need changing
|
|
|
|
in other cases... */
|
2002-05-01 04:51:32 +08:00
|
|
|
|
|
|
|
s = symtabFind(m->symtab, "_main");
|
2005-01-16 06:15:51 +08:00
|
|
|
if (!s) {
|
|
|
|
fprintf(stderr, "rdx: could not find symbol '_main' in '%s'\n",
|
|
|
|
argv[1]);
|
|
|
|
exit(255);
|
2002-05-01 04:51:32 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
code = (main_fn) s->offset;
|
|
|
|
|
2005-01-16 06:15:51 +08:00
|
|
|
argv++, argc--; /* remove 'rdx' from command line */
|
2002-05-01 04:51:32 +08:00
|
|
|
|
2005-01-16 06:15:51 +08:00
|
|
|
return code(argc, argv); /* execute */
|
2002-05-01 04:51:32 +08:00
|
|
|
}
|