为什么与 pthread 链接会导致分段错误?

2023-12-06

我有一个带有静态变量('abc.cpp')的精简简单程序:

#include <iostream>

int main(int, char**)
{
  static const std::string a("123");
  std::cout << "Hello world" << std::endl;
  return 0;
}

我编译它并且它有效:

> g++ -ggdb abc.cpp -o abc
> ./abc
Hello world

但是,如果我链接到 pthread 库......

> g++ -ggdb -lpthread abc.cpp -o abc
> ./abc
Segmentation fault (core dumped)

> gdb abc
(gdb) run
Starting program: abc

Program received signal SIGSEGV, Segmentation fault.
0x0000000000000000 in ?? ()
(gdb) where
#0  0x0000000000000000 in ?? ()
#1  0x00007ffff7b01681 in ?? () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#2  0x00007ffff7b016c3 in std::locale::locale() () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#3  0x00007ffff7afe244 in std::ios_base::Init::Init() ()
   from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#4  0x0000000000400d03 in __static_initialization_and_destruction_0 (__initialize_p=1,
    __priority=65535) at /usr/include/c++/4.9/iostream:74
#5  0x0000000000400d2c in _GLOBAL__sub_I_main () at abc.cpp:8
#6  0x0000000000400d7d in __libc_csu_init ()
#7  0x00007ffff74a6e55 in __libc_start_main (main=0x400c06 <main(int, char**)>, argc=1,
    argv=0x7fffffffdb58, init=0x400d30 <__libc_csu_init>, fini=<optimised out>,
    rtld_fini=<optimised out>, stack_end=0x7fffffffdb48) at libc-start.c:246
#8  0x0000000000400b39 in _start ()

我知道它在这里不使用线程,但在实际的非精简程序中,它链接到一个使用线程的库。感觉即使实际上没有使用线程,链接到 pthread 应该没问题。

有趣的是,添加消毒剂使其不会崩溃(不确定这是否是“未定义”/不稳定的修复......)。

> g++ -ggdb -fsanitize=undefined -lpthread abc.cpp -o abc
> ./abc
Hello world

为什么这会导致段错误?

旁注:Clang 有效。

> clang++ -ggdb -lpthread abc.cpp -o abc
> ./abc
Hello world

版本信息:

> g++ -v
Using built-in specs.
COLLECT_GCC=g++
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.9/lto-wrapper
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 4.9.2-0ubuntu1~14.04' --with-bugurl=file:///usr/share/doc/gcc-4.9/README.Bugs --enable-languages=c,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.9 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.9 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --disable-vtable-verify --enable-plugin --with-system-zlib --disable-browser-plugin --enable-java-awt=gtk --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-4.9-amd64/jre --enable-java-home --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-4.9-amd64 --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-4.9-amd64 --with-arch-directory=amd64 --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --enable-objc-gc --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 4.9.2 (Ubuntu 4.9.2-0ubuntu1~14.04)

