关于<程序员的自我修养-链接,装载和库>最后的C运行库在LINUX下的编译

flkejgoiejgiejgkejgh 2012-07-08 11:20:26
看完了《程序员的自我修养》这本书,最后给出了一个小的C 运行库,按照书中的操作,我尝试编译了一下,代码我只写了框架,想编译通过后再继续添加,可惜,没通过,希望大家帮忙释疑,不胜感激。

里面用到的几个文件:
minicrt.h 这个文件包含了整个运行库提供的所有函数,还包括FILE结构等部分全局变量
string.c 这个文件包含了字符串操作的方法
malloc.c 这个文件包含了堆的管理,提供三个接口 mini_crt_init_io();malloc();free();
stdio.c 这个文件包含了printf和文件操作的接口

分别列出:

//minicrt.h
#ifndef _MINI_CRT_H_
#define _MINI_CRT_H_

#ifndef NULL
#define NULL (0)
#endif

//heap manage
void free(void *ptr);
void *malloc(unsigned size);
static int brk(void *end_data_segment);
int mini_crt_init_heap();

//string
char *itoa(int n,char *str,int radix);
int strcmp(const char *src,const char *dst);
char *strcpy(char *dest,const char *src);
unsigned strlen(const char *str);

//file
typedef int FILE

#define EOF (-1)
#define stdin ((FILE *)0)
#define stdout ((FILE *)1)
#define stderr ((FILE *)2)

int mini_crt_init_io();
FILE *fopen(const char *filename,const char *mode);
int fread(void* buffer,int size,int count,FILE *stream);
int fwrite(const void *buffer,int size,int count,FILE *stream);
int fclose(FILE *fp);
int fseek(FILE *fp,int offset,int set);

//io
int fputc(int c,FILE *stream);
int fputs(const char *str,FILE *stream);
int printf(const char *format,...);
int fprintf(FILE *stream,const char *format,...);

#endif




//string.c
char *itoa(int n,char *str,int radix){
return str;
}

int strcmp(const char *src,const char *dst){
int ret=0;
return ret;
}

char *strcpy(char *dest,const char *src){
char *ret=dest;
return ret;
}

unsigned strlen(const char *str){
int cnt=0;
return cnt;
}





//malloc.c
#include "minicrt.h"

typedef struct _heap_header{
enum{
HEAP_BLOCK_FREE=0XABABABAB,
HEAP_BLOCK_USED=0XCDCDCDCD,
}type;
unsigned size;
struct _heap_header *next;
struct _heap_header *prev;
}heap_header;

#define ADDR_ADD(a,o) (((char *)(a))+o)
#define HEADER_SIZE (sizeof(heap_header))

static heap_header *list_head=NULL;

void free(void *ptr){

}
void *malloc(unsigned size){
return NULL;
}
int mini_crt_heap_init(){
return 1;
}



//stdio.c
#include "minicrt.h"

int mini_crt_io_init(){
return 1;
}

static int open(const char *pathname,int flags,int mode){
int fd=0;
return fd;
}

static int read(int fd,void *buffer,unsigned size){
int ret=0;
return ret;
}

static int write(int fd,const void *buffer,unsigned size){
int ret=0;
return ret;
}

static int close(int fd){
int ret=0;
return ret;
}

static int seek(int fd,int offset,int mode){
int ret=0;
return ret;
}

FILE *fopen(const char *filename,const char *mode){
int fd=-1;
int flag=0;
int access=00700;

#define O_RDONLY 00
#define O_WRONLY 01
#define O_RDWR 02
#define O_CREAT 0100
#define O_TRUNC 01000
#define O_APPEND 02000
return (FILE *)fd;
}

int fread(void *buffer,int size,int count,FILE *stream){
return read((int)stream,buffer,size*count);
}

int fwrite(const void *buffer,int size,int count,FILE *stream){
return write((int)stream,buffer,size*count);
}

int fclose(FILE *fp){
return close((int)fp);
}

int fseek(FILE *fp,int offset,int set){
return seek((int)fp,offset,set);
}

//输入输出函数
int fputs(int c,FILE *stream){
return c;
}

int fputs(const char *str,FILE *stream){
int len=strlen(str);
return len;
}

#define va_list char*
#define va_start(ap,arg) (ap=(va_list)&arg+sizeof(arg))
#define va_arg(ap,t) (*(t*)((ap+=sizeof(t))-sizeof(t)))
#define va_end(ap) (ap=(va_list)0)

int vfprintf(FILE *stream,const char *format,va_list arglist){
int ret=0;
return ret;
}

int printf(const char *format,...){
return vfprintf(stdout,format,arglist);
}
int fprintf(FILE *stream,const char *format,...){
return vfprintf(stream,format,arglist);
}


按照书中提示方法编译:
gcc -c -fno-builtin -nostdlib -fno-stack-protector entry.c malloc.c stdio.c string.c
只有string.c文件编译通过了
...全文
165 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
杜小东 2012-08-06
  • 打赏
  • 举报
回复
果然只是个框架。 有没想过,尽力把printf()写出来啊?
  • 打赏
  • 举报
回复
我的系统是UBUNTU 10.04

23,121

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