0
0
mirror of https://github.com/netwide-assembler/nasm.git synced 2025-10-10 00:25:06 -04:00
Files
nasm/rdoff/rdf2bin.c
H. Peter Anvin fe501957c0 Portability fixes
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.)
2007-10-02 21:53:51 -07:00

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;
}