gpt4 book ai didi

c - 从C调用带有函数参数的Rust函数会导致SegFault

转载 作者:行者123 更新时间:2023-12-03 11:34:09 26 4
gpt4 key购买 nike

我用Rust构建了一个共享对象,并用C链接到它。编译/链接工作正常,但是一旦调用该函数,我就会得到一个SegFault。

Rust函数声明:
它消耗两个整数/使用量,以及对返回一个整数/使用量的函数的引用。

#[no_mangle]
pub fn show_loading_animation(from: usize,
to: usize,
progress_in_percentage_fn: &dyn Fn() -> usize) { ... }

我从C像这样调用它:
typedef long long usize; // 64 bit
extern void show_loading_animation(usize, usize, usize (*prog_fn)());

usize progress_reporter() {
return 80l;
}

int main(void) {
show_loading_animation(0, 100, &progress_reporter);
return 0;
}

我假设 &dyn Fn()与c函数引用不兼容?我用gdb调试成show_loading_animation。这是程序集,最后一行是崩溃的地方。
0000000000004530 <show_loading_animation>:
4530: 55 push %rbp
4531: 41 57 push %r15
4533: 41 56 push %r14
4535: 41 55 push %r13
4537: 41 54 push %r12
4539: 53 push %rbx
453a: 48 81 ec f8 00 00 00 sub $0xf8,%rsp
4541: 48 89 94 24 e0 00 00 mov %rdx,0xe0(%rsp)
4548: 00
4549: 48 89 34 24 mov %rsi,(%rsp)
454d: 48 39 fe cmp %rdi,%rsi
4550: 0f 82 a9 03 00 00 jb 48ff <show_loading_animation+0x3cf>
4556: 48 89 fb mov %rdi,%rbx
4559: 48 8b 41 18 mov 0x18(%rcx),%rax
455d: 48 89 84 24 d8 00 00 mov %rax,0xd8(%rsp)
4564: 00
4565: 45 31 f6 xor %r14d,%r14d
4568: 48 8d 6c 24 30 lea 0x30(%rsp),%rbp
456d: 0f 1f 00 nopl (%rax)
4570: 48 8b bc 24 e0 00 00 mov 0xe0(%rsp),%rdi
4577: 00
4578: ff 94 24 d8 00 00 00 callq *0xd8(%rsp) <-- crash

最佳答案

&dyn T是一个胖指针(基本上是指向数据的指针和指向vtable的指针),C对其内部结构一无所知,因此您需要改用type Fn = extern "C" fn() -> usize

关于c - 从C调用带有函数参数的Rust函数会导致SegFault,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62470073/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com