日期:2014-05-16  浏览次数:20676 次

Linux多线程,静态编译程序可执行,动态编译程序报Segmentation fault
使用的交叉编译arm-linux-gcc pthread.c -o a.out -lpthread -static

pthread.c源代码:

#include <stdio.h>
#include <pthread.h>
#include <unistd.h>


void *threadfuc(void *pvoid)
{
int id = (int)pvoid;
printf("Child thread %d says:Hello world!\n", id);

return NULL;
}

int main()
{
pthread_t tid1,tid2;
pthread_create(&tid1, NULL, &threadfuc, (void *)1);
pthread_create(&tid2, NULL, &threadfuc, (void *)2);

pthread_detach(tid1);

/* 第二个参数:等待线程的返回值 */
pthread_join(tid2, NULL);
printf("Main thread say:Hello world!\n");
return 0;
}


问题是:
    编译没错误,静态编译的程序可在开发板上执行,动态编译的程序运行时直接报Segmentation fault,似乎这个程序一点都不会执行。
    u-boot、内核及文件系统都是自己移植的,在开发板上的/lib目录中与pthread相关的库文件有:

    自己已经找不出是什么原因了,求大神指教!!!感激不尽。。。。
Linux 多线程 库文件 应用程序

------解决方案--------------------
那的确是你移植的问题了。
------解决方案--------------------
我遇到过这样的情况,kernel+rootfs是低版本的mips gcc编译的,app是高版本的mips gcc编译的,动态链接的话app运行就抛SEGV,静态链接的话正常运行。
通常rootfs里的lib是从编译器目录里提取的,猜测不同版本编译器的库二进制代码有所不同。
------解决方案--------------------
(void*)1
这样写好吗
相当于去取内存地址为1的数据
------解决方案--------------------
引用:
Quote: 引用:

(void*)1
这样写好吗
相当于去取内存地址为1的数据

我只是把1转化为地址,但是并没有去这个地址取值啊!而且进入threadfuc函数,我马上就把他给转为整型了,而且Linux还有VFS层,这个(void*)1也并不是指物理地址1啊!

1和void*所占字符数可能不同
指针和普通数据类型之间还是不要互转吧
------解决方案--------------------
建议去看看动态编译和静态编译的区别,毕竟静态编译没问题。
------解决方案--------------------