C++ 为什么Windows gcc(cygwin)不写ELF头?

C++ 为什么Windows gcc(cygwin)不写ELF头?,c++,debugging,gcc,compilation,dwarf,C++,Debugging,Gcc,Compilation,Dwarf,例如,在linux机器中,当我们编译以下代码时: b、 抄送: 使用命令: gcc-gdwarf-2-c b.cc-o b.o 我们得到了精灵头球 root@marceloaleks:~# hd b.o |head 00000000 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 |.ELF............| 00000010 01 00 3e 00 01 00 00 00 00 00 00 00 00 00 00 00 |..

例如,在linux机器中,当我们编译以下代码时:

b、 抄送:

使用命令:

gcc-gdwarf-2-c b.cc-o b.o

我们得到了精灵头球

root@marceloaleks:~# hd b.o |head 00000000 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 |.ELF............| 00000010 01 00 3e 00 01 00 00 00 00 00 00 00 00 00 00 00 |..>.............| 00000020 00 00 00 00 00 00 00 00 a8 03 00 00 00 00 00 00 |................| 00000030 00 00 00 00 40 00 00 00 00 00 40 00 14 00 11 00 |....@.....@.....| 00000040 55 48 89 e5 48 89 7d f8 5d c3 00 00 b1 00 00 00 |UH..H.}.].......| 00000050 02 00 00 00 00 00 08 01 00 00 00 00 04 00 00 00 |................| 00000060 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 00000070 00 00 00 00 00 00 00 00 00 02 00 00 00 00 0c 01 |................| 00000080 01 64 00 00 00 03 00 00 00 00 01 02 64 00 00 00 |.d..........d...| 00000090 02 23 00 03 00 00 00 00 01 03 6b 00 00 00 02 23 |.#........k....#| root@marceloaleks:~#高清b.o |头 00000000 7f 45 4c 46 02 01 00 00 | ELF| 000000 10 01 00 3e 00 01 00 00 00 |..>| 000000 200 00 00 a8 03 00 00 || 00000030 00 00 00 00 40 00 00 00 00 00 40 00 14 00 11 00 |....@.....@.....| 000000 40 55 48 89 e5 48 89 7d f8 5d c3 00 00 b1 00 00 00 | UH..H}.]| 00000050 02 00 00 00 00 00 08 01 00 00 00 00 04 00 00 00 |................| 00000060 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 000000 70 00 00 00 02 00 00 0c 01 || 000000 80 01 64 00 00 03 00 00 00 00 01 02 64 00 00 00 | d| 000000 90 02 23 00 03 00 00 00 01 03 6b 00 00 00 02 23 |..k#| 00000000 7f 45 4c 46 02 01 00 00 |。ELF|

但是,当我们在Windows上执行相同操作时,结果是:

C:\Aleks-IOT\Code\Dev\JAVA\nbdwarfdumplib>xxd b.o |head 00000000: 6486 0d00 0000 0000 ae05 0000 1c00 0000 d............... 00000010: 0000 0400 2e74 6578 7400 0000 0000 0000 .....text....... 00000020: 0000 0000 1000 0000 1c02 0000 0000 0000 ................ 00000030: 0000 0000 0000 0000 2000 5060 2e64 6174 ........ .P`.dat 00000040: 6100 0000 0000 0000 0000 0000 0000 0000 a............... C:\Aleks IOT\Code\Dev\JAVA\nbdwarfdumplib>xxd b.o|head 00000000:6486 0d00 0000 ae05 0000 1c00 0000 d。。。。。。。。。。。。。。。 00000010:0000 0400 2e74 6578 7400 0000 0000…文本。。。。。。。 00000020:0000 0000 1000 0000 1c02 0000 0000 0000。。。。。。。。。。。。。。。。 000000 30:0000 2000 5060 2e64 6174。P`.dat 00000040:6100 0000 a。。。。。。。。。。。。。。。 我真正的问题是,我只想从一个简单的编译单元(本例中是b.cc)中提取dwarf调试数据

有线索吗


谢谢

我不知道你用的是什么版本。在Linux中,gcc可以是: -GCC标准(编译C) -GCC elf(用elf编译C)


在Windows中也是如此,但由于Windows不使用Elf,因此使用Elf更为困难。Windows使用PE()。如果您希望在Windows中使用ELF,只需获取GCC源代码,并在./configure阶段使用ELF目标自行构建即可

但是,您将无法在Windows中运行输出

在PE中,调试信息作为符号存储在COFF symbol表中。您可以通过Windows API访问它:


有一堆免费工具使用它,让你窥视到PE文件。例如:

是的,但如果没有生成可执行文件,我无法在windows中获取dwarf数据。非常感谢。dwarfdump在Linux中工作得非常好!你知道如何获取一个来源的PE吗?我添加了一些细节。您可能需要对PE文件查看器进行web搜索。我不知道哪一个最好。我已经很久没有在这个领域工作了。我不想使用PE格式,因为它只存在于windows世界,我的应用程序也需要在Linux和MAcOS中运行。但是你提到了生成gcc来获得elf;这是一个好主意,我会试试。我想你需要重新构建你的应用程序来运行Linux和Mac。即使它们都是ELF,系统调用也不兼容。为什么不在Linux机器上构建呢?否则,您必须在Windows中设置交叉编译工具链,这是可以的,但是您将无法通过在Windows上运行应用程序来测试应用程序。gcc可以选择在单独的文件中输出dwarf数据。也许你想这么做。你有64位的Windows 10吗?您可以尝试,这将允许您在Windows cmd或powershell窗口中构建和运行ELF二进制文件。这是预览质量-我只使用
apt-get
,就获得了BSODs-但它可以工作。我将尝试一下 C:\Aleks-IOT\Code\Dev\JAVA\nbdwarfdumplib>xxd b.o |head 00000000: 6486 0d00 0000 0000 ae05 0000 1c00 0000 d............... 00000010: 0000 0400 2e74 6578 7400 0000 0000 0000 .....text....... 00000020: 0000 0000 1000 0000 1c02 0000 0000 0000 ................ 00000030: 0000 0000 0000 0000 2000 5060 2e64 6174 ........ .P`.dat 00000040: 6100 0000 0000 0000 0000 0000 0000 0000 a...............