> dpkg -l 'libstdc++6*'
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name                Version        Architecture   Description
+++-===================-==============-==============-===========================================
ii  libstdc++6:amd64    5-20150329-1ub amd64          GNU Standard C++ Library v3
un  libstdc++6-4.0-dbg  <none>         <none>         (no description available)
un  libstdc++6-4.1-dbg  <none>         <none>         (no description available)
un  libstdc++6-4.2-dbg  <none>         <none>         (no description available)
un  libstdc++6-4.3-dbg  <none>         <none>         (no description available)
un  libstdc++6-4.4-dbg  <none>         <none>         (no description available)
un  libstdc++6-4.5-dbg  <none>         <none>         (no description available)
un  libstdc++6-4.6-dbg  <none>         <none>         (no description available)
un  libstdc++6-4.7-dbg  <none>         <none>         (no description available)
un  libstdc++6-4.8-dbg  <none>         <none>         (no description available)
ii  libstdc++6-4.9-dbg: 4.9.2-0ubuntu1 amd64          GNU Standard C++ Library v3 (debugging file
un  libstdc++6-5-dbg    <none>         <none>         (no description available)
un  libstdc++6-dbg      <none>         <none>         (no description available)

这是ldd abc对于海湾合作委员会构建:

linux-vdso.so.1 => (0x00007ffef8f2f000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f87b167c000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f87b1465000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f87b109f000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f87b0d99000)
/lib64/ld-linux-x86-64.so.2 (0x00007f87b1a11000)

And the ldd abc对于 clang 构建(请注意此处的 pthread,而不是 gcc 中的):

linux-vdso.so.1 => (0x00007fffa4cc7000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fab1f10d000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fab1ed94000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fab1ea8d000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fab1e876000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fab1e4b1000)
/lib64/ld-linux-x86-64.so.2 (0x00007fab1f347000)

就其价值而言,我的语言环境:

> locale
LANG=en_AU.UTF-8
LANGUAGE=en_AU:en
LC_CTYPE="en_AU.UTF-8"
LC_NUMERIC="en_AU.UTF-8"
LC_TIME="en_AU.UTF-8"
LC_COLLATE="en_AU.UTF-8"
LC_MONETARY="en_AU.UTF-8"
LC_MESSAGES="en_AU.UTF-8"
LC_PAPER="en_AU.UTF-8"
LC_NAME="en_AU.UTF-8"
LC_ADDRESS="en_AU.UTF-8"
LC_TELEPHONE="en_AU.UTF-8"
LC_MEASUREMENT="en_AU.UTF-8"
LC_IDENTIFICATION="en_AU.UTF-8"
LC_ALL=

设置默认区域设置会产生相同的结果(以及相同的堆栈跟踪):

> LC_ALL=C ./abc
Segmentation fault (core dumped)

该问题实际上是您的系统默认使用的黄金链接器中的错误。检查 ld --version 打印的名称。 该错误似乎仍然存在:https://sourceware.org/bugzilla/show_bug.cgi?id=16417

使用标准 bfd 链接器不会出现此问题。使用的链接器由以下定义gcc -fuse-ld=gold或符号链接/usr/bin/ld

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么与 pthread 链接会导致分段错误? 的相关文章

  • Exit() 时是否调用基本对象析构函数?

    我意识到这个问题已经出现过几次 但我试图获得上述问题的明确答案 但我不断遇到相互矛盾的信息 我需要知道的是 当我使用 exit 时 基本类对象是否被破坏 我知道需要删除动态内存 但我的意思更像是 include
  • 将类对象放置在向量中?

    我注意到我可以将一个类放置在一个向量中 这是我的程序 我收到以下错误 out blackjack exe blackjack obj blackjack obj error LNK2019 unresolved external symbo
  • 如何在类文件中使用 Url.Action() ?

    如何在 MVC 项目的类文件中使用 Url Action Like namespace 3harf public class myFunction public static void CheckUserAdminPanelPermissi
  • 如何将 SOLID 原则应用到现有项目中

    我对这个问题的主观性表示歉意 但我有点卡住了 我希望之前处理过这个问题的人能够提供一些指导和建议 我有 现在已经成为 一个用 C 2 0 编写的非常大的 RESTful API 项目 并且我的一些类已经变得巨大 我的主要 API 类就是一个
  • 无法注册时间触发的后台任务

    对于 Windows 8 应用程序 在 C Xaml 中 我尝试注册后台任务 很难说 但我想我的后台任务已正确注册 但是当我单击调试位置工具栏上的后台任务名称时 我的应用程序停止工作 没有任何消息 我查看了事件查看器上的日志 得到 具有入口
  • cpp.react库的C++源代码中奇怪的“->* []”表达式

    这是我在文档中找到的 C 片段cpp react 库 https github com schlangster cpp react implicit parallelism auto in D MakeVar 0 auto op1 in g
  • 在 C# 中,如何根据在 gridview 行中单击的按钮引用特定产品记录

    我有一个显示产品网格视图的页面 该表内有一列 其中有一个名为 详细信息 的超链接 我想这样做 以便如果用户单击该特定产品的详细信息单元格 将打开一个新页面 提供有关该产品的更多信息 我不确定如何确定哪个Product记录链接的详细信息以及我
  • 即使没有异步,CallContext.LogicalGetData 也会恢复。为什么?

    我注意到CallContext LogicalSetData LogicalGetData不按照我期望的方式工作 内部设置的值async方法得到恢复即使没有异步或任何类型的线程切换 无论如何 这是一个简单的例子 using System u
  • 不同 C++ 文件中的相同类名

    如果两个 C 文件具有相同名称的类的不同定义 那么当它们被编译和链接时 即使没有警告也会抛出一些东西 例如 a cc class Student public std string foo return A void foo a Stude
  • 什么是空终止字符串?

    它与什么不同标准 字符串 http www cplusplus com reference string string 字符串 实际上只是一个数组chars 空终止字符串是指其中包含空字符的字符串 0 标记字符串的结尾 不一定是数组的结尾
  • 从网页运行 ClickOnce 应用程序,无需用户操作

    我们有一个基于 Java 的 Web 应用程序以及用 C 编写的相同应用程序 如果 java 检查器发现客户端计算机上没有安装 Java 则应该运行该应用程序 这个想法是运行 C 单击一次 http en wikipedia org wik
  • 如何递归取消引用指针(C++03)?

    我正在尝试在 C 中递归地取消引用指针 如果传递一个对象 那就是not一个指针 这包括智能指针 我只想返回对象本身 如果可能的话通过引用返回 我有这个代码 template
  • memcpy/memmove 到联合成员,这是否设置“活动”成员?

    重要说明 一些评论者似乎认为我是从工会抄袭的 仔细看memcpy 它从普通旧地址复制uint32 t 它不包含在联合中 另外 我正在复制 通过memcpy 到工会的特定成员 u a16 or u x in a union 不直接到整个联盟本
  • Oauth2中如何同时撤销RefreshToken和使AccessToken失效

    我正在使用 Owin Oauth2 授权和资源服务器相同 开发单页面应用程序 AngularJS Net MVC Json Rest API 的身份验证流程 我选择了 Bearer Token 路由而不是传统的 cookie session
  • 模板类中的无效数据类型生成编译时错误?

    我正在使用 C 创建一个字符串类 我希望该类仅接受数据类型 char 和 wchar t 并且我希望编译器在编译时使用 error 捕获任何无效数据类型 我不喜欢使用assert 我怎样才能做到这一点 您可以使用静态断言 促进提供一个 ht
  • 使动态创建的链接标签在 Winforms 中可点击

    我正在制作一个程序 允许用户单击由动态链接标签创建的公司名称 在我想知道如何做到这一点之前 我从未在 C 中使用过链接标签 可为特定用户生成的业务数量各不相同 因此每个用户的链接标签数量并不相同 然后我想捕获业务 ID 以进行 Json 调
  • 如何解压 msgpack 文件?

    我正在将 msgpack 编码的数据写入文件 在编写时 我只是使用 C API 的 fbuffer 如 我为示例删除了所有错误处理 FILE fp fopen filename ab msgpack packer pk msgpack pa
  • C++:为什么 numeric_limits 对它不知道的类型起作用?

    我创建了自己的类型 没有任何比较器 也没有专门化std numeric limits 尽管如此 由于某种原因 std numeric limits
  • C++:二叉树所有节点值的总和

    我正在准备面试 我被一个二叉树问题困住了 我们如何计算二叉树所有节点中存在的值的总和 优雅的递归解决方案 伪代码 def sum node if node NULL return 0 return node gt value sum nod
  • 我可以使用 lambda 函数或 std::function 对象来代替函数指针吗?

    我有一个需要使用的库 它定义了以下内容 typedef void CallbackFunction const int i 并且有一个注册回调的函数 如下所示 void registerCallback CallbackFunction p

随机推荐

  • 在 Android 应用程序上设置全局菜单

    复制 静态选项菜单 大家好 我知道如何在我的应用程序中创建一个菜单 并在菜单的每个 按钮 上添加图标和文本 但此菜单仅在我创建它的活动中可见 我想知道是否可以创建一个可从所有活动访问的全局菜单 谢谢 我想知道是否可以 创建一个全局菜单 可以
  • 使用 hibernate + spring mvc 获取自动生成的密钥,保存时

    我在用Spring MVC 休眠 Resource name sessionFactory private SessionFactory sessionFactory save public
  • 删除数组中重复的字符串

    我是 C 新手 我正在寻找一种从字符串数组中删除重复字符串的方法 如下所示 string exempleArray string1 string2 string1 代码之后应该如下所示 string1 string2 但顺序根本不重要 非常
  • 捕获“X-Frame-Options 禁止显示”[重复]

    这个问题在这里已经有答案了 我知道这个错误是无法克服的 但我想做的是 当我遇到无法嵌入的页面时 该页面只是作为弹出窗口加载 目前发生的情况是我被重定向到该页面 对于无法嵌入的页面 我在 Chrome 中看到以下错误 Refused to d
  • 在 JavaScript 中多次使用展开运算符?

    为什么扩展运算符不能多次使用 let arr 1 2 3 console log arr Array Array 1 console log arr Array Array 3 console log arr SyntaxError exp
  • 为什么我可以创建一个父类类型的变量

    当我上这些课时 public class Master public String test return I am the master object public String boeh return Only inside maste
  • ruby while 循环转换为 haskell

    我刚刚开始学习一些 Haskell 和函数式编程 但我发现很难掌握它 我正在尝试翻译一小段rubyHaskell 的代码 因为我喜欢函数式编程和 Haskell 提出的概念 更因为我来自数学领域 Haskell 看起来非常数学化 class
  • 在java中检索嵌套json中的所有键

    这是我写的程序 To change this template choose Tools Templates and open the template in the editor package javaapplication1 impo
  • iOS7中UISearchbar文本右对齐的方法

    你能告诉我如何在 iOS 7 中右对齐 UISearchbar 文本吗 我在iOS6中使用了这个 但现在它在iOS7中不起作用 hacking search bar UITextField searchField for UIView su
  • Android 中如何防止异常捕获?

    我正在尝试为 Android 开发一个应用程序 但我很难追踪在此过程中遇到的每个异常的来源和原因 我的代码在 Activity 中运行 如果我的一行引发异常 那么它不会停在该行并突出显示它 而是将我扔到 ActivityThread 类的代
  • Firebase:激活只读和非实时模式以提高浏览器性能

    激活只读和非实时模式以提高浏览器性能 我的项目中弹出消息 我也无法删除节点 我也读过这个https groups google com forum topic firebase talk qLxZCI8i47s 其中规定 如果您的 Fire
  • 更改 R 中多个 data.frame 对象中的单列名称

    我经常收到几个xts以日期作为行名称的对象 我必须改变那些xts物体进入data frame对象 但是当我这样做时 作为日期的行名称将成为名为的新第一列 ndex包含日期 但我需要那些Index要调用的列Date 因此 我想迭代地更改所有新
  • POST 请求中的 & 符号造成严重破坏

    我的 iPhone 应用程序有一个简单的 POST 它工作正常 除了传递一个 符号会导致后端中断 它几乎就像将其视为 GET 请求 符号分隔变量名称 我需要先进行某种编码吗 这是代码 NSString content NSString al
  • 如何在 Chrome 应用中手动清除 webview 的缓存?

    我正在开发一个 Chrome 应用程序 它在 webview 标签中显示一些网页内容 内容正在被缓存 当我编辑内容文件时 清除 Chrome 浏览器的缓存似乎并没有真正清除 webview 缓存 其中一篇文章建议每次 Chrome 应用程序
  • Ghostscript 目前可以将 PDF 转换为 PDF/X 吗?

    印刷厂要求我论文的 PDF 符合 PDF X1a 2001 标准 内容文件是使用编译的XeTeX LaTeX第二个 PDF 是封面设计Inkscape 0 48 我在这篇文章中找到的最接近的答案 https stackoverflow co
  • 修改图表_系列主题

    我正在尝试使用更改条形的颜色theme论点 但我得到一个错误 library quantmod getSymbols SPY from Sys Date 500 to Sys Date chart Series SPY chart Seri
  • Codeigniter 3 - Ajax 文件上传(您没有选择要上传的文件)

    控制器 function post if this gt input gt is ajax request show 404 exit data result false config upload path base url userfi
  • 面向对象设计:何时创建抽象类

    现在 我正在学习OOP 主要是c 我感兴趣的是创建一个无法实例化的类的主要原因是什么 何时创建抽象类的正确示例是什么 我发现自己过于热衷于以继承方式使用抽象类 系统中什么时候类是抽象的 什么时候类不应该是抽象的 是否有一些规则 例如 我创建
  • 在 Intellij Idea 中同时评估多个表达式

    在 Intellij Idea 中 我正在寻找一种使用一个命令在调试模式下评估多个表达式的方法 Normally I can evaluate single command with Right Click Evaluate Express
  • 为什么与 pthread 链接会导致分段错误?

    我有一个带有静态变量 abc cpp 的精简简单程序 include