You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

RISC-V环境下函数指针显示为0但可正常调用的问题排查

RISC-V QEMU环境下函数指针打印为0但可正常调用的异常问题

在基于RISC-V架构的QEMU虚拟机系统中,出现了一个异常现象:打印函数指针时输出为0x0000000000000000,但直接调用该函数指针却能正常执行对应的函数。

最简复现代码

void testfn(void) {
    printf("Hello, world!\n");
}

int main(int argc, char *argv[]) {
    printf("fp: %p\n", &testfn);
    return 0;
}

执行后输出:

fp: 0x0000000000000000

即使给testfn添加GCC的__attribute__((noinline))属性,结果依然一致。

进一步验证代码及输出

为排除printf实现的问题,我尝试将函数指针强制转换为unsigned long long类型作为循环次数,结果循环执行了0次,说明函数指针确实被识别为0:

void __attribute__((noinline)) testfn(void) {
    printf("Hello, world!\n");
}

int main(int argc, char *argv[]) {
    void (*fn)(void) = &testfn;

    printf("Testing printf...\n");
    printf("fp addr: %p\n", &fn);
    fn();

    for (int i = 0; i < (unsigned long long) fn; ++i) {
        printf("Here!\n");
    }

    printf("fp: %p\n", fn);
    return 0;
}

执行输出如下:

Testing printf...
fp addr: 0x0000000000003FA8
Hello, world!
fp: 0x0000000000000000

编译与运行命令

编译命令:

riscv64-unknown-elf-gcc -Wall -O0 -fno-omit-frame-pointer -ggdb -gdwarf-2 -MD -mcmodel=medany -ffreestanding -fno-common -nostdlib -mno-relax -I. -fno-stack-protector -fno-pie -no-pie -c -o user/rkttest.o user/rkttest.c

QEMU运行命令:

qemu-system-riscv64 -machine virt -bios none -kernel kernel/kernel -m 128M -smp 3 -nographic -global virtio-mmio.force-legacy=false -drive file=fs.img,if=none,format=raw,id=x0 -device virtio-blk-device,drive=x0,bus=virtio-mmio-bus.0

目前推测可能是编译器bug或环境异常,但不确定是否存在遗漏的配置或知识点,特此寻求解答。

内容的提问来源于stack exchange,提问作者tedtanner

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 09:16:00