具有导出的C符号和静态链接的libstd的Rust库

时间:2018-12-31 03:07:38

标签: postgresql rust rust-cargo

我在Postgres API和我的Rust代码之间有一点包装C。我需要导出这些C函数,以便Postgres可以调用它。

我已经尝试过dylibcdylib软件包。 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
}

我需要同时具有cdylibdylib的某些属性。不幸的是,它们似乎在Cargo代码库中进行了硬编码。

0 个答案:

没有答案