⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rdf2bin.c

📁 开源的nasm编译器源码,研究编译器原理很有帮且
💻 C
字号:
/* rdf2bin: convert an RDOFF object file to flat binary */#include <stdlib.h>#include <stdio.h>#include <string.h>#include "rdfload.h"#include "rdoff.h"#include "nasmlib.h"long 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=%lx, 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: %08lx\ndata: %08lx\nbss:  %08lx\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;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -