这种情况一般出现在汇编代码中。有些跳转指令的跳转范围很小。而当要跳转到的地址超出了范围,那么就会报错!
对于x86:
最终的原因是使用参数-mcmodel=kernel,只能使用最高2G最低2G的内存空间,如果想使用更多的大内存空间,应该使用-mcmodel=large。
对于ppc:
mcmodel对于ppc并不适用,我们在网上搜索找到了-mlongcall参数,加入到base_cflags中。
这对于c源码文件很有效果。可是如果写在汇编里的跳转指令,则没法了。
这时候,也许我们应该想想是否可以改汇编。或者,把跳转指令后面跟的跳转地址放在跳转指令的跳转范围之内。
对于MIPS:
修改Makefile的编译选项为:CFLAGS = -msingle-float -mips32 -Wa,-xgot -mno-abicalls -fno-pic即可
i386 、x86_64 、ppc是指CPU的架构
1、i386:是指兼容Intel 80386处理器
x86或80x86是英代爾Intel首先开发制造的一种微处理器体系结构的泛称。
該系列較早期的處理器名稱是以數字來表示,並以“86”作為結尾,包括Intel 8086、80186、80286、80386以及80486,因此其架構被稱為“x86”。由於數字並不能作為註冊商標,因此Intel及其競爭者均在新一代處理器使用可註冊的名稱,如Pentium。現時Intel把x86-32稱為IA-32,全名為Intel Architecture, 32-bit。不過由於x86包括16位的處理器,這樣的命名也出現麻煩
2、x86_64:AMD64
又稱「x86-64」或「x64」,是一種64位元的電腦處理器架構。它是建基於現有32位元的x86架構,由AMD公司所開發,應用AMD64指令集的自家產品有Athlon 64、Athlon 64 FX、Athlon 64 X2、Turion 64、Opteron及最新的Sempron處理器
3、ppc:IBM® POWER Architecture 体系
是RISC指令集的CPU
4、AArch64是ARMv8 架构的一种执行状态。
为了更广泛地向企业领域推进,需要引入 64 位构架。同时也需要在 ARMv8 架构中引入新的 AArch64 执行状态。AArch64 不是一个单纯的 32 位 ARM 构架扩展,而是 ARMv8 内全新的构架,完全使用全新的 A64 指令集。
5、S390X
s390x 是 IBM System z 系列 (zSeries)大型机 (mainframe) 硬件平台,是银行或者大型企业或者科研单位用的,大部分用户接触不到。