我在Postgres API和我的Rust代码之间有一点包装C。我需要导出这些C函数,以便Postgres可以调用它。
我已经尝试过dylib
和cdylib
软件包。 dylib
导出我期望的符号:
$ nm target/release/libfdwtrait.so | grep add_one
0000000000005ef0 T add_one
0000000000005ee0 T pg_finfo_add_one
但是它需要一个libstd共享对象:
$ ldd target/release/libfdwtrait.so
linux-vdso.so.1 (0x000000740050d000)
libstd-6c11f2ad6c829596.so => not found
libgcc_s.so.1 => /lib/aarch64-linux-gnu/libgcc_s.so.1 (0x000000740049a000)
libc.so.6 => /lib/aarch64-linux-gnu/libc.so.6 (0x0000007400350000)
/lib/ld-linux-aarch64.so.1 (0x00000074004e2000)
cdylib
不会导出我需要的C函数:
$ nm target/release/libfdwtrait.so | grep add_one
zsh: done nm ../target/release/libfdwtrait.so |
zsh: exit 1 grep --color=auto add_one
但也不需要共享对象
$ ldd ../target/release/libfdwtrait.so
linux-vdso.so.1 (0x000000796a39b000)
libdl.so.2 => /lib/aarch64-linux-gnu/libdl.so.2 (0x000000796a31c000)
libpthread.so.0 => /lib/aarch64-linux-gnu/libpthread.so.0 (0x000000796a2f0000)
libgcc_s.so.1 => /lib/aarch64-linux-gnu/libgcc_s.so.1 (0x000000796a2ce000)
libc.so.6 => /lib/aarch64-linux-gnu/libc.so.6 (0x000000796a184000)
/lib/ld-linux-aarch64.so.1 (0x000000796a370000)
src / fdw.c :
PG_FUNCTION_INFO_V1(add_one);
Datum
add_one(PG_FUNCTION_ARGS)
{
int32 arg = PG_GETARG_INT32(0);
int32 result = call_from_c(arg);
PG_RETURN_INT32(result);
}
src / lib.rs :
#[no_mangle]
pub extern "C" fn call_from_c(i: libc::int32_t) -> libc::int32_t {
i * 2
}
我需要同时具有cdylib
和dylib
的某些属性。不幸的是,它们似乎在Cargo代码库中进行了硬编码。