hidden symbol `pthread_atfork'
gcc交叉编译时发生这种错误
/.. .../voice_demo: hidden symbol `pthread_atfork' in /opt/gcc-linaro-aarch64-linux-gnu-4.9-2014.09_linux/bin/../aarch64-linux-gnu/libc/usr/lib/aarch64-linux-gnu/libpthread_nonshared.a(pthread_atfork.oS) is referenced by DSO
调用关系如下:
A->B.so->多线程函数库
A依赖B的动态库文件。B动态库又依赖于多线程函数库
原因
实际上,pthread_atfork这个函数并不在libpthread.so.0库里面。 是在链接的时候直接把一个.a链接到库里面的
B.so在链接的时候,使用-lpthread引入多线程库,而-lpthread并不会把包含pthread_atfork
的静态库链进来。
解决方法
B.so在编译的时候 使用-pthread引入多线程库,而不是-lpthread
-lpthread和pthread的区别
例如下面的代码,使用了多线程库。
#include <sys/types.h>
#include <pthread.h>
#include <sys/wait.h>
pid_t self_pid; /* pid of current process */
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
void fork_prepare(void)
{
pthread_mutex_lock(&mutex);
}
void fork_parent(void)
{
pthread_mutex_unlock(&mutex);
}
void fork_child(void)
{
self_pid = getpid();
pthread_mutex_unlock(&mutex);
}
void *thread_routine(void *arg)
{
pid_t child_pid;
child_pid = fork();
if(child_pid == (pid_t)-1)
return NULL;
pthread_mutex_lock(&mutex);
pthread_mutex_unlock(&mutex);
printf("After fork: %d (%d)\n", child_pid, self_pid);
if(child_pid != 0){ // parent process
if ((pid_t)-1 == waitpid(child_pid, (int*)0, 0))
return NULL;
}
return NULL;
}
int main(int argc, char *argv[])
{
pthread_t fork_thread;
int atfork_flag = 1;
if(argc > 1)
atfork_flag = atoi (argv[1]);
if(atfork_flag){
pthread_atfork(fork_prepare, fork_parent, fork_child);
}
self_pid = getpid();
pthread_mutex_lock(&mutex);
pthread_create(&fork_thread, NULL, thread_routine, NULL);
sleep(5);
pthread_mutex_unlock (&mutex);
pthread_join(fork_thread, NULL);
return 0;
}
分别采用两种方式编译成动态库
gcc -shared -fPIC -Wall -lpthread -o atfork.so main.c
gcc -shared -fPIC -Wall -pthread -o atfork.so main.c
采用-lpthread生成的so大小为13008
采用-pthread生成的so大小为16816,说明链接了一块东西。。
附:如果直接用-lpthread将上段代码生成可执行程序,是会报错的,因为找不到符号。
而-pthread是不会有这种问题的。
为什么会有这种区别呢。
gcc -v -shared -fPIC -Wall -lpthread -o atfork.so main.c
gcc -v -shared -fPIC -Wall -pthread -o atfork.so main.c
分别打印诊断日志。
进行比较发现。
gcc -v -shared -fPIC -Wall -pthread -o atfork.so main.c
输出
/usr/lib/gcc/x86_64-linux-gnu/5/cc1 -quiet -v -imultiarch x86_64-linux-gnu -D_REENTRANT main.c -quiet -dumpbase main.c -mtune=generic -march=x86-64 -auxbase main -Wall -version -fPIC -fstack-protector-strong -Wformat-security -o /tmp/cciFOaoT.s
gcc -v -shared -fPIC -Wall -lpthread -o atfork.so main.c
输出
/usr/lib/gcc/x86_64-linux-gnu/5/cc1 -quiet -v -imultiarch x86_64-linux-gnu main.c -quiet -dumpbase main.c -mtune=generic -march=x86-64 -auxbase main -Wall -version -fPIC -fstack-protector-strong -Wformat-security -o /tmp/ccZTeFNI.s
第一个多了-D_REENTRANT, 这个宏是线程安全的意思。
转载的时候,请注明出处哦http://www.cnblogs.com/stonehat/
hidden symbol `pthread_atfork'的更多相关文章
- unsupported dynamic reloc R_ARM_REL32 AND hidden symbol '__dso_handle' is not defined
项目里编译codec src\makefiles\android\codec\Makefileline 25 原本用 4.6 不会报错-L/data/android/android-ndk/sourc ...
- hidden symbol ... is referenced by DSO
在Linux上编译Qt的时候configure出来的Makefile传递给g++的参数visiblility=hidden,然后就会调用Qt库所使用的第三方库libpng库源代码函数声明添加上__at ...
- Ubuntu上安装ns2-2.34
Ubuntu上安装ns2-2.34 步骤1 下载ns-allinone-2.34 $ tar zxf ns-allinone-2.34.tar.gz 步骤2 sudo apt-get install ...
- OpenCV4Android释疑: 透析Android以JNI调OpenCV的三种方式(让OpenCVManager永不困扰)
OpenCV4Android释疑: 透析Android以JNI调OpenCV的三种方式(让OpenCVManager永不困扰) 前文曾详细探讨了关于OpenCV的使用,原本以为天下已太平.但不断有人反 ...
- OpenCV4Android
前文曾详细探讨了关于OpenCV的使用,原本以为天下已太平.但不断有人反应依然配不好OpenCV4Android,不能得心应手的在Android上使用OpenCV,大量的精力都浪费在摸索配置上.尤其是 ...
- 移植 Qt 至 tiny210 详细过程
实验所需资源: tiny210(cortex-a8) QT 版本:5.6.2 PC 环境:UBUNTU tslib:tslib-1.4 交叉工具链:4.5.1 开发板已装载好 Linux 编译 tsl ...
- 深入浅出 SVG
前言 据悉,8月18号将在广州举办中国第一届React开发者大会.今日早读文章由@Starrier翻译分享. 正文从这开始- SVG 是优秀且令人难以置信的强大图像格式.本教程通过简单地解释所有需要了 ...
- 『MXNet』第六弹_Gluon性能提升
一.符号式编程 1.命令式编程和符号式编程 命令式: def add(a, b): return a + b def fancy_func(a, b, c, d): e = add(a, b) f = ...
- base标签对svg的影响
页面地址:http://127.0.0.1:8080/fullLink_node.html?project_id=2 base:<base href="http://127.0.0.1 ...
随机推荐
- Create小程序
我有时候喜欢直接用命令行创建.编译.执行java文件, 每次创建一个文件都要新建一个.java文件,然后再编辑.java文件加入类名,主函数…… 这些流程我有点厌倦,于是就编写了一个超级简单的自动创建 ...
- 第二十二章 Django会话与表单验证
第二十二章 Django会话与表单验证 第一课 模板回顾 1.基本操作 def func(req): return render(req,'index.html',{'val':[1,2,3...]} ...
- Jenkins系列——定时构建
1.环境说明 操作系统:win7旗舰版64bit jdk:sun JDK1.7.0_80 64bit tomcat:apache-tomcat-8.0.41 jenkins:2.32.3LST 本系列 ...
- hdu1800 贪心+hash+真的有毒
这道题用map<string,int>TLE到死.这题又是一道毒题,看了评论,居然可以用int读入,而且网上还有用排序的....用int的连前导0都不需要处理了 说下贪心吧,每把扫帚一定要 ...
- nyoj281 整数中的1(二) 数位DP
和整数中的1一毛一样.就是输入时改了一下罢了. AC代码: #include<cstdio> const int maxn = 35; int w[maxn], h[maxn]; void ...
- 常用的CSS框架
常用的CSS框架 之前在写自己的个人网站的时候,由于自己Web前端不是特别好,于是就去找相关的CSS框架来搭建页面了. 找到以下这么一篇文章(列出了很多常用的CSS框架): http://w3scho ...
- session不会过期
$(function () { window.setInterval(function () { $.post('random.html'); }, 60000); }); 加在母版页里,使用与长时间 ...
- hadoop配置遇到问题的解决
1. ssh localhost: 不能登陆:将错误提示中的文件全部删除.原因:登陆过远程主机 2. 问题: 伪分布式datanode启动不了:在datanode的log日志文件出现以下错误提示: ...
- Hdfs读取文件到本地总结
总结了一下三个方法:hdfs自带 按字节复制 按行复制 (在java io里还有字符复制,暂且不提) 因为hdfs自带的,不知道为什么有些场合不能用,每次能下载的个数还不一定,所以就考虑自己按照jav ...
- byte[] Base64 Stream 之间相互转换
图片 base64转byte[] /// <summary> /// 保存base64图片,返回阿里云地址 /// </summary> /// <param name= ...