LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
楼主: lofeng

“gcc和g++的区别”以及“gcc工作流程”问题请教

[复制链接]
 楼主| 发表于 2009-5-17 10:39:32 | 显示全部楼层
首先给出引用的出处:gcc internals manual
http://gcc.gnu.org/onlinedocs/gccint/Collect2.html#Collect2

下面是gcc driver 控制架构,这幅图摘自台湾的一个gcc研究小组的报告:
gcc并不能说是gnu的c编译器,他只是个front-end,具体的编译工作是cc1来完成的
gcc并不是直接调用ld的,是通过collect2来的,但是这个过程又是怎样的?collect2是通过什么方法来找到合适的ld的?
我在上面对gcc的工作流程并不是想当然的,而是根据一些资料推断出来的

只是上面那幅图没有涉及到collect2,而gcc -v test.c中的信息表明直接调用的是collect2而不是ld,这样collect2跟ld之间是怎样交互的就有点困惑。正如在第七贴中提到的,是否是那样的一个过程?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

发表于 2009-5-17 10:41:33 | 显示全部楼层
标题和内容不符合....

看到标题进来的,发现自己是 白脖。

这水真深阿.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-5-17 10:48:45 | 显示全部楼层
Post by linux_pro;1988112
标题和内容不符合....

看到标题进来的,发现自己是 白脖。

这水真深阿.
不好意思 也不知道该取个什么样的标题比较合适 已经修改了下 不知道能不能表达自己的意思
回复 支持 反对

使用道具 举报

发表于 2009-5-17 13:23:11 | 显示全部楼层
@linux_pro
没关系,大伙都是白脖。
楼主的问题 是 大杀器。

@lofeng
您给出的图 和 偶上一帖给出的流程 是 等效的,只是更清楚一些。

对大多数人 /usr/bin/gcc 就是编译器,对 gcc 开发者 或 编译原理研究者 才有必要分析到您感兴趣的层次。

如果您准备移植 gcc 到一个 新OS,参照 gcc 官网的移植指南一定会非常开心。
您会发现 gcc 源代码的结构非常适于移植,这才是 分出 前后端 的 真正意义。

精神上,偶支持您把这些问题弄清楚。
但偶会不停的给您泼冷水,就像前面说的那是 gcc 开发者 或 编译原理研究者 才需要关心的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-5-17 15:27:42 | 显示全部楼层
http://www.cppblog.com/romangol/archive/2008/04/19/47595.html
gcc: CreateProcess: No such file or Directory 错误
这个问题在google里面很多人发问,但是没有一个完整的解答,下面给出一个完整的解答
产生这个错误有两个原因:
第一是gcc无法找到安装目录里面的libexec目录里面的工具,通常这些工具包括cc1.exe,cc1plus.exe,collect2.exe,它们通常存放在:
安装目录\libexec\gcc\mingw32\4.3.0
第二是gcc无法找到mingw目录里面binutils的工具,它们通常存放在
安装目录\mingw32\bin
这两个目录的名字并不完全固定,根据不同组织编译的gcc各有不同,比如mingw官方编译的gcc4.3.0 alpha,上述目录就是
安装目录\gcc\i386-pc-mingw32\4.3.0
而官方提供的binutils包里面是
安装目录\i686-pc-mingw32\bin

只要这两个地方没有设置好,就可能导致CreateProcess错误,那么,有没有什么好办法能够确定这里应该怎样命名呢?[color="Red"]办法是用16进制编辑器打开gcc.exe,搜索GCC_EXEC_PREFIX,当搜索到该字符串(不止一个)时,观察后面是否出现版本号4.3.0,如果出现,后面紧接着的就是路径,如果是mingw32那么上面的命名就应该是
安装目录\libexec\gcc\mingw32\4.3.0
安装目录\mingw32\bin

如果是其他的例如i686-pc-mingw32,那么名称相应的变为
安装目录\libexec\gcc\i686-pc-mingw32\4.3.0
安装目录\i686-pc-mingw32\bin

很困惑这里为什么会出现这个错误,难道gcc编译的时候是将调用的程序诸如cc1等的路径hard coded的?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-5-17 15:29:18 | 显示全部楼层
楼主的问题 是 大杀器。
不好意思 一不小心就提出了这么个问题
俺只是想多了解一点 这样碰到一些奇怪的问题时就会明白问题出在哪里
回复 支持 反对

使用道具 举报

发表于 2009-5-17 16:33:32 | 显示全部楼层
Post by lofeng;1988215
很困惑这里为什么会出现这个错误,难道gcc编译的时候是将调用的程序诸如cc1等的路径hard coded的?

您说对了。
再重复一遍,对于一般用户 /usr/bin/gcc /usr/bin/g++ (gcj g77 ……)就是人机接口,gcc 内部的东西当作 黑盒 看即可。

看过您所有帖子,但一直没明白您在做什么。

如果因为工作关系需要在 windows 下编译程序,直接安装适当版本的编译器和支持程序 干活就是,根本不需要自己手工编译工具链的,各种版本的都有现成的。

如果是研究目的,选 windows 已犯大忌,使用 MingGW 更是大忌(不足以 bootstrap 工具链),最不济也应使用 Cygwin(只是运行稍慢些,但完整),最好还是老老实实选合适的系统环境,请不要继续浪费自己的时间。
回复 支持 反对

使用道具 举报

发表于 2009-5-17 23:38:14 | 显示全部楼层
hi,聚焦深空 找到LZ时干嘛的了?:daniu:
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-5-18 10:35:03 | 显示全部楼层
to linux_pro:
我是干嘛的不重要,在接触一些新东西时,总是允许有点想法的吧。呵呵~~
有很多地方,我想搞得清楚一点,譬如说做LFS时,如果只是按照手册一步步来,而不明白为什么要那样做,又有多大的意义和价值呢?
回复 支持 反对

使用道具 举报

发表于 2009-5-18 13:26:24 | 显示全部楼层
@linux_pro
lz 干嘛的,咱们不用关心。
不过把 MinGW 用到实际工作中的,真的很少见。

@lofeng
很遗憾,偶说的 您一点也听不进去,看来还是温度不够。
建议您冷处理一下,等几天或个把月再回来看看您自己的问题,您会有收获的。

不要再跑题了。
LFS/CLFS 并不是解决您的这些问题的,手册仅仅是参考罢了。
如果得到丁点 LFS/CLFS 真传,您会明白重点是,找到问题,接着自己动手解决问题。

您的问题更底层一些,大部分已经超出 LFS/CLFS 范围,合理的解决问题的方法已经给您重复多遍:[color="Red"]阅读 gcc 源代码

等您把自己的问题弄清楚,欢迎您把自己的收获用普通人能明白的方式反馈回来。

不要再浪费时间。
祝好运!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表