Как выставить функции черты как внешние функции в cdylib? - PullRequest
1 голос
/ 25 февраля 2020

Я хотел бы определить черту с именем API, которая определяет набор функций, которые должны быть доступны для native. У меня может быть несколько реализаций API, поэтому эта черта гарантирует, что я по ошибке не пропущу функцию из набора.

Я объявил черту и реализовал ее:

pub trait API {
    extern "C" fn foo();
}

pub struct MyImpl1;
impl API for MyImpl1 {
    #[no_mangle]
    extern "C" fn foo() {
        println!("foo");
    }
}

Я компилирую ящик как cdylib с cargo build. Cargo.toml выглядит следующим образом:

[package]
name = "api-trait"
version = "0.1.0"
edition = "2018"

[lib]
crate-type = ["cdylib"]

Кажется, что даже когда я делаю MyImpl1 publi c, символ foo не существует в сгенерированном двоичном файле.

На macOS, используя nm target/debug/libapi_trait.dylib, я получил

0000000000000f64 s GCC_except_table10
                 U __Unwind_GetDataRelBase
                 U __Unwind_GetIPInfo
                 U __Unwind_GetLanguageSpecificData
                 U __Unwind_GetRegionStart
                 U __Unwind_GetTextRelBase
                 U __Unwind_SetGR
                 U __Unwind_SetIP
0000000000000ec0 t __ZN12panic_unwind3imp14find_eh_action28_$u7b$$u7b$closure$u7d$$u7d$17h882730ec655d7cb8E
0000000000000ed0 t __ZN12panic_unwind3imp14find_eh_action28_$u7b$$u7b$closure$u7d$$u7d$17hf5c37156294234d5E
0000000000000a10 t __ZN12panic_unwind5dwarf2eh20read_encoded_pointer17h9109e27fb696b750E
00000000000009e0 t __ZN4core3ops8function6FnOnce40call_once$u7b$$u7b$vtable.shim$u7d$$u7d$17h1282dc016f2aa15fE
00000000000009f0 t __ZN4core3ops8function6FnOnce40call_once$u7b$$u7b$vtable.shim$u7d$$u7d$17h6c6c5197d1b45824E
0000000000000a00 t __ZN4core3ptr18real_drop_in_place17ha0a3e8a3d7a638afE
0000000000002038 d __dyld_private
0000000000000bd0 T _rust_eh_personality
                 U dyld_stub_binder

На Linux, используя nm target/debug/libapi_trait.so, я получаю

0000000000202008 b __bss_start
0000000000202008 b completed.7697
                 w __cxa_finalize@@GLIBC_2.2.5
0000000000000710 t deregister_tm_clones
00000000000007a0 t __do_global_dtors_aux
0000000000201d28 t __do_global_dtors_aux_fini_array_entry
0000000000202000 d __dso_handle
0000000000201d90 d _DYNAMIC
0000000000202008 d _edata
0000000000202010 b _end
0000000000000ccc t _fini
00000000000007e0 t frame_dummy
0000000000201d20 t __frame_dummy_init_array_entry
0000000000000ecc r __FRAME_END__
0000000000201f90 d _GLOBAL_OFFSET_TABLE_
                 w __gmon_start__
0000000000000d30 r __GNU_EH_FRAME_HDR
00000000000006d8 t _init
                 w _ITM_deregisterTMCloneTable
                 w _ITM_registerTMCloneTable
0000000000000750 t register_tm_clones
00000000000009a0 T rust_eh_personality
0000000000202008 d __TMC_END__
                 U _Unwind_GetDataRelBase@@GCC_3.0
                 U _Unwind_GetIPInfo@@GCC_4.2.0
                 U _Unwind_GetLanguageSpecificData@@GCC_3.0
                 U _Unwind_GetRegionStart@@GCC_3.0
                 U _Unwind_GetTextRelBase@@GCC_3.0
                 U _Unwind_SetGR@@GCC_3.0
                 U _Unwind_SetIP@@GCC_3.0
0000000000000cb0 t _ZN12panic_unwind3imp14find_eh_action28_$u7b$$u7b$closure$u7d$$u7d$17h7d8572c3ef9c01a4E
0000000000000cc0 t _ZN12panic_unwind3imp14find_eh_action28_$u7b$$u7b$closure$u7d$$u7d$17h8f3ed794c49a4682E
0000000000000820 t _ZN12panic_unwind5dwarf2eh20read_encoded_pointer17he5d3453b5c6c588aE
00000000000007f0 t _ZN4core3ops8function6FnOnce40call_once$u7b$$u7b$vtable.shim$u7d$$u7d$17h91ae32eaf5f323cfE
0000000000000800 t _ZN4core3ops8function6FnOnce40call_once$u7b$$u7b$vtable.shim$u7d$$u7d$17h95ce8da4c283a783E
0000000000000810 t _ZN4core3ptr18real_drop_in_place17h02c8363f4a3e6833E

foo делает не существует ни в одном. Что я пропустил?

...