我試圖將被黑方案移植到GDB-7.6.1。以前在GDB-3.2.2下是好的。 但是,我遇到了一些編譯錯誤,儘管我沒有碰到任何與這些宏定義變量相關的東西。最重要的是,Makefile中的相關句子是相同的。但是objdump顯示它們在宏變量中是不同的。C++中未定義的引用
配置後,編譯器會抱怨
libsim.a(engine.o): In function `delayslot32':
/home/ruizhewu/work/gdb/gdb761-5-M3/gdb-7.6.1/lx-bcm-sc/sim/mips/../../../sim/mips/mips.igen:77: undefined reference to `SC_PRE_PROC_DELAY_SLOT'
/home/ruizhewu/work/gdb/gdb761-5-M3/gdb-7.6.1/lx-bcm-sc/sim/mips/../../../sim/mips/mips.igen:85: undefined reference to `SC_POST_PROC_DELAY_SLOT'
bash-3.2$ objdump -t libsim.a |less
........
support.o: file format elf64-x86-64
SYMBOL TABLE:
000000000000021d g F .text 00000000000000bd delayslot32
0000000000000000 *UND* 0000000000000000 SC_PRE_PROC_DELAY_SLOT
engine.o: file format elf64-x86-64
SYMBOL TABLE:
000000000000d72f l F .text 00000000000000bd delayslot32
...
...
...
0000000000000000 *UND* 0000000000000000 SC_PRE_PROC_DELAY_SLOT
以前的計劃,engine.o只有delayslot32,但沒有SC_PRE_PROC_DELAY_SLOT
的mips.igen代碼:
:function:::address_word:delayslot32:address_word target
{
instruction_word delay_insn;
SC_PRE_PROC_DELAY_SLOT(SD, CIA);
sim_events_slip (SD, 1);
DSPC = CIA;
CIA = CIA + 4; /* NOTE not mips16 */
STATE |= simDELAYSLOT;
delay_insn = IMEM32 (CIA); /* NOTE not mips16 */
idecode_issue (CPU_, delay_insn, (CIA));
STATE &= ~simDELAYSLOT;
SC_POST_PROC_DELAY_SLOT(SD);
return target;
}
makefile與gdb3.2.2下的程序實際上是一樣的:
SIM/MIPS/Makefile文件:
semantics.o: sim-main.h scSupport.h adslExtension.h semantics.c $(SIM_EXTRA_DEPS)
engine.o: sim-main.h scSupport.h adslExtension.h engine.c $(SIM_EXTRA_DEPS)
support.o: sim-main.h support.c $(SIM_EXTRA_DEPS)
idecode.o: sim-main.h scSupport.h adslExtension.h idecode.c $(SIM_EXTRA_DEPS)
itable.o: sim-main.h itable.c $(SIM_EXTRA_DEPS)
scSupport.o: scSupport.h adslExtension.h scSupport.c $(SIM_EXTRA_DEPS)
未定義的變量,它的編譯器抱怨在 實際上是定義scSupport.h
#define SC_PRE_PROC_DELAY_SLOT(sd, cia) scEventEndOfInstExe(sd, cia)
#define SC_POST_PROC_DELAY_SLOT(sd)
另外,您不能將程序「移植」到GDB。也許GCC。但是GDB是一個調試器,而不是編譯器。 –
GDB也可以用作CPU模擬器 – user1694917
沒有一個答案是可行的。 1.刪除所有的宏仍然有相同的錯誤。 2.舊版本仍然可以使用UND SC_POST_PROC_DELAY_SLOT。 3.最重要的是,SC_POST_PROC_DELAY_SLOT被定義爲#ifdef和#else。所以不可能由未定義的宏造成。 – user1694917