Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
关于链接/加载和模拟器的一个问题 我设计了一个使用Verilter的MIPS I模拟器,它允许我把Verilog代码包到C++中。我试图在我的处理器上运行C++程序,但是我遇到了一些问题。我的目标是: 用c语言编写测试程序++ 使用交叉编译器g++(mips linux)编译此程序 获取生成的ELF文件并使用objdump将其反汇编 将整个二进制对象转储存储在文本文件中 在我的模拟器中打开文本文件 运行一些文本操作函数来隔离objdump的十六进制转储部分 将整个ELF HEX转储加载到处理器的内存中(包含由ELF文件定义的内存中的地址键入的元素的C++内存映射)< /LI> 通过设置程序计数器运行程序,直到退出程序的syscall_C++_Assembly_Linker_Loader - Fatal编程技术网

关于链接/加载和模拟器的一个问题 我设计了一个使用Verilter的MIPS I模拟器,它允许我把Verilog代码包到C++中。我试图在我的处理器上运行C++程序,但是我遇到了一些问题。我的目标是: 用c语言编写测试程序++ 使用交叉编译器g++(mips linux)编译此程序 获取生成的ELF文件并使用objdump将其反汇编 将整个二进制对象转储存储在文本文件中 在我的模拟器中打开文本文件 运行一些文本操作函数来隔离objdump的十六进制转储部分 将整个ELF HEX转储加载到处理器的内存中(包含由ELF文件定义的内存中的地址键入的元素的C++内存映射)< /LI> 通过设置程序计数器运行程序,直到退出程序的syscall

关于链接/加载和模拟器的一个问题 我设计了一个使用Verilter的MIPS I模拟器,它允许我把Verilog代码包到C++中。我试图在我的处理器上运行C++程序,但是我遇到了一些问题。我的目标是: 用c语言编写测试程序++ 使用交叉编译器g++(mips linux)编译此程序 获取生成的ELF文件并使用objdump将其反汇编 将整个二进制对象转储存储在文本文件中 在我的模拟器中打开文本文件 运行一些文本操作函数来隔离objdump的十六进制转储部分 将整个ELF HEX转储加载到处理器的内存中(包含由ELF文件定义的内存中的地址键入的元素的C++内存映射)< /LI> 通过设置程序计数器运行程序,直到退出程序的syscall,c++,assembly,linker,loader,C++,Assembly,Linker,Loader,问题在于第7步和第8步。我对ELF文件格式有非常初步的了解。据我所知(readelf可用于输出程序起点),程序计数器最初应设置在.text节开头的地址。不幸的是,这样做并不能在我的处理器上运行正确的程序 我已经通过编写汇编程序,将它们加载到MIPS汇编模拟器中,并逐个指令验证寄存器文件和生成的寻址是否匹配,来验证处理器的程序执行是否正确。我不明白的是为什么我不能通过写C++来编译一个“HeloWord”程序,编译并加载到我的“内存”中。我在这个领域不是特别有知识。我真的需要一些人帮我弄清楚 我的

问题在于第7步和第8步。我对ELF文件格式有非常初步的了解。据我所知(readelf可用于输出程序起点),程序计数器最初应设置在.text节开头的地址。不幸的是,这样做并不能在我的处理器上运行正确的程序

我已经通过编写汇编程序,将它们加载到MIPS汇编模拟器中,并逐个指令验证寄存器文件和生成的寻址是否匹配,来验证处理器的程序执行是否正确。我不明白的是为什么我不能通过写C++来编译一个“HeloWord”程序,编译并加载到我的“内存”中。我在这个领域不是特别有知识。我真的需要一些人帮我弄清楚

我的理解是.text和.data包含程序运行所需的所有内容。显然情况并非如此,因为当我遍历.text部分时,我的程序无法正确执行。在将ELF文件加载到内存之前,我还需要对其执行其他操作吗?

是我喜欢的ELF解释,尽管您似乎理解ELF问题。它们还解释了g++是如何输出elf文件的,因此它可能会帮助您解析输出文件(还有更多的好信息)


希望这些信息能有所帮助。

我已经编写了一个完整的MIPS I模拟器,可以加载ELF二进制文件。你可以得到源代码,也许你可以得到问题的答案。还包括一些演示程序。关键是让编译器生成一个独立的可执行文件,它不使用任何运行时库,甚至不使用gcc的支持库。

zvrba可能已经击中要害,您不能/不应该在程序中调用printf之类的C库函数

编写一个简单的C程序,从以下几点开始:

const unsigned char hello[]="helloworld"; void notmain ( void ) { unsigned int ra; for(ra=0;hello[ra];ra++) { PUT32(0x1234,hello[ra]); } } 常量unsigned char hello[]=“helloworld”; void notmain(void) { 无符号整数ra; for(ra=0;hello[ra];ra++) { PUT32(0x1234,hello[ra]); } } 并从您编写的汇编程序调用notmain,这些程序可以一起工作和链接

PUT32只是将一些数据写入某个地址,我通常在汇编程序ymmv中实现这些

选择除0x1234以外的其他地址,我的假设是,在sim卡环境中,您可以查看对地址位置的访问并查看字符。当您可以查看总线上的字节时,无需与uart通信,也无需在模拟中解码串行数据

Elf文件真的很容易解析,如果您已经编写了模拟器,那么读取Elf文件并不是什么大问题。我不在乎图书馆,它们只是让我更难。如果您选择使用结构,则需要使用一些结构。我可以为您提供代码,如果您愿意,可以让您开始。另一种方法是使用gnu工具将elf转换为二进制文件(mips-objcopy file.elf-O binary file.bin)。如果.text和.data彼此不接近,objcopy程序将生成一个巨大的文件,在两个地址空间之间填充零。对于嵌入式,您希望避免在.data节中包含任何内容,请始终不提前初始化程序中的变量,并且只读表将const设置为.text而不是.data

这是一个娱乐项目还是工作项目还是公众消费项目?也许有一天我会对使用它感兴趣,我喜欢verilator的概念,但它对verilog标准来说要么是有限的,要么是太严格了,而且很多verilog在没有工作的情况下是不会运行的,所以我还没有真正玩过它


祝你好运。

此外,我尝试编写内联汇编并编译以验证我的处理器,但编译后我找不到我的程序(我只是重复addi$0x12ab。。。"一次又一次。然后我在elf文件的十六进制转储中搜索0x12ab。我无法以这种方式在elf文件中找到我的程序。因此,从ZVRBA的模拟器上看,似乎elf文件加载到内存的方式与我的方式非常相似。我基本上在十六进制dum之后从elf文件中删除所有字符ping它,我使用每个十六进制指令/数据地址作为键向内存映射添加一个元素。然后使用地址键进行访问。因此,这个过程的重要方面是将所有元素加载到正确的地址,并将程序、全局、堆栈和帧指针设置到它们所需的位置。因为这就是我正在做的g我想我可以假设我应该改变我的编译器。我还写了一篇论文,详细描述了模拟器的工作原理(包括一些ELF方面)。论文摘要在这里:给我发一封电子邮件,这样我就可以把论文寄给你(由于版权问题,我不能在线发布)。我认为这将是一个好主意,我建立自己的交叉编译器(而不是使用提供给我的glitchy之一)。你知道一个很好的资源描述这个过程吗?特别是为mipsel elf gcc目标?我给你发了一封电子邮件。不确定它是否通过你