2014-03-03 26 views
1

我正在编写代码混淆工具作为我的硕士论文的一部分,并且遇到了一些问题。试图在libemu中使用emu_instruction提供前向声明错误

我使用libemu模拟x86指令,我想读取包含十六进制代码的输入文件并将指令存储在向量中。在libemu中,指令由struct emu_instruction表示,我也想在我的程序中使用这个结构,因为libemu也提供了一个解析器。这是我想使用它:

emulator.cpp

std::vector<struct emu_instruction*> Emulator::getInstructionVector() 
{ 
    std::vector<struct emu_instruction*> v; 
    //e is my struct emu* 
    while(emu_cpu_parse(emu_cpu_get(e))) { 
     v.push_back(&emu_cpu_get(e)->instr); 
    } 

    return v; 
} 

emulator.h(我改变了进口路径)

#ifndef EMULATOR_H 
#define EMULATOR_H 

#include <vector> 

extern "C" { 
#include "~/libemu/libemu/include/emu/emu.h" 
#include "~/libemu/libemu/include/emu/emu_memory.h" 
#include "~/libemu/libemu/include/emu/emu_cpu.h" 
#include "~/libemu/libemu/include/emu/emu_log.h" 
#include "~/libemu/libemu/include/emu/emu_instruction.h" 
} 

class Emulator { 

public: 
Emulator(); 
~Emulator(); 

void loadProgramInMemory(unsigned char instructionBytes[], int instructionBytesLen); 
std::vector<struct emu_instruction*> getInstructionVector(); 
int runAndGetEFlags(); 
void printDebug(); 

private: 
struct emu *e; 
struct emu_memory *mem; 
int static_offset; 
}; 

#endif 

我不得不改变在emu_instruction进口路径使其编译。

试图运行这段代码时,我得到的错误是

emulator.cpp: In member function ‘std::vector<emu_instruction*> Emulator::getInstructionVector()’: emulator.cpp:29:29: error: invalid use of incomplete type ‘struct emu_cpu’ ~/libemu/libemu/include/emu/emu.h:45:8: error: forward declaration of ‘struct emu_cpu’

在这一点上,我不知道该怎么办,因为我不完全理解的错误。任何帮助,将不胜感激。

添加makefile。

的Makefile:

CXX  = g++ 
CC  = g++ 

SRC = $(wildcard *.cpp) 
OBJ = $(SRC:.cpp=.o) 

# Executables 
PROGS = program 

all: $(PROGS) 

program: program.o parser.o instruction.o emulator.o   /home/user/libemu/libemu/src/.libs/libemu.a 
$(CXX) $(CXXFLAGS) program.o parser.o instruction.o emulator.o /home/user/libemu/libemu/src/.libs/libemu.a -ludis86 -o program.out 

parser: parser.o instruction.o 
$(CXX) $(CXXFLAGS) parser.o instruction.o -ludis86 

clean: 
rm -f *.o 

cleaner: clean 
rm -f $(PROGS) *.out 

%.d: %.cpp 
    @set -e; rm -f [email protected]; \ 
    $(CXX) -MM $(CXXFLAGS) $< > [email protected]$$$$; \ 
    sed 's,\($*\)\.o[ :]*,\1.o [email protected] : ,g' < [email protected]$$$$ > [email protected]; \ 
    rm -f [email protected]$$$$ 

回答

0

这真的挺难猜测是emulator.cpp行29,但我认为你的compilec无法找到libemu头的其余部分。 尝试将路径恢复到原始的emu_instruction,并添加到编译器行键(如-I/home/user/libemu/libemu/include)中以指向包含标题的位置。

+0

第29行是'v.push_back(&emu_cpu_get(e) - > instr);'我还添加了我的Makefile,我不知道如何添加你在使用make时不幸提示的内容。 – user3374384

+0

在makefile头部定义了'CXXFLAGS = -I/home/user/libemu/libemu/include' –

0

您必须包含emu_cpu_data.h这是实际定义的emu_cpu