2014-02-10 21 views
-1

我試圖將被黑方案移植到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) 
+0

另外,您不能將程序「移植」到GDB。也許GCC。但是GDB是一個調試器,而不是編譯器。 –

+0

GDB也可以用作CPU模擬器 – user1694917

+0

沒有一個答案是可行的。 1.刪​​除所有的宏仍然有相同的錯誤。 2.舊版本仍然可以使用UND SC_POST_PROC_DELAY_SLOT。 3.最重要的是,SC_POST_PROC_DELAY_SLOT被定義爲#ifdef和#else。所以不可能由未定義的宏造成。 – user1694917

回答

2

它似乎很明顯對我來說,頭文件scSupport.h做沒有被包含到使用宏的文件之一中。無論是宏還是宏都是有條件定義的,並沒有真正設置。

找出發生的原因。

+0

是的,它的#ifndef SC_SUPPORT_H 的#define SC_SUPPORT_H 的#include 「SIM-basics.h」 /* ---------------條件宏*/ 的#ifdef \t USE_SC但是gcc ....- DUSE_SC ... -g -O0 -c -o support.o -MT support.o -MMD -MP -MF .deps/support.Tpo support.c – user1694917

+0

即使刪除了所有的#define ,它仍然是一樣的 – user1694917