I have 2 modules

Module A having function F() and also having init_module/cleanup_module .
Module B having function F() [ name is same as of A but function is difffernt ]and also having init_module/cleanup_module .


Requirement is that from module X init_module I want to call F() from module A . Then insmod B . Now the F() should be the function from module B and not A .I had tried declaring them as extern but essentially trampling into EIP =0x00000000 and there is a core dump

Approach 2 : Use a systemcall to proxy the function

A.c
/* Kernel includes */
#include <linux/config.h>
#include <linux/module.h>

extern void *sys_call_table[];
static asmlinkage void (*function)(void)
{
printk("Module A: I am a function A.F() .\n");
}


/* Initialize the module - call the function */
static int init_module()
{
printk("Module A: Init Module calls function A.F() .\n");
sys_call_table[300] = function ;
return sys_call_table[300];
}

B.c
/* Kernel includes */
#include <linux/config.h>
#include <linux/module.h>

extern void *sys_call_table[];
static asmlinkage void (*function)(void)
{
printk("Module A: I am a function A.F() .\n");
}


/* Initialize the module - call the function */
static int init_module()
{
printk("Module B: Init Module calls function B.F() .\n");
sys_call_table[300] = function ;
return sys_call_table[300];
}


void cleanup_module()
{
/* Return the system call back to normal */
"A.c" 25L, 487C
void cleanup_module()
{
/* Return the system call back to normal */
"A.c" 25L, 487C
}

These dont seem to work well
Can anyone suggest what is a better appraoch?