cdsfiui 发表于 2017-01-10 20:22

clone()函数导致编译失败,奇葩的出错信息

一个二十行的程序:
#include<stdio.h>
#include<sched.h>
#include<unistd.h>
#include<sys/types.h>
extern int errno;
int f(void*arg)
{
pid_t pid=getpid();
printf("child pid=%d\n",pid);
}
char buf;
int main()
{
int ret=clone(f,buf,CLONE_VM|CLONE_VFORK,NULL);
if(ret==-1){
    printf("%d\n",errno);
    return 1;
}
printf("father pid=%d\n",getpid());
return 0;
}g++4.1.2编译提示:
$g++ testClone.cpp
/usr/bin/ld: errno: TLS definition in /lib64/libc.so.6 section .tbss mismatches non-TLS reference in /tmp/ccihZbuv.o
/lib64/libc.so.6: could not read symbols: Bad value
collect2: ld returned 1 exit status


这是什么情况? g++ testClone.cpp -lpthread也不行啊

MMMIX 发表于 2017-01-10 22:20

回复 1# cdsfiui

把你对 errno 的声明删除了。在 glibc 中,errno 是个 TLS (Thread-local storage) 变量,每个线程一份,你的这种声明和 glibc 对其的声明是冲突的。

需要访问 errno 的话,直接包含 <errno.h> 即可,不要自己去声明。

页: [1]
查看完整版本: clone()函数导致编译失败,奇葩的出错信息