Beginnings of a crude utility to dump the contents of an OMF file
[nasm/nasm.git] / rdoff / rdf2bin.c
blobe01b36d5be60c892f3bd8cc3df378f4566ce05f4
1 /* ----------------------------------------------------------------------- *
2 *
3 * Copyright 1996-2009 The NASM Authors - All Rights Reserved
4 * See the file AUTHORS included with the NASM distribution for
5 * the specific copyright holders.
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following
9 * conditions are met:
11 * * Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * * Redistributions in binary form must reproduce the above
14 * copyright notice, this list of conditions and the following
15 * disclaimer in the documentation and/or other materials provided
16 * with the distribution.
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
19 * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
20 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
21 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
23 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
25 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
26 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
29 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
30 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32 * ----------------------------------------------------------------------- */
35 * rdf2bin.c - convert an RDOFF object file to flat binary
38 #include "compiler.h"
40 #include <stdlib.h>
41 #include <stdio.h>
42 #include <string.h>
44 #include "rdfload.h"
45 #include "nasmlib.h"
47 int32_t origin = 0;
48 int align = 16;
50 char *getfilename(char *pathname)
52 char *lastslash = pathname - 1;
53 char *i = pathname;
55 while (*i) {
56 if (*i == '/')
57 lastslash = i;
58 i++;
60 return lastslash + 1;
63 int main(int argc, char **argv)
65 rdfmodule *m;
66 bool err;
67 FILE *of;
68 char *padding;
69 int codepad, datapad, bsspad = 0;
71 if (argc < 2) {
72 puts("Usage: rdf2bin [-o relocation-origin] [-p segment-alignment] " "input-file output-file");
73 puts(" rdf2com [-p segment-alignment] input-file output-file");
74 return 1;
77 if (!nasm_stricmp(getfilename(*argv), "rdf2com")) {
78 origin = 0x100;
80 argv++, argc--;
82 while (argc > 2) {
83 if (!strcmp(*argv, "-o")) {
84 argv++, argc--;
85 origin = readnum(*argv, &err);
86 if (err) {
87 fprintf(stderr, "rdf2bin: invalid parameter: %s\n", *argv);
88 return 1;
90 } else if (!strcmp(*argv, "-p")) {
91 argv++, argc--;
92 align = readnum(*argv, &err);
93 if (err) {
94 fprintf(stderr, "rdf2bin: invalid parameter: %s\n", *argv);
95 return 1;
97 } else if (!strcmp(*argv, "-b")) {
98 argv++, argc--;
99 bsspad = readnum(*argv, &err);
100 if (err) {
101 fprintf(stderr, "rdf2bin: invalid parameter: %s\n", *argv);
102 return 1;
104 } else
105 break;
107 argv++, argc--;
109 if (argc < 2) {
110 puts("rdf2bin: required parameter missing");
111 return -1;
113 m = rdfload(*argv);
115 if (!m) {
116 rdfperror("rdf2bin", *argv);
117 return 1;
119 printf("relocating %s: origin=%"PRIx32", align=%d\n", *argv, origin, align);
121 m->textrel = origin;
122 m->datarel = origin + m->f.seg[0].length;
123 if (m->datarel % align != 0) {
124 codepad = align - (m->datarel % align);
125 m->datarel += codepad;
126 } else
127 codepad = 0;
129 m->bssrel = m->datarel + m->f.seg[1].length;
130 if (m->bssrel % align != 0) {
131 datapad = align - (m->bssrel % align);
132 m->bssrel += datapad;
133 } else
134 datapad = 0;
136 printf("code: %08"PRIx32"\ndata: %08"PRIx32"\nbss: %08"PRIx32"\n",
137 m->textrel, m->datarel, m->bssrel);
139 rdf_relocate(m);
141 argv++;
143 of = fopen(*argv, "wb");
144 if (!of) {
145 fprintf(stderr, "rdf2bin: could not open output file %s\n", *argv);
146 return 1;
149 padding = malloc(align);
150 if (!padding) {
151 fprintf(stderr, "rdf2bin: out of memory\n");
152 return 1;
155 if (fwrite(m->t, 1, m->f.seg[0].length, of) != (size_t)m->f.seg[0].length ||
156 fwrite(padding, 1, codepad, of) != (size_t)codepad ||
157 fwrite(m->d, 1, m->f.seg[1].length, of) != (size_t)m->f.seg[1].length) {
158 fprintf(stderr, "rdf2bin: error writing to %s\n", *argv);
159 return 1;
162 if (bsspad) {
163 void *p = calloc(bsspad -= (m->bssrel - origin), 1);
164 fwrite(p, 1, bsspad, of);
167 fclose(of);
168 return 0;