http://www.linux-mips.org/wiki/Modules
Modules
Insmod complains about the _gp_disp symbol being undefined
_gp_disp
is a magic symbol used with PIC code on MIPS. Be happy, this error message saved you from crashing your system. You should use the same compiler options to compile a kernel module as the kernel makefiles do. In particular the options
-fno-pic -mno-abicalls
are important.
Loading a module results in relocation overflow errors
The attempt to load a module results in relocation overflow messages for virtually every function used in the kernel:
mymod.o: Relocation overflow of type 4 for printk
mymod.o: Relocation overflow of type 4 for printk
mymod.o: Relocation overflow of type 4 for printk
mymod.o: Relocation overflow of type 4 for alloc_etherdev
...
This error is caused by the limited range of relocation type 4 (R_MIPS26) which due to it's 26-bit offset only has a 28-bit reach. Modules and kernels happen to be located very far from each other and as the result this 28-bit range is insufficient. Insmod, not being stupid notices the problem and issues this error message.
The solution is the same as in the previous section. When compiling a kernel you
must use the same compiler flags for modules as your actual kernel source is using in this particular kernel configuration. These are different from the flags that are used during the build of the kernel itself. In this particular case the module was built without
-mlong-calls
which is causing this kind of error.