亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 4382 | 回復(fù): 1
打印 上一主題 下一主題

請(qǐng)教EXPORT_SYMBOL的用法! [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2006-04-13 13:37 |只看該作者 |倒序?yàn)g覽
由于我剛剛開始進(jìn)行內(nèi)核編程,所以,請(qǐng)你幫我解決如下問題:
在nfqueue.c中用EXPORT_SYMBOL定義了__dequeue和cbq符號(hào),并且加載后用ksyms可以看到該符號(hào),但在queue_m.c中調(diào)用時(shí),加載后出現(xiàn): unresolved symbol cbq和unresolved symbol __dequeue.
為什么會(huì)出現(xiàn)該問題?
我的程序如下:
/* nfqueue.c */
#define __KERNEL__
#define MODULE
#include <linux/module.h>
#include <linux/netdevice.h>
#include <linux/kernel.h>
#include <linux/netfilter.h>
#include <linux/netfilter_ipv4.h>
#include <linux/skbuff.h>
#include <linux/config.h>
#include <net/ip.h>
#include <linux/inet.h>

static struct nf_hook_ops nfho_pre;

struct data_class_head {
        unsigned int qlen;
        struct data_class        *next;               
        struct data_class        *prev;

};
struct data_class {
        struct data_class *next;
        struct sk_buff *data;
};

struct data_class_head *cbq;

EXPORT_SYMBOL( cbq );

int queue_empty(struct data_class_head *list)
{
        return (list->next == (struct data_class *) list);
}
void __queue_init(struct data_class_head *list)
{
        printk("Enter queue_init\n";
        list->prev = list->next = NULL;
        list->qlen = 0;
}
void __queue_head(struct data_class_head *list, struct sk_buff *newskb)
{
        struct data_class *newptr;
        printk("Enter queue_head function \n";
        newptr = (struct data_class *)kmalloc(sizeof(struct data_class ),GFP_KERNEL);
      
        newptr->data = newskb;
        newptr->next = NULL;
        list->qlen++;      
        if( list->next == NULL )
        {
                list->next = list->prev = newptr;
        }
        else
                list->next = (list->next)->next = newptr;
}

struct sk_buff *__dequeue(struct data_class_head *list)
{
        struct data_class *result;

        if( list->prev == NULL )
        {
                printk("queue is null...\n";
                return NULL;
        }
        result = list->prev;
        list->prev = result->next;
        list->qlen--;
        if( list->prev == NULL )
                list->next = NULL;
        kfree(result);
        return (result->data);
}

EXPORT_SYMBOL(__dequeue );

unsigned int hook_pre_routing( unsigned int hooknum,
                struct sk_buff **skb,
                const struct net_device *in,
                const struct net_device *out,
                int (*okfn)(struct sk_buff *))
{
        printk("Enter NF_IP_PRE_ROUTING  ...\n";
        if((*skb)->nh.iph->saddr == in_aton("210.27.5.64" )
        {
                struct sk_buff *newskb;
                printk("Get message ...\n";

                newskb = kmalloc(sizeof(struct data_class_head),GFP_KERNEL);      
                //newskb->priority = 2;
                newskb = *skb;
                __queue_head(cbq,newskb);      
                              
                //return NF_ACCEPT;
                return NF_QUEUE;
        }
        else
                return NF_ACCEPT;
}

int init_module()
{
        //struct data_class_head *q;
        nfho_pre.hook = hook_pre_routing;
        nfho_pre.hooknum = NF_IP_PRE_ROUTING;
        nfho_pre.pf = PF_INET;
        nfho_pre.priority = NF_IP_PRI_FIRST;

        nf_register_hook( &nfho_pre );

        cbq = (struct data_class_head *)kmalloc(sizeof(struct data_class_head),GFP_KERNEL);      
        __queue_init(cbq);
        return 0;
}

void cleanup_module()
{
        nf_unregister_hook( &nfho_pre );
}

MODULE_LICENSE("GPL";


/*
* queue_m.c      
*
*/
#define __KERNEL__
#define MODULE
#include <linux/module.h>
#include <linux/netdevice.h>
#include <linux/kernel.h>
#include <linux/netfilter.h>
#include <linux/netfilter_ipv4.h>
#include <linux/skbuff.h>
#include <linux/config.h>
#include <linux/types.h>

extern struct data_class_head *cbq;
extern struct sk_buff *__dequeue( struct data_class_head *list);

static int cbwfq_queue( struct sk_buff *skb, struct nf_info *info, void *data)
{
        printk("Enter CBWFQ_QUEUE ...\n";

        skb = __dequeue( cbq );
        kfree(info);
        nf_reinject(skb,info, NF_ACCEPT);      
        return 0;
}

int init_module()
{
        nf_register_queue_handler(PF_INET, NULL, NULL );
        if(nf_register_queue_handler(PF_INET, cbwfq_queue, NULL ) < 0 )
        {
                printk("Register queue error !\n";
                return -1;
        }
      
        return 0;
}

void cleanup_module()
{
        nf_unregister_queue_handler(PF_INET);
}

MODULE_LICENSE("GPL";

論壇徽章:
0
2 [報(bào)告]
發(fā)表于 2006-04-17 15:38 |只看該作者
原帖由 sunxpa 于 2006-4-13 13:37 發(fā)表
由于我剛剛開始進(jìn)行內(nèi)核編程,所以,請(qǐng)你幫我解決如下問題:
在nfqueue.c中用EXPORT_SYMBOL定義了__dequeue和cbq符號(hào),并且加載后用ksyms可以看到該符號(hào),但在queue_m.c中調(diào)用時(shí),加載后出現(xiàn): unresolved symbol cbq和 ...


看樣子是2.4的內(nèi)核,一般2.6不會(huì)出現(xiàn)這樣的問題。
如果在2.4中無法導(dǎo)出symbol,請(qǐng)?jiān)贙ernel核心如arch/fs/mm等下面使用EXPORT_SYMBOL.
否則無法保證/proc/ksym中能導(dǎo)出你的接口。

也就是如果你自己外加的符號(hào)不采用此類方式,是無法讓其它引用的。

這是2.4問題。
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP