在x86下交叉编译mips程序

1. 交叉编译工具链准备

从龙芯开源社区(http://www.loongnix.cn)获取最新交叉编译工具链

$ mkdir cross
$ cd cross 
$ wget http://ftp.loongnix.cn/toolchain/gcc/release/mips/gcc8/mips-loongson-gcc8-linux-gnu-2021-02-08.tar.gz
--2021-12-16 15:30:55--  http://ftp.loongnix.cn/toolchain/gcc/release/mips/gcc8/mips-loongson-gcc8-linux-gnu-2021-02-08.tar.gz
正在解析主机 ftp.loongnix.cn (ftp.loongnix.cn)... 192.168.200.30
正在连接 ftp.loongnix.cn (ftp.loongnix.cn)|192.168.200.30|:80... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:497822488 (475M) [application/x-gzip]
正在保存至: “mips-loongson-gcc8-linux-gnu-2021-02-08.tar.gz”

mips-loongson-gcc8-linux-gnu-2021-02-08.tar.gz  100%[=====================================================================================================>] 474.76M  65.7MB/s  用时 7.2s    

2021-12-16 15:31:02 (66.0 MB/s) - 已保存 “mips-loongson-gcc8-linux-gnu-2021-02-08.tar.gz” [497822488/497822488])
$ tar xf mips-loongson-gcc8-linux-gnu-2021-02-08.tar.gz

2.hello.c

编写hello.c

#include <stdio.h>

int main(void)
{
    printf("hello world.\n");
    return 0;
}

3. 设定环境变量

设置PATH环境变量

$ export PATH=/home/loongson/cross/mips-loongson-gcc8-linux-gnu-2021-02-08/bin:$PATH

查看gcc版本

$ mips-linux-gnu-gcc -v
Using built-in specs.
COLLECT_GCC=mips-linux-gnu-gcc
COLLECT_LTO_WRAPPER=/home/loongson/cross/mips-loongson-gcc8-linux-gnu-2021-02-08/bin/../libexec/gcc/mips-linux-gnu/8.3.0/lto-wrapper
Target: mips-linux-gnu
Configured with: /opt/loongson-gcc8.3.0-linux-gnu/src/gcc-8.3.0/src/configure --build=x86_64-unkonwn-linux --host=x86_64-unkonwn-linux --target=mips-linux-gnu --enable-threads --disable-libmudflap --disable-libssp --disable-libstdcxx-pch --with-arch-32=mips32r2 --with-arch-64=mips64r2 --with-float=hard --with-mips-plt --enable-extra-sgxxlite-multilibs --with-gnu-as --with-gnu-ld --enable-languages=c,c++,fortran --enable-shared --enable-lto --enable-symvers=gnu --enable-__cxa_atexit --with-fix-loongson3-llsc --with-fused-madd4 --with-linker-hash-style=both --with-glibc-version=2.25 --with-pkgversion='loongson cross toolchain' --with-bugurl=http://bugs.loongnix.org/ --disable-nls --prefix=/opt/loongson --disable-libffi --disable-libquadmath --disable-libitm --disable-libatomic --with-sysroot=/opt/loongson/mips-linux-gnu/libc --with-build-sysroot=/opt/loongson-gcc8.3.0-linux-gnu/install/mips-loongson-gcc8-linux-gnu-2021-02-08/mips-linux-gnu/libc --with-gmp=/opt/loongson-gcc8.3.0-linux-gnu/obj/pkg-mips-linux-gnu/host-libs-x86_64-pc-linux-gnu/usr --with-mpfr=/opt/loongson-gcc8.3.0-linux-gnu/obj/pkg-mips-linux-gnu/host-libs-x86_64-pc-linux-gnu/usr --with-mpc=/opt/loongson-gcc8.3.0-linux-gnu/obj/pkg-mips-linux-gnu/host-libs-x86_64-pc-linux-gnu/usr --disable-libgomp --disable-libitm --disable-libatomic --disable-libssp --disable-libcc1 --enable-poison-system-directories --with-python-dir=mips-linux-gnu/share/gdb/python --with-build-time-tools=/opt/loongson-gcc8.3.0-linux-gnu/install/mips-loongson-gcc8-linux-gnu-2021-02-08/mips-linux-gnu/bin --with-build-time-tools=/opt/loongson-gcc8.3.0-linux-gnu/install/mips-loongson-gcc8-linux-gnu-2021-02-08/mips-linux-gnu/bin SED=sed
Thread model: posix
gcc version 8.3.0 (loongson cross toolchain) 

