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相关的库文件有:
自己已经找不出是什么原因了,求大神指教!!!感激不尽。。。。
------解决方案--------------------那的确是你移植的问题了。
------解决方案--------------------我遇到过这样的情况,kernel+rootfs是低版本的mips gcc编译的,app是高版本的mips gcc编译的,动态链接的话app运行就抛SEGV,静态链接的话正常运行。
通常rootfs里的lib是从编译器目录里提取的,猜测不同版本编译器的库二进制代码有所不同。
------解决方案--------------------(void*)1
这样写好吗
相当于去取内存地址为1的数据
------解决方案--------------------
1和void*所占字符数可能不同
指针和普通数据类型之间还是不要互转吧
------解决方案--------------------建议去看看动态编译和静态编译的区别,毕竟静态编译没问题。
------解决方案--------------------