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

时间:2016-09-13 16:44:10

标签: c++ debugging gcc compilation dwarf

在linux机器中,当我们编译时,例如下面的代码片段:

b.cc:

typedef struct sTeste {
    int campo1;
    char campo2;
    int campo3;


} T_TESTE;


void m1(T_TESTE *p) {

}

使用命令:

  

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

我们得到了ELF标题

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....#|

00000000 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 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...............

我真正的问题是我想从一个简单的编译单元(在本例中为b.cc)中提取矮调试数据。

任何线索?

由于

2 个答案:

答案 0 :(得分:4)

因为Windows不使用ELF。 Windows使用PE(https://en.wikipedia.org/wiki/Portable_Executable)。如果你想在Windows中使用ELF,只需获取GCC源代码并在./configure阶段使用elf目标自行构建。

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

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

https://msdn.microsoft.com/en-us/library/ms809762.aspx

有一大堆免费工具可以让你偷看PE文件。例如:https://sourceforge.net/projects/nktspeview/

答案 1 :(得分:1)

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

在Windows中也是如此,但更难以拥有Elf