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

使用-static编译时sem_open触发core dump问题求助

静态编译命名信号量代码时sem_open崩溃的解决办法

在Ubuntu 20.04系统用GCC 9.3.0编译命名信号量代码时,添加-static参数编译出的程序会在sem_open调用处崩溃,不使用静态编译则运行正常。测试代码如下:

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <semaphore.h>
int main(int argc, char* argv[]) {
    sem_t* p = sem_open("ec_initial_name_sem", O_RDWR|O_CREAT, 0777, 1); 
    while(1) { usleep(10000000); }
}

问题原因

命名信号量的sem_open属于POSIX实时扩展接口,这类接口依赖系统的librt实时库。动态编译时,系统的动态链接器会自动加载依赖的librt.so,所以不需要手动指定链接库也能正常运行;但静态编译时,必须显式链接librt库,否则会出现符号缺失,导致程序在调用sem_open时崩溃。另外,链接库的顺序也有讲究,-lrt需要放在-lpthread之后。

解决办法

修改编译命令,添加-lrt参数并调整链接顺序,正确的编译命令如下:

g++ testNamedSem.cpp -g -o namedSem -lpthread -lrt -static

用这个命令编译后,生成的静态可执行文件就能正常调用sem_open,不会再崩溃。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 16:00:20