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'相关推荐

  1. 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 ...

  2. NS2安装笔记 - Ubuntu9.10

    转帖:http://blog.csdn.net/wuyanna1989/archive/2010/01/02/5119823.aspx 参考书推荐:<NS与网络模拟> - 徐雷鸣等 1. ...

  3. HTML+CSS+JS实现 ❤️电商商品图片幻灯片特效❤️

    效果演示: 代码目录: 主要代码实现: CSS样式: *, *::after, *::before {box-sizing: border-box; }html {background: #fff; ...

  4. 使用 ld 命令链接目标文件生成可执行文件

    1.目标文件生链接成可执行文件依赖的库和目标文件 使用 ld 链接目标文件生成可执行文件,用于取代命令 g++,仅仅用于学习 ld 命令的使用,不用于实际的项目编译. 首先看一个简单的 C++ 源文件 ...

  5. hexo(sakura)给博客增添侧边栏(回到顶部,跳转评论,深色模式,播放音乐)Valine-1.4.4新版本尝鲜+个性制定(表情包、qq头像、UI样式)

    文章目录 hexo(sakura)给博客增添侧边栏(回到顶部,跳转评论,深色模式,播放音乐) 原理 直接使用 Valine-1.4.4新版本尝鲜+个性制定(表情包.qq头像.UI样式) 总结 本文全是 ...

  6. img: SVG格式在vue中的使用

    SVG格式在vue中的使用 SVG:svg是一种图像文件格式,它是可缩放的矢量图形,它是基于XML,由World Wide Web Consortium (W3C)联盟进行开发的.严格来说应该是一种开 ...

  7. 在 vue 中使用 SVG 建立图标系统并且使用

    首先我们先来学一下 svg 标签的基础知识,参考了阮一峰大神的网络日志,链接:http://www.ruanyifeng.com/blog/2018/08/svg.html SVG 全称是可缩放矢量图 ...

  8. 链接脚本lds 相关的知识

    链接脚本lds相关的知识 目录 链接脚本lds相关的知识 前言 关于vmlinux.lds目标的生成与构建 关于链接脚本的语法 sections 输出段 关于vmlinux.lds链接脚本的解读 参考 ...

  9. 链接脚本(Linker Scripts)语法和规则解析(翻译自官方手册)

    原链接:链接脚本(Linker Scripts)语法和规则解析(翻译自官方手册)_BSP-路人甲的博客-CSDN博客_链接脚本语法 为了便于与英文原文对照学习与理解(部分翻译可能不准确),本文中的每个 ...

最新文章

  1. PostgreSQL ODBC问题与探索SQLSpecialColumns
  2. 3字节转换为有符号整型C语言,3.C语言整型数据
  3. 一些数据库优化经验资料整理
  4. 与JBoss BPM Travel Agency更新了现代BPM数据集成
  5. oppo5.0以上机器(亲测有效)激活Xposed框架的教程
  6. 怎样使用navicat将mysql的数据表导出保存(转储SQL文件)
  7. [Effective C++ --032]确定你的public继承塑模出is-a
  8. 物联网应用层协议选择和分析--MQTT、CoAP 、HTTP、XMPP、SoAP
  9. 数据 正则化 python_Python数据科学:正则化方法
  10. 无人驾驶(基于计算机视觉的高精度地图)
  11. 精确率(查准率)、召回率(查全率)和F1值
  12. 微信小程序实现每日签到功能
  13. 输入快递单号自动识别快递公司的方法
  14. 普通话测试第四题评分标准_普通话等级考试内容及评分标准
  15. 学ios 需要学html5me,针对iOS平台移植Flash内容的指导教程(1)
  16. [中国近代史] 第五章测验
  17. 非线性回归-Polynomial regression
  18. CPU、内存、磁盘三者的关系
  19. 码农分为两类:看过《数学之美》的与没看过的
  20. 透明度百分比8位色值

热门文章

  1. JavaScript中||(或)逻辑运算符注意点
  2. 作业1-3 求1+2!+3!+...+20!的和
  3. 请求重定向与请求转发的区别
  4. javacript 验证函数
  5. PCL Lesson 4:直通滤波+多视图可视化
  6. yolov3前向传播(三)-- 坐标转换,iou计算,权重加载,图片显示
  7. 如何阅读python源码_如何阅读源代码(转)
  8. linux session 设置时间设置,设置linux系统history相关变量,命令时间、保存history条数,多session共享history...
  9. ant vue 树形菜单横向显示_丝滑般 Vue 拖拽排序树形表格组件Vue-DragTreeTable
  10. java多线程的同步控制_Java多线程并发控制工具信号量Semaphore,实现原理及案例...