4 编译

4.1 直接编译

$ mips-linux-gnu-gcc hello.c -mips64r2 -mabi=64 -o hello
$ file hello
hello: ELF 64-bit LSB executable, MIPS, MIPS64 rel2 version 1 (SYSV), dynamically linked, interpreter /lib64/ld.so.1, for GNU/Linux 3.2.0, with debug_info, not stripped

将编译的hello拷贝到龙芯3A4000机器上运行

$ ./hello 
hello world.

4.2 分步编译

预处理------编译-----汇编-----链接

加入-v参数,查看每一步的具体过程

预处理

$ mips-linux-gnu-gcc -march=mips64r2 -mabi=64 -v -E hello.c -o hello.i
Using built-in specs.
COLLECT_GCC=mips-linux-gnu-gcc
Target: mips-linux-gnu
Configured with: /opt/loongson-gcc8.3.0-linux-gnu/src/gcc-8.3.0/src/configure --build=x86_64-unkonwn-linux --host=x86_64-unkonwn-linux --target=mips-linux-gnu --enable-threads --disable-libmudflap --disable-libssp --disable-libstdcxx-pch --with-arch-32=mips32r2 --with-arch-64=mips64r2 --with-float=hard --with-mips-plt --enable-extra-sgxxlite-multilibs --with-gnu-as --with-gnu-ld --enable-languages=c,c++,fortran --enable-shared --enable-lto --enable-symvers=gnu --enable-__cxa_atexit --with-fix-loongson3-llsc --with-fused-madd4 --with-linker-hash-style=both --with-glibc-version=2.25 --with-pkgversion='loongson cross toolchain' --with-bugurl=http://bugs.loongnix.org/ --disable-nls --prefix=/opt/loongson --disable-libffi --disable-libquadmath --disable-libitm --disable-libatomic --with-sysroot=/opt/loongson/mips-linux-gnu/libc --with-build-sysroot=/opt/loongson-gcc8.3.0-linux-gnu/install/mips-loongson-gcc8-linux-gnu-2021-02-08/mips-linux-gnu/libc --with-gmp=/opt/loongson-gcc8.3.0-linux-gnu/obj/pkg-mips-linux-gnu/host-libs-x86_64-pc-linux-gnu/usr --with-mpfr=/opt/loongson-gcc8.3.0-linux-gnu/obj/pkg-mips-linux-gnu/host-libs-x86_64-pc-linux-gnu/usr --with-mpc=/opt/loongson-gcc8.3.0-linux-gnu/obj/pkg-mips-linux-gnu/host-libs-x86_64-pc-linux-gnu/usr --disable-libgomp --disable-libitm --disable-libatomic --disable-libssp --disable-libcc1 --enable-poison-system-directories --with-python-dir=mips-linux-gnu/share/gdb/python --with-build-time-tools=/opt/loongson-gcc8.3.0-linux-gnu/install/mips-loongson-gcc8-linux-gnu-2021-02-08/mips-linux-gnu/bin --with-build-time-tools=/opt/loongson-gcc8.3.0-linux-gnu/install/mips-loongson-gcc8-linux-gnu-2021-02-08/mips-linux-gnu/bin SED=sed
Thread model: posix
gcc version 8.3.0 (loongson cross toolchain) 
COLLECT_GCC_OPTIONS='-march=mips64r2' '-mabi=64' '-v' '-E' '-o' 'hello.i' '-mhard-float' '-mllsc'  '-mfix-loongson3-llsc' '-mfused-madd4' '-mno-shared' '-EL'
 /home/loongson/cross/mips-loongson-gcc8-linux-gnu-2021-02-08/bin/../libexec/gcc/mips-linux-gnu/8.3.0/cc1 -E -quiet -v -imultilib 64 -iprefix /home/loongson/cross/mips-loongson-gcc8-linux-gnu-2021-02-08/bin/../lib/gcc/mips-linux-gnu/8.3.0/ -isysroot /home/loongson/cross/mips-loongson-gcc8-linux-gnu-2021-02-08/bin/../mips-linux-gnu/libc hello.c -o hello.i -mel -march=mips64r2 -mabi=64 -mhard-float -mllsc -mfix-loongson3-llsc -mfused-madd4 -mno-shared
