gdb 8.2无法识别macOS Mojave 10.14上的可执行文件

时间:2018-09-27 05:13:32

标签: macos gdb

我通过brew install gdb得到了gdb。

源文件内容为:

#include <cstdio>
int main(){
    int a = 10;
    for(int i = 0; i< 10; i++){
        a += i;
    }
    printf("%d\n",a);
    return 0;
}

这是名为“ demo”的可执行文件: https://pan.baidu.com/s/1wg-ffGCYzPGDI77pRxhyaw

我这样编译源文件:

c++ -g -o demo demo.cpp

并运行gdb

gdb ./demo

但是,它不起作用。无法识别可执行文件。

GNU gdb (GDB) 8.2
Copyright (C) 2018 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Type "show copying" and "show warranty" for details.
This GDB was configured as "x86_64-apple-darwin18.0.0".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.

For help, type "help".
Type "apropos word" to search for commands related to "word"...
BFD: /Users/xxx/Codes/demo: unknown load command 0x32
BFD: /Users/xxx/Codes/demo: unknown load command 0x32
"/Users/xxx/Codes/demo": not in executable format: file format not recognized

我使用file demo,其输出为demo: Mach-O 64-bit executable x86_64

我使用file ./demo,其输出为./demo: Mach-O 64-bit executable x86_64

类型c++ -v,输出为:

Apple LLVM version 10.0.0 (clang-1000.10.44.2)
Target: x86_64-apple-darwin18.0.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin

运行./demo,其输出为55 在gdb中输入show configuration,它显示:

 This GDB was configured as follows:
 configure --host=x86_64-apple-darwin18.0.0 --target=x86_64-apple-darwin18.0.0
         --with-auto-load-dir=:${prefix}/share/auto-load
         --with-auto-load-safe-path=:${prefix}/share/auto-load
         --with-expat
         --with-gdb-datadir=/usr/local/Cellar/gdb/8.2/share/gdb (relocatable)
         --with-jit-reader-dir=/usr/local/Cellar/gdb/8.2/lib/gdb (relocatable)
         --without-libunwind-ia64
         --without-lzma
         --without-babeltrace
         --without-intel-pt
         --disable-libmcheck
         --without-mpfr
         --with-python=/System/Library/Frameworks/Python.framework/Versions/2.7
         --without-guile
         --with-separate-debug-dir=/usr/local/Cellar/gdb/8.2/lib/debug (relocatable)

谁可以帮助我?非常感谢!!!

8 个答案:

答案 0 :(得分:11)

问题在于,与clang-1000.11.45.2一起分发的Apple LLVM version 10.0.0向名为LC_BUILD_VERSION的o-mach可执行文件添加了新的加载命令。

$ otool -l test.o
...
Load command 1
       cmd LC_BUILD_VERSION
   cmdsize 24
  platform macos
       sdk n/a
     minos 10.14
    ntools 0
...

来自苹果source

/*
 * The build_version_command contains the min OS version on which this
 * binary was built to run for its platform.  The list of known platforms and
 * tool values following it.
 */

因此,当前bfd(gdb用于操纵可执行程序的程序)无法解释此命令,并返回错误。

我找到的临时解决方案是直接编辑bfd提供的gdb源。 我只测试了gdb-8.0.1

首先,从mirrors下载gdb-8.0.1源。然后将以下代码添加到gdb-8.0.1/bfd/mach-o.c4649行:

case BFD_MACH_O_LC_BUILD_VERSION:
break;

最后添加int gdb-8.0.1/include/mach-o/loader.h

  BFD_MACH_O_LC_BUILD_VERSION = 0x32

189行(不要忘记在,之后的第188行末添加BFD_MACH_O_LC_VERSION_MIN_WATCHOS = 0x30)。

按照这些说明操作后,您可以按照自述文件中的指示进行经典的gdb编译:

run the ``configure'' script here, e.g.:

    ./configure 
    make

To install them (by default in /usr/local/bin, /usr/local/lib, etc),
then do:
    make install

别忘了像解释here一样签署gdb。 如果仍然出现(os / kern)故障(0x5)错误,只需运行sudo gdb

