【问题标题】:Disable xsave in glibc's ld.so在 glibc 的 ld.so 中禁用 xsave
【发布时间】:2019-06-07 08:35:09
【问题描述】:

我想使用gdb的记录,但是因为glibc的ld.so使用xsave指令,我得到错误“进程记录不支持地址0x7ffff7fe883c的指令0xfae64。”

感谢stackoverflow answer,我能够通过二进制补丁修复类似的错误。运行半小时后使用调试符号编译 glibc 失败,所以如果有更快的解决方案,我会很高兴。我从here 获得了一个编译版本,但似乎没有提供更早的版本(即我现在使用的是 glibc 2.28.r502.g065957a3704-1 和 gdb 8.2.1)。如何使 gdb 记录工作?

【问题讨论】:

  • 尝试使用更新的 gdb 版本。
  • @fuz 8.2.1 是据我所知的最新 gdb 版本。
  • 我找到了两种可能的解决方案:(a)在运行程序之前设置LD_BIND_NOW=1 或(b)做一个静态链接。根据this thread,两者都是推荐的解决方法。
  • @fuz 太棒了,这些变通办法都有效,想把它写成解决方案吗?

标签: assembly linker gdb x86-64 glibc


【解决方案1】:

问题在于 gdb 中内置的 x86 模拟器无法理解许多较新的指令。解决此问题的唯一方法是等待带有相关说明的新版本。与此同时,this thread 提出了一些解决方法:

  • 加载二进制文件并将环境变量LD_BIND_NOW设置为1以避免在动态链接器中触发xsave
  • 或者,静态链接要调试的二进制文件
  • 或者,链接到-z now,例如通过将 -Wl,-z,now 传递给 C 编译器

【讨论】:

  • 不需要静态链接,-Wl,-z,now主程序和所有库就足够了。
  • 您能解释一下为什么会这样吗?是不是第一次引用符号时的默认函数调用解析在二进制和动态链接器之间进行上下文切换时使用xsave,但是如果在启动时解析符号,那么上下文将永远不会在二进制和动态链接器之间切换?跨度>
  • @rubystallion 抱歉,不知道。
  • @rubystallion:Florian 删除的答案提到惰性动态链接在惰性动态链接蹦床上使用 xsave。我认为这可能是为了避免 SSE/AVX 转换停滞,无论是在动态链接器代码中,还是在返回主程序时更糟。可能会造成 SSE 指令永远存在错误依赖的情况:Why is this SSE code 6 times slower without VZEROUPPER on Skylake?。虽然我不确定他们为什么不能只使用vzeroupper,因为 SysV ABI 说函数调用会破坏向量 regs。
猜你喜欢
  • 1970-01-01
  • 2017-08-19
  • 2014-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-22
  • 2014-04-02
  • 2020-01-17
  • 1970-01-01
相关资源
最近更新 更多