GCC 4.4.3下编译SimpleScalar 3.2

1.安装环境
GCC-4.4.3

2.软件下载
首先到http://www.simplescalar.com/tools.html上下载以下三个tar包。
simplesim-3v0d.tgz
simpletools-2v0.tgz
simpleutils-2v0.tgz
整个安装过程只需这个三个软件包即可。

3.安装过程

3.1 解压缩

假设把这三个软件包放在目录/root下。我们新建一个simplescalar目录,并将这三个包复制放入。然后解压缩,再将三个压缩包删除。命令如下,假设当前在/root下。

mkdir simplescalar

cp *.tgz simplescalar/

cd simplescalar/

tar –zxvf simplesim-3v0d.tgz

tar –zxvf simpletools-2v0.tgz

tar –zxvf simpleutils-2v0.tgz

rm –f *.tgz

3.2 设置环境变量

需设置三个环境变量,以方便后面的安装,不设置也行。

export HOST=i386-Ubuntu-linux ;格式为 机器类型-公司-系统

export TARGET=sslittle-na-sstrix ;设置为小字端机器

export IDIR=/root/simplescalar ;将结果安装到/root/simplescalar

3.3 编译binutils2.5.2

进入binutils2.5.2并配置一下,然后编译,安装。在这里将遇到许多问题,后面将会

一一举出。命令如下:

cd binutils-2.5.2

./configure -host=$HOST -target=$TARGET -with-gnu-as -with-gnu-ld -prefix=$IDIR

make

首先会碰到第一个编译错误:

gcc -c -g -I. -I./../include strerror.c

strerror.c:467: 错误: 对‘sys_nerr’的静态声明出现在非静态声明之后

/usr/include/bits/sys_errlist.h:27: 错误: ‘sys_nerr’的上一个声明在此

strerror.c:468: 错误: 与‘sys_errlist’类型冲突

/usr/include/bits/sys_errlist.h:28: 错误: ‘sys_errlist’的上一个声明在此

make[1]: *** [strerror.o] 错误 1

make[1]:正在离开目录 `/root/simplescalar/binutils-2.5.2/libiberty'

make: *** [all-libiberty] 错误 2

解决:进入/root/simplescalar/binutils-2.5.2/libiberty 打开strerror.c,在第25行加入#undef NEED_sys_errlist

第二个错误:

bison -y -d ./ldgram.y

make[1]: bison:命令未找到

make[1]: *** [ldgram.c] 错误 127

make[1]:正在离开目录 `/root/simplescalar/binutils-2.5.2/ld'

make: *** [all-ld] 错误 2

这是由于没有安装bison的缘故,执行apt-get install flex bison安装bison

第三个错误:

./ldlex.l: 在函数‘yy_input’中:

./ldlex.l:477: 错误: ‘yy_current_buffer’未声明(在此函数内第一次使用)

./ldlex.l:477: 错误: (即使在一个函数内多次出现,每个未声明的标识符在其

./ldlex.l:477: 错误: 所在的函数内也只报告一次。)

make[1]: *** [ldlex.o] 错误 1

make[1]:正在离开目录 `/root/simplescalar/binutils-2.5.2/ld'

make: *** [all-ld] 错误 2

解决:进入/root/simplescalar/binutils-2.5.2/ld,打开ldlex.l 定位到476行,将小写的yy_current_buffer改为大写的YY_CURRENT_BUFFER。

第四个错误:

/usr/lib/gcc/i486-linux-gnu/4.3.3/include/varargs.h:4:2: 错误: #error "GCC no longer implements <varargs.h>."

/usr/lib/gcc/i486-linux-gnu/4.3.3/include/varargs.h:5:2: 错误: #error "Revise your code to use <stdarg.h>."

解决:进入/root/simplescalar/binutils-2.5.2/ld,打开ldmisc.c,定位到24行,将#include<vararg.h>改为#include<stdarg.h>

第五个错误:

ldmisc.c: 在函数‘info_msg’中:

ldmisc.c:344: 错误: expected declaration specifiers before ‘va_dcl’

ldmisc.c:348:15: 错误: 宏“va_start”需要 2 个参数,但只给出了 1 个

ldmisc.c:357: 错误: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘va_dcl’

解决:

这是因为在stdarg.h里已经不再支持 va_dcl,所以编译无法通过。

修改如下:

《《屏蔽掉函数内部分~~》》eg:

343 void info_msg(const char* fmt, va_list ap)

344 //va_dcl

345 {

346 /* char *fmt;

347 va_list arg;

348 va_start(arg);

349 fmt = va_arg(arg, char *);

350 vfinfo(stdout, fmt, arg);

351 va_end(arg);

352 */

353 }

终于没错了,make install一下。发现simplescalar下多了一个bin文件夹

3.4 编译simplescalar

这个步骤比较简单,编译过程中没有错误。

cd simplesim-3.0

make config-pisa ;使它支持PISA,不然最后无法使用

make

3.5 编译gcc-2.6.3

这个步骤可能会碰到较多问题。

cd gcc-2.6.3

./configure -hose=$HOST -target=$TARGET -with-gnu-as -with-gnu-ld -prefix=$IDIR

make

第一个问题:

cccp.c:194: 错误: 与‘sys_errlist’类型冲突

/usr/include/bits/sys_errlist.h:28: 错误: ‘sys_errlist’的上一个声明在此

解决:进入/root/simplescalar/gcc-2.6.3,打开cccp.c,定位到191,在上一行加入#define bsd4_4

第二个问题:

gcc -c -DCROSS_COMPILE -DIN_GCC -DPOSIX -g -I. -I. -I./config sdbout.c

sdbout.c:57:18: 错误: syms.h:没有该文件或目录

sdbout.c: 在函数‘gen_fake_label’中:

经过确认,在GCC-4.3.3之下存在gsyms.h而不存在syms.h,所以需改变这里的宏定义,解决方法是在这段代码之前(53行处)加一个 #undef USG,这样就会将gsyms.h包含进去。

第三个问题:

insn-output.c: 在函数‘output_110’中:

insn-output.c:675: 错误: 缺少结尾的 " 字符

insn-output.c:676: 错误: 程序中有游离的‘\’

insn-output.c:676: 错误: ‘sll’未声明(在此函数内第一次使用)

insn-output.c:676: 错误: (即使在一个函数内多次出现,每个未声明的标识符在其

insn-output.c:676: 错误: 所在的函数内也只报告一次。)

insn-output.c:676: 错误: expected ‘;’ before ‘t’

打开insn-output.c,定位到675行。找到如下代码:

这里会出错的原因是因为,在C语言里面字符串如果分多行写的话必须以“\”结尾,表示连接上下两行。注意的是这里会产生这个错误的原因是Flex (Flex是Linux下词法分析,语法分析代码自动生成工具)版本的问题。这个insn-output.c是由Flex自动生成的,由于 RedHat-EL4上的Flex版本与该项目的版本不一致,故导致生成文件也有点不同。如果直接修改 insn-output.c文件中的所有这些问题,只是治标行为,如果clean过一次的话,再重新编译,又得再一次修改。治本的方法是,找一个能正确生成代码的Flex版本。本次安装采用“治标”的方法,为所有出现这个问题的地方添加一个”\”。

修改方法如下:

FIXME\n后面添加一个'\'

即:

675   return "FIXME\n\

同样的错误,修改方法一样。

第五个问题:

gcc.c:172: 错误: 与‘sys_errlist’类型冲突

/usr/include/bits/sys_errlist.h:28: 错误: ‘sys_errlist’的上一个声明在此

gcc.c: 在函数‘translate_options’中:

这个问题也与前面类似,就不再详述,解决办法是在./gcc.c的169行添加一个#define bsd4_4。

第六个问题:

./cp/g++.c:90: 错误: 与‘sys_errlist’类型冲突

/usr/include/bits/sys_errlist.h:28: 错误: ‘sys_errlist’的上一个声明在此

./cp/g++.c: 在函数‘fatal’中:

这个问题也与前面类似,就不再详述,解决办法是在./cp/g++.c的52行添加一个#define bsd4_4。

总算可以了。呵呵

别忘了: make install

4.

HelloWorld测试

走到这里时,已经将simplescalar以及它的交叉编译器都编译安装好。下面进行测试

假设现在 simplescalar目录下, 写一个hello.c文件内容如下:

#include <stdio.h>

int
main(int argc, char *argv[])
{
printf("Hello World!\n");
return 0;
}

以如下步骤编译:

bin/sslittle-na-sstrix-gcc hello.c

simplesim-3.0/sim-safe a.out

运行结果如下:

sim: ** starting functional simulation **

Hello world

sim: ** simulation statistics **

sim_num_insn 7691 # total number of instructions executed

sim_num_refs 4234 # total number of loads and stores executed

sim_elapsed_time 1 # total simulation time in seconds

sim_inst_rate 7691.0000 # simulation speed (in insts/sec)

ld_text_base 0x00400000 # program text (code) segment base

ld_text_size 70128 # program text (code) size in bytes

ld_data_base 0x10000000 # program initialized data segment base

ld_data_size 8192 # program init'ed `.data' and uninit'ed `.bss' size in bytes

ld_stack_base 0x7fffc000 # program stack segment base (highest address in stack)

ld_stack_size 16384 # program initial stack size

ld_prog_entry 0x00400140 # program entry point (initial PC)

ld_environ_base 0x7fff8000 # program environment base address address

ld_target_big_endian 0 # target executable endian-ness, non-zero if big endian

mem.page_count 26 # total number of pages allocated

mem.page_mem 104k # total size of memory pages allocated

mem.ptab_misses 26 # total first level page table misses

mem.ptab_accesses 476132 # total page table accesses

mem.ptab_miss_rate 0.0001 # first level page table miss rate

相关推荐