经过确认,在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