C代码交叉编译为适配RSIM的MIPS R10000汇编及语法错误排查求助
各位前辈好!我目前在学校的服务器环境下做一个基于MIPS R10000架构(指定用服务器自带的RSIM模拟器)的Dijkstra算法实现项目,遇到了交叉编译和汇编语法兼容的棘手问题,想请教大家的解决方案:
背景
因为项目复杂度较高,我同时在做两件事:一是从零手写MIPS汇编实现算法,二是用C先写出正确的算法逻辑(毕竟C上手快太多)。现在手写汇编卡在了收尾细节上,所以想把C代码交叉编译成RSIM能识别的MIPS汇编,对比着找出自己手写代码里的问题,但试了各种方法都没成功。
我试过的方法及遇到的问题
1. 本地GCC加-S选项生成汇编
我用gcc -S dijkstra.c生成了汇编代码,但后来才知道这是x86架构的汇编,完全不兼容RSIM的MIPS要求。把这份汇编交给RSIM配套的rasm汇编器处理时,报了一堆语法错误,比如不认识.section、.type这类伪指令,还有x86特有的pushq、movq指令也无法识别。
我的测试C代码很简单:
#include <stdio.h> int main() { printf("Hello, World!"); return 0; }
本地GCC生成的x86汇编代码:
.text .section .rodata .LC0: .string "Hello, World!" .text .globl main .type main, @function main: .LFB0: .cfi_startproc endbr64 pushq %rbp .cfi_def_cfa_offset 16 .cfi_offset 6, -16 movq %rsp, %rbp .cfi_def_cfa_register 6 leaq .LC0(%rip), %rdi movl $0, %eax call printf@PLT movl $0, %eax popq %rbp .cfi_def_cfa 7, 8 ret .cfi_endproc .LFE0: .size main, .-main .ident "GCC: (Ubuntu 9.4.0-1ubuntu1~20.04.1) 9.4.0" .section .note.GNU-stack,"",@progbits .section .note.gnu.property,"a" .align 8 .long 1f - 0f .long 4f - 1f .long 5 0: .string "GNU" 1: .align 8 .long 0xc0000002 .long 3f - 2f 2: .long 0x3 3: .align 8 4:
执行make时的错误输出:
cd ~/Courses/CSCI250/Dijkstras make /home/fac/wrc/bin/rasm -l dijkstra.asm > dijkstra.lst 2 0000 .section .rodata Info: Unimplemented directive 4 0000 .string "Hello, World!" Error: Syntax error near label field 7 0000 .type main, @function Error: Syntax error near label field 10 0000 .cfi_startproc Error: Syntax error near label field 11 0000 endbr64 Error: Syntax error near label field 12 0000 pushq %rbp Error: Syntax error near label field 13 0000 .cfi_def_cfa_offset 16 Error: Syntax error near label field 14 0000 .cfi_offset 6, -16 Error: Syntax error near label field 15 0000 movq %rsp, %rbp Error: Syntax error near label field 16 0000 .cfi_def_cfa_register 6 Error: Syntax error near label field 17 0000 leaq .LC0(%rip), %rdi Error: Syntax error near label field 18 0000 movl $0, %eax Error: Syntax error near label field 19 0000 call printf@PLT Error: Syntax error near label field 20 0000 movl $0, %eax Error: Syntax error near label field 21 0000 popq %rbp Error: Syntax error near label field 22 0000 .cfi_def_cfa 7, 8 Error: Syntax error near label field 23 0000 ret Error: Syntax error near label field 24 0000 .cfi_endproc Error: Syntax error near label field 26 0000 .size main, .-main Error: Syntax error near label field 27 0000 .ident "GCC: (Ubuntu 9.4.0-1ubuntu1~20.04.1) 9.4.0" Error: Syntax error near label field 28 0000 .section .note.GNU-stack,"",@progbits Info: Unimplemented directive Error: Syntax error near comment field 29 0000 .section .note.gnu.property,"a" Info: Unimplemented directive Error: Syntax error near comment field 31 0000 .long 1f - 0f Error: Syntax error near label field 32 0000 .long 4f - 1f Error: Syntax error near label field 33 0000 .long 5 Error: Syntax error near label field 34 0000 0: Error: Syntax error near label field 35 0000 .string "GNU" Error: Syntax error near label field 36 0000 1: Error: Syntax error near label field 38 0000 .long 0xc0000002 Error: Syntax error near label field 39 0000 .long 3f - 2f Error: Syntax error near label field 40 0000 2: Error: Syntax error near label field 41 0000 .long 0x3 Error: Syntax error near label field 42 0000 3: Error: Syntax error near label field 44 0000 4: Error: Syntax error near label field There were 3 informational messages There were 33 fatal errors make: *** [Makefile:20: dijkstra.obj] Error 33
2. 尝试Compiler Explorer
我调整了Compiler Explorer上所有可能的输出选项,但还是没找到能生成适配RSIM的MIPS汇编的配置,似乎默认的编译器都不针对RSIM做优化。
3. 尝试指定MIPS架构的GCC选项
我试过用gcc -S -march=mips1 dijkstra.c,结果直接报错,说我的GCC不支持MIPS架构的目标,给出的有效选项全是x86系列的:
cd ~/Courses/CSCI250/Dijkstras gcc -S -march=mips1 dijkstra.c cc1: error: bad value (‘mips1’) for ‘-march=’ switch cc1: note: valid arguments to ‘-march=’ switch are: nocona core2 nehalem corei7 westmere sandybridge corei7-avx ivybridge core-avx-i haswell core-avx2 broadwell skylake skylake-avx512 cannonlake icelake-client icelake-server cascadelake tigerlake bonnell atom silvermont slm goldmont goldmont-plus tremont knl knm x86-64 eden-x2 nano nano-1000 nano-2000 nano-3000 nano-x2 eden-x4 nano-x4 k8 k8-sse3 opteron opteron-sse3 athlon64 athlon64-sse3 athlon-fx amdfam10 barcelona bdver1 bdver2 bdver3 bdver4 znver1 znver2 btver1 btver2 native
4. 尝试Buildroot
我查了资料说Buildroot可以生成交叉编译工具链,但我完全搞不懂怎么配置才能生成适配RSIM的MIPS R10000工具链,也不确定生成的工具链能不能在RSIM上正常运行。
我的需求
想请教大家:有没有办法生成RSIM模拟器能兼容的MIPS R10000汇编代码?或者有没有正确的交叉编译工具链配置方法,让我能把C代码转成可以直接参考的MIPS汇编,好把有用的部分移植到我自己手写的代码里?
感谢各位的帮助!
备注:内容来源于stack exchange,提问作者Aidan Mellin

