2017-05-10 20 views
4

我知道正常的方式,我试过了,但它似乎不起作用。如何在Linux内核中使用另一个c文件的变量?

在LINUX /网/排程/ sch_htb.c,我定义变量:

unsigned int queuelength; 
EXPORT_SYMBOL(queuelength); 

约在变量,而不是重要的一些行动。

在LINUX /网/的IPv4/tcp_dctcp.c,

extern unsigned int queuelength; 

错误配网/内置in.o:

In function `dctcp_update_alpha': 
linux/net/ipv4/tcp_dctcp.c:230: undefined reference to `queuelength' 

内核版本为V4.6。

+0

都是文件('网/排程/ sch_htb.c'和'网/支持IPv4/tcp_dctcp.c')被编译为内核核心的** **的部分(即不作为模块)?如果是这样,则不需要'EXPORT_SYMBOL'。请注意,文件的该汇编'排程/ sch_htb.c'取决于'CONFIG_NET_SCH_HTB'配置选项。如果将它作为模块进行编译,则不能使用内核中定义的符号。 – Tsyvarev

+0

我检查了 '的.config' 文件,其示出了 “CONFIG_TCP_CONG_DCTCP = Y ” 和 “CONFIG_NET_SCH_HTB = M”。我想,也许我应该从“M”到“Y”它改变和删除“EXPORT_SYMBOL'.Then我successfuly编译它? – Hunter

+0

我还有一个问题。我需要使用变量“queuelength”也在其他代码(OVS)。所以,也许我一定要预订“EXPORT_SYMBOL”和编译为模块?我不知道这件事,但是它没有很好地工作,而无需修改网/支持IPv4/tcp_dctcp.c.What我应该做处理在同一时间的两个问题? – Hunter

回答

1

这取决于如何源文件,它限定变量(通常,符号),和一个源文件,它使用变量(符号)被编译:作为内核模块的一部分,或者作为内核核心(即,内置进入内核)的一部分。

假设的源文件的名称是define-symbol.cuse-symbol.c相应地,你有5种可能:

  1. 两个define-symbol.cuse-symbol.c被编译到内核核心

    EXPORT_SYMBOL不需要

  2. define-symbol.c被编译进内核核心use-symbol.c被编译成内核模块

    EXPORT_SYMBOL需要

  3. define-symbol.c被编译成内核模块use-symbol.c被编译进内核核心

    不能使用这样的符号。

  4. define-symbol.cuse-symbol.c被编译成相同的内核模块

    EXPORT_SYMBOL不需要

  5. define-symbol.cuse-symbol.c被编译成不同的内核模块

    EXPORT_SYMBOL需要

注意,源代码编译的这种方式可能取决于配置选项

在你的情况下,看来你有情况3:如net/ipv4/tcp_dctcp.c用于built-in.o,它是内核核心的一部分。


注意,在任何情况下,变量应该是宣布使用它。否则,编译时会出现错误,而不是链接之一。

相关问题