2017-05-10 91 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,它是內核核心的一部分。


注意,在任何情況下,變量應該是宣佈使用它。否則,編譯時會出現錯誤,而不是鏈接之一。

相關問題