最近在跟着《CPU设计实战》这本书学习MIPS指令集CPU的设计,在进行到4.3.1节快速上手CPU设计的开发环境的第4步,编译测试程序时,遇到了一个报错,网上也没找到方法,故记录一下自己的解决方法。

书上这一步的要求是:将一个有预先写好程序的func目录(此书的资源里已经提供)设置为一个已经安装了MIPS-GCC交叉编译工具的Linux虚拟机的共享目录,然后在虚拟机中进入soft/func目录,先运行make clean,再运行make进行编译。我采用的是openEuler20.03系统照着https://blog.csdn.net/alfiy/article/details/121653881https://blog.csdn.net/alfiy/article/details/121653881 这篇文章所描述的方法装了buildroot。但是如果用的是其他操作系统或其他编译工具,或者在进行其他项目时,如果遇到类似的问题,应该也能通过以下方式解决。

这是运行make时遇到的报错内容,部分无关的省略掉了:

[openeuler@test func]$ make
make compile
(--------------中间部分内容省略-----------------)
make[2]: Leaving directory '/mnt/hgfs/func/inst'
mipsel-linux-gcc -E -P -Umips -D_LOADER -U_MAIN -D_KERNEL -fno-builtin -mips1 -DMEMSTART=0x80000000 -DMEMSIZE=0x04000 -DCPU_COUNT_PER_US=1000 -I /mnt/hgfs/func/include  -fno-reorder-blocks -fno-reorder-functions -EL bin.lds.S -o bin.lds
mipsel-linux-ld -g -EL -T bin.lds  -o main.elf start.o -L . -linst
mipsel-linux-ld: section .MIPS.abiflags LMA [00000000bfcb0c48,00000000bfcb0c5f] overlaps section .data LMA [00000000bfcb0c48,00000000bfcb0c57]
make[1]: *** [Makefile:33: main.elf] Error 1
make[1]: Leaving directory '/mnt/hgfs/func'
make: *** [Makefile:13: all] Error 2
[openeuler@test func]$

执行mipsel-linux-ld -g -EL -T bin.lds  -o main.elf start.o -L . -linst这句时报section重叠。网上搜索了一圈发现,问题应该是这本书提供的源代码里没有给.data和.MIPS.abiflags的内容分配空间或是分配的不合理,导致了内容过多时存储会有重叠,导致报错。参考了另一篇有类似报错的文章,https://blog.csdn.net/weixin_39871788/article/details/78858791,尝试了以下方法,问题解决。

在文件夹中找到bin.lds文件(做完后发现改动bin.lds.S也可以,但是最后一步的操作有所不同)。因为这个文件夹是虚拟机和主机的共享文件夹,所以在主机上打开修改就行。

如果是在其他地方或项目里出现了这种问题,就去找项目里的以.ld或者.lds为后缀的文件打开修改。.ld文件里面的格式和不同语句分别代表什么意思网上都有,而且很详细。这里就不多介绍。

用任意文本编辑器打开后在第二行和第三行之间插入如下内容,给不同的内容分配不同的空间。如果已经存在MEMORY模块,就往里面加语句(也就是定义新空间)或者数字改大。

MEMORY
{RAM (xrw) : ORIGIN = 0x68000000, LENGTH = 1024KFLASH (rx) : ORIGIN = 0x8000000, LENGTH = 1024K
}

加上上面的语句后就可以使用定义的空间了。在.data的大括号后面加上 >RAM,表示这块内容使用刚才的分配空间。

  .data : AT(rodata_end){(中间部分省略,完整的代码会贴在后面)
} >RAM

这个报错是因为.MIPS.abiflags存在冲突,于是就在文件中另找一个地方插入如下几行,表示给.MIPS.abiflags使用刚才分配的另一个空间,避免冲突。在哪个位置插入似乎影响不大,我是插入到了.bss块的大括号后面的一行。如果是其他文件或项目的问题,对照插入或者找到相应的地方修改即可。

  .MIPS.abiflags : {. = ALIGN(4);*(.MIPS.abiflags*). = ALIGN(4);} >FLASH

改好后完整的bin.lds文件如下:

