У меня есть небольшая часть оболочки C, которая находится между Postgres API и моим кодом Rust.Мне нужно экспортировать эти функции 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.