1 /* ----------------------------------------------------------------------- *
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
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
50 char *getfilename(char *pathname
)
52 char *lastslash
= pathname
- 1;
63 int main(int argc
, char **argv
)
69 int codepad
, datapad
, bsspad
= 0;
72 puts("Usage: rdf2bin [-o relocation-origin] [-p segment-alignment] " "input-file output-file");
73 puts(" rdf2com [-p segment-alignment] input-file output-file");
77 if (!nasm_stricmp(getfilename(*argv
), "rdf2com")) {
83 if (!strcmp(*argv
, "-o")) {
85 origin
= readnum(*argv
, &err
);
87 fprintf(stderr
, "rdf2bin: invalid parameter: %s\n", *argv
);
90 } else if (!strcmp(*argv
, "-p")) {
92 align
= readnum(*argv
, &err
);
94 fprintf(stderr
, "rdf2bin: invalid parameter: %s\n", *argv
);
97 } else if (!strcmp(*argv
, "-b")) {
99 bsspad
= readnum(*argv
, &err
);
101 fprintf(stderr
, "rdf2bin: invalid parameter: %s\n", *argv
);
110 puts("rdf2bin: required parameter missing");
116 rdfperror("rdf2bin", *argv
);
119 printf("relocating %s: origin=%"PRIx32
", align=%d\n", *argv
, origin
, align
);
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
;
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
;
136 printf("code: %08"PRIx32
"\ndata: %08"PRIx32
"\nbss: %08"PRIx32
"\n",
137 m
->textrel
, m
->datarel
, m
->bssrel
);
143 of
= fopen(*argv
, "wb");
145 fprintf(stderr
, "rdf2bin: could not open output file %s\n", *argv
);
149 padding
= malloc(align
);
151 fprintf(stderr
, "rdf2bin: out of memory\n");
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
);
163 void *p
= calloc(bsspad
-= (m
->bssrel
- origin
), 1);
164 fwrite(p
, 1, bsspad
, of
);