На машине с 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).
Любая подсказка?
Спасибо
Потому что 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/
Я не знаю, какую версию вы используете. В Linux gcc может быть:
— Стандарт GCC (компиляция C)
— GCC-эльф (скомпилировать C с эльфом)
В Windows тоже, но эльф сложнее