| * If the word is <CF(DOESJUMP), it's a primitive |
* If the word is <CF(DOESJUMP), it's a primitive |
| */ |
*/ |
| |
|
| void relocate(Cell *image, const char *bitstring, int size, int base, Label symbols[]) |
void relocate(Cell *image, const char *bitstring, |
| |
int size, int base, Label symbols[]) |
| { |
{ |
| int i=0, j, k, steps=(size/sizeof(Cell))/RELINFOBITS; |
int i=0, j, k, steps=(size/sizeof(Cell))/RELINFOBITS; |
| Cell token; |
Cell token; |
| char bits; |
char bits; |
| Cell max_symbols; |
Cell max_symbols; |
| /** A virtial start address that's the real start address minus the one in the image */ |
/* |
| |
* A virtial start address that's the real start address minus |
| |
* the one in the image |
| |
*/ |
| Cell *start = (Cell * ) (((void *) image) - ((void *) base)); |
Cell *start = (Cell * ) (((void *) image) - ((void *) base)); |
| |
|
| |
|
| /* printf("relocating to %x[%x] start=%x base=%x\n", image, size, start, base); */ |
/* printf("relocating to %x[%x] start=%x base=%x\n", image, size, start, base); */ |
| |
|
| for (max_symbols=DOESJUMP+1; symbols[max_symbols]!=0; max_symbols++) |
for (max_symbols=DOESJUMP+1; symbols[max_symbols]!=0; max_symbols++) |
| else |
else |
| fprintf(stderr,"Primitive %d used in this image at $%lx is not implemented by this\n engine (%s); executing this code will crash.\n",CF(token),(long)&image[i],VERSION); |
fprintf(stderr,"Primitive %d used in this image at $%lx is not implemented by this\n engine (%s); executing this code will crash.\n",CF(token),(long)&image[i],VERSION); |
| } |
} |
| else |
else { |
| // if base is > 0: 0 is a null reference so don't adjust |
// if base is > 0: 0 is a null reference so don't adjust |
| if (token>=base) { |
if (token>=base) { |
| image[i]+=(Cell)start; |
image[i]+=(Cell)start; |
| } |
} |
| } |
} |
| } |
} |
| |
} |
| ((ImageHeader*)(image))->base = (Address) image; |
((ImageHeader*)(image))->base = (Address) image; |
| } |
} |
| |
|
| imp=image+preamblesize; |
imp=image+preamblesize; |
| if (clear_dictionary) |
if (clear_dictionary) |
| memset(imp+header.image_size, 0, dictsize-header.image_size); |
memset(imp+header.image_size, 0, dictsize-header.image_size); |
| { |
if(header.base==0 || header.base == 0x100) { |
| Cell reloc_size=((header.image_size-1)/sizeof(Cell))/8+1; |
Cell reloc_size=((header.image_size-1)/sizeof(Cell))/8+1; |
| char reloc_bits[reloc_size]; |
char reloc_bits[reloc_size]; |
| fseek(imagefile, preamblesize+header.image_size, SEEK_SET); |
fseek(imagefile, preamblesize+header.image_size, SEEK_SET); |
| } |
} |
| #endif |
#endif |
| } |
} |
| |
else if(header.base!=imp) { |
| |
fprintf(stderr,"%s: Cannot load nonrelocatable image (compiled for address $%lx) at address $%lx\n", |
| |
progname, (unsigned long)header.base, (unsigned long)imp); |
| |
exit(1); |
| |
} |
| if (header.checksum==0) |
if (header.checksum==0) |
| ((ImageHeader *)imp)->checksum=check_sum; |
((ImageHeader *)imp)->checksum=check_sum; |
| else if (header.checksum != check_sum) { |
else if (header.checksum != check_sum) { |