Почему Windows GCC (Cygwin) не пишут заголовок ELF?

На машине с 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 ..... текст .......
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 ...............

Моя настоящая проблема в том, что я хотел бы извлечь данные отладки dwarf только из простого модуля компиляции (в данном случае b.cc).

Любая подсказка?

Спасибо

2

Решение

Потому что Windows не использует ELF. Windows использует PE (https://en.wikipedia.org/wiki/Portable_Executable). Если вы хотите использовать ELF в Windows, просто получите исходный код GCC и создайте его самостоятельно с целью elf на этапе ./configure.

Однако вы не сможете запустить вывод в Windows.

В PE информация отладки хранится в виде символов в таблице символов COFF. Вы можете получить к нему через Windows API:

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

Есть множество бесплатных инструментов, которые позволяют вам заглянуть в PE-файлы. Например: https://sourceforge.net/projects/nktspeview/

4

Другие решения

Я не знаю, какую версию вы используете. В Linux gcc может быть:
— Стандарт GCC (компиляция C)
— GCC-эльф (скомпилировать C с эльфом)

В Windows тоже, но эльф сложнее

1

По вопросам рекламы [email protected]