关于C编译器的

goldbeef 2012-11-16 11:15:44
最近在看深入理解计算机系统这本书,第七章 其中讲到 对编译程序的分解步骤,首先对main 函数预处理 生成main.i,然后使用 ccl 编译器对main.i进行编译,貌似 没有这个编译器。

/*****************main.c*/

void swap();

int buf[2]={1,2};

int main(){
swap();
return 0;
}


/**************swap.c/
extern int buf[];
int *bufp0=&buf[0];
int *bufp1;

void swap(){
int temp;
bufp1=&buf[1];
temp=*bufp0;
*bufp1=*bufp0;
*bufp0=temp;
}
////////////



首先预处理 main.c
$ cpp main.c /tmp/main.i
然后 对 main.c汇编 如下
$ ccl /tmp/main.i main.c -O2 -o /tmp/main.s

但是自己运行怎么会出错,貌似是没有 ccl编译器,这是怎么回事?
...全文
185 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
冷月清晖 2012-11-16
  • 打赏
  • 举报
回复
笔误吧,应该是gcc
图灵狗 2012-11-16
  • 打赏
  • 举报
回复
GCC环境下,可以按照如下的步骤对编译器的处理流程进行实践和理解。 预处理,生成的是一个进行过预处理的源代码文件,本质上还是源代码:

gcc -E main.c -o main.i
gcc -E swap.c -o swap.i
编译,生成的是一个经过编译的汇编程序源代码:

gcc -S main.i -o main.s
gcc -S swap.i -o swap.s
汇编,这一步生成的是目标文件,已经非常接近于我们需要的可执行文件了:

gcc -c main.s -o main.o
gcc -c swap.s -o swap.o
链接,链接就是链接目标文件模块,将对目标文件中因为跨模块而未能解析的符号引用(symbol)在这一步进行最后处理,得到的test就是可执行程序了:

gcc main.o swap.o -o test
AnYidan 2012-11-16
  • 打赏
  • 举报
回复
深入理解计算机系统 的开始有讲此书的编译环境,用的 gcc
转角天边 2012-11-16
  • 打赏
  • 举报
回复
编译器工作原理 http://blog.csdn.net/pizi0475/article/details/6301757
goldbeef 2012-11-16
  • 打赏
  • 举报
回复
引用 9 楼 turingo 的回复:
cpp/cc1/as/ld都是运作在gcc编译器底层的程序,bash中不一定可以直接找到它们,所以建议直接用gcc -E/gcc -S/gcc -c/gcc去替代它们的功能,这样对于理解也不会有什么障碍,而对于实践来讲,就方便很多了。
好的,谢谢了!
图灵狗 2012-11-16
  • 打赏
  • 举报
回复
cpp/cc1/as/ld都是运作在gcc编译器底层的程序,bash中不一定可以直接找到它们,所以建议直接用gcc -E/gcc -S/gcc -c/gcc去替代它们的功能,这样对于理解也不会有什么障碍,而对于实践来讲,就方便很多了。
图灵狗 2012-11-16
  • 打赏
  • 举报
回复
需要链接crt之类的启动代码,比如ld main.o swap.o /usr/lib/crt1.o /usr/lib/crti.o /usr/lib/crtn.o -o test -lc
引用 7 楼 goldbeef 的回复:
引用 3 楼 turingo 的回复:GCC环境下,可以按照如下的步骤对编译器的处理流程进行实践和理解。 预处理,生成的是一个进行过预处理的源代码文件,本质上还是源代码: Plain Text code?123gcc -E main.c -o main.igcc -E swap.c -o swap.i 编译,生成的是一个经过编译的汇编程序源代码: Plai……
goldbeef 2012-11-16
  • 打赏
  • 举报
回复
引用 3 楼 turingo 的回复:
GCC环境下,可以按照如下的步骤对编译器的处理流程进行实践和理解。 预处理,生成的是一个进行过预处理的源代码文件,本质上还是源代码: Plain Text code?123gcc -E main.c -o main.igcc -E swap.c -o swap.i 编译,生成的是一个经过编译的汇编程序源代码: Plain Text code?123gcc ……
您好,但是问下 链接器 ld 怎么使用,那本书中 讲到 $ ld -o p /tmp/main.o /tmp/swap.o 生成可执行文件 p ,但是如果按照你回复的方式分别生成 main.o 以及swap.o,然后使用 ld进行链接时会出现 警告信息: ld: warning: cannot find entry symbol _start; defaulting to 0000000008048094 链接生成的可执行文件 执行时会出现 段错误(Segmentation fault), 这是怎么回事?
ForestDB 2012-11-16
  • 打赏
  • 举报
回复
有可能是Unix平台上的类似编译器。 gcc一般用gcc -S达到类似效果。
whizer 2012-11-16
  • 打赏
  • 举报
回复
应该是gcc, 可以看看gcc使用手册.

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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