ignoring duplicate directory "/home/loongson/cross/mips-loongson-gcc8-linux-gnu-2021-02-08/lib/gcc/mips-linux-gnu/8.3.0/include"
ignoring nonexistent directory "/home/loongson/cross/mips-loongson-gcc8-linux-gnu-2021-02-08/bin/../mips-linux-gnu/libc/usr/local/include"
ignoring duplicate directory "/home/loongson/cross/mips-loongson-gcc8-linux-gnu-2021-02-08/lib/gcc/mips-linux-gnu/8.3.0/include-fixed/64"
ignoring duplicate directory "/home/loongson/cross/mips-loongson-gcc8-linux-gnu-2021-02-08/mips-linux-gnu/include"
#include "..." search starts here:
#include <...> search starts here:
 /home/loongson/cross/mips-loongson-gcc8-linux-gnu-2021-02-08/lib/gcc/mips-linux-gnu/8.3.0/include
 /home/loongson/cross/mips-loongson-gcc8-linux-gnu-2021-02-08/lib/gcc/mips-linux-gnu/8.3.0/include-fixed/64
 /home/loongson/cross/mips-loongson-gcc8-linux-gnu-2021-02-08/mips-linux-gnu/include
 /home/loongson/cross/mips-loongson-gcc8-linux-gnu-2021-02-08/mips-linux-gnu/libc/usr/include
End of search list.
COMPILER_PATH=/home/loongson/cross/mips-loongson-gcc8-linux-gnu-2021-02-08/bin/../libexec/gcc/mips-linux-gnu/8.3.0/:/home/loongson/cross/mips-loongson-gcc8-linux-gnu-2021-02-08/bin/../libexec/gcc/:/home/loongson/cross/mips-loongson-gcc8-linux-gnu-2021-02-08/bin/../lib/gcc/mips-linux-gnu/8.3.0/../../../../mips-linux-gnu/bin/
LIBRARY_PATH=/home/loongson/cross/mips-loongson-gcc8-linux-gnu-2021-02-08/bin/../lib/gcc/mips-linux-gnu/8.3.0/64/:/home/loongson/cross/mips-loongson-gcc8-linux-gnu-2021-02-08/bin/../lib/gcc/mips-linux-gnu/8.3.0/../../../../mips-linux-gnu/lib/../lib64/:/home/loongson/cross/mips-loongson-gcc8-linux-gnu-2021-02-08/bin/../mips-linux-gnu/libc//lib64/../lib64/:/home/loongson/cross/mips-loongson-gcc8-linux-gnu-2021-02-08/bin/../mips-linux-gnu/libc//usr/lib64/../lib64/:/home/loongson/cross/mips-loongson-gcc8-linux-gnu-2021-02-08/bin/../lib/gcc/mips-linux-gnu/8.3.0/:/home/loongson/cross/mips-loongson-gcc8-linux-gnu-2021-02-08/bin/../lib/gcc/:/home/loongson/cross/mips-loongson-gcc8-linux-gnu-2021-02-08/bin/../lib/gcc/mips-linux-gnu/8.3.0/../../../../mips-linux-gnu/lib/:/home/loongson/cross/mips-loongson-gcc8-linux-gnu-2021-02-08/bin/../mips-linux-gnu/libc//lib64/:/home/loongson/cross/mips-loongson-gcc8-linux-gnu-2021-02-08/bin/../mips-linux-gnu/libc//usr/lib64/
COLLECT_GCC_OPTIONS='-march=mips64r2' '-mabi=64' '-v' '-E' '-o' 'hello.i' '-mhard-float' '-mllsc'  '-mfix-loongson3-llsc' '-mfused-madd4' '-mno-shared' '-EL'

编译