OUTPUT_ARCH(mips)
ENTRY(_start)
MEMORY
{RAM (xrw) : ORIGIN = 0x68000000, LENGTH = 1024KFLASH (rx) : ORIGIN = 0x8000000, LENGTH = 1024K
}
SECTIONS
{. = 0xbfc00000;.text :{_ftext = . ;*(.text)*(.rodata*)*(.reginfo)*(.init)*(.stub)*(.gnu.warning)rodata_end = .;} =0_etext = .;PROVIDE (etext = .);.fini : { *(.fini) } =0. = 0x80000000;.data : AT(rodata_end){_fdata = . ;_stack = _fdata + 0x04000 -32;*(.data)*(.data*)__CTOR_LIST__ = .;LONG((__CTOR_END__ - __CTOR_LIST__) / 4 - 2)*(.ctors)LONG(0)__CTOR_END__ = .;__DTOR_LIST__ = .;LONG((__DTOR_END__ - __DTOR_LIST__) / 4 - 2)*(.dtors)LONG(0)__DTOR_END__ = .;_gp = ALIGN(16) + 0x7ff0;*(.got.plt) *(.got)*(.sdata)*(.lit8)*(.lit4)
} >RAM_edata = .;PROVIDE (edata = .);data_size = SIZEOF(.data);data_load_start = LOADADDR(.data);__bss_start = .;_fbss = .;.sbss : { *(.sbss) *(.scommon) }.bss :{*(.dynbss)*(.bss)*(COMMON)}.MIPS.abiflags : {. = ALIGN(4);*(.MIPS.abiflags*). = ALIGN(4);} >FLASH. = ALIGN(8);_end = . ;PROVIDE (end = .);. = ALIGN(32);.bigdata : { *(.bigdata) }. = ALIGN(256);_heap = . ;.stab 0 : { *(.stab) }.stabstr 0 : { *(.stabstr) }.debug 0 : { *(.debug) }.debug_srcinfo 0 : { *(.debug_srcinfo) }.debug_aranges 0 : { *(.debug_aranges) }.debug_pubnames 0 : { *(.debug_pubnames) }.debug_sfnames 0 : { *(.debug_sfnames) }.line 0 : { *(.line) }.gptab.sdata : { *(.gptab.data) *(.gptab.sdata) }.gptab.sbss : { *(.gptab.bss) *(.gptab.sbss) }
}

将改好的文件保存好即可。如果你是在bin.lds文件里改动的,则需要再打开相同目录下的Makefile文件,找到下面这一段,把其中第一行注释掉,避免重新编译时刚才所做的改动被覆盖。如果上面的内容是在bin.lds.S文件中改动,则可忽略这一步。

main.elf: start.o libinst.a #把下面这行注释掉,避免重新编译时刚才所做的改动被覆盖#${CROSS_COMPILE}gcc -E -P -Umips -D_LOADER -U_MAIN $(CFLAGS) bin.lds.S -o bin.lds${CROSS_COMPILE}ld -g -EL -T bin.lds  -o $@ start.o -L . -linst${CROSS_COMPILE}objdump -alD $@ > test.s

改动完成,再次在Linux上重新运行make clean和make命令(如果是在bin.lds.S里做的改动,就运行make reset),成功编译。如果是其他工程或项目中报错,那就按照对应项目中的说明重新运行。

