2012-03-23 35 views
32

từ hereÝ nghĩa của "EXPORT_SYMBOL" trong mã nhân Linux là gì?

48 struct snd_card *snd_cards[SNDRV_CARDS]; 
49 EXPORT_SYMBOL(snd_cards); 

tôi không nhận được whats ý nghĩa của nó và tại sao điều đó được sử dụng. Tôi đã cố gắng tìm kiếm nó nhưng không hiểu ý nghĩa của nó.

+1

http://stackoverflow.com/questions/6670589/use-of-export-symbol có thể được sử dụng – Bart

+0

thông tin tuyệt vời về điều này có thể được tìm thấy [nghe] (http://tuxthink.blogspot.in/2011/ 07/export-symbols-from-module.html) –

+0

Ví dụ về runnable tối thiểu: https://stackoverflow.com/a/44614246/895245 –

Trả lời

33

Nó làm cho một biểu tượng có thể truy cập vào các mô-đun được nạp động (miễn là các mô-đun được thêm vào khai báo extern).

Cách đây không lâu, someone asked how to use it.

+1

Được xác định ở đâu? Làm thế nào nó hoạt động? –

+0

@cirosantilli Nó được định nghĩa trong 'include/linux/export.h'. Tìm 'ksymtab' và' kstrtab'. – cnicutar

+0

Bất cứ ai biết dưới phiên bản hạt nhân /include/linux/export.h đã được thêm vào? (Hoặc một cách dễ dàng để kiểm tra mà không phải đi qua từng cây nguồn hạt nhân duy nhất) Tôi không thấy nó trong 2.6.39.4. – sager89

3

Không phải là câu trả lời, mà là một minh chứng, như đã hứa từ nhận xét của tôi, rằng các ký hiệu xuất khẩu không phải là được yêu cầu không tĩnh. Các dưới 2 module chứng minh điều này:

/* mod1.c */ 
#include <linux/module.h> 

static int mod1_exp_func(int i) 
{ 
    pr_info("%s:%d the value passed in is %d\n", 
      __func__, __LINE__, i); 

    return i; 
} 
EXPORT_SYMBOL(mod1_exp_func); /* export static symbol */ 

static int __init mod1_init(void) 
{ 
    pr_info("Initializing simple mod\n"); 
    return 0; 
} 

static void __exit mod1_exit(void) 
{ 
    pr_info("This module is exiting\n"); 
} 

module_init(mod1_init); 
module_exit(mod1_exit); 
MODULE_LICENSE("GPL v2"); 

Và các mô-đun thứ hai

/* mod2.c */ 
#include <linux/module.h> 

extern int mod1_exp_func(int); 

static int __init mod2_init(void) 
{ 
    pr_info("Initializing mod2\n"); 
    pr_info("Calling exported function in mod1\n"); 
    mod1_exp_func(3); 
    return 0; 
} 

static void __exit mod2_exit(void) 
{ 
    pr_info("mod2 exiting\n"); 
} 

module_init(mod2_init); 
module_exit(mod2_exit); 
MODULE_LICENSE("GPL v2"); 

Chúng được thử nghiệm trên CentOS 6 & CentOS 7: kernel 2.6.32 và 3.10 (tương ứng). Đang tải mod1.ko và sau đó mod2.ko sẽ dẫn đến giá trị được chuyển đến mod1_exp_func() được in vào bộ đệm nhật ký hạt nhân.

+1

Liệu nó có hoạt động nếu các chức năng không tĩnh? Bởi vì tôi đã thử làm cho các hàm không tĩnh và trong khi một trong các tệp đã có trong thư mục con, làm cho mô-đun đó đang ném một cảnh báo nói rằng các hàm đã xuất không được xác định trong mô-đun hiện có trong thư mục con. Và khi tôi tạo ra các định nghĩa tĩnh, nó hoạt động. –

Các vấn đề liên quan