2016-09-13 11 views
3

В Linux машине, когда мы составляем, например, фрагмент кода ниже:Почему Windows gcc (cygwin) не пишет заголовок ELF?

b.cc:

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


} T_TESTE; 


void m1(T_TESTE *p) { 

} 

с помощью команды:

НКУ -gdwarf-2 - с b.cc -о бо

мы получаем заголовок ELF

 
[email protected]:~# 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 |[email protected]@.....| 
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 в этом дело).

Любые подсказки?

Благодаря

+0

У вас есть Windows 10 64-бит? Вы можете попробовать [Ubuntu в Windows] (https://msdn.microsoft.com/en-us/commandline/wsl/install_guide), что позволит вам создавать и запускать файлы ELF в окне Windows cmd или powershell. Это качество предварительного просмотра - я получил BSOD, просто используя 'apt-get', но он работает. –

+0

Попытаюсь –

ответ

1

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

В Windows тоже, но это более трудно иметь Elf

4

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

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

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

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

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

+0

Да, но я не смог получить данные о гном в окнах без создания исполняемого файла. Спасибо. dwarfdump отлично работает в Linux! Вы знаете, как получить PE только для источника? –

+0

Я добавил некоторые подробности. Возможно, вы захотите сделать веб-поиск для PE-файлов. Я не знаю, что лучше. Прошло много времени с тех пор, как я работал в этой области. – thang

+0

Я не хочу использовать формат PE, потому что он находится только в мире Windows, и мое приложение должно работать в Linux и MAcOS. Но вы говорили о генерации gcc, чтобы получить эльфа; это хорошая идея, и я постараюсь. –