mirror of
https://github.com/netwide-assembler/nasm.git
synced 2025-10-10 00:25:06 -04:00
Concentrate compiler dependencies to compiler.h; make sure compiler.h is included first in every .c file (since some prototypes may depend on the presence of feature request macros.) Actually use the conditional inclusion of various functions (totally broken in previous releases.)
137 lines
3.2 KiB
C
137 lines
3.2 KiB
C
/*
|
|
* rdf2bin.c - convert an RDOFF object file to flat binary
|
|
*/
|
|
|
|
#include "compiler.h"
|
|
|
|
#include <stdlib.h>
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
|
|
#include "rdfload.h"
|
|
#include "nasmlib.h"
|
|
|
|
int32_t origin = 0;
|
|
int align = 16;
|
|
|
|
char *getfilename(char *pathname)
|
|
{
|
|
char *lastslash = pathname - 1;
|
|
char *i = pathname;
|
|
|
|
while (*i) {
|
|
if (*i == '/')
|
|
lastslash = i;
|
|
i++;
|
|
}
|
|
return lastslash + 1;
|
|
}
|
|
|
|
int main(int argc, char **argv)
|
|
{
|
|
rdfmodule *m;
|
|
int tmp;
|
|
FILE *of;
|
|
char *padding;
|
|
int codepad, datapad, bsspad = 0;
|
|
|
|
if (argc < 2) {
|
|
puts("Usage: rdf2bin [-o relocation-origin] [-p segment-alignment] " "input-file output-file");
|
|
puts(" rdf2com [-p segment-alignment] input-file output-file");
|
|
return 1;
|
|
}
|
|
|
|
if (!nasm_stricmp(getfilename(*argv), "rdf2com")) {
|
|
origin = 0x100;
|
|
}
|
|
argv++, argc--;
|
|
|
|
while (argc > 2) {
|
|
if (!strcmp(*argv, "-o")) {
|
|
argv++, argc--;
|
|
origin = readnum(*argv, &tmp);
|
|
if (tmp) {
|
|
fprintf(stderr, "rdf2bin: invalid parameter: %s\n", *argv);
|
|
return 1;
|
|
}
|
|
} else if (!strcmp(*argv, "-p")) {
|
|
argv++, argc--;
|
|
align = readnum(*argv, &tmp);
|
|
if (tmp) {
|
|
fprintf(stderr, "rdf2bin: invalid parameter: %s\n", *argv);
|
|
return 1;
|
|
}
|
|
} else if (!strcmp(*argv, "-b")) {
|
|
argv++, argc--;
|
|
bsspad = readnum(*argv, &tmp);
|
|
if (tmp) {
|
|
fprintf(stderr, "rdf2bin: invalid parameter: %s\n", *argv);
|
|
return 1;
|
|
}
|
|
} else
|
|
break;
|
|
|
|
argv++, argc--;
|
|
}
|
|
if (argc < 2) {
|
|
puts("rdf2bin: required parameter missing");
|
|
return -1;
|
|
}
|
|
m = rdfload(*argv);
|
|
|
|
if (!m) {
|
|
rdfperror("rdf2bin", *argv);
|
|
return 1;
|
|
}
|
|
printf("relocating %s: origin=%"PRIx32", align=%d\n", *argv, origin, align);
|
|
|
|
m->textrel = origin;
|
|
m->datarel = origin + m->f.seg[0].length;
|
|
if (m->datarel % align != 0) {
|
|
codepad = align - (m->datarel % align);
|
|
m->datarel += codepad;
|
|
} else
|
|
codepad = 0;
|
|
|
|
m->bssrel = m->datarel + m->f.seg[1].length;
|
|
if (m->bssrel % align != 0) {
|
|
datapad = align - (m->bssrel % align);
|
|
m->bssrel += datapad;
|
|
} else
|
|
datapad = 0;
|
|
|
|
printf("code: %08"PRIx32"\ndata: %08"PRIx32"\nbss: %08"PRIx32"\n",
|
|
m->textrel, m->datarel, m->bssrel);
|
|
|
|
rdf_relocate(m);
|
|
|
|
argv++;
|
|
|
|
of = fopen(*argv, "wb");
|
|
if (!of) {
|
|
fprintf(stderr, "rdf2bin: could not open output file %s\n", *argv);
|
|
return 1;
|
|
}
|
|
|
|
padding = malloc(align);
|
|
if (!padding) {
|
|
fprintf(stderr, "rdf2bin: out of memory\n");
|
|
return 1;
|
|
}
|
|
|
|
if (fwrite(m->t, 1, m->f.seg[0].length, of) != m->f.seg[0].length ||
|
|
fwrite(padding, 1, codepad, of) != codepad ||
|
|
fwrite(m->d, 1, m->f.seg[1].length, of) != m->f.seg[1].length) {
|
|
fprintf(stderr, "rdf2bin: error writing to %s\n", *argv);
|
|
return 1;
|
|
}
|
|
|
|
if (bsspad) {
|
|
void *p = calloc(bsspad -= (m->bssrel - origin), 1);
|
|
fwrite(p, 1, bsspad, of);
|
|
}
|
|
|
|
fclose(of);
|
|
return 0;
|
|
}
|