gcc支持多种不同的语言,也支持多种不同的CPU架构。
在它的实现上,不同语言编译的实现是通过
conststruct lang_hooks lang_hooks = LANG_HOOKS_INITIALIZER;
这个结构体的不同定义来实现的。比如c语言的编译器就通过gcc/c-lang.c指定了lang_hooks这个结构体的一个实现。而C++语言编译器对此结构体的实现则放在gcc/cp/cp-lang.c中,同样在gcc目录下还可以发现gcc/objcp/objcp-lang.c和gcc/treelang/treetree.c这两个文件也提供了lang_hooks的不同实现。由此就可以很容易发现gcc所支持的编程语言。
而要生成不同目标CPU的代码,gcc则提供了另一个结构体:
struct gcc_target targetm = TARGET_INITIALIZER;
对此结构体的不同实现则是放在gcc/config/xxx/目录下的,其中xxx是具体的平台,如i386,bfin等等。
当然在后端,除了对gcc_target这个结构体提供不同的实现外,还必须重新定义一系列的宏,这些宏都是放在不同平台的config子目录下的,那么gcc如何知道要包含哪个目录下的头文件呢?
答案就在tm.h。以下是bf561交叉编译器下tm.h的内容:
#ifndef GCC_TM_H
#define GCC_TM_H
#ifdef IN_GCC
# include"options.h"
# include"config/bfin/bfin.h"
# include"config/dbxelf.h"
# include"config/elfos.h"
# include"config/bfin/elf.h"
# include"defaults.h"
#endif
#ifdefined IN_GCC && !defined GENERATOR_FILE && !defined USED_FOR_TARGET
# include"insn-constants.h"
# include"insn-flags.h"
#endif
#endif/* GCC_TM_H */
tm.h并不是gcc源码包的一部分,而是动态生成的,在gcc/gcc目录下的Makefile有这样的部分:
tm.h: cs-tm.h ; @true
cs-tm.h: Makefile
TARGET_CPU_DEFAULT="$(target_cpu_default)" /
HEADERS="$(tm_include_list)" DEFINES="$(tm_defines)" /
$(SHELL) $(srcdir)/mkconfig.sh tm.h
这说明tm.h的生成要靠mkconfig.sh将tm_include_list这个变量中列出的文件。
再看看tm_include_list的定义:
tm_include_list=options.h config/bfin/bfin.h config/dbxelf.h config/elfos.h config/bfin/elf.h defaults.h
这个变量也是在Makefile中定义的,但是Makefile是由gcc/configure动态生成的,所以再看看gcc/configure中的相关部分:
tm_file_list="options.h"
tm_include_list="options.h"
for f in $tm_file; do
 case $f in
    defaults.h )
       tm_file_list="${tm_file_list} /$(srcdir)/$f"
       tm_include_list="${tm_include_list} $f"
       ;;
    * )
       tm_file_list="${tm_file_list} /$(srcdir)/config/$f"
       tm_include_list="${tm_include_list} config/$f"
       ;;
 esac
done
离目标越来越近了,顺藤摸瓜,看看在config.gcc中对$tm_file的定义:
tm_file=${cpu_type}/${cpu_type}.h
case ${target} in
# Support site-specific machine types.
bfin*-elf*)
     tm_file="${tm_file} dbxelf.h elfos.h bfin/elf.h"
        tmake_file=bfin/t-bfin-elf
        use_collect2=no
        ;;
bfin*-uclinux*)
     tm_file="${tm_file} dbxelf.h elfos.h bfin/elf.h bfin/uclinux.h"
        tmake_file=bfin/t-bfin-uclinux
        use_collect2=no
        ;;
bfin*-linux-uclibc*)
     tm_file="${tm_file} dbxelf.h elfos.h bfin/elf.h linux.h bfin/linux.h"
        tmake_file="t-slibgcc-elf-ver bfin/t-bfin-linux"
        use_collect2=no
        ;;
bfin*-*)
     tm_file="${tm_file} dbxelf.h elfos.h bfin/elf.h"
        tmake_file=bfin/t-bfin
        use_collect2=no
        ;;
呵呵,最后看看cpu_type的定义:
cpu_type=`echo ${target} | sed 's/-.*$//'`
case ${target} in
bfin*-*)
     cpu_type=bfin
     ;;
至此,终于真相大白!