$ mips-linux-gnu-gcc -march=mips64r2 -mabi=64 -v  -s hello.i -o hello.s
Using built-in specs.
COLLECT_GCC=mips-linux-gnu-gcc
COLLECT_LTO_WRAPPER=/home/loongson/cross/mips-loongson-gcc8-linux-gnu-2021-02-08/bin/../libexec/gcc/mips-linux-gnu/8.3.0/lto-wrapper
Target: mips-linux-gnu
Configured with: /opt/loongson-gcc8.3.0-linux-gnu/src/gcc-8.3.0/src/configure --build=x86_64-unkonwn-linux --host=x86_64-unkonwn-linux --target=mips-linux-gnu --enable-threads --disable-libmudflap --disable-libssp --disable-libstdcxx-pch --with-arch-32=mips32r2 --with-arch-64=mips64r2 --with-float=hard --with-mips-plt --enable-extra-sgxxlite-multilibs --with-gnu-as --with-gnu-ld --enable-languages=c,c++,fortran --enable-shared --enable-lto --enable-symvers=gnu --enable-__cxa_atexit --with-fix-loongson3-llsc --with-fused-madd4 --with-linker-hash-style=both --with-glibc-version=2.25 --with-pkgversion='loongson cross toolchain' --with-bugurl=http://bugs.loongnix.org/ --disable-nls --prefix=/opt/loongson --disable-libffi --disable-libquadmath --disable-libitm --disable-libatomic --with-sysroot=/opt/loongson/mips-linux-gnu/libc --with-build-sysroot=/opt/loongson-gcc8.3.0-linux-gnu/install/mips-loongson-gcc8-linux-gnu-2021-02-08/mips-linux-gnu/libc --with-gmp=/opt/loongson-gcc8.3.0-linux-gnu/obj/pkg-mips-linux-gnu/host-libs-x86_64-pc-linux-gnu/usr --with-mpfr=/opt/loongson-gcc8.3.0-linux-gnu/obj/pkg-mips-linux-gnu/host-libs-x86_64-pc-linux-gnu/usr --with-mpc=/opt/loongson-gcc8.3.0-linux-gnu/obj/pkg-mips-linux-gnu/host-libs-x86_64-pc-linux-gnu/usr --disable-libgomp --disable-libitm --disable-libatomic --disable-libssp --disable-libcc1 --enable-poison-system-directories --with-python-dir=mips-linux-gnu/share/gdb/python --with-build-time-tools=/opt/loongson-gcc8.3.0-linux-gnu/install/mips-loongson-gcc8-linux-gnu-2021-02-08/mips-linux-gnu/bin --with-build-time-tools=/opt/loongson-gcc8.3.0-linux-gnu/install/mips-loongson-gcc8-linux-gnu-2021-02-08/mips-linux-gnu/bin SED=sed
Thread model: posix
gcc version 8.3.0 (loongson cross toolchain) 
COLLECT_GCC_OPTIONS='-march=mips64r2' '-mabi=64' '-v' '-s' '-o' 'hello.s' '-mhard-float' '-mllsc'  '-mfix-loongson3-llsc' '-mfused-madd4' '-mno-shared' '-EL'
 /home/loongson/cross/mips-loongson-gcc8-linux-gnu-2021-02-08/bin/../libexec/gcc/mips-linux-gnu/8.3.0/cc1 -fpreprocessed hello.i -mel -quiet -dumpbase hello.i -march=mips64r2 -mabi=64 -mhard-float -mllsc -mfix-loongson3-llsc -mfused-madd4 -mno-shared -auxbase hello -version -o /tmp/ccGbgOod.s
