【发布时间】:2020-07-18 15:13:23
【问题描述】:
我正在使用glibc-2.27 中的pthread.h 库,当我的进程调用pthread_create() 18 次或更多次(它应该是一个繁重的多线程应用程序)时,进程被中止并显示错误消息:
*** stack smashing detected ***: <unknown> terminated
Aborted (core dumped)
我在调试过程中做了一些strace,我找到了原因。显然,所有对 mmap() 的隐式调用作为 pthread_create() 的一部分如下所示:
mmap(NULL, 8392704, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7f6de43fa000
人们可以注意到MAP_STACK 标志,它表示:
在适合进程或线程堆栈的地址分配映射。 该标志目前是无操作的,但在 glibc 线程实现中使用,因此如果某些架构需要对堆栈分配进行特殊处理,以后可以透明地为 glibc 实现支持。
(man mmap 在我的系统上 - Ubuntu 18.04 LTS)
可以配置pthread_create 调用不这样做吗?或者可能使用brk 或其他方式自动增加数据段?
感谢您的帮助!
【问题讨论】:
标签: c pthreads clone glibc mmap