使用GNU工具链的优势

  出处:http://www.zdnet.com.cn/developer/code/story/0,3800066897,39142725,00.htm

作者: 翻译:javaresearch.org-Abel_Cao
2003-06-27 12:14 PM

GNU编译器(GCC)是一个“免费”的C/C++工具链,有力的支撑了Linux系统的发展。由于它可被看作许多嵌入式处理器的一个交叉编译器,所以在嵌入式软件开发中是一个流行的工具。

支持的体系结构包括:

  • ARM, StrongARM, XScale
  • Hitachi SH
  • Intel i960
  • Intel x86/IA-32
  • MIPS
  • Motorola PowerPC
  • Motorola 68K/ColdFire

我最近使用Windows/MS-DOS主机上的GCC工具链并使用DJGPP完成了一个面向StrongARM 处理器的项目。我发现这个工具链非常可靠,而且能够产生快速高效的机器码。

    GCC工具链中大多数有用的工具主要集中于以下几个源代码包中:

GCC

  • gcc: C 编译器
  • g++: C++ 编译器
  • cpp: C 预处理器

Binutils (binary utilities)

  • as: 汇编程序
  • ld: (目标代码)连接器
  • objcopy: 目标文件翻译器,用于从连接器输出中创建一个ROM 映像
  • objdump: 目标文件阅读器, 用于反汇编目标文件

Make

  • make: make 工具

Debugger

  • gdb: 源代码调试器

当使用交叉编译器的时候,程序通常用前缀来指示目标的体系结构和连接器的输出隔世。例如, arm-elf-as是GCC 工具链中的汇编程序编译器,针对ARM 处理器并产生ELF 格式的二进制代码。这种命名约定避免了对众多以”gcc”命名的针对不同体系结构的编译器的使用混淆。

你可以从GNU FTP site.免费下载GCC个工具的全部源代码。本文不包括怎样从这些源代码创建一个交叉编译器,而CrossGCC FAQ 提供了很好的文档和详细指令。但在你准备使用FTP下载之前,本文会给你一些有益的帮助。

 

选择一个主机系统

为了生成一个GCC交叉编译器,首先需要你在机器上安装一个原始的GCC便一起。这是因为GCC源代码只能被它自身编译,而不能使用Microsoft VC++或其他编译器。下面是一些可选的主机系统和相关工具。

Linux
Linux是可以用来建立一个交叉编译器的最早的主机系统。它已经包括了一个原始GCC 编译器,以及开发大多数GCC 源代码的环境。如果你通常使用Windows 作为你的开发系统,这是一个不太实际的选择。

Windows/Cygwin
Cygwin 是Windows 上的UNIX 方针环境。可以把它看作是"UNIX 窗口" 代替了"DOS 窗口" 。择个环境可以让你在Windows 上使用GCC 原始编译器和其他通用的UNIX 程序,因而能够建立一个GCC 交叉编译器。你也必须在Cygwin 的环境中运行所生成的交叉编译器。这是在Windows 上建立GCC 交叉编译器的最简单的方法,缺点是Cygwin 相对较大运行较慢。

Windows/MS-DOS
       你还可以使用DJGPP建立一个GCC 交叉编译器。 DJGPP是免费的GNU程序在MS-DOS 32为保护模式的移植版本,包括了GCC。主要是因为在UNIX和MS-DOS 之间的源代码命名约定不同,使得这种方法有点复杂。优点是他所生成的交叉编译器可以象正常的Windows DOS 程序一样运行,而不需要运行Cygwin 。

支持库

做完这些,你可能需要一个针对目标处理器的标准的C 运行库。在使用GCC是通常使用这两个库:glibcnewlib.  glibc 是针对PC应用设计的,对大多数嵌入式应用来说都显得过于笨重。另一方面,newlib 是面向嵌入式系统的, 明显的简洁高效。这些库都是开放源代码的,可以使用GCC 交叉编译器来重新编译。

授权问题

GCC 和 newlib 库对嵌入式系统开发者的授权发布比较宽松。总体上讲,如果你使用了这些工具和库,你不需要公开你的源代码和知识产权,这是一个常见的误解。

商用的 GCC 发布

Red Hat 主动开发了GNU 工具链,并为那些不像自己建立工具链的开发者提供了GNUPro 工具箱。该工具箱包括了许多主机和嵌入式目标处理器的二进制工具。对于 Windows平台使用了 Cygwin 环境。目前,工具箱是与Red Hat 的其他软件捆绑销售的,所以走这条路要多花些钱。

责任编辑:炒饭

68000 反汇编C原码 /* * main() */ int main(int argc, char **argv) { char dis_op[64], dis_inst[32], dis_arg[24]; UINT32 start_addr = 0, org = 0, do_org = 0, len = 0, fsize, i, j, k, file_i = 0; FILE *fp; UINT8 *buffer; char *c; /* * Process the command line */ if (argc <= 1) ShowHelp(); for (i = 1; i < argc; i++) { if (argv[i][0] != '-') { if (file_i) fprintf(stderr, "68kd: Garbage on the command line (ignored): %s\n", argv[i]); else file_i = i; } else if (!strcmp(argv[i], "-?") || !strcmp(argv[i], "-h")) ShowHelp(); else if (!strcmp(argv[i], "-s")) { i++; if (i >= argc) fprintf(stderr, "68kd: Warning: No argument to: %s (ignored)\n", "-s"); else start_addr = strtoul(argv[i], &c, 16); } else if (!strcmp(argv[i], "-l")) { i++; if (i >= argc) fprintf(stderr, "68kd: Warning: No argument to: %s (ignored)\n", "-l"); else { len = strtoul(argv[i], &c, 16); if (!len) exit(0); // nothing to do! } } else if (!strcmp(argv[i], "-o")) { i++; if (i >= argc) fprintf(stderr, "68kd: Warning: No argument to: %s (ignored)\n", "-o"); else { org = strtoul(argv[i], &c, 16); do_org = 1; } } else fprintf(stderr, "68kd: Warning: Unrecognized option: %s (ignored)\n", argv[i]); } if (!file_i) { fprintf(stderr, "68kd: No file specified\n"); exit(1); } /* * Load file */ if ((fp = fopen(argv[file_i], "rb")) == NULL) { fprintf(stderr, "68kd: Unable to open %s for writing\n", argv[file_i]); exit(1); } fseek(fp, 0, SEEK_END); fsize = ftell(fp); rewind(fp); if ((buffer = (UINT8 *) malloc(fsize)) == NULL) { fprintf(stderr, "68kd: Not enough memory to load input file: %s, %lu bytes\n", argv[file_i], (unsigned long) fsize); exit(1); } fread(buffer, sizeof(UINT8), fsize, fp); fclose(fp); ByteSwapMemory(buffer, fsize);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值