GNU C17 (loongson cross toolchain) version 8.3.0 (mips-linux-gnu)
	compiled by GNU C version 4.4.7 20120313 (Red Hat 4.4.7-23), GMP version 6.1.2, MPFR version 4.0.2, MPC version 1.1.0, isl version none
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
GNU C17 (loongson cross toolchain) version 8.3.0 (mips-linux-gnu)
	compiled by GNU C version 4.4.7 20120313 (Red Hat 4.4.7-23), GMP version 6.1.2, MPFR version 4.0.2, MPC version 1.1.0, isl version none
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
Compiler executable checksum: 93d86743fd86b57bd034193cfa73bcc3
COLLECT_GCC_OPTIONS='-march=mips64r2' '-mabi=64' '-v' '-s' '-o' 'hello.s' '-mhard-float' '-mllsc'  '-mfix-loongson3-llsc' '-mfused-madd4' '-mno-shared' '-EL'
 /home/loongson/cross/mips-loongson-gcc8-linux-gnu-2021-02-08/bin/../lib/gcc/mips-linux-gnu/8.3.0/../../../../mips-linux-gnu/bin/as -v -EL -O1 -mabi=64 -march=mips64r2 -mno-shared -mhard-float -KPIC -o /tmp/ccQugjiD.o /tmp/ccGbgOod.s
GNU assembler version 2.31.1 (mips-linux-gnu) using BFD version (loongson cross toolchain) 2.31.1
COMPILER_PATH=/home/loongson/cross/mips-loongson-gcc8-linux-gnu-2021-02-08/bin/../libexec/gcc/mips-linux-gnu/8.3.0/:/home/loongson/cross/mips-loongson-gcc8-linux-gnu-2021-02-08/bin/../libexec/gcc/:/home/loongson/cross/mips-loongson-gcc8-linux-gnu-2021-02-08/bin/../lib/gcc/mips-linux-gnu/8.3.0/../../../../mips-linux-gnu/bin/
LIBRARY_PATH=/home/loongson/cross/mips-loongson-gcc8-linux-gnu-2021-02-08/bin/../lib/gcc/mips-linux-gnu/8.3.0/64/:/home/loongson/cross/mips-loongson-gcc8-linux-gnu-2021-02-08/bin/../lib/gcc/mips-linux-gnu/8.3.0/../../../../mips-linux-gnu/lib/../lib64/:/home/loongson/cross/mips-loongson-gcc8-linux-gnu-2021-02-08/bin/../mips-linux-gnu/libc//lib64/../lib64/:/home/loongson/cross/mips-loongson-gcc8-linux-gnu-2021-02-08/bin/../mips-linux-gnu/libc//usr/lib64/../lib64/:/home/loongson/cross/mips-loongson-gcc8-linux-gnu-2021-02-08/bin/../lib/gcc/mips-linux-gnu/8.3.0/:/home/loongson/cross/mips-loongson-gcc8-linux-gnu-2021-02-08/bin/../lib/gcc/:/home/loongson/cross/mips-loongson-gcc8-linux-gnu-2021-02-08/bin/../lib/gcc/mips-linux-gnu/8.3.0/../../../../mips-linux-gnu/lib/:/home/loongson/cross/mips-loongson-gcc8-linux-gnu-2021-02-08/bin/../mips-linux-gnu/libc//lib64/:/home/loongson/cross/mips-loongson-gcc8-linux-gnu-2021-02-08/bin/../mips-linux-gnu/libc//usr/lib64/
COLLECT_GCC_OPTIONS='-march=mips64r2' '-mabi=64' '-v' '-s' '-o' 'hello.s' '-mhard-float' '-mllsc'  '-mfix-loongson3-llsc' '-mfused-madd4' '-mno-shared' '-EL'
 /home/loongson/cross/mips-loongson-gcc8-linux-gnu-2021-02-08/bin/../libexec/gcc/mips-linux-gnu/8.3.0/collect2 -plugin /home/loongson/cross/mips-loongson-gcc8-linux-gnu-2021-02-08/bin/../libexec/gcc/mips-linux-gnu/8.3.0/liblto_plugin.so -plugin-opt=/home/loongson/cross/mips-loongson-gcc8-linux-gnu-2021-02-08/bin/../libexec/gcc/mips-linux-gnu/8.3.0/lto-wrapper -plugin-opt=-fresolution=/tmp/cce3yhd3.res -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s --sysroot=/home/loongson/cross/mips-loongson-gcc8-linux-gnu-2021-02-08/bin/../mips-linux-gnu/libc/ --eh-frame-hdr --hash-style=both -EL -dynamic-linker /lib64/ld.so.1 -melf64ltsmip -o hello.s -s /home/loongson/cross/mips-loongson-gcc8-linux-gnu-2021-02-08/bin/../mips-linux-gnu/libc//usr/lib64/../lib64/crt1.o /home/loongson/cross/mips-loongson-gcc8-linux-gnu-2021-02-08/bin/../mips-linux-gnu/libc//usr/lib64/../lib64/crti.o /home/loongson/cross/mips-loongson-gcc8-linux-gnu-2021-02-08/bin/../lib/gcc/mips-linux-gnu/8.3.0/64/crtbegin.o -L/home/loongson/cross/mips-loongson-gcc8-linux-gnu-2021-02-08/bin/../lib/gcc/mips-linux-gnu/8.3.0/64 -L/home/loongson/cross/mips-loongson-gcc8-linux-gnu-2021-02-08/bin/../lib/gcc/mips-linux-gnu/8.3.0/../../../../mips-linux-gnu/lib/../lib64 -L/home/loongson/cross/mips-loongson-gcc8-linux-gnu-2021-02-08/bin/../mips-linux-gnu/libc//lib64/../lib64 -L/home/loongson/cross/mips-loongson-gcc8-linux-gnu-2021-02-08/bin/../mips-linux-gnu/libc//usr/lib64/../lib64 -L/home/loongson/cross/mips-loongson-gcc8-linux-gnu-2021-02-08/bin/../lib/gcc/mips-linux-gnu/8.3.0 -L/home/loongson/cross/mips-loongson-gcc8-linux-gnu-2021-02-08/bin/../lib/gcc -L/home/loongson/cross/mips-loongson-gcc8-linux-gnu-2021-02-08/bin/../lib/gcc/mips-linux-gnu/8.3.0/../../../../mips-linux-gnu/lib -L/home/loongson/cross/mips-loongson-gcc8-linux-gnu-2021-02-08/bin/../mips-linux-gnu/libc//lib64 -L/home/loongson/cross/mips-loongson-gcc8-linux-gnu-2021-02-08/bin/../mips-linux-gnu/libc//usr/lib64 /tmp/ccQugjiD.o -lgcc --push-state --as-needed -lgcc_s --pop-state -lc -lgcc --push-state --as-needed -lgcc_s --pop-state /home/loongson/cross/mips-loongson-gcc8-linux-gnu-2021-02-08/bin/../lib/gcc/mips-linux-gnu/8.3.0/64/crtend.o /home/loongson/cross/mips-loongson-gcc8-linux-gnu-2021-02-08/bin/../mips-linux-gnu/libc//usr/lib64/../lib64/crtn.o
