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 processif ((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.sgcc -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/
转载于:https://www.cnblogs.com/stonehat/p/7275927.html
hidden symbol `pthread_atfork'相关推荐
- unsupported dynamic reloc R_ARM_REL32 AND hidden symbol '__dso_handle' is not defined
项目里编译codec src\makefiles\android\codec\Makefile line 25 原本用 4.6 不会报错 -L/data/android/android-ndk/sou ...
- NS2安装笔记 - Ubuntu9.10
转帖:http://blog.csdn.net/wuyanna1989/archive/2010/01/02/5119823.aspx 参考书推荐:<NS与网络模拟> - 徐雷鸣等 1. ...
- HTML+CSS+JS实现 ❤️电商商品图片幻灯片特效❤️
效果演示: 代码目录: 主要代码实现: CSS样式: *, *::after, *::before {box-sizing: border-box; }html {background: #fff; ...
- 使用 ld 命令链接目标文件生成可执行文件
1.目标文件生链接成可执行文件依赖的库和目标文件 使用 ld 链接目标文件生成可执行文件,用于取代命令 g++,仅仅用于学习 ld 命令的使用,不用于实际的项目编译. 首先看一个简单的 C++ 源文件 ...
- hexo(sakura)给博客增添侧边栏(回到顶部,跳转评论,深色模式,播放音乐)Valine-1.4.4新版本尝鲜+个性制定(表情包、qq头像、UI样式)
文章目录 hexo(sakura)给博客增添侧边栏(回到顶部,跳转评论,深色模式,播放音乐) 原理 直接使用 Valine-1.4.4新版本尝鲜+个性制定(表情包.qq头像.UI样式) 总结 本文全是 ...
- img: SVG格式在vue中的使用
SVG格式在vue中的使用 SVG:svg是一种图像文件格式,它是可缩放的矢量图形,它是基于XML,由World Wide Web Consortium (W3C)联盟进行开发的.严格来说应该是一种开 ...
- 在 vue 中使用 SVG 建立图标系统并且使用
首先我们先来学一下 svg 标签的基础知识,参考了阮一峰大神的网络日志,链接:http://www.ruanyifeng.com/blog/2018/08/svg.html SVG 全称是可缩放矢量图 ...
- 链接脚本lds 相关的知识
链接脚本lds相关的知识 目录 链接脚本lds相关的知识 前言 关于vmlinux.lds目标的生成与构建 关于链接脚本的语法 sections 输出段 关于vmlinux.lds链接脚本的解读 参考 ...
- 链接脚本(Linker Scripts)语法和规则解析(翻译自官方手册)
原链接:链接脚本(Linker Scripts)语法和规则解析(翻译自官方手册)_BSP-路人甲的博客-CSDN博客_链接脚本语法 为了便于与英文原文对照学习与理解(部分翻译可能不准确),本文中的每个 ...
最新文章
- PostgreSQL ODBC问题与探索SQLSpecialColumns
- 3字节转换为有符号整型C语言,3.C语言整型数据
- 一些数据库优化经验资料整理
- 与JBoss BPM Travel Agency更新了现代BPM数据集成
- oppo5.0以上机器(亲测有效)激活Xposed框架的教程
- 怎样使用navicat将mysql的数据表导出保存(转储SQL文件)
- [Effective C++ --032]确定你的public继承塑模出is-a
- 物联网应用层协议选择和分析--MQTT、CoAP 、HTTP、XMPP、SoAP
- 数据 正则化 python_Python数据科学:正则化方法
- 无人驾驶(基于计算机视觉的高精度地图)
- 精确率(查准率)、召回率(查全率)和F1值
- 微信小程序实现每日签到功能
- 输入快递单号自动识别快递公司的方法
- 普通话测试第四题评分标准_普通话等级考试内容及评分标准
- 学ios 需要学html5me,针对iOS平台移植Flash内容的指导教程(1)
- [中国近代史] 第五章测验
- 非线性回归-Polynomial regression
- CPU、内存、磁盘三者的关系
- 码农分为两类:看过《数学之美》的与没看过的
- 透明度百分比8位色值
热门文章
- JavaScript中||(或)逻辑运算符注意点
- 作业1-3 求1+2!+3!+...+20!的和
- 请求重定向与请求转发的区别
- javacript 验证函数
- PCL Lesson 4:直通滤波+多视图可视化
- yolov3前向传播(三)-- 坐标转换,iou计算,权重加载,图片显示
- 如何阅读python源码_如何阅读源代码(转)
- linux session 设置时间设置,设置linux系统history相关变量,命令时间、保存history条数,多session共享history...
- ant vue 树形菜单横向显示_丝滑般 Vue 拖拽排序树形表格组件Vue-DragTreeTable
- java多线程的同步控制_Java多线程并发控制工具信号量Semaphore,实现原理及案例...