Modules

From LinuxMIPS
Revision as of 13:03, 11 November 2004 by Ralf (Talk | contribs)

(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search

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.