使用-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
相关产品推荐
相关产品推荐