解决《CPU设计实战》第四章实践交叉编译时报错mipsel-linux-ld: section .MIPS.abiflags LMA overlaps section .data LMA相关推荐

  1. CPU设计实战 第5章 实践任务

    CPU设计实战-汪文祥 邢金璋 第5章 实践任务一 实验环境 lab6.zip 文章目录 前言 一.实验内容 前言 在lab5的实验环境下,添加算术逻辑运算类指令,乘除运算类指令,以及乘数法配套的数据 ...

  2. 尚学堂java实战第四章课后习题

    尚学堂java实战第四章课后习题 文章中的题目答案仅供参考 选择题答案: 1.B 解析:一个java类必然存在构造器,即使没有定义构造器,也会存在一个默认的无参构造器. 2.D 3.AC 解析: A( ...

  3. 零基础学Python课后实战第四章

    零基础学Python课后实战第四章 实战一:输出王者荣耀的游戏角色 实战二:模拟火车订票系统 实战三:电视剧的收视率排行榜 tips 实战一:输出王者荣耀的游戏角色 列表的创建.遍历列表 代码 pri ...

  4. C++ API 设计 09 第四章 设计

    第四章 设计 上个章节是为开始设计API打下基础和准备必要的开发背景知识.我分析了各种对API设计有益的品质和讲解了应用于可维护的API设计的标准设计模式. 本章将把这些信息全部整合到一起,涵盖高品质 ...

  5. android movie 资源释放,Android 资讯类App项目实战 第四章 电影模块

    前言: 正在做一个资讯类app,打算一边做一边整理,供自己学习与巩固.用到的知识复杂度不高,仅适于新手.经验不多,如果写出来的代码有不好的地方欢迎讨论. 以往的内容 第四章 电影模块 本章内容最终效果 ...

  6. 【CPU设计实战】数字逻辑电路设计基础(一)

    cpu设计中,需要遵守一些规定 禁止出现initial语句 禁止出现casex,casez 禁止使用#表达电路延迟 时钟信号clock只允许出现在always@(posedge clk)中 带复位的触 ...

  7. 机器学习实战——第四章(分类):朴素贝叶斯

    前言 首先感谢博主:Jack-Cui 主页:http://blog.csdn.net/c406495762 朴素贝叶斯博文地址: https://blog.csdn.net/c406495762/ar ...

  8. 设计美学 第四章 技术革命与设计革命

    文章目录 1 技术革命与设计革命 1.1技术与设计的关系 1.2技术革命对设计的影响 1.3技术基础与审美范型 2 古代技术革命 3 古典设计 3.1东方建筑中的古典设计 3.2西方建筑中的古典设计 ...

  9. 合同在线修改 java_Java并发编程实战-第四章

    序文: 如果你没有时间阅读这本,那你就来对地方了.小编会将每一章刨去废话,取其精华.分享给大家.如果觉得可以请不要忘了关注小编.我会定期跟新java 中的经典书籍. 正文: 第四章:对象的组合(更加适 ...

  10. DirectX12 3D 游戏开发与实战第四章内容(上)

    Direct3D的初始化(上) 学习目标 了解Direct3D在3D编程中相对于硬件所扮演的角色 理解组件对象模型COM在Direct3D中的作用 掌握基础的图像学概念,例如2D图像的存储方式,页面翻 ...

最新文章

  1. 推荐8个年薪100万BAT级优质技术大号
  2. centos 7 lvs 负载均衡搭建部署
  3. Tomcat7.0安装配置
  4. [云炬创业基础笔记]第十一章创业计划书测试5
  5. MySQL(6)数据库中的高级(进阶) SQL 语句
  6. UOJ #150 【NOIP2015】 运输计划
  7. 2021年Q2母婴行业季度洞察报告
  8. 3-3.HDFS项目实战目标和要求
  9. 下载Bootstrap3源码版本
  10. pandas.Series.values
  11. HDU 1285 确定比赛名次【拓扑排序】
  12. Vue面试中,经常会被问到的面试题/Vue知识点整理
  13. 机器学习模型的超参数优化
  14. ABP中的数据过滤器
  15. ArcGIS教程:填挖的工作原理
  16. 电脑安装虚拟机网络适配器上面没有虚拟机的网络
  17. vi /etc/sysconfig/network
  18. 使用ARCHPR明文攻击爆破压缩包
  19. 如何做好公众号内容运营?这三个步骤就够了
  20. Http请求状态码:905

热门文章

  1. 矩母函数求期望与方差
  2. YOLOX论文逐句翻译
  3. 自动驾驶基础知识(二)——术语中英文对照
  4. MAK代理激活的使用方法和注意事项
  5. Windows 安装 KMS 与 MAK 的区别
  6. Mqtt开发笔记:windows下C++ ActiveMQ客户端介绍、编译和使用
  7. Vue项目中实现改变屏幕尺寸重新刷新页面-计算页面尺寸
  8. 树状数组的理解以及简单应用
  9. 电脑语言栏消失看我怎么办
  10. leaflet+D3