这是一个临时解决方案,等待GNU团队直接在存储库中解决问题。

编辑

Binutils-gdb已更新,现在在提交fc7b364中实现了这些更改。

希望这会有所帮助。

答案 1 :(得分:2)

我在等待官方酿造公式更新的同时发布了一个似乎有效的临时酿造公式:

简单安装https://raw.githubusercontent.com/timotheecour/homebrew-timutil/master/gdb_tim.rb

答案 2 :(得分:1)

升级到GDB版本8.3。另请参见Binutils错误跟踪器中的Issue 23728, binutils fail on macOS 10.14 (Mojave) due to unimpl

来自bug report

  

我找到了问题的根源。 binutils无法处理负载   命令0x32 LC_BUILD_VERSION(实际上也不是0x31 LC_NOTE)。他们是   在最新的LLVM版本中定义:请参阅   https://github.com/llvm-mirror/llvm/blob/master/include/llvm/BinaryFormat/MachO.def#L77

     

看objdump -private-headers的输出,有一个清晰的   区别:

@@ -56,16 +56,18 @@ attributes NO_TOC STRIP_STATIC_SYMS LIVE
  reserved1 0
  reserved2 0
 Load command 1
-      cmd LC_VERSION_MIN_MACOSX
-  cmdsize 16
-  version 10.13
-      sdk n/a
+       cmd LC_BUILD_VERSION
+   cmdsize 24
+  platform macos
+       sdk n/a
+     minos 10.14
+    ntools 0
 Load command 2
      cmd LC_SYMTAB
  cmdsize 24
     

LC_VERSION_MIN_MACOSX在binutils中实现,而   LC_BUILD_VERSION不是。它显然是莫哈韦沙漠中的新事物。

答案 3 :(得分:0)

我从堆栈溢出中得到了一个很好的解决方案,但我不知道它为什么起作用。 这是link

我是macOS的新手,并且执行以下操作:

  1. 高塞拉利昂协同设计gdb 8.0.1
  2. 更新到莫哈韦沙漠
  3. gdb 8.0.1因BFD: /Users/xxx/Codes/demo: unknown load command 0x32而死
  4. 更改为gdb 8.2.1并遇到钥匙串错误Unknown Error -2,147,414,007
      

    通过在Login中获取证书来解决此问题,然后将其导出并导入到System中(如果无法导入,请从“登录名”中删除它。)

  5. 最后,由于某种错误,它仍然不起作用,并且ERROR: Unable to start debugging. Unexpected GDB output from command "-exec-run". Unable to find Mach task port for process-id 1510: (os/kern) failure (0x5). (please check gdb is codesigned - see taskgated(8))附带了how to undo codesign,据错误消息仍然存在,答案告诉我brew reinstall gdb,但是它仍然无法正常工作,我昨天才打电话给它。
  6. 最后我遇到了that link,我是HAPPYY,现在我可以进行调试了!

希望我的解决方案可以提供帮助。

答案 4 :(得分:0)

我通过以下方式使gdb在Mojave上工作:

a)获取最新的gdb源档案(在撰写本文时,ftp://sourceware.org/pub/gdb/snapshots/current/gdb-weekly-8.2.50.20190212.tar.xz)-除其他外,它增加了在Mac上识别可执行文件的处理。

b)建立gdb。在darwin-nat.c中出现变量阴影错误,因此我编辑了文件并重新构建。

c)遵循https://forward-in-code.blogspot.com/2018/11/mojave-vs-gdb.html

中的步骤

Voila。

(来源:GDB on Mac/Mojave: During startup program terminated with signal ?, Unknown signal

答案 5 :(得分:0)

从Homebrew安装的

gdb 8.2与Mac mojave不兼容。 我已经升级到8.2.1。该问题应得到解决。

答案 6 :(得分:0)

答案 7 :(得分:-3)

通过精简应用程序,我克服了Mojave上的这个问题。 GDB不了解通用二进制文件。因此,如果file myapp告诉您myapp是通用二进制文件,请尝试以下操作:

lipo -thin x86_64 -output myapp-x86_64 myapp

然后

gdb myapp-x86_64