COLLECT_GCC_OPTIONS='-march=mips64r2' '-mabi=64' '-v' '-s' '-o' 'hello.s' '-mhard-float' '-mllsc'  '-mfix-loongson3-llsc' '-mfused-madd4' '-mno-shared' '-EL'

汇编
需要添加参数*-EL -O1 -mabi=64 -march=mips64r2 -mno-shared -mhard-float -KPIC *,此处的添加,请参考编译步骤的输出信息

$mips-linux-gnu-as -EL -O1 -mabi=64 -march=mips64r2 -mno-shared -mhard-float -KPIC hello.S -o hello.o

链接

$ mips-linux-gnu-ld -m elf64ltsmip /home/loongson/cross/mips-loongson-gcc8-linux-gnu-2021-02-08/bin/../mips-linux-gnu/libc//usr/lib64/../lib64/crt1.o /home/loongson/cross/mips-loongson-gcc8-linux-gnu-2021-02-08/bin/../mips-linux-gnu/libc//usr/lib64/../lib64/crti.o /home/loongson/cross/mips-loongson-gcc8-linux-gnu-2021-02-08/bin/../lib/gcc/mips-linux-gnu/8.3.0/64/crtbegin.o -L/home/loongson/cross/mips-loongson-gcc8-linux-gnu-2021-02-08/bin/../lib/gcc/mips-linux-gnu/8.3.0/64 -L/home/loongson/cross/mips-loongson-gcc8-linux-gnu-2021-02-08/bin/../lib/gcc/mips-linux-gnu/8.3.0/../../../../mips-linux-gnu/lib/../lib64 -L/home/loongson/cross/mips-loongson-gcc8-linux-gnu-2021-02-08/bin/../mips-linux-gnu/libc//lib64/../lib64 -L/home/loongson/cross/mips-loongson-gcc8-linux-gnu-2021-02-08/bin/../mips-linux-gnu/libc//usr/lib64/../lib64 -L/home/loongson/cross/mips-loongson-gcc8-linux-gnu-2021-02-08/bin/../lib/gcc/mips-linux-gnu/8.3.0 -L/home/loongson/cross/mips-loongson-gcc8-linux-gnu-2021-02-08/bin/../lib/gcc -L/home/loongson/cross/mips-loongson-gcc8-linux-gnu-2021-02-08/bin/../lib/gcc/mips-linux-gnu/8.3.0/../../../../mips-linux-gnu/lib -L/home/loongson/cross/mips-loongson-gcc8-linux-gnu-2021-02-08/bin/../mips-linux-gnu/libc//lib64 -L/home/loongson/cross/mips-loongson-gcc8-linux-gnu-2021-02-08/bin/../mips-linux-gnu/libc//usr/lib64 hello.o -lgcc --push-state --as-needed -lgcc_s --pop-state -lc -lgcc --push-state --as-needed -lgcc_s --pop-state /home/loongson/cross/mips-loongson-gcc8-linux-gnu-2021-02-08/bin/../lib/gcc/mips-linux-gnu/8.3.0/64/crtend.o /home/loongson/cross/mips-loongson-gcc8-linux-gnu-2021-02-08/bin/../mips-linux-gnu/libc//usr/lib64/../lib64/crtn.o -o hello

