Include the ABI version in the file format, and refuse to execute
binary files with ABI mismatches
This commit is contained in:
@@ -132,10 +132,15 @@ typedef int stkentry;
|
||||
* Structure of the file header:
|
||||
*
|
||||
* 2 "LC" (magic)
|
||||
* 2 0 (version)
|
||||
* 2 00:01 (version)
|
||||
* 4 ptr (pointer to function table)
|
||||
* 4 abiversion1
|
||||
* 4 abiversion2
|
||||
* 4 abiversion3
|
||||
* 4 abiversion4
|
||||
* 4 abiversion5
|
||||
*
|
||||
* ptr-4 code
|
||||
* ptr-28 code
|
||||
*
|
||||
* 1 or more of:
|
||||
* 4 length of block, or 0 to terminate
|
||||
@@ -150,5 +155,5 @@ typedef int stkentry;
|
||||
#define MAGIC1 'L'
|
||||
#define MAGIC2 'C'
|
||||
#define VERSION1 0
|
||||
#define VERSION2 0
|
||||
#define VERSION2 1
|
||||
|
||||
|
||||
@@ -267,9 +267,11 @@ int lookup_function(ast *node, struct fn_desc *fn)
|
||||
return 1;
|
||||
}
|
||||
|
||||
int lookup_constant(ast *node, int *constant)
|
||||
#define lookup_constant(node, constant) \
|
||||
lookup_constant_string(node->info.string, constant)
|
||||
|
||||
int lookup_constant_string(char *constantname, int *constant)
|
||||
{
|
||||
char *constantname = node->info.string;
|
||||
struct hashentry *hashptr;
|
||||
|
||||
if (constant_count < 0)
|
||||
@@ -1185,6 +1187,7 @@ void output_code(void)
|
||||
int morepasses = 1;
|
||||
int passno = 0;
|
||||
int pc;
|
||||
int abiver;
|
||||
|
||||
while (morepasses) {
|
||||
ptr = instr_head;
|
||||
@@ -1259,9 +1262,22 @@ void output_code(void)
|
||||
output_byte(VERSION1);
|
||||
output_byte(VERSION2);
|
||||
|
||||
#define ABIVERSION(x) do { \
|
||||
abiver = 0; \
|
||||
if (!lookup_constant_string(x, &abiver)) \
|
||||
printf("%s not defined\n", x); \
|
||||
output_int(abiver); \
|
||||
} while (0)
|
||||
|
||||
pc = (pc + 3) & ~3; /* Align table */
|
||||
|
||||
output_int(pc+8); /* Pointer to function table */
|
||||
output_int(pc+28); /* Pointer to function table */
|
||||
|
||||
ABIVERSION("__abiversion1");
|
||||
ABIVERSION("__abiversion2");
|
||||
ABIVERSION("__abiversion3");
|
||||
ABIVERSION("__abiversion4");
|
||||
ABIVERSION("__abiversion5");
|
||||
|
||||
ptr = instr_head;
|
||||
pc = 0;
|
||||
|
||||
@@ -2,6 +2,12 @@
|
||||
|
||||
typedef int (*vm_intfn)(void);
|
||||
|
||||
extern const long vm_abiversion1;
|
||||
extern const long vm_abiversion2;
|
||||
extern const long vm_abiversion3;
|
||||
extern const long vm_abiversion4;
|
||||
extern const long vm_abiversion5;
|
||||
|
||||
/*
|
||||
* We must include here all prototypes for functions which can be
|
||||
* included in the ABI function table
|
||||
|
||||
@@ -609,6 +609,11 @@ void vm_init_functions(void)
|
||||
assert(vm_codearea[2] == VERSION1);
|
||||
assert(vm_codearea[3] == VERSION2);
|
||||
|
||||
assert(GETINT(vm_codearea, 8) == vm_abiversion1);
|
||||
assert(GETINT(vm_codearea, 12) == vm_abiversion2);
|
||||
assert(GETINT(vm_codearea, 16) == vm_abiversion3);
|
||||
assert(GETINT(vm_codearea, 20) == vm_abiversion4);
|
||||
assert(GETINT(vm_codearea, 24) == vm_abiversion5);
|
||||
|
||||
/* Now, get the function table pointer */
|
||||
t = GETINT(vm_codearea, 4);
|
||||
|
||||
Reference in New Issue
Block a user