为自己的操作系统添加gcc编译器

为自己的操作系统添加gcc编译器
2010-02-02 10:30
【zz】toolchain guide for totally new CPU
http://blog.chinaunix.net/u2/79526/showart_1200076.html


2007-12-11
从何开始

有个新的CPU, 或者新的操作系统,该怎么样搞个tool chain出来? 如何构建一个 self host的操作系统? 或许不为真的要去构造, 仅仅
满足一下好奇心而已. 当然打算从gnu toolchain入手, 又不是为了写编译器.
(来自互联网的内容已尽力标明出处)

tool chain 的结构

GCC的tool chain 包括几个部分? 根据印象,应是有gcc,cpp,cc1,gas,ld,gdb, ar, nm,strip,objdump ....emulator? 忘了,还有重
要的libc... 汗..
看一个以上几部分都已经都存在的tool chain的构建,我们需要下面的几个部分才能构建一个完整的tool chain:
binutils :gas,ld,ar,nm,strip,objdump....
gun-gcc:  gcc,cpp,cc1,
libc:     a c lib for applications
gdb:      for debugging ...
模拟器...
以上各个部分,缺了就不好受...

 
。。。。。(省略)
     

OS Specific ToolChain --总结
 
回头看看 Self-host OS 和 Toolchain Porting 到这里为止,我们完成了几步?(当前host和target host的cpu相同).     
现在有了一个Coss Build 的toolchain,并且有自己的libc,但是gcc还是运行在当前的host,而不是我们的平台,我们需要再一次的使用这
个cross toolchain去编译binutil和gcc.然后拿到自己OS上,为了测试,再一次编译GCC....ft.

使用cross-toolchain编译运行在target上的gcc时,最好先研究下gcc编译的一些细节,下面列出些参考资料:
http://gcc.gnu.org/install/configure.html  官方的gcc编译配置说明
http://sdn.vlsm.org/share/LDP/lfs/chapter05/toolchaintechnotes.html  LFS的toolchain Notes
http:///man.chinaunix.net/linux/lfs/htmlbook/chapter05/toolchaintechnotes.html  LFS toolchain Notes 中文版

这些资料是创建linux的发行版所使用的技术,但是对制作self hosted 的tool chain也大有裨益,不妨看看.
下面是一些基本的调试技术和说明:
1.确定当前的工作平台(估计你是i686-pc-linux-gnu吧?)   找个config.guess运行下试试就行了 2.确定当前平台的动态链接器 一般由glibc提供,名称是ld-linux.so.2或者ld.so.1 (64位平台可能还不一样).常规的办法是
readelf -l <name of binary> | grep interpreter

3.关键的地方 
  比如你的cross-toolchian在usr/cross目录下,的确认一下,ld和gcc所有的搜索路径都只在/usr/cross下.否则编译出来的self-host
gcc含有对当前host的lib的引用就麻烦了.下面两个是必须检查确认的:
ld的搜索路径,以保证程序只连接到我们选择的库上,确认方式:ld --verbose | grep SEARCH
gccspecs文件,告诉编译器该使用哪个动态连接器.(对于我们可以使用静态链接先)确认方式为:
    readelf -l <name of binary> | grep interprete     看一个这个cross-toolchain编译出来的bin文件
    gcc dummy.c -Wl,--verbose 2>&1 | grep succeeded   确认gcc编译过程中打开的文件
    gcc -print-prog-name=ld    确认gcc将要使用的ld
    ./configure    运行gcc的configure,其中会有这次编译所需要的ld,as的信息,类似于:             checking what assembler to use... /tools/i686-pc-linux-gnu/bin/as
            checking what linker to use... /tools/i686-pc-linux-gnu/bin/ld

最后,来看看libgloss库是个什么东西:(讲newlib的时候,总会提到这个库)
Libgloss:
这个library 来自newlib,以往,这些部分也在newlib source中,在newlib只有一个target時还行.但是后来原来越多的target得到支
持,就比较麻烦.以前target相关的sourcecode在"stub"目录.后来library 中和hardware (targt)相关的函数都放到了stub 下。
然后,gdb, glibc也发现这个stub很有用,所以就把stub 目从newlib source code中移出,形成了现在的libgloss.
Libgloss : Gnu Low-level OS support.

另: newlib是RedHat弄的.....
http://sourceware.org/newlib/   newlib的homepage


OS Specific ToolChain -- self Bootstrap 利用上面的cross-toolchain,我们可以编译一个可以运行在myos上的GCC. BinUtils /usr/src/build-binutils, run ../binutils-2.18/configure  --host=$TARGET --target=$TARGET --prefix=$PREFIX-BOOTSTRAP --with-lib-path=$PREFIX/newlib make install export PATH=$PATH:$PREFIX/bin 要指定一个正确的--with-lib-path才行(这里的$PREFIX/newlib可能不对,得换成真实路径), 安装路径应该换一个才对,比如存在环境 变量$PREFIX-BOOTSTRAP中. GCC From /usr/src/build-gcc, run (only use --enable-languages=c if you haven't downloaded and unpacked gcc-g++!) ../gcc-4.2.1/configure --host=$TARGET--target=$TARGET --prefix=$PREFIX-BOOTSTRAP --disable-nls \ --enable-languages=c --without-headers --disable-shared    make all-gcc   make install-gcc more option :--with-sysroot --with-libs ... --host:虽然未在gun的官方文档中发现这个选项的说明,但是确实有的,通过这个选 项,gcc选取指定host下的as/ld/lib http://gcc.gnu.org/install/configure.html 通过这两个步骤生成的gcc和binutils应该可以运行于myos了!!! 以上步骤未经证实,仅供参考.

GDB Porting
系统self hosted以后,最重要的基础设施就是debug了. GDB无疑是我们的选择(都porting了gcc了,当然debug 选GDB...-:)
首先看看官方文档,GDB internal
http://sourceware.org/gdb/download/onlinedocs/gdbint.html
然后这里有个GDB remote stub的协议说明:
http://sca.uwaterloo.ca/coldfire/gcc-doc/docs/porting_4.html
最重要的是,我们的linuxfourm有teewater这样一批热心人,看看笔者的几遍文章吧:
移植GDB(1) arch和frame. v0.3 更新时间:2006-04-01
http://www.linuxforum.net/forum/showthreaded.php?Cat=&Board=program&Number=603645
移植GDB(2) native v0.0 更新时间:2006-02-21
http://www.linuxforum.net/forum/showthreaded.php?Cat=&Board=program&Number=595833
移植GDB(3) init.c和target_ops v0.0 更新时间:2006-02-27
http://www.linuxforum.net/forum/showthreaded.php?Cat=&Board=program&Number=596941
移植GDB(4)  gdbserver v0.0 更新时间:2006-03-03
http://www.linuxforum.net/forum/showthreaded.php?Cat=&Board=program&Number=597734

GDBINT梗概 :实在是太长,另起文章
http://docs.google.com/Doc?id=dcbsxfpf_68fjrhsnch


Refrence
DISCUSS: porting tool chain to new cpu  不是只有我们才有疑惑....
Building a GNU/Linux ARM Toolchain (from scratch) 为已有体系结构建立tool chain

GNU binutils binutils 的老家
Preliminary Notes on Porting BFD  BFD proting 预备知识
Untitled Document for GAS 这个比较好,讨论了如何移植一个GAS到新的CPU
DISCUSS:Porting binutils to new CPU 一个讨论, 如何porting binutils 到一个新的cpu: CGEN的作用...
Add new target to Binutils:Score 这是一个移植Binutils到新CPU的比较完整的例子,有移植相关的全部代码
[PATCH]:new target SCore 上面例子的参靠资料
New port to Cell SPU  这是啥?这就是大名顶顶的PS3游戏机的Cell CPU啊
berkeley Cell CPU wiki CELL cpu的一个论坛

Using and Porting the GNU Compiler Collection (GCC) GCC移植权威文档...
GCC Internals Manual 权威啊权威...

Compiler  一个实例(没有涉及binutils)
CGEN, the Cpu tools GENerator  为CPU创建assemblers, disassemblers and simulator的工具

gcc.cookys.org  台湾gcc研究工作室....(有点老)
CCRG:咱们自己的gcc研究室(863计划???)  中文gcc资料大大的...
http://www.cse.iitb.ac.in/~uday/gcc-workshop/?file=downloads  GCC internal workshop 印度

http://www.osdev.org/wiki/OS_Specific_Toolchain 移植tool chain到new host
http://www.osdev.org/wiki/Porting_Newlib        移植new lib到你的OS
http://www.osdev.org/wiki/GCC_Cross-Compiler    GCC Cross Compiler
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值