生成hello可执行程序

$ file hello
hello: ELF 64-bit LSB executable, MIPS, MIPS64 rel2 version 1 (SYSV), dynamically linked, interpreter /lib64/ld.so.1, for GNU/Linux 3.2.0, not stripped

注意上述命令的-m elf64ltsmip参数
通过如下方式获取ld的仿真类型

$ mips-linux-gnu-ld -V
GNU ld (loongson cross toolchain) 2.31.1
  Supported emulations:
   elf32btsmip
   elf32ltsmip
   elf32btsmipn32
   elf64btsmip
   elf32ltsmipn32
   elf64ltsmip

此处选择elf64ltsmip(64位小端)

4.3 sysroot的使用

4.3.1 挂载远端sysroot

$ mkdir sysroot
sshfs test@192.168.20.1:/ sysroot/

4.3.2 编译

$ mips-linux-gnu-gcc -march=mips64r2 -mabi=64 -B ./sysroot/lib/mips64el-linux-gnuabi64/ --sysroot=$PWD/sysroot hello.c -o hello
$ file hello
hello: ELF 64-bit LSB executable, MIPS, MIPS64 rel2 version 1 (SYSV), dynamically linked, interpreter /lib64/ld.so.1, for GNU/Linux 3.2.0, not stripped
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
驱动器 D 中的卷是 LINUX 卷的序列号是 4471-561B D:\桌面\mips交叉编译环境 的目录 2009-10-22 20:27 <DIR> . 2009-10-22 20:27 <DIR> .. 2009-10-22 20:09 27,425,338 gcc-3.4.3.tar.bz2 2009-10-22 20:08 7,421,782 binutils-2.10.91.0.2.tar.bz2 2009-10-22 20:08 242,445 glibc-linuxthreads-2.5.tar.bz2 2009-10-22 20:10 20,544,628 glibc-2.5.tar.gz 2009-10-22 20:20 1,720 elf-machine-rela-mips.dpatch 2009-10-22 20:26 4,727 建立基于linuxMIPS交叉编译环境 .txt 6 个文件 55,640,640 字节 2 个目录 6,793,084,928 可用字节 三、构建过程 1、准备环境 目标平台: mipsel-linux(即little endian,x86也是little endian的,不懂的话自己到网上查资料吧) 安装目录: /usr/local/crossdev 源代码安装目录: /usr/local/src 注:没有的目录请自行建立。 2、准备MIPS环境的头文件 我们是在i386下编译的,但要使用MIPS的头文件定义才能正确编译MIPS交叉编译工具。这些头文件都在kernel源程序中。 cd /usr/local/src/ tar xzvf linux-2.4.2.tar.gz cd linux/ make ARCH=mips menuconfig 在"CPU selection"中, 选中"(R3000) CPU type",也可以选你实际的MIPS平台的CPU类型 在"General setup"中, 选中"Generate little endian code" make dep mkdir -p /usr/local/crossdev/mipsel-linux/include cp -r /usr/local/src/linux/include/asm-mips /usr/local/crossdev/mipsel-linux/include/asm cp -r /usr/local/src/linux/include/linux /usr/local/crossdev/mipsel-linux/include/ 3、编译binutils cd /usr/local/src/ tar xzvf binutils-2.11.90.0.31.tar.gz cd binutils-2.11.90.0.31/ ./configure --target=mipsel-linux --prefix=/usr/local/crossdev make make install export PATH=/usr/local/crossdev/bin:$PATH 4、编译自举的(bootstrap)gcc 因为这时还没有MIPS的glibc库可以使用,只能编译一个最简单的gcc,用这个gcc编译出glibc后就可以再编译一个完成的gcc了。 cd /usr/local/src/ tar xzvf gcc-3.0.2.tar.gz cd gcc-3.0.2/ ./configure --target=mipsel-linux --prefix=/usr/local/crossdev --enable-languages=c --with-newlib --disable-shared make make install 注:以上编译安装的工具已经可以直接编译MIPS的kernel(make zImage)了。 5、编译glibc 现在可以使用刚才建立的binutils和gcc来编译MIPS的glibc了。 cd /usr/local/src/ tar xzvf glibc-2.2.3.tar.gz cd glibc-2.2.3/ tar xzvf ../glibc-linuxthreads-2.2.3.tar.gz patch -p1 < ../glibc-2.2.3-mips-base-addr-got.diff CC=mipsel-linux-gcc AR=mipsel-linux-ar RANLIB=mipsel-linux-ranlib ./configure --host=mipsel-linux --prefix=/usr/local/crossdev/mipsel-linux --enable-add-ons=linuxthreads make make install 6、重新编译完整的gcc cd /usr/local/src/ rm -rf gcc-3.0.2/ tar xzvf gcc-3.0.2.tar.gz cd gcc-3.0.2/ ./configure --target=mipsel-linux --prefix=/usr/local/crossdev --enable-languages=c,c++ make make install 以上就构建好了一套自己的MIPS交叉编译环境,目录在/usr/local/crossdev下,你可以把它打包拷贝到其它i386的Linux系统下也能使用。 要使用其来交叉编译时请先加上PATH环境变量:export PATH=/usr/local/crossdev/bin:$PATH
程序交叉编译是将源代码从一种体系结构编译成另一种体系结构的过程。通常情况下,程序员编写的代码是针对特定的计算机体系结构编写的,例如 x86、ARM、MIPS 等。但是,如果需要在不同的体系结构上运行相同的代码,就需要进行交叉编译交叉编译器是一个专门设计用于将源代码从一种体系结构编译成另一种体系结构的编译器。交叉编译器通常包括两个部分:前端和后端。前端负责将源代码转换为中间表示形式(IR),而后端负责将中间表示形式转换为目标体系结构的机器代码。 整个交叉编译的过程可以分为以下几个步骤: 1. 编写源代码:程序员编写源代码,通常是使用 C、C++ 或其他高级语言。 2. 预处理:源代码经过预处理器处理,包括宏展开、条件编译等操作。 3. 编译:源代码经过交叉编译器的前端处理,生成中间表示形式(IR)。 4. 优化:对中间表示形式进行优化,以提高代码的性能和效率。 5. 代码生成:将优化后的中间表示形式转换为目标体系结构的机器代码。 6. 链接:将生成的目标文件与库文件等进行链接,生成最终的可执行文件。 需要注意的是,交叉编译的过程需要考虑目标体系结构的硬件特性、操作系统、ABI 等因素,因此需要使用特定的交叉编译器和工具链。同时,也需要特别注意程序中的平台相关代码,确保在不同体系结构上的兼容性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值