gcc交叉编译的实现相关推荐

  1. linaro gcc 交叉编译链编译

    linaro gcc 交叉编译链编译全解析 在此编译的是4.8.3版本的gcc,依赖2.18的glibc,2.24的binutils 参考http://blog.chinaunix.net/uid-2 ...

  2. 构建gcc交叉编译工具链

    如何构建一个GCC交叉编译工具链 GCC不仅是一个编译器,它是一个开源工程,可以让你建立各种编译器.一些编译器支持多线程,一些支持共享库,一些支持Multilib(典型的应用是在64位机上运行32位应 ...

  3. Linux下gcc交叉编译工具链制作实例详细总结(附下载地址)

    一.简介 本文主要讲解gcc交叉编译工具链搭建的全过程,以本人实际的操作去讲述整个工具链的搭建,希望对大家有所帮助. 二.工具链的搭建流程 1.下载相关源码:包括binutils.kernel.gcc ...

  4. 【华为云技术分享】鲲鹏弹性云服务器GCC交叉编译环境搭建指南

    南七技校林书豪 1.简介 交叉编译,简单地说,就是在一个平台上生成另一个平台上的可执行代码.本指南主要内容为在非ARM架构服务器环境下搭建ARM的GCC编译环境,编译基于ARM架构的应用软件.交叉编译 ...

  5. arm linux gcc交叉编译,arm-linux-gcc交叉编译器安装

    在网上下载arm-linux-gcc-4.4.3.tar.gz. 1.解压#tar -zxvf arm-linux-gcc-4.4.3.tar.gz 2.打开解压目录,将FriendlyARM文件夹拷 ...

  6. Linaro GCC 交叉编译工具链 国内源下载列表 (持续更新)

    gcc-linaro-4.9-2016.02-x86_64_arm-linux-gnueabihf.tar.xz 链接:https://pan.baidu.com/s/1-DCIVVs6QTGv5tY ...

  7. TencentOS-Tiny之GCC

    国庆节快乐! 序 本来都已躺在床上准备睡了,但是心情久久不能平静,于是在22:39又爬起来,把第二篇上手文章写一下. 前一篇文章写了如何在MacOS上使用STM32CubeIDE进行搭建开发环境以及代 ...

  8. 交叉编译Qt5.5.1----本人亲自测试基本可行!!!

    原文地址::https://blog.csdn.net/jzzy_hony/article/details/81141481 相关文章 1.qt中configure参数配置说明----https:// ...

  9. 交叉编译Qt5.9.6

    准备 主机平台:Ubuntu 16.04 LTS(x64)     目标平台:ARM40-A5D3     Qt版本:Qt5.9.6     tslib github     sqlite3     ...

最新文章

  1. Windows搭建wnmp
  2. RabbitMQ Network Partitions
  3. centos下hadoop的安装
  4. arm linux串口控制led,通信程序设计 - Linux下ARM和单片机的串口通信设计
  5. Unity 通过Unity Admob Plugin插件集成admob教程
  6. mysql rr和rc_MySQL Transaction--RC和RR区别
  7. subsonic 配置及使用
  8. 翼虎 android,福特翼虎成首款同时兼容CarPlay和Android Auto的车型
  9. 搜狐2019第一季度总收入4.31亿超预期 减亏超预期
  10. 大数据之-Hadoop之HDFS_NameNode和Secondary NameNode工作机制_通过文件的增删改查说明---大数据之hadoop工作笔记0070
  11. 预算执行审计计算机审计方法,预算执行审计中计算机审计思路和SQL语句运用.doc...
  12. python批量实现将文件夹内的每张图片分割成多张
  13. monkey命令常用参数与monkey事件百分比
  14. Vue秒杀倒计时插件vue2-countdown
  15. Git 合并单个文件
  16. Skiplist和strcpy以及AVL/红黑树
  17. 爱奇艺落子IP源头 全产业链开放协同助攻原创内容
  18. 你的计算机没有安装cad2006,win7安装autocad2006无法正常的2种解决方法
  19. MacBook Pro做为Windows电脑的扩展屏【已解决】
  20. 32位/64位系统,jdk32位,64位,32/64位jdk编译出来的class和eclipse 32位和64位

热门文章

  1. c语言中用简易暗纹来输入密码,确定夫琅和费单缝衍射明、暗纹位置的不同教学方法的讨论...
  2. java volidate线程安全_03.(多线程与并发)面试题-02--Volidate的原理和指令重排序
  3. mysql密码安全级别_Mysql数据库的安全性问题释疑
  4. CCIE-LAB-第一篇-教学导入环境
  5. 【CodeForces - 438D】The Child and Sequence(线段树区间取模操作)
  6. 【POJ - 1562】Oil Deposits (dfs搜索,连通块问题)
  7. android 动态换肤框架,GitHub - ss520k/Android-Skin-Loader: 一个通过动态加载本地皮肤包进行换肤的皮肤框架...
  8. 列举python中常用的数据类型_Python基础知识 变量和简单数据类型
  9. linux操作系统权限详解,Linux权限详解
  10. linux添加启动脚本文件夹,linux – 将脚本中的符号链接添加到rc.d文件夹中以在系统启动期间启动进程...