postgresql - 具有导出 C 符号和静态链接 libstd 的 Rust 库
问题描述
我在 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)
源代码/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 代码库中被硬编码。
解决方案
推荐阅读
- xamarin - 需要帮助调试异常错误 - 无法获取提供程序。缺少 android.support.FILE_PROVIDER_PATHS
- android-studio - 从活动中更改日期/时间选择器视图以适应 Android Studio 中的片段
- godot - 加载脚本时运行初始化代码
- c - 为什么 SystemTable->ConIn 函数会导致我的粉丝发疯并冻结启动过程?
- google-sheets - 如何(预)格式化谷歌表格的(空)单元格,以便格式化?
- java - 请帮我理解这个问题
- javascript - npm run(-script) ''task-name" windows 问题?
- android - Android 上的 IOIO 板:处理外部中断和更改通知
- java - 如何将属性添加到所有传出 Span (Java)
- firebase - 在 Firebase 控制台上查看 Firestore 集合时